xref: /AOO41X/main/sw/source/core/text/txtfld.cxx (revision d3553c6b68aef63d45d1605bdabbc6fea7b9e42f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 #include "hintids.hxx"
29 #include <fmtfld.hxx>
30 #include <txtfld.hxx>
31 #include <charfmt.hxx>
32 
33 #include "viewsh.hxx"   // NewFldPortion, GetDoc()
34 #include "doc.hxx"      // NewFldPortion, GetSysFldType()
35 #include "rootfrm.hxx"  // Info ueber virt. PageNumber
36 #include "pagefrm.hxx"  // NewFldPortion, GetVirtPageNum()
37 #include "ndtxt.hxx"    // NewNumberPortion, pHints->GetNum()
38 #include "fldbas.hxx"      // SwField
39 #include "viewopt.hxx"	// SwViewOptions
40 #include "flyfrm.hxx"	//IsInBody()
41 #include "viewimp.hxx"
42 #include "txtatr.hxx"   // SwTxtFld
43 #include "txtcfg.hxx"
44 #include "swfont.hxx"   // NewFldPortion, new SwFont
45 #include "fntcache.hxx"   // NewFldPortion, SwFntAccess
46 #include "porfld.hxx"
47 #include "porftn.hxx"   // NewExtraPortion
48 #include "porref.hxx"   // NewExtraPortion
49 #include "portox.hxx"   // NewExtraPortion
50 #include "porhyph.hxx"   // NewExtraPortion
51 #include "porfly.hxx"   // NewExtraPortion
52 #include "itrform2.hxx"   // SwTxtFormatter
53 #include "chpfld.hxx"
54 #include "dbfld.hxx"
55 #include "expfld.hxx"
56 #include "docufld.hxx"
57 #include "pagedesc.hxx"  // NewFldPortion, GetNum()
58 #include <pormulti.hxx> 	// SwMultiPortion
59 #include "fmtmeta.hxx" // lcl_NewMetaPortion
60 
61 
62 //IAccessibility2 Implementation 2009-----
63 #ifndef _REFFLD_HXX
64 #include "reffld.hxx"
65 #endif
66 #ifndef _FLDDAT_HXX
67 #include "flddat.hxx"
68 #endif
69 //-----IAccessibility2 Implementation 2009
70 /*************************************************************************
71  *                      SwTxtFormatter::NewFldPortion()
72  *************************************************************************/
73 
74 
75 sal_Bool lcl_IsInBody( SwFrm *pFrm )
76 {
77 	if ( pFrm->IsInDocBody() )
78 		return sal_True;
79 	else
80 	{
81         const SwFrm *pTmp = pFrm;
82         const SwFlyFrm *pFly;
83 		while ( 0 != (pFly = pTmp->FindFlyFrm()) )
84             pTmp = pFly->GetAnchorFrm();
85 		return pTmp->IsInDocBody();
86 	}
87 }
88 
89 
90 SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf,
91 												const SwTxtAttr *pHint ) const
92 {
93 	SwExpandPortion *pRet = 0;
94 	SwFrm *pFrame = (SwFrm*)pFrm;
95 	SwField *pFld = (SwField*)pHint->GetFmtFld().GetField();
96 	const sal_Bool bName = rInf.GetOpt().IsFldName();
97 
98 	SwCharFmt* pChFmt = 0;
99 	sal_Bool bNewFlyPor = sal_False,
100 		 bINet = sal_False;
101 	//IAccessibility2 Implementation 2009-----
102 	sal_uInt16 subType;
103 	//-----IAccessibility2 Implementation 2009
104 	// set language
105 	((SwTxtFormatter*)this)->SeekAndChg( rInf );
106 	if (pFld->GetLanguage() != GetFnt()->GetLanguage())
107 	{
108 		pFld->SetLanguage( GetFnt()->GetLanguage() );
109 		// let the visual note know about its new language
110 		if (pFld->GetTyp()->Which()==RES_POSTITFLD)
111 			const_cast<SwFmtFld*> (&pHint->GetFmtFld())->Broadcast( SwFmtFldHint( &pHint->GetFmtFld(), SWFMTFLD_LANGUAGE ) );
112 	}
113 
114 	ViewShell *pSh = rInf.GetVsh();
115     SwDoc *const pDoc( (pSh) ? pSh->GetDoc() : 0 );
116     bool const bInClipboard( (pDoc) ? pDoc->IsClipBoard() : true );
117     sal_Bool bPlaceHolder = sal_False;
118 
119 	switch( pFld->GetTyp()->Which() )
120 	{
121 		case RES_SCRIPTFLD:
122 		case RES_POSTITFLD:
123 			pRet = new SwPostItsPortion( RES_SCRIPTFLD == pFld->GetTyp()->Which() );
124 			break;
125 
126 		case RES_COMBINED_CHARS:
127 			{
128 				if( bName )
129                 {
130                     String const sName( pFld->GetFieldName() );
131                     pRet = new SwFldPortion(sName);
132                 }
133 				else
134                 {
135                     String const sContent( pFld->ExpandField(bInClipboard) );
136                     pRet = new SwCombinedPortion(sContent);
137                 }
138 			}
139 			break;
140 
141 		case RES_HIDDENTXTFLD:
142             {
143                 String const str( (bName)
144                         ? pFld->GetFieldName()
145                         : pFld->ExpandField(bInClipboard) );
146                 pRet = new SwHiddenPortion(str);
147             }
148 			break;
149 
150 		case RES_CHAPTERFLD:
151 			if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
152 			{
153 				((SwChapterField*)pFld)->ChangeExpansion( pFrame,
154 										&((SwTxtFld*)pHint)->GetTxtNode() );
155 			}
156             {
157                 String const str( (bName)
158                         ? pFld->GetFieldName()
159                         : pFld->ExpandField(bInClipboard) );
160                 pRet = new SwFldPortion( str );
161             }
162 			break;
163 
164 		case RES_DOCSTATFLD:
165 			if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
166             {
167 				((SwDocStatField*)pFld)->ChangeExpansion( pFrame );
168             }
169             {
170                 String const str( (bName)
171                         ? pFld->GetFieldName()
172                         : pFld->ExpandField(bInClipboard) );
173                 pRet = new SwFldPortion( str );
174             }
175             //IAccessibility2 Implementation 2009-----
176             if(pRet)
177                 ((SwFldPortion*)pRet)->m_nAttrFldType= ATTR_PAGECOOUNTFLD;
178             //-----IAccessibility2 Implementation 2009
179             break;
180 
181 		case RES_PAGENUMBERFLD:
182 		{
183 			if( !bName && pSh && pSh->GetLayout() && !pSh->Imp()->IsUpdateExpFlds() )//swmod 080122
184 			{
185                 SwPageNumberFieldType *pPageNr = (SwPageNumberFieldType *)pFld->GetTyp();
186 
187                 const SwRootFrm* pTmpRootFrm = pSh->GetLayout();
188                 const sal_Bool bVirt = pTmpRootFrm->IsVirtPageNum();
189 
190                 MSHORT nVirtNum = pFrame->GetVirtPageNum();
191                 MSHORT nNumPages = pTmpRootFrm->GetPageNum();
192 				sal_Int16 nNumFmt = -1;
193 				if(SVX_NUM_PAGEDESC == pFld->GetFormat())
194 					nNumFmt = pFrame->FindPageFrm()->GetPageDesc()->GetNumType().GetNumberingType();
195 
196 				pPageNr->ChangeExpansion( pDoc, nVirtNum, nNumPages,
197 											bVirt, nNumFmt > -1 ? &nNumFmt : 0);
198 			}
199             {
200                 String const str( (bName)
201                         ? pFld->GetFieldName()
202                         : pFld->ExpandField(bInClipboard) );
203                 pRet = new SwFldPortion( str );
204             }
205             //IAccessibility2 Implementation 2009-----
206             if(pRet)
207                 ((SwFldPortion*)pRet)->m_nAttrFldType= ATTR_PAGENUMBERFLD;
208             //-----IAccessibility2 Implementation 2009
209             break;
210 		}
211 		case RES_GETEXPFLD:
212 		{
213 			if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
214 			{
215 				SwGetExpField* pExpFld = (SwGetExpField*)pFld;
216 				if( !::lcl_IsInBody( pFrame ) )
217 				{
218 					pExpFld->ChgBodyTxtFlag( sal_False );
219 					pExpFld->ChangeExpansion( *pFrame, *((SwTxtFld*)pHint) );
220 				}
221 				else if( !pExpFld->IsInBodyTxt() )
222 				{
223 					// war vorher anders, also erst expandieren, dann umsetzen!!
224 					pExpFld->ChangeExpansion( *pFrame, *((SwTxtFld*)pHint) );
225 					pExpFld->ChgBodyTxtFlag( sal_True );
226 				}
227 			}
228             {
229                 String const str( (bName)
230                         ? pFld->GetFieldName()
231                         : pFld->ExpandField(bInClipboard) );
232                 pRet = new SwFldPortion( str );
233             }
234 			break;
235 		}
236 		case RES_DBFLD:
237 		{
238 			if( !bName )
239 			{
240 				SwDBField* pDBFld = (SwDBField*)pFld;
241 				pDBFld->ChgBodyTxtFlag( ::lcl_IsInBody( pFrame ) );
242 /* Solange das ChangeExpansion auskommentiert ist.
243  * Aktualisieren in Kopf/Fuszeilen geht aktuell nicht.
244 				if( !::lcl_IsInBody( pFrame ) )
245 				{
246 					pDBFld->ChgBodyTxtFlag( sal_False );
247 					pDBFld->ChangeExpansion( pFrame, (SwTxtFld*)pHint );
248 				}
249 				else if( !pDBFld->IsInBodyTxt() )
250 				{
251 					// war vorher anders, also erst expandieren, dann umsetzen!!
252 					pDBFld->ChangeExpansion( pFrame, (SwTxtFld*)pHint );
253 					pDBFld->ChgBodyTxtFlag( sal_True );
254 				}
255 */
256 			}
257             {
258                 String const str( (bName)
259                         ? pFld->GetFieldName()
260                         : pFld->ExpandField(bInClipboard) );
261                 pRet = new SwFldPortion(str);
262             }
263 			break;
264 		}
265 		case RES_REFPAGEGETFLD:
266 			if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
267             {
268 				((SwRefPageGetField*)pFld)->ChangeExpansion( pFrame, (SwTxtFld*)pHint );
269             }
270             {
271                 String const str( (bName)
272                         ? pFld->GetFieldName()
273                         : pFld->ExpandField(bInClipboard) );
274                 pRet = new SwFldPortion(str);
275             }
276 			break;
277 
278 		case RES_JUMPEDITFLD:
279 			if( !bName )
280 				pChFmt =  ((SwJumpEditField*)pFld)->GetCharFmt();
281 			bNewFlyPor = sal_True;
282             bPlaceHolder = sal_True;
283 			break;
284 		//IAccessibility2 Implementation 2009-----
285 		case RES_GETREFFLD:
286 			subType = ((SwGetRefField*)pFld)->GetSubType();
287             {
288                 String const str( (bName)
289                         ? pFld->GetFieldName()
290                         : pFld->ExpandField(bInClipboard) );
291                 pRet = new SwFldPortion(str);
292             }
293             if(pRet)
294 			{
295 				if( subType == REF_BOOKMARK  )
296                     ((SwFldPortion*)pRet)->m_nAttrFldType = ATTR_BOOKMARKFLD;
297 				else if( subType == REF_SETREFATTR )
298 					((SwFldPortion*)pRet)->m_nAttrFldType = ATTR_SETREFATTRFLD;
299 				break;
300 			}
301 		case RES_DATETIMEFLD:
302 			subType = ((SwDateTimeField*)pFld)->GetSubType();
303             {
304                 String const str( (bName)
305                         ? pFld->GetFieldName()
306                         : pFld->ExpandField(bInClipboard) );
307                 pRet = new SwFldPortion(str);
308             }
309             if(pRet)
310 			{
311 				if( subType & DATEFLD  )
312 					((SwFldPortion*)pRet)->m_nAttrFldType= ATTR_DATEFLD;
313 				else if( subType & TIMEFLD )
314 					((SwFldPortion*)pRet)->m_nAttrFldType = ATTR_TIMEFLD;
315 				break;
316 			}
317 		//-----IAccessibility2 Implementation 2009
318 		default:
319             {
320                 String const str( (bName)
321                         ? pFld->GetFieldName()
322                         : pFld->ExpandField(bInClipboard) );
323                 pRet = new SwFldPortion(str);
324             }
325 	}
326 
327 	if( bNewFlyPor )
328 	{
329 		SwFont *pTmpFnt = 0;
330 		if( !bName )
331 		{
332 			pTmpFnt = new SwFont( *pFnt );
333 			if( bINet )
334 			{
335 				SwAttrPool* pPool = pChFmt->GetAttrSet().GetPool();
336 				SfxItemSet aSet( *pPool, RES_CHRATR_BEGIN, RES_CHRATR_END );
337 				SfxItemSet aTmpSet( aSet );
338                 pFrm->GetTxtNode()->GetAttr(aSet,rInf.GetIdx(),rInf.GetIdx()+1);
339 				aTmpSet.Set( pChFmt->GetAttrSet() );
340 				aTmpSet.Differentiate( aSet );
341 				if( aTmpSet.Count() )
342                     pTmpFnt->SetDiffFnt( &aTmpSet, pFrm->GetTxtNode()->getIDocumentSettingAccess() );
343 			}
344 			else
345                 pTmpFnt->SetDiffFnt( &pChFmt->GetAttrSet(), pFrm->GetTxtNode()->getIDocumentSettingAccess() );
346 		}
347         {
348             String const str( (bName)
349                     ? pFld->GetFieldName()
350                     : pFld->ExpandField(bInClipboard) );
351             pRet = new SwFldPortion(str, pTmpFnt, bPlaceHolder);
352         }
353 	}
354 
355 	return pRet;
356 }
357 
358 /*************************************************************************
359  *                      SwTxtFormatter::TryNewNoLengthPortion()
360  *************************************************************************/
361 
362 SwFldPortion * lcl_NewMetaPortion(SwTxtAttr & rHint, const bool bPrefix)
363 {
364     ::sw::Meta *const pMeta(
365         static_cast<SwFmtMeta &>(rHint.GetAttr()).GetMeta() );
366     ::rtl::OUString fix;
367     ::sw::MetaField *const pField( dynamic_cast< ::sw::MetaField * >(pMeta) );
368     OSL_ENSURE(pField, "lcl_NewMetaPortion: no meta field?");
369     if (pField)
370     {
371         pField->GetPrefixAndSuffix((bPrefix) ? &fix : 0, (bPrefix) ? 0 : &fix);
372     }
373     return new SwFldPortion( fix );
374 }
375 
376 /** Try to create a new portion with zero length, for an end of a hint
377     (where there is no CH_TXTATR). Because there may be multiple hint ends at a
378     given index, m_nHintEndIndex is used to keep track of the already created
379     portions. But the portions created here may actually be deleted again,
380     due to UnderFlow. In that case, m_nHintEndIndex must be decremented,
381     so the portion will be created again on the next line.
382  */
383 SwExpandPortion *
384 SwTxtFormatter::TryNewNoLengthPortion(SwTxtFormatInfo & rInfo)
385 {
386     if (pHints)
387     {
388         const xub_StrLen nIdx(rInfo.GetIdx());
389         while (m_nHintEndIndex < pHints->GetEndCount())
390         {
391             SwTxtAttr & rHint( *pHints->GetEnd(m_nHintEndIndex) );
392             xub_StrLen const nEnd( *rHint.GetAnyEnd() );
393             if (nEnd > nIdx)
394             {
395                 break;
396             }
397             ++m_nHintEndIndex;
398             if (nEnd == nIdx)
399             {
400                 if (RES_TXTATR_METAFIELD == rHint.Which())
401                 {
402                     SwFldPortion *const pPortion(
403                             lcl_NewMetaPortion(rHint, false));
404                     pPortion->SetNoLength(); // no CH_TXTATR at hint end!
405                     return pPortion;
406                 }
407             }
408         }
409     }
410     return 0;
411 }
412 
413 /*************************************************************************
414  *                      SwTxtFormatter::NewExtraPortion()
415  *************************************************************************/
416 
417 SwLinePortion *SwTxtFormatter::NewExtraPortion( SwTxtFormatInfo &rInf )
418 {
419 	SwTxtAttr *pHint = GetAttr( rInf.GetIdx() );
420 	SwLinePortion *pRet = 0;
421 	if( !pHint )
422 	{
423 #if OSL_DEBUG_LEVEL > 1
424 //        aDbstream << "NewExtraPortion: hint not found?" << endl;
425 #endif
426 		pRet = new SwTxtPortion;
427 		pRet->SetLen( 1 );
428 		rInf.SetLen( 1 );
429 		return pRet;
430 	}
431 
432 	switch( pHint->Which() )
433 	{
434 		case RES_TXTATR_FLYCNT :
435 		{
436 			pRet = NewFlyCntPortion( rInf, pHint );
437 			break;
438 		}
439 		case RES_TXTATR_FTN :
440 		{
441 			pRet = NewFtnPortion( rInf, pHint );
442 			break;
443 		}
444 		case RES_TXTATR_FIELD :
445 		{
446 			pRet = NewFldPortion( rInf, pHint );
447 			break;
448 		}
449 		case RES_TXTATR_REFMARK :
450 		{
451 			pRet = new SwIsoRefPortion;
452 			break;
453 		}
454 		case RES_TXTATR_TOXMARK :
455 		{
456 			pRet = new SwIsoToxPortion;
457 			break;
458 		}
459         case RES_TXTATR_METAFIELD:
460         {
461             pRet = lcl_NewMetaPortion( *pHint, true );
462             break;
463         }
464 		default: ;
465 	}
466 	if( !pRet )
467 	{
468 #if OSL_DEBUG_LEVEL > 1
469 //        aDbstream << "NewExtraPortion: unknown hint" << endl;
470 #endif
471 		const XubString aNothing;
472 		pRet = new SwFldPortion( aNothing );
473 		rInf.SetLen( 1 );
474 	}
475 	return pRet;
476 }
477 
478 /*************************************************************************
479  *                      SwTxtFormatter::NewNumberPortion()
480  *************************************************************************/
481 
482 
483 SwNumberPortion *SwTxtFormatter::NewNumberPortion( SwTxtFormatInfo &rInf ) const
484 {
485 	if( rInf.IsNumDone() || rInf.GetTxtStart() != nStart
486 				|| rInf.GetTxtStart() != rInf.GetIdx() )
487 		return 0;
488 
489 	SwNumberPortion *pRet = 0;
490 	const SwTxtNode* pTxtNd = GetTxtFrm()->GetTxtNode();
491 	const SwNumRule* pNumRule = pTxtNd->GetNumRule();
492 
493 	// hat ein "gueltige" Nummer ?
494     if( pTxtNd->IsNumbered() && pTxtNd->IsCountedInList())
495 	{
496         const SwNumFmt &rNumFmt = pNumRule->Get( static_cast<sal_uInt16>(pTxtNd->GetActualListLevel()) );
497 		const sal_Bool bLeft = SVX_ADJUST_LEFT == rNumFmt.GetNumAdjust();
498 		const sal_Bool bCenter = SVX_ADJUST_CENTER == rNumFmt.GetNumAdjust();
499         // --> OD 2008-01-23 #newlistlevelattrs#
500         const bool bLabelAlignmentPosAndSpaceModeActive(
501                 rNumFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT );
502         const KSHORT nMinDist = bLabelAlignmentPosAndSpaceModeActive
503                                 ? 0 : rNumFmt.GetCharTextDistance();
504         // <--
505 
506 		if( SVX_NUM_BITMAP == rNumFmt.GetNumberingType() )
507 		{
508             // --> OD 2008-01-23 #newlistlevelattrs#
509             pRet = new SwGrfNumPortion( (SwFrm*)GetTxtFrm(),
510                                         pTxtNd->GetLabelFollowedBy(),
511                                         rNumFmt.GetBrush(),
512                                         rNumFmt.GetGraphicOrientation(),
513                                         rNumFmt.GetGraphicSize(),
514                                         bLeft, bCenter, nMinDist,
515                                         bLabelAlignmentPosAndSpaceModeActive );
516             // <--
517 			long nTmpA = rInf.GetLast()->GetAscent();
518 			long nTmpD = rInf.GetLast()->Height() - nTmpA;
519 			if( !rInf.IsTest() )
520 				((SwGrfNumPortion*)pRet)->SetBase( nTmpA, nTmpD, nTmpA, nTmpD );
521 		}
522 		else
523 		{
524 			// Der SwFont wird dynamisch angelegt und im CTOR uebergeben,
525 			// weil das CharFmt nur einen SV-Font zurueckliefert.
526 			// Im Dtor vom SwNumberPortion wird der SwFont deletet.
527 			SwFont *pNumFnt = 0;
528 			const SwAttrSet* pFmt = rNumFmt.GetCharFmt() ?
529                                     &rNumFmt.GetCharFmt()->GetAttrSet() :
530                                     NULL;
531             const IDocumentSettingAccess* pIDSA = pTxtNd->getIDocumentSettingAccess();
532 
533             if( SVX_NUM_CHAR_SPECIAL == rNumFmt.GetNumberingType() )
534 			{
535 				const Font *pFmtFnt = rNumFmt.GetBulletFont();
536 
537                 //
538                 // Build a new bullet font basing on the current paragraph font:
539                 //
540                 pNumFnt = new SwFont( &rInf.GetCharAttr(), pIDSA );
541 
542                 // --> FME 2005-08-11 #i53199#
543                 if ( !pIDSA->get(IDocumentSettingAccess::DO_NOT_RESET_PARA_ATTRS_FOR_NUM_FONT) )
544                 {
545                     // i18463:
546                     // Underline style of paragraph font should not be considered
547                     // Overline style of paragraph font should not be considered
548                     // Weight style of paragraph font should not be considered
549                     // Posture style of paragraph font should not be considered
550                     pNumFnt->SetUnderline( UNDERLINE_NONE );
551                     pNumFnt->SetOverline( UNDERLINE_NONE );
552                     pNumFnt->SetItalic( ITALIC_NONE, SW_LATIN );
553                     pNumFnt->SetItalic( ITALIC_NONE, SW_CJK );
554                     pNumFnt->SetItalic( ITALIC_NONE, SW_CTL );
555                     pNumFnt->SetWeight( WEIGHT_NORMAL, SW_LATIN );
556                     pNumFnt->SetWeight( WEIGHT_NORMAL, SW_CJK );
557                     pNumFnt->SetWeight( WEIGHT_NORMAL, SW_CTL );
558                 }
559 
560                 //
561                 // Apply the explicit attributes from the character style
562                 // associated with the numering to the new bullet font.
563                 //
564 				if( pFmt )
565                     pNumFnt->SetDiffFnt( pFmt, pIDSA );
566 
567                 if ( pFmtFnt )
568 				{
569 					const sal_uInt8 nAct = pNumFnt->GetActual();
570 					pNumFnt->SetFamily( pFmtFnt->GetFamily(), nAct );
571 					pNumFnt->SetName( pFmtFnt->GetName(), nAct );
572 					pNumFnt->SetStyleName( pFmtFnt->GetStyleName(), nAct );
573 					pNumFnt->SetCharSet( pFmtFnt->GetCharSet(), nAct );
574 					pNumFnt->SetPitch( pFmtFnt->GetPitch(), nAct );
575 				}
576 
577                 // we do not allow a vertical font
578                 pNumFnt->SetVertical( pNumFnt->GetOrientation(),
579                                       pFrm->IsVertical() );
580 
581                 // --> OD 2008-01-23 #newlistelevelattrs#
582                 pRet = new SwBulletPortion( rNumFmt.GetBulletChar(),
583                                             pTxtNd->GetLabelFollowedBy(),
584                                             pNumFnt,
585                                             bLeft, bCenter, nMinDist,
586                                             bLabelAlignmentPosAndSpaceModeActive );
587                 // <--
588 			}
589 			else
590 			{
591                 XubString aTxt( pTxtNd->GetNumString() );
592                 // --> OD 2008-01-23 #newlistlevelattrs#
593                 if ( aTxt.Len() > 0 )
594                 {
595                     aTxt.Insert( pTxtNd->GetLabelFollowedBy() );
596                 }
597                 // <--
598 
599 				// 7974: Nicht nur eine Optimierung...
600 				// Eine Numberportion ohne Text wird die Breite von 0
601 				// erhalten. Die nachfolgende Textportion wird im BreakLine
602 				// in das BreakCut laufen, obwohl rInf.GetLast()->GetFlyPortion()
603 				// vorliegt!
604 				if( aTxt.Len() )
605 				{
606                     //
607                     // Build a new numbering font basing on the current paragraph font:
608                     //
609                     pNumFnt = new SwFont( &rInf.GetCharAttr(), pIDSA );
610 
611                     // --> FME 2005-08-11 #i53199#
612                     if ( !pIDSA->get(IDocumentSettingAccess::DO_NOT_RESET_PARA_ATTRS_FOR_NUM_FONT) )
613                     {
614                         // i18463:
615                         // Underline style of paragraph font should not be considered
616                         pNumFnt->SetUnderline( UNDERLINE_NONE );
617                         // Overline style of paragraph font should not be considered
618                         pNumFnt->SetOverline( UNDERLINE_NONE );
619                     }
620 
621 
622                     //
623                     // Apply the explicit attributes from the character style
624                     // associated with the numering to the new bullet font.
625                     //
626 					if( pFmt )
627                         pNumFnt->SetDiffFnt( pFmt, pIDSA );
628 
629                     // we do not allow a vertical font
630                     pNumFnt->SetVertical( pNumFnt->GetOrientation(), pFrm->IsVertical() );
631 
632                     // --> OD 2008-01-23 #newlistlevelattrs#
633                     pRet = new SwNumberPortion( aTxt, pNumFnt,
634                                                 bLeft, bCenter, nMinDist,
635                                                 bLabelAlignmentPosAndSpaceModeActive );
636                     // <--
637 				}
638 			}
639 		}
640 	}
641 	return pRet;
642 }
643 
644