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