Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "hintids.hxx"
21 : #include <fmtfld.hxx>
22 : #include <txtfld.hxx>
23 : #include <charfmt.hxx>
24 :
25 : #include "viewsh.hxx"
26 : #include "doc.hxx"
27 : #include "rootfrm.hxx"
28 : #include "pagefrm.hxx"
29 : #include "ndtxt.hxx"
30 : #include "fldbas.hxx"
31 : #include "viewopt.hxx"
32 : #include "flyfrm.hxx"
33 : #include "viewimp.hxx"
34 : #include "txtatr.hxx"
35 : #include "swfont.hxx"
36 : #include "fntcache.hxx"
37 : #include "porfld.hxx"
38 : #include "porftn.hxx"
39 : #include "porref.hxx"
40 : #include "portox.hxx"
41 : #include "porhyph.hxx"
42 : #include "porfly.hxx"
43 : #include "itrform2.hxx"
44 : #include "chpfld.hxx"
45 : #include "dbfld.hxx"
46 : #include "expfld.hxx"
47 : #include "docufld.hxx"
48 : #include "pagedesc.hxx"
49 : #include <pormulti.hxx>
50 : #include "fmtmeta.hxx"
51 : #include "reffld.hxx"
52 : #include "flddat.hxx"
53 : #include "fmtautofmt.hxx"
54 : #include <IDocumentSettingAccess.hxx>
55 :
56 80 : static bool lcl_IsInBody( SwFrm *pFrm )
57 : {
58 80 : if ( pFrm->IsInDocBody() )
59 24 : return true;
60 : else
61 : {
62 56 : const SwFrm *pTmp = pFrm;
63 : const SwFlyFrm *pFly;
64 168 : while ( 0 != (pFly = pTmp->FindFlyFrm()) )
65 56 : pTmp = pFly->GetAnchorFrm();
66 56 : return pTmp->IsInDocBody();
67 : }
68 : }
69 :
70 5120 : SwExpandPortion *SwTxtFormatter::NewFldPortion( SwTxtFormatInfo &rInf,
71 : const SwTxtAttr *pHint ) const
72 : {
73 5120 : SwExpandPortion *pRet = 0;
74 5120 : SwFrm *pFrame = (SwFrm*)pFrm;
75 5120 : SwField *pFld = (SwField*)pHint->GetFmtFld().GetField();
76 5120 : const bool bName = rInf.GetOpt().IsFldName();
77 :
78 5120 : SwCharFmt* pChFmt = 0;
79 5120 : bool bNewFlyPor = false;
80 5120 : sal_uInt16 subType = 0;
81 :
82 : // set language
83 5120 : ((SwTxtFormatter*)this)->SeekAndChg( rInf );
84 5120 : if (pFld->GetLanguage() != GetFnt()->GetLanguage())
85 : {
86 788 : pFld->SetLanguage( GetFnt()->GetLanguage() );
87 : // let the visual note know about its new language
88 788 : if (pFld->GetTyp()->Which()==RES_POSTITFLD)
89 136 : const_cast<SwFmtFld*> (&pHint->GetFmtFld())->Broadcast( SwFmtFldHint( &pHint->GetFmtFld(), SwFmtFldHintWhich::LANGUAGE ) );
90 : }
91 :
92 5120 : SwViewShell *pSh = rInf.GetVsh();
93 5120 : SwDoc *const pDoc( (pSh) ? pSh->GetDoc() : 0 );
94 5120 : bool const bInClipboard( (pDoc) ? pDoc->IsClipBoard() : true );
95 5120 : bool bPlaceHolder = false;
96 :
97 5120 : switch( pFld->GetTyp()->Which() )
98 : {
99 : case RES_SCRIPTFLD:
100 : case RES_POSTITFLD:
101 190 : pRet = new SwPostItsPortion( RES_SCRIPTFLD == pFld->GetTyp()->Which() );
102 190 : break;
103 :
104 : case RES_COMBINED_CHARS:
105 : {
106 0 : if( bName )
107 0 : pRet = new SwFldPortion( pFld->GetFieldName() );
108 : else
109 0 : pRet = new SwCombinedPortion( pFld->ExpandField(bInClipboard) );
110 : }
111 0 : break;
112 :
113 : case RES_HIDDENTXTFLD:
114 : {
115 : OUString const aStr( (bName)
116 0 : ? pFld->GetFieldName()
117 0 : : pFld->ExpandField(bInClipboard) );
118 0 : pRet = new SwHiddenPortion(aStr);
119 : }
120 0 : break;
121 :
122 : case RES_CHAPTERFLD:
123 0 : if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
124 : {
125 : ((SwChapterField*)pFld)->ChangeExpansion( pFrame,
126 0 : &static_txtattr_cast<SwTxtFld const*>(pHint)->GetTxtNode());
127 : }
128 : {
129 : OUString const aStr( (bName)
130 0 : ? pFld->GetFieldName()
131 0 : : pFld->ExpandField(bInClipboard) );
132 0 : pRet = new SwFldPortion( aStr );
133 : }
134 0 : break;
135 :
136 : case RES_DOCSTATFLD:
137 360 : if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
138 : {
139 278 : ((SwDocStatField*)pFld)->ChangeExpansion( pFrame );
140 : }
141 : {
142 : OUString const aStr( (bName)
143 0 : ? pFld->GetFieldName()
144 360 : : pFld->ExpandField(bInClipboard) );
145 360 : pRet = new SwFldPortion( aStr );
146 : }
147 360 : if(pRet)
148 360 : ((SwFldPortion*)pRet)->m_nAttrFldType= ATTR_PAGECOOUNTFLD;
149 360 : break;
150 :
151 : case RES_PAGENUMBERFLD:
152 : {
153 2708 : if( !bName && pSh && pSh->GetLayout() && !pSh->Imp()->IsUpdateExpFlds() )
154 : {
155 2076 : SwPageNumberFieldType *pPageNr = (SwPageNumberFieldType *)pFld->GetTyp();
156 :
157 2076 : const SwRootFrm* pTmpRootFrm = pSh->GetLayout();
158 2076 : const bool bVirt = pTmpRootFrm->IsVirtPageNum();
159 :
160 2076 : sal_uInt16 nVirtNum = pFrame->GetVirtPageNum();
161 2076 : sal_uInt16 nNumPages = pTmpRootFrm->GetPageNum();
162 2076 : sal_Int16 nNumFmt = -1;
163 2076 : if(SVX_NUM_PAGEDESC == pFld->GetFormat())
164 1978 : nNumFmt = pFrame->FindPageFrm()->GetPageDesc()->GetNumType().GetNumberingType();
165 : static_cast<SwPageNumberField*>(pFld)
166 2076 : ->ChangeExpansion(nVirtNum, nNumPages);
167 : pPageNr->ChangeExpansion(pDoc,
168 2076 : bVirt, nNumFmt > -1 ? &nNumFmt : 0);
169 : }
170 : {
171 : OUString const aStr( (bName)
172 0 : ? pFld->GetFieldName()
173 2708 : : pFld->ExpandField(bInClipboard) );
174 2708 : pRet = new SwFldPortion( aStr );
175 : }
176 2708 : if(pRet)
177 2708 : ((SwFldPortion*)pRet)->m_nAttrFldType= ATTR_PAGENUMBERFLD;
178 2708 : break;
179 : }
180 : case RES_GETEXPFLD:
181 : {
182 2 : if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
183 : {
184 2 : SwGetExpField* pExpFld = (SwGetExpField*)pFld;
185 2 : if( !::lcl_IsInBody( pFrame ) )
186 : {
187 0 : pExpFld->ChgBodyTxtFlag( false );
188 : pExpFld->ChangeExpansion(*pFrame,
189 0 : *static_txtattr_cast<SwTxtFld const*>(pHint));
190 : }
191 2 : else if( !pExpFld->IsInBodyTxt() )
192 : {
193 : // war vorher anders, also erst expandieren, dann umsetzen!!
194 : pExpFld->ChangeExpansion(*pFrame,
195 0 : *static_txtattr_cast<SwTxtFld const*>(pHint));
196 0 : pExpFld->ChgBodyTxtFlag( true );
197 : }
198 : }
199 : {
200 : OUString const aStr( (bName)
201 0 : ? pFld->GetFieldName()
202 2 : : pFld->ExpandField(bInClipboard) );
203 2 : pRet = new SwFldPortion( aStr );
204 : }
205 2 : break;
206 : }
207 : case RES_DBFLD:
208 : {
209 78 : if( !bName )
210 : {
211 78 : SwDBField* pDBFld = (SwDBField*)pFld;
212 78 : pDBFld->ChgBodyTxtFlag( ::lcl_IsInBody( pFrame ) );
213 : }
214 : {
215 : OUString const aStr( (bName)
216 0 : ? pFld->GetFieldName()
217 78 : : pFld->ExpandField(bInClipboard) );
218 78 : pRet = new SwFldPortion(aStr);
219 : }
220 78 : break;
221 : }
222 : case RES_REFPAGEGETFLD:
223 0 : if( !bName && pSh && !pSh->Imp()->IsUpdateExpFlds() )
224 : {
225 : ((SwRefPageGetField*)pFld)->ChangeExpansion(pFrame,
226 0 : static_txtattr_cast<SwTxtFld const*>(pHint));
227 : }
228 : {
229 : OUString const aStr( (bName)
230 0 : ? pFld->GetFieldName()
231 0 : : pFld->ExpandField(bInClipboard) );
232 0 : pRet = new SwFldPortion(aStr);
233 : }
234 0 : break;
235 :
236 : case RES_JUMPEDITFLD:
237 2 : if( !bName )
238 2 : pChFmt = ((SwJumpEditField*)pFld)->GetCharFmt();
239 2 : bNewFlyPor = true;
240 2 : bPlaceHolder = true;
241 2 : break;
242 : case RES_GETREFFLD:
243 1454 : subType = ((SwGetRefField*)pFld)->GetSubType();
244 : {
245 : OUString const str( (bName)
246 0 : ? pFld->GetFieldName()
247 1454 : : pFld->ExpandField(bInClipboard) );
248 1454 : pRet = new SwFldPortion(str);
249 : }
250 1454 : if(pRet)
251 : {
252 1454 : if( subType == REF_BOOKMARK )
253 1454 : ((SwFldPortion*)pRet)->m_nAttrFldType = ATTR_BOOKMARKFLD;
254 0 : else if( subType == REF_SETREFATTR )
255 0 : ((SwFldPortion*)pRet)->m_nAttrFldType = ATTR_SETREFATTRFLD;
256 1454 : break;
257 : }
258 : case RES_DATETIMEFLD:
259 20 : subType = ((SwDateTimeField*)pFld)->GetSubType();
260 : {
261 : OUString const str( (bName)
262 0 : ? pFld->GetFieldName()
263 20 : : pFld->ExpandField(bInClipboard) );
264 20 : pRet = new SwFldPortion(str);
265 : }
266 20 : if(pRet)
267 : {
268 20 : if( subType & DATEFLD )
269 14 : ((SwFldPortion*)pRet)->m_nAttrFldType= ATTR_DATEFLD;
270 6 : else if( subType & TIMEFLD )
271 6 : ((SwFldPortion*)pRet)->m_nAttrFldType = ATTR_TIMEFLD;
272 20 : break;
273 : }
274 : default:
275 : {
276 : OUString const aStr( (bName)
277 0 : ? pFld->GetFieldName()
278 306 : : pFld->ExpandField(bInClipboard) );
279 306 : pRet = new SwFldPortion(aStr);
280 : }
281 : }
282 :
283 5120 : if( bNewFlyPor )
284 : {
285 2 : SwFont *pTmpFnt = 0;
286 2 : if( !bName )
287 : {
288 2 : pTmpFnt = new SwFont( *pFnt );
289 2 : pTmpFnt->SetDiffFnt( &pChFmt->GetAttrSet(), pFrm->GetTxtNode()->getIDocumentSettingAccess() );
290 : }
291 : {
292 : OUString const aStr( (bName)
293 0 : ? pFld->GetFieldName()
294 2 : : pFld->ExpandField(bInClipboard) );
295 2 : pRet = new SwFldPortion(aStr, pTmpFnt, bPlaceHolder);
296 : }
297 : }
298 :
299 5120 : return pRet;
300 : }
301 :
302 80 : static SwFldPortion * lcl_NewMetaPortion(SwTxtAttr & rHint, const bool bPrefix)
303 : {
304 : ::sw::Meta *const pMeta(
305 80 : static_cast<SwFmtMeta &>(rHint.GetAttr()).GetMeta() );
306 80 : OUString fix;
307 80 : ::sw::MetaField *const pField( dynamic_cast< ::sw::MetaField * >(pMeta) );
308 : OSL_ENSURE(pField, "lcl_NewMetaPortion: no meta field?");
309 80 : if (pField)
310 : {
311 80 : pField->GetPrefixAndSuffix((bPrefix) ? &fix : 0, (bPrefix) ? 0 : &fix);
312 : }
313 80 : return new SwFldPortion( fix );
314 : }
315 :
316 : /** Try to create a new portion with zero length, for an end of a hint
317 : (where there is no CH_TXTATR). Because there may be multiple hint ends at a
318 : given index, m_nHintEndIndex is used to keep track of the already created
319 : portions. But the portions created here may actually be deleted again,
320 : due to Underflow. In that case, m_nHintEndIndex must be decremented,
321 : so the portion will be created again on the next line.
322 : */
323 : SwExpandPortion *
324 322951 : SwTxtFormatter::TryNewNoLengthPortion(SwTxtFormatInfo & rInfo)
325 : {
326 322951 : if (pHints)
327 : {
328 189008 : const sal_Int32 nIdx(rInfo.GetIdx());
329 476327 : while (m_nHintEndIndex < pHints->GetEndCount())
330 : {
331 231250 : SwTxtAttr & rHint( *pHints->GetEnd(m_nHintEndIndex) );
332 231250 : sal_Int32 const nEnd( *rHint.GetAnyEnd() );
333 231250 : if (nEnd > nIdx)
334 : {
335 132899 : break;
336 : }
337 98351 : ++m_nHintEndIndex;
338 98351 : if (nEnd == nIdx)
339 : {
340 97833 : if (RES_TXTATR_METAFIELD == rHint.Which())
341 : {
342 : SwFldPortion *const pPortion(
343 40 : lcl_NewMetaPortion(rHint, false));
344 40 : pPortion->SetNoLength(); // no CH_TXTATR at hint end!
345 40 : return pPortion;
346 : }
347 : }
348 : }
349 : }
350 322911 : return 0;
351 : }
352 :
353 10588 : SwLinePortion *SwTxtFormatter::NewExtraPortion( SwTxtFormatInfo &rInf )
354 : {
355 10588 : SwTxtAttr *pHint = GetAttr( rInf.GetIdx() );
356 10588 : SwLinePortion *pRet = 0;
357 10588 : if( !pHint )
358 : {
359 0 : pRet = new SwTxtPortion;
360 0 : pRet->SetLen( 1 );
361 0 : rInf.SetLen( 1 );
362 0 : return pRet;
363 : }
364 :
365 10588 : switch( pHint->Which() )
366 : {
367 : case RES_TXTATR_FLYCNT :
368 : {
369 4112 : pRet = NewFlyCntPortion( rInf, pHint );
370 4112 : break;
371 : }
372 : case RES_TXTATR_FTN :
373 : {
374 278 : pRet = NewFtnPortion( rInf, pHint );
375 278 : break;
376 : }
377 : case RES_TXTATR_FIELD :
378 : case RES_TXTATR_ANNOTATION :
379 : {
380 5120 : pRet = NewFldPortion( rInf, pHint );
381 5120 : break;
382 : }
383 : case RES_TXTATR_REFMARK :
384 : {
385 152 : pRet = new SwIsoRefPortion;
386 152 : break;
387 : }
388 : case RES_TXTATR_TOXMARK :
389 : {
390 398 : pRet = new SwIsoToxPortion;
391 398 : break;
392 : }
393 : case RES_TXTATR_METAFIELD:
394 : {
395 40 : pRet = lcl_NewMetaPortion( *pHint, true );
396 40 : break;
397 : }
398 : default: ;
399 : }
400 10588 : if( !pRet )
401 : {
402 488 : const OUString aNothing;
403 488 : pRet = new SwFldPortion( aNothing );
404 488 : rInf.SetLen( 1 );
405 : }
406 10588 : return pRet;
407 : }
408 :
409 : // OOXML spec says that w:rPr inside w:pPr specifies formatting for the paragraph mark symbol (i.e. the control
410 : // character than can be configured to be shown). However, in practice MSO also uses it as direct formatting
411 : // for numbering in that paragraph. I don't know if the problem is in the spec or in MSWord.
412 8414 : static void checkApplyParagraphMarkFormatToNumbering( SwFont* pNumFnt, SwTxtFormatInfo& rInf, const IDocumentSettingAccess* pIDSA )
413 : {
414 8414 : SwTxtNode* node = rInf.GetTxtFrm()->GetTxtNode();
415 8414 : if( !pIDSA->get(IDocumentSettingAccess::APPLY_PARAGRAPH_MARK_FORMAT_TO_NUMBERING ))
416 9646 : return;
417 7182 : if( SwpHints* hints = node->GetpSwpHints())
418 : {
419 7690 : for( size_t i = 0; i < hints->Count(); ++i )
420 : {
421 5522 : SwTxtAttr* hint = hints->GetTextHint( i );
422 : // Formatting for the paragraph mark is set to apply only to the (non-existent) extra character
423 : // the at end of the txt node.
424 15654 : if( hint->Which() == RES_TXTATR_AUTOFMT && hint->GetEnd() != NULL
425 10132 : && hint->GetStart() == *hint->GetEnd() && hint->GetStart() == node->Len())
426 : {
427 1460 : boost::shared_ptr<SfxItemSet> pSet(hint->GetAutoFmt().GetStyleHandle());
428 1460 : pNumFnt->SetDiffFnt( pSet.get(), pIDSA );
429 : }
430 : }
431 : }
432 : }
433 :
434 :
435 8612 : SwNumberPortion *SwTxtFormatter::NewNumberPortion( SwTxtFormatInfo &rInf ) const
436 : {
437 25836 : if( rInf.IsNumDone() || rInf.GetTxtStart() != nStart
438 17224 : || rInf.GetTxtStart() != rInf.GetIdx() )
439 0 : return 0;
440 :
441 8612 : SwNumberPortion *pRet = 0;
442 8612 : const SwTxtNode* pTxtNd = GetTxtFrm()->GetTxtNode();
443 8612 : const SwNumRule* pNumRule = pTxtNd->GetNumRule();
444 :
445 : // hat ein "gueltige" Nummer ?
446 8612 : if( pTxtNd->IsNumbered() && pTxtNd->IsCountedInList())
447 : {
448 8606 : int nLevel = pTxtNd->GetActualListLevel();
449 :
450 8606 : if (nLevel < 0)
451 0 : nLevel = 0;
452 :
453 8606 : if (nLevel >= MAXLEVEL)
454 0 : nLevel = MAXLEVEL - 1;
455 :
456 8606 : const SwNumFmt &rNumFmt = pNumRule->Get( nLevel );
457 8606 : const bool bLeft = SVX_ADJUST_LEFT == rNumFmt.GetNumAdjust();
458 8606 : const bool bCenter = SVX_ADJUST_CENTER == rNumFmt.GetNumAdjust();
459 : const bool bLabelAlignmentPosAndSpaceModeActive(
460 8606 : rNumFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT );
461 : const sal_uInt16 nMinDist = bLabelAlignmentPosAndSpaceModeActive
462 8606 : ? 0 : rNumFmt.GetCharTextDistance();
463 :
464 8606 : if( SVX_NUM_BITMAP == rNumFmt.GetNumberingType() )
465 : {
466 140 : pRet = new SwGrfNumPortion( (SwFrm*)GetTxtFrm(),
467 : pTxtNd->GetLabelFollowedBy(),
468 140 : rNumFmt.GetBrush(),
469 : rNumFmt.GetGraphicOrientation(),
470 140 : rNumFmt.GetGraphicSize(),
471 : bLeft, bCenter, nMinDist,
472 420 : bLabelAlignmentPosAndSpaceModeActive );
473 140 : long nTmpA = rInf.GetLast()->GetAscent();
474 140 : long nTmpD = rInf.GetLast()->Height() - nTmpA;
475 140 : if( !rInf.IsTest() )
476 70 : ((SwGrfNumPortion*)pRet)->SetBase( nTmpA, nTmpD, nTmpA, nTmpD );
477 : }
478 : else
479 : {
480 : // Der SwFont wird dynamisch angelegt und im CTOR uebergeben,
481 : // weil das CharFmt nur einen SV-Font zurueckliefert.
482 : // Im Dtor vom SwNumberPortion wird der SwFont deletet.
483 8466 : SwFont *pNumFnt = 0;
484 8466 : const SwAttrSet* pFmt = rNumFmt.GetCharFmt() ?
485 3706 : &rNumFmt.GetCharFmt()->GetAttrSet() :
486 12172 : NULL;
487 8466 : const IDocumentSettingAccess* pIDSA = pTxtNd->getIDocumentSettingAccess();
488 :
489 8466 : if( SVX_NUM_CHAR_SPECIAL == rNumFmt.GetNumberingType() )
490 : {
491 6100 : const vcl::Font *pFmtFnt = rNumFmt.GetBulletFont();
492 :
493 : // Build a new bullet font basing on the current paragraph font:
494 :
495 6100 : pNumFnt = new SwFont( &rInf.GetCharAttr(), pIDSA );
496 :
497 : // #i53199#
498 6100 : if ( !pIDSA->get(IDocumentSettingAccess::DO_NOT_RESET_PARA_ATTRS_FOR_NUM_FONT) )
499 : {
500 : // i18463:
501 : // Underline style of paragraph font should not be considered
502 : // Overline style of paragraph font should not be considered
503 : // Weight style of paragraph font should not be considered
504 : // Posture style of paragraph font should not be considered
505 6100 : pNumFnt->SetUnderline( UNDERLINE_NONE );
506 6100 : pNumFnt->SetOverline( UNDERLINE_NONE );
507 6100 : pNumFnt->SetItalic( ITALIC_NONE, SW_LATIN );
508 6100 : pNumFnt->SetItalic( ITALIC_NONE, SW_CJK );
509 6100 : pNumFnt->SetItalic( ITALIC_NONE, SW_CTL );
510 6100 : pNumFnt->SetWeight( WEIGHT_NORMAL, SW_LATIN );
511 6100 : pNumFnt->SetWeight( WEIGHT_NORMAL, SW_CJK );
512 6100 : pNumFnt->SetWeight( WEIGHT_NORMAL, SW_CTL );
513 : }
514 :
515 : // Apply the explicit attributes from the character style
516 : // associated with the numering to the new bullet font.
517 :
518 6100 : if( pFmt )
519 2436 : pNumFnt->SetDiffFnt( pFmt, pIDSA );
520 :
521 6100 : checkApplyParagraphMarkFormatToNumbering( pNumFnt, rInf, pIDSA );
522 :
523 6100 : if ( pFmtFnt )
524 : {
525 5978 : const sal_uInt8 nAct = pNumFnt->GetActual();
526 5978 : pNumFnt->SetFamily( pFmtFnt->GetFamily(), nAct );
527 5978 : pNumFnt->SetName( pFmtFnt->GetName(), nAct );
528 5978 : pNumFnt->SetStyleName( pFmtFnt->GetStyleName(), nAct );
529 5978 : pNumFnt->SetCharSet( pFmtFnt->GetCharSet(), nAct );
530 5978 : pNumFnt->SetPitch( pFmtFnt->GetPitch(), nAct );
531 : }
532 :
533 : // we do not allow a vertical font
534 6100 : pNumFnt->SetVertical( pNumFnt->GetOrientation(),
535 12200 : pFrm->IsVertical() );
536 :
537 : // --> OD 2008-01-23 #newlistelevelattrs#
538 6100 : pRet = new SwBulletPortion( rNumFmt.GetBulletChar(),
539 : pTxtNd->GetLabelFollowedBy(),
540 : pNumFnt,
541 : bLeft, bCenter, nMinDist,
542 6100 : bLabelAlignmentPosAndSpaceModeActive );
543 : }
544 : else
545 : {
546 2366 : OUString aTxt( pTxtNd->GetNumString() );
547 2366 : if ( !aTxt.isEmpty() )
548 : {
549 2314 : aTxt += pTxtNd->GetLabelFollowedBy();
550 : }
551 :
552 : // 7974: Nicht nur eine Optimierung...
553 : // Eine Numberportion ohne Text wird die Breite von 0
554 : // erhalten. Die nachfolgende Textportion wird im BreakLine
555 : // in das BreakCut laufen, obwohl rInf.GetLast()->GetFlyPortion()
556 : // vorliegt!
557 2366 : if( !aTxt.isEmpty() )
558 : {
559 :
560 : // Build a new numbering font basing on the current paragraph font:
561 :
562 2314 : pNumFnt = new SwFont( &rInf.GetCharAttr(), pIDSA );
563 :
564 : // #i53199#
565 2314 : if ( !pIDSA->get(IDocumentSettingAccess::DO_NOT_RESET_PARA_ATTRS_FOR_NUM_FONT) )
566 : {
567 : // i18463:
568 : // Underline style of paragraph font should not be considered
569 2314 : pNumFnt->SetUnderline( UNDERLINE_NONE );
570 : // Overline style of paragraph font should not be considered
571 2314 : pNumFnt->SetOverline( UNDERLINE_NONE );
572 : }
573 :
574 : // Apply the explicit attributes from the character style
575 : // associated with the numering to the new bullet font.
576 :
577 2314 : if( pFmt )
578 1258 : pNumFnt->SetDiffFnt( pFmt, pIDSA );
579 :
580 2314 : checkApplyParagraphMarkFormatToNumbering( pNumFnt, rInf, pIDSA );
581 :
582 : // we do not allow a vertical font
583 2314 : pNumFnt->SetVertical( pNumFnt->GetOrientation(), pFrm->IsVertical() );
584 :
585 : pRet = new SwNumberPortion( aTxt, pNumFnt,
586 : bLeft, bCenter, nMinDist,
587 2314 : bLabelAlignmentPosAndSpaceModeActive );
588 2366 : }
589 : }
590 : }
591 : }
592 8612 : return pRet;
593 270 : }
594 :
595 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|