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 :
22 : #include <string.h>
23 : #include <vcl/font.hxx>
24 : #include <editeng/brushitem.hxx>
25 : #include <editeng/lrspitem.hxx>
26 : #include <editeng/numitem.hxx>
27 : #include <svl/grabbagitem.hxx>
28 : #include <fmtornt.hxx>
29 : #include <doc.hxx>
30 : #include <pam.hxx>
31 : #include <charfmt.hxx>
32 : #include <paratr.hxx>
33 : #include <frmfmt.hxx>
34 : #include <ndtxt.hxx>
35 : #include <docary.hxx>
36 : #include <docsh.hxx>
37 : #include <SwStyleNameMapper.hxx>
38 :
39 : // Needed to load default bullet list configuration
40 : #include <unotools/configitem.hxx>
41 :
42 : #include <numrule.hxx>
43 : #include <SwNodeNum.hxx>
44 :
45 : #include <boost/unordered_map.hpp>
46 :
47 : #include <list.hxx>
48 : #include <algorithm>
49 :
50 : #include <unotools/saveopt.hxx>
51 :
52 : #include <IDocumentListsAccess.hxx>
53 : #include <IDocumentStylePoolAccess.hxx>
54 : #include <IDocumentState.hxx>
55 :
56 : using namespace ::com::sun::star;
57 :
58 : sal_uInt16 SwNumRule::mnRefCount = 0;
59 : SwNumFmt* SwNumRule::maBaseFmts[ RULE_END ][ MAXLEVEL ] = {
60 : {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
61 :
62 : SwNumFmt* SwNumRule::maLabelAlignmentBaseFmts[ RULE_END ][ MAXLEVEL ] = {
63 : {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
64 :
65 : const sal_uInt16 SwNumRule::maDefNumIndents[ MAXLEVEL ] = {
66 : //inch: 0,5 1,0 1,5 2,0 2,5 3,0 3,5 4,0 4,5 5,0
67 : 1440/4, 1440/2, 1440*3/4, 1440, 1440*5/4, 1440*3/2, 1440*7/4, 1440*2,
68 : 1440*9/4, 1440*5/2
69 : };
70 :
71 14398 : OUString SwNumRule::GetOutlineRuleName()
72 : {
73 14398 : return OUString("Outline");
74 : }
75 :
76 16142864 : const SwNumFmt& SwNumRule::Get( sal_uInt16 i ) const
77 : {
78 : OSL_ASSERT( i < MAXLEVEL && meRuleType < RULE_END );
79 16142864 : return maFmts[ i ]
80 10140066 : ? *maFmts[ i ]
81 6002798 : : ( meDefaultNumberFormatPositionAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION
82 0 : ? *maBaseFmts[ meRuleType ][ i ]
83 48428592 : : *maLabelAlignmentBaseFmts[ meRuleType ][ i ] );
84 : }
85 :
86 10684734 : const SwNumFmt* SwNumRule::GetNumFmt( sal_uInt16 i ) const
87 : {
88 10684734 : const SwNumFmt * pResult = NULL;
89 :
90 : OSL_ASSERT( i < MAXLEVEL && meRuleType < RULE_END );
91 10684734 : if ( i < MAXLEVEL && meRuleType < RULE_END)
92 : {
93 10684734 : pResult = maFmts[ i ];
94 : }
95 :
96 10684734 : return pResult;
97 : }
98 :
99 : // #i91400#
100 7846 : void SwNumRule::SetName( const OUString & rName,
101 : IDocumentListsAccess& rDocListAccess)
102 : {
103 7846 : if ( msName != rName )
104 : {
105 30 : if (mpNumRuleMap)
106 : {
107 0 : mpNumRuleMap->erase(msName);
108 0 : (*mpNumRuleMap)[rName] = this;
109 :
110 0 : if ( !GetDefaultListId().isEmpty() )
111 : {
112 0 : rDocListAccess.trackChangeOfListStyleName( msName, rName );
113 : }
114 : }
115 :
116 30 : msName = rName;
117 : }
118 7846 : }
119 :
120 358520 : void SwNumRule::GetTxtNodeList( SwNumRule::tTxtNodeList& rTxtNodeList ) const
121 : {
122 358520 : rTxtNodeList = maTxtNodeList;
123 358520 : }
124 :
125 1816 : SwNumRule::tTxtNodeList::size_type SwNumRule::GetTxtNodeListSize() const
126 : {
127 1816 : return maTxtNodeList.size();
128 : }
129 :
130 7670 : void SwNumRule::AddTxtNode( SwTxtNode& rTxtNode )
131 : {
132 : tTxtNodeList::iterator aIter =
133 7670 : std::find( maTxtNodeList.begin(), maTxtNodeList.end(), &rTxtNode );
134 :
135 7670 : if ( aIter == maTxtNodeList.end() )
136 : {
137 7670 : maTxtNodeList.push_back( &rTxtNode );
138 : }
139 7670 : }
140 :
141 7670 : void SwNumRule::RemoveTxtNode( SwTxtNode& rTxtNode )
142 : {
143 : tTxtNodeList::iterator aIter =
144 7670 : std::find( maTxtNodeList.begin(), maTxtNodeList.end(), &rTxtNode );
145 :
146 7670 : if ( aIter != maTxtNodeList.end() )
147 : {
148 7670 : maTxtNodeList.erase( aIter );
149 : }
150 7670 : }
151 :
152 42684 : void SwNumRule::SetNumRuleMap(boost::unordered_map<OUString, SwNumRule *, OUStringHash> *
153 : pNumRuleMap)
154 : {
155 42684 : mpNumRuleMap = pNumRuleMap;
156 42684 : }
157 :
158 46780 : sal_uInt16 SwNumRule::GetNumIndent( sal_uInt8 nLvl )
159 : {
160 : OSL_ENSURE( MAXLEVEL > nLvl, "NumLevel is out of range" );
161 46780 : return maDefNumIndents[ nLvl ];
162 : }
163 :
164 30 : sal_uInt16 SwNumRule::GetBullIndent( sal_uInt8 nLvl )
165 : {
166 : OSL_ENSURE( MAXLEVEL > nLvl, "NumLevel is out of range" );
167 30 : return maDefNumIndents[ nLvl ];
168 : }
169 :
170 17168 : static void lcl_SetRuleChgd( SwTxtNode& rNd, sal_uInt8 nLevel )
171 : {
172 17168 : if( rNd.GetActualListLevel() == nLevel )
173 2044 : rNd.NumRuleChgd();
174 17168 : }
175 :
176 187024 : SwNumFmt::SwNumFmt() :
177 : SvxNumberFormat(SVX_NUM_ARABIC),
178 : SwClient( 0 ),
179 187024 : pVertOrient(new SwFmtVertOrient( 0, text::VertOrientation::NONE))
180 374048 : ,cGrfBulletCP(USHRT_MAX)//For i120928,record the cp info of graphic within bullet
181 : {
182 187024 : }
183 :
184 9810254 : SwNumFmt::SwNumFmt( const SwNumFmt& rFmt) :
185 : SvxNumberFormat(rFmt),
186 : SwClient( rFmt.GetRegisteredInNonConst() ),
187 19620508 : pVertOrient(new SwFmtVertOrient( 0, rFmt.GetVertOrient()))
188 29430762 : ,cGrfBulletCP(rFmt.cGrfBulletCP)//For i120928,record the cp info of graphic within bullet
189 : {
190 9810254 : sal_Int16 eMyVertOrient = rFmt.GetVertOrient();
191 9810254 : SetGraphicBrush( rFmt.GetBrush(), &rFmt.GetGraphicSize(),
192 9810254 : &eMyVertOrient);
193 9810254 : }
194 :
195 3038460 : SwNumFmt::SwNumFmt(const SvxNumberFormat& rNumFmt, SwDoc* pDoc)
196 : : SvxNumberFormat(rNumFmt)
197 6076920 : , pVertOrient(new SwFmtVertOrient( 0, rNumFmt.GetVertOrient()))
198 9115380 : , cGrfBulletCP(USHRT_MAX)
199 : {
200 3038460 : sal_Int16 eMyVertOrient = rNumFmt.GetVertOrient();
201 3038460 : SetGraphicBrush( rNumFmt.GetBrush(), &rNumFmt.GetGraphicSize(),
202 3038460 : &eMyVertOrient);
203 3038460 : const OUString rCharStyleName = rNumFmt.SvxNumberFormat::GetCharFmtName();
204 3038460 : if( !rCharStyleName.isEmpty() )
205 : {
206 19626 : SwCharFmt* pCFmt = pDoc->FindCharFmtByName( rCharStyleName );
207 19626 : if( !pCFmt )
208 : {
209 : sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( rCharStyleName,
210 0 : nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
211 : pCFmt = nId != USHRT_MAX
212 0 : ? pDoc->getIDocumentStylePoolAccess().GetCharFmtFromPool( nId )
213 0 : : pDoc->MakeCharFmt( rCharStyleName, 0 );
214 : }
215 19626 : pCFmt->Add( this );
216 : }
217 3018834 : else if( GetRegisteredIn() )
218 0 : GetRegisteredInNonConst()->Remove( this );
219 3038460 : }
220 :
221 33426954 : SwNumFmt::~SwNumFmt()
222 : {
223 13035278 : delete pVertOrient;
224 20391676 : }
225 :
226 0 : void SwNumFmt::NotifyGraphicArrived()
227 : {
228 0 : if( GetCharFmt() )
229 0 : UpdateNumNodes( (SwDoc*)GetCharFmt()->GetDoc() );
230 0 : }
231 :
232 : // #i22362#
233 4494 : bool SwNumFmt::IsEnumeration() const
234 : {
235 : // #i30655# native numbering did not work any longer
236 : // using this code. Therefore HBRINKM and I agreed upon defining
237 : // IsEnumeration() as !IsItemize()
238 4494 : return !IsItemize();
239 : }
240 :
241 5930 : bool SwNumFmt::IsItemize() const
242 : {
243 : bool bResult;
244 :
245 5930 : switch(GetNumberingType())
246 : {
247 : case SVX_NUM_CHAR_SPECIAL:
248 : case SVX_NUM_BITMAP:
249 696 : bResult = true;
250 :
251 696 : break;
252 :
253 : default:
254 5234 : bResult = false;
255 : }
256 :
257 5930 : return bResult;
258 :
259 : }
260 :
261 20440 : SwNumFmt& SwNumFmt::operator=( const SwNumFmt& rNumFmt)
262 : {
263 20440 : SvxNumberFormat::operator=(rNumFmt);
264 20440 : if( rNumFmt.GetRegisteredIn() )
265 20406 : rNumFmt.GetRegisteredInNonConst()->Add( this );
266 34 : else if( GetRegisteredIn() )
267 0 : GetRegisteredInNonConst()->Remove( this );
268 : //For i120928,record the cp info of graphic within bullet
269 20440 : cGrfBulletCP = rNumFmt.cGrfBulletCP;
270 20440 : return *this;
271 : }
272 :
273 7483188 : bool SwNumFmt::operator==( const SwNumFmt& rNumFmt) const
274 : {
275 14586314 : bool bRet = SvxNumberFormat::operator==(rNumFmt) &&
276 14586314 : GetRegisteredIn() == rNumFmt.GetRegisteredIn();
277 7483188 : return bRet;
278 : }
279 :
280 29668 : void SwNumFmt::SetCharFmt( SwCharFmt* pChFmt)
281 : {
282 29668 : if( pChFmt )
283 25658 : pChFmt->Add( this );
284 4010 : else if( GetRegisteredIn() )
285 0 : GetRegisteredInNonConst()->Remove( this );
286 29668 : }
287 :
288 56040 : void SwNumFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
289 : {
290 : // Look for the NumRules object in the Doc where this NumFormat is set.
291 : // The format does not need to exist!
292 56040 : const SwCharFmt* pFmt = 0;
293 56040 : sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
294 56040 : switch( nWhich )
295 : {
296 : case RES_ATTRSET_CHG:
297 : case RES_FMT_CHG:
298 56040 : pFmt = GetCharFmt();
299 56040 : break;
300 : }
301 :
302 56040 : if( pFmt && !pFmt->GetDoc()->IsInDtor() )
303 30358 : UpdateNumNodes( (SwDoc*)pFmt->GetDoc() );
304 : else
305 25682 : CheckRegistration( pOld, pNew );
306 56040 : }
307 :
308 19846 : void SwNumFmt::SetCharFmtName(const OUString& rSet)
309 : {
310 19846 : SvxNumberFormat::SetCharFmtName(rSet);
311 19846 : }
312 :
313 0 : OUString SwNumFmt::GetCharFmtName() const
314 : {
315 0 : if((SwCharFmt*)GetRegisteredIn())
316 0 : return ((SwCharFmt*)GetRegisteredIn())->GetName();
317 :
318 0 : return OUString();
319 : }
320 :
321 12848792 : void SwNumFmt::SetGraphicBrush( const SvxBrushItem* pBrushItem, const Size* pSize,
322 : const sal_Int16* pOrient)
323 : {
324 12848792 : if(pOrient)
325 12848714 : pVertOrient->SetVertOrient( *pOrient );
326 12848792 : SvxNumberFormat::SetGraphicBrush( pBrushItem, pSize, pOrient);
327 12848792 : }
328 :
329 0 : void SwNumFmt::SetVertOrient(sal_Int16 eSet)
330 : {
331 0 : SvxNumberFormat::SetVertOrient(eSet);
332 0 : }
333 :
334 19620508 : sal_Int16 SwNumFmt::GetVertOrient() const
335 : {
336 19620508 : return SvxNumberFormat::GetVertOrient();
337 : }
338 :
339 30358 : void SwNumFmt::UpdateNumNodes( SwDoc* pDoc )
340 : {
341 30358 : bool bDocIsModified = pDoc->getIDocumentState().IsModified();
342 30358 : bool bFnd = false;
343 : const SwNumRule* pRule;
344 831146 : for( sal_uInt16 n = pDoc->GetNumRuleTbl().size(); !bFnd && n; )
345 : {
346 770430 : pRule = pDoc->GetNumRuleTbl()[ --n ];
347 8298482 : for( sal_uInt8 i = 0; i < MAXLEVEL; ++i )
348 7556002 : if( pRule->GetNumFmt( i ) == this )
349 : {
350 27950 : SwNumRule::tTxtNodeList aTxtNodeList;
351 27950 : pRule->GetTxtNodeList( aTxtNodeList );
352 135354 : for ( SwNumRule::tTxtNodeList::iterator aIter = aTxtNodeList.begin();
353 90236 : aIter != aTxtNodeList.end(); ++aIter )
354 : {
355 17168 : lcl_SetRuleChgd( *(*aIter), i );
356 : }
357 27950 : bFnd = true;
358 27950 : break;
359 : }
360 : }
361 :
362 30358 : if( bFnd && !bDocIsModified )
363 0 : pDoc->getIDocumentState().ResetModified();
364 30358 : }
365 :
366 646 : const SwFmtVertOrient* SwNumFmt::GetGraphicOrientation() const
367 : {
368 646 : sal_Int16 eOrient = SvxNumberFormat::GetVertOrient();
369 646 : if(text::VertOrientation::NONE == eOrient)
370 646 : return 0;
371 : else
372 : {
373 0 : pVertOrient->SetVertOrient(eOrient);
374 0 : return pVertOrient;
375 : }
376 : }
377 :
378 42660 : SwNumRule::SwNumRule( const OUString& rNm,
379 : const SvxNumberFormat::SvxNumPositionAndSpaceMode eDefaultNumberFormatPositionAndSpaceMode,
380 : SwNumRuleType eType,
381 : bool bAutoFlg )
382 : : maTxtNodeList(),
383 : maParagraphStyleList(),
384 : mpNumRuleMap(0),
385 : msName( rNm ),
386 : meRuleType( eType ),
387 : mnPoolFmtId( USHRT_MAX ),
388 : mnPoolHelpId( USHRT_MAX ),
389 : mnPoolHlpFileId( UCHAR_MAX ),
390 : mbAutoRuleFlag( bAutoFlg ),
391 : mbInvalidRuleFlag( true ),
392 : mbContinusNum( false ),
393 : mbAbsSpaces( false ),
394 : mbHidden( false ),
395 : mbCountPhantoms( true ),
396 : meDefaultNumberFormatPositionAndSpaceMode( eDefaultNumberFormatPositionAndSpaceMode ),
397 42660 : msDefaultListId()
398 : {
399 42660 : if( !mnRefCount++ ) // for the first time, initialize
400 : {
401 : SwNumFmt* pFmt;
402 : sal_uInt8 n;
403 :
404 : // numbering:
405 : // position-and-space mode LABEL_WIDTH_AND_POSITION:
406 51425 : for( n = 0; n < MAXLEVEL; ++n )
407 : {
408 46750 : pFmt = new SwNumFmt;
409 46750 : pFmt->SetIncludeUpperLevels( 1 );
410 46750 : pFmt->SetStart( 1 );
411 46750 : pFmt->SetLSpace( lNumIndent );
412 46750 : pFmt->SetAbsLSpace( lNumIndent + SwNumRule::GetNumIndent( n ) );
413 46750 : pFmt->SetFirstLineOffset( lNumFirstLineOffset );
414 46750 : pFmt->SetSuffix( "." );
415 46750 : pFmt->SetBulletChar( numfunc::GetBulletChar(n));
416 46750 : SwNumRule::maBaseFmts[ NUM_RULE ][ n ] = pFmt;
417 : }
418 : // position-and-space mode LABEL_ALIGNMENT
419 : // first line indent of general numbering in inch: -0,25 inch
420 4675 : const long cFirstLineIndent = -1440/4;
421 : // indent values of general numbering in inch:
422 : // 0,5 0,75 1,0 1,25 1,5
423 : // 1,75 2,0 2,25 2,5 2,75
424 : const long cIndentAt[ MAXLEVEL ] = {
425 : 1440/2, 1440*3/4, 1440, 1440*5/4, 1440*3/2,
426 4675 : 1440*7/4, 1440*2, 1440*9/4, 1440*5/2, 1440*11/4 };
427 51425 : for( n = 0; n < MAXLEVEL; ++n )
428 : {
429 46750 : pFmt = new SwNumFmt;
430 46750 : pFmt->SetIncludeUpperLevels( 1 );
431 46750 : pFmt->SetStart( 1 );
432 46750 : pFmt->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT );
433 46750 : pFmt->SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
434 46750 : pFmt->SetListtabPos( cIndentAt[ n ] );
435 46750 : pFmt->SetFirstLineIndent( cFirstLineIndent );
436 46750 : pFmt->SetIndentAt( cIndentAt[ n ] );
437 46750 : pFmt->SetSuffix( "." );
438 46750 : pFmt->SetBulletChar( numfunc::GetBulletChar(n));
439 46750 : SwNumRule::maLabelAlignmentBaseFmts[ NUM_RULE ][ n ] = pFmt;
440 : }
441 :
442 : // outline:
443 : // position-and-space mode LABEL_WIDTH_AND_POSITION:
444 51425 : for( n = 0; n < MAXLEVEL; ++n )
445 : {
446 46750 : pFmt = new SwNumFmt;
447 46750 : pFmt->SetNumberingType(SVX_NUM_NUMBER_NONE);
448 46750 : pFmt->SetIncludeUpperLevels( MAXLEVEL );
449 46750 : pFmt->SetStart( 1 );
450 46750 : pFmt->SetCharTextDistance( lOutlineMinTextDistance );
451 46750 : pFmt->SetBulletChar( numfunc::GetBulletChar(n));
452 46750 : SwNumRule::maBaseFmts[ OUTLINE_RULE ][ n ] = pFmt;
453 : }
454 : // position-and-space mode LABEL_ALIGNMENT:
455 : // indent values of default outline numbering in inch:
456 : // 0,3 0,4 0,5 0,6 0,7
457 : // 0,8 0,9 1,0 1,1 1,2
458 : const long cOutlineIndentAt[ MAXLEVEL ] = {
459 : 1440*3/10, 1440*2/5, 1440/2, 1440*3/5, 1440*7/10,
460 4675 : 1440*4/5, 1440*9/10, 1440, 1440*11/10, 1440*6/5 };
461 51425 : for( n = 0; n < MAXLEVEL; ++n )
462 : {
463 46750 : pFmt = new SwNumFmt;
464 46750 : pFmt->SetNumberingType(SVX_NUM_NUMBER_NONE);
465 46750 : pFmt->SetIncludeUpperLevels( MAXLEVEL );
466 46750 : pFmt->SetStart( 1 );
467 46750 : pFmt->SetPositionAndSpaceMode( SvxNumberFormat::LABEL_ALIGNMENT );
468 46750 : pFmt->SetLabelFollowedBy( SvxNumberFormat::LISTTAB );
469 46750 : pFmt->SetListtabPos( cOutlineIndentAt[ n ] );
470 46750 : pFmt->SetFirstLineIndent( -cOutlineIndentAt[ n ] );
471 46750 : pFmt->SetIndentAt( cOutlineIndentAt[ n ] );
472 46750 : pFmt->SetBulletChar( numfunc::GetBulletChar(n));
473 46750 : SwNumRule::maLabelAlignmentBaseFmts[ OUTLINE_RULE ][ n ] = pFmt;
474 : }
475 : }
476 42660 : memset( maFmts, 0, sizeof( maFmts ));
477 : OSL_ENSURE( !msName.isEmpty(), "NumRule without a name!" );
478 42660 : }
479 :
480 627664 : SwNumRule::SwNumRule( const SwNumRule& rNumRule )
481 : : maTxtNodeList(),
482 : maParagraphStyleList(),
483 : mpNumRuleMap(0),
484 : msName( rNumRule.msName ),
485 : meRuleType( rNumRule.meRuleType ),
486 627664 : mnPoolFmtId( rNumRule.GetPoolFmtId() ),
487 627664 : mnPoolHelpId( rNumRule.GetPoolHelpId() ),
488 627664 : mnPoolHlpFileId( rNumRule.GetPoolHlpFileId() ),
489 : mbAutoRuleFlag( rNumRule.mbAutoRuleFlag ),
490 : mbInvalidRuleFlag( true ),
491 : mbContinusNum( rNumRule.mbContinusNum ),
492 : mbAbsSpaces( rNumRule.mbAbsSpaces ),
493 : mbHidden( rNumRule.mbHidden ),
494 : mbCountPhantoms( true ),
495 : meDefaultNumberFormatPositionAndSpaceMode( rNumRule.meDefaultNumberFormatPositionAndSpaceMode ),
496 2510656 : msDefaultListId( rNumRule.msDefaultListId )
497 : {
498 627664 : ++mnRefCount;
499 627664 : memset( maFmts, 0, sizeof( maFmts ));
500 6904304 : for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
501 6276640 : if( rNumRule.maFmts[ n ] )
502 3432840 : Set( n, *rNumRule.maFmts[ n ] );
503 627664 : }
504 :
505 1340622 : SwNumRule::~SwNumRule()
506 : {
507 7373421 : for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
508 6703110 : delete maFmts[ n ];
509 :
510 670311 : if (mpNumRuleMap)
511 : {
512 42677 : mpNumRuleMap->erase(GetName());
513 : }
514 :
515 670311 : if( !--mnRefCount ) // the last one closes the door (?)
516 : {
517 : // Numbering:
518 4666 : SwNumFmt** ppFmts = (SwNumFmt**)SwNumRule::maBaseFmts;
519 : int n;
520 :
521 51326 : for( n = 0; n < MAXLEVEL; ++n, ++ppFmts )
522 46660 : delete *ppFmts, *ppFmts = 0;
523 :
524 : // Outline:
525 51326 : for( n = 0; n < MAXLEVEL; ++n, ++ppFmts )
526 46660 : delete *ppFmts, *ppFmts = 0;
527 :
528 4666 : ppFmts = (SwNumFmt**)SwNumRule::maLabelAlignmentBaseFmts;
529 51326 : for( n = 0; n < MAXLEVEL; ++n, ++ppFmts )
530 46660 : delete *ppFmts, *ppFmts = 0;
531 51326 : for( n = 0; n < MAXLEVEL; ++n, ++ppFmts )
532 46660 : delete *ppFmts, *ppFmts = 0;
533 : }
534 :
535 670311 : maTxtNodeList.clear();
536 670311 : maParagraphStyleList.clear();
537 670311 : }
538 :
539 588634 : void SwNumRule::CheckCharFmts( SwDoc* pDoc )
540 : {
541 : SwCharFmt* pFmt;
542 6474974 : for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
543 5927852 : if( maFmts[ n ] && 0 != ( pFmt = maFmts[ n ]->GetCharFmt() ) &&
544 41512 : pFmt->GetDoc() != pDoc )
545 : {
546 : // copy
547 0 : SwNumFmt* pNew = new SwNumFmt( *maFmts[ n ] );
548 0 : pNew->SetCharFmt( pDoc->CopyCharFmt( *pFmt ) );
549 0 : delete maFmts[ n ];
550 0 : maFmts[ n ] = pNew;
551 : }
552 588634 : }
553 :
554 7838 : SwNumRule& SwNumRule::operator=( const SwNumRule& rNumRule )
555 : {
556 7838 : if( this != &rNumRule )
557 : {
558 86218 : for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
559 78380 : Set( n, rNumRule.maFmts[ n ] );
560 :
561 7838 : meRuleType = rNumRule.meRuleType;
562 7838 : msName = rNumRule.msName;
563 7838 : mbAutoRuleFlag = rNumRule.mbAutoRuleFlag;
564 7838 : mbInvalidRuleFlag = true;
565 7838 : mbContinusNum = rNumRule.mbContinusNum;
566 7838 : mbAbsSpaces = rNumRule.mbAbsSpaces;
567 7838 : mbHidden = rNumRule.mbHidden;
568 7838 : mnPoolFmtId = rNumRule.GetPoolFmtId();
569 7838 : mnPoolHelpId = rNumRule.GetPoolHelpId();
570 7838 : mnPoolHlpFileId = rNumRule.GetPoolHlpFileId();
571 : }
572 7838 : return *this;
573 : }
574 :
575 2610 : bool SwNumRule::operator==( const SwNumRule& rRule ) const
576 : {
577 5220 : bool bRet = meRuleType == rRule.meRuleType &&
578 5220 : msName == rRule.msName &&
579 5220 : mbAutoRuleFlag == rRule.mbAutoRuleFlag &&
580 5220 : mbContinusNum == rRule.mbContinusNum &&
581 5220 : mbAbsSpaces == rRule.mbAbsSpaces &&
582 5220 : mnPoolFmtId == rRule.GetPoolFmtId() &&
583 7830 : mnPoolHelpId == rRule.GetPoolHelpId() &&
584 5220 : mnPoolHlpFileId == rRule.GetPoolHlpFileId();
585 2610 : if( bRet )
586 : {
587 26854 : for( sal_uInt8 n = 0; n < MAXLEVEL; ++n )
588 24444 : if( !( rRule.Get( n ) == Get( n ) ))
589 : {
590 200 : bRet = false;
591 200 : break;
592 : }
593 : }
594 2610 : return bRet;
595 : }
596 :
597 3815658 : void SwNumRule::Set( sal_uInt16 i, const SwNumFmt& rNumFmt )
598 : {
599 : OSL_ENSURE( i < MAXLEVEL, "Serious defect, please inform OD" );
600 3815658 : if( i < MAXLEVEL )
601 : {
602 3815658 : if( !maFmts[ i ] || !(rNumFmt == Get( i )) )
603 : {
604 3789864 : delete maFmts[ i ];
605 3789864 : maFmts[ i ] = new SwNumFmt( rNumFmt );
606 3789864 : mbInvalidRuleFlag = true;
607 : }
608 : }
609 3815658 : }
610 :
611 1978662 : void SwNumRule::Set( sal_uInt16 i, const SwNumFmt* pNumFmt )
612 : {
613 : OSL_ENSURE( i < MAXLEVEL, "Serious defect, please inform OD" );
614 1978662 : if( i >= MAXLEVEL )
615 1978662 : return;
616 1978662 : SwNumFmt* pOld = maFmts[ i ];
617 1978662 : if( !pOld )
618 : {
619 359708 : if( pNumFmt )
620 : {
621 341534 : maFmts[ i ] = new SwNumFmt( *pNumFmt );
622 341534 : mbInvalidRuleFlag = true;
623 : }
624 : }
625 1618954 : else if( !pNumFmt )
626 0 : delete pOld, maFmts[ i ] = 0, mbInvalidRuleFlag = true;
627 1618954 : else if( *pOld != *pNumFmt )
628 20440 : *pOld = *pNumFmt, mbInvalidRuleFlag = true;
629 : }
630 :
631 294 : OUString SwNumRule::MakeNumString( const SwNodeNum& rNum, bool bInclStrings,
632 : bool bOnlyArabic ) const
633 : {
634 294 : if (rNum.IsCounted())
635 : return MakeNumString(rNum.GetNumberVector(),
636 294 : bInclStrings, bOnlyArabic, MAXLEVEL);
637 :
638 0 : return OUString();
639 : }
640 :
641 7050 : OUString SwNumRule::MakeNumString( const SwNumberTree::tNumberVector & rNumVector,
642 : const bool bInclStrings,
643 : const bool bOnlyArabic,
644 : const unsigned int _nRestrictToThisLevel,
645 : SwNumRule::Extremities* pExtremities ) const
646 : {
647 7050 : OUString aStr;
648 :
649 7050 : unsigned int nLevel = rNumVector.size() - 1;
650 :
651 7050 : if ( pExtremities )
652 1744 : pExtremities->nPrefixChars = pExtremities->nSuffixChars = 0;
653 :
654 7050 : if ( nLevel > _nRestrictToThisLevel )
655 : {
656 676 : nLevel = _nRestrictToThisLevel;
657 : }
658 :
659 7050 : if (nLevel < MAXLEVEL)
660 : {
661 7050 : const SwNumFmt& rMyNFmt = Get( static_cast<sal_uInt16>(nLevel) );
662 :
663 : {
664 7050 : sal_uInt8 i = static_cast<sal_uInt8>(nLevel);
665 :
666 21146 : if( !IsContinusNum() &&
667 : // - do not include upper levels, if level isn't numbered.
668 13678 : rMyNFmt.GetNumberingType() != SVX_NUM_NUMBER_NONE &&
669 6628 : rMyNFmt.GetIncludeUpperLevels() ) // Just the own level?
670 : {
671 6628 : sal_uInt8 n = rMyNFmt.GetIncludeUpperLevels();
672 6628 : if( 1 < n )
673 : {
674 452 : if( i+1 >= n )
675 452 : i -= n - 1;
676 : else
677 0 : i = 0;
678 : }
679 : }
680 :
681 15054 : for( ; i <= nLevel; ++i )
682 : {
683 8004 : const SwNumFmt& rNFmt = Get( i );
684 8004 : if( SVX_NUM_NUMBER_NONE == rNFmt.GetNumberingType() )
685 : {
686 : // Should 1.1.1 --> 2. NoNum --> 1..1 or 1.1 ??
687 : // if( i != rNum.nMyLevel )
688 : // aStr += ".";
689 464 : continue;
690 : }
691 :
692 7540 : if( rNumVector[ i ] )
693 : {
694 7290 : if( bOnlyArabic )
695 1086 : aStr += OUString::number( rNumVector[ i ] );
696 : else
697 6204 : aStr += rNFmt.GetNumStr( rNumVector[ i ] );
698 : }
699 : else
700 250 : aStr += "0"; // all 0 level are a 0
701 7540 : if( i != nLevel && !aStr.isEmpty() )
702 908 : aStr += ".";
703 : }
704 :
705 : // The type doesn't have any number, so don't append
706 : // the post-/prefix string
707 19646 : if( bInclStrings && !bOnlyArabic &&
708 19646 : SVX_NUM_CHAR_SPECIAL != rMyNFmt.GetNumberingType() &&
709 6298 : SVX_NUM_BITMAP != rMyNFmt.GetNumberingType() )
710 : {
711 6298 : const OUString sPrefix = rMyNFmt.GetPrefix();
712 12596 : const OUString sSuffix = rMyNFmt.GetSuffix();
713 :
714 6298 : aStr = sPrefix + aStr + sSuffix;
715 6298 : if ( pExtremities )
716 : {
717 1744 : pExtremities->nPrefixChars = sPrefix.getLength();
718 1744 : pExtremities->nSuffixChars = sSuffix.getLength();
719 6298 : }
720 : }
721 : }
722 : }
723 :
724 7050 : return aStr;
725 : }
726 :
727 914 : OUString SwNumRule::MakeRefNumString( const SwNodeNum& rNodeNum,
728 : const bool bInclSuperiorNumLabels,
729 : const sal_uInt8 nRestrictInclToThisLevel ) const
730 : {
731 914 : OUString aRefNumStr;
732 :
733 914 : if ( rNodeNum.GetLevelInListTree() >= 0 )
734 : {
735 914 : bool bOldHadPrefix = true;
736 :
737 914 : const SwNodeNum* pWorkingNodeNum( &rNodeNum );
738 1048 : do
739 : {
740 1940 : bool bMakeNumStringForPhantom( false );
741 1940 : if ( pWorkingNodeNum->IsPhantom() )
742 : {
743 0 : int nListLevel = pWorkingNodeNum->GetLevelInListTree();
744 :
745 0 : if (nListLevel < 0)
746 0 : nListLevel = 0;
747 :
748 0 : if (nListLevel >= MAXLEVEL)
749 0 : nListLevel = MAXLEVEL - 1;
750 :
751 0 : SwNumFmt aFmt( Get( static_cast<sal_uInt16>(nListLevel) ) );
752 0 : bMakeNumStringForPhantom = aFmt.IsEnumeration() &&
753 0 : SVX_NUM_NUMBER_NONE != aFmt.GetNumberingType();
754 :
755 : }
756 5624 : if ( bMakeNumStringForPhantom ||
757 3880 : ( !pWorkingNodeNum->IsPhantom() &&
758 3880 : pWorkingNodeNum->GetTxtNode() &&
759 1940 : pWorkingNodeNum->GetTxtNode()->HasNumber() ) )
760 : {
761 : Extremities aExtremities;
762 : OUString aPrevStr = MakeNumString( pWorkingNodeNum->GetNumberVector(),
763 : true, false, MAXLEVEL,
764 1744 : &aExtremities);
765 1744 : sal_Int32 nStrip = 0;
766 3868 : while ( nStrip < aExtremities.nPrefixChars )
767 : {
768 1338 : const sal_Unicode c = aPrevStr[nStrip];
769 1338 : if ( c!='\t' && c!=' ')
770 958 : break;
771 380 : ++nStrip;
772 : }
773 :
774 1744 : if (nStrip)
775 : {
776 380 : aPrevStr = aPrevStr.copy( nStrip );
777 380 : aExtremities.nPrefixChars -= nStrip;
778 : }
779 :
780 1744 : if (bOldHadPrefix &&
781 1566 : aExtremities.nSuffixChars &&
782 1566 : !aExtremities.nPrefixChars
783 : )
784 : {
785 1216 : aPrevStr = aPrevStr.copy(0,
786 1216 : aPrevStr.getLength() - aExtremities.nSuffixChars);
787 : }
788 :
789 1744 : bOldHadPrefix = ( aExtremities.nPrefixChars > 0);
790 :
791 1744 : aRefNumStr = aPrevStr + aRefNumStr;
792 : }
793 :
794 1940 : if ( bInclSuperiorNumLabels && pWorkingNodeNum->GetLevelInListTree() > 0 )
795 : {
796 1048 : sal_uInt8 n = Get( static_cast<sal_uInt16>(pWorkingNodeNum->GetLevelInListTree()) ).GetIncludeUpperLevels();
797 1048 : pWorkingNodeNum = dynamic_cast<SwNodeNum*>(pWorkingNodeNum->GetParent());
798 : // skip parents, whose list label is already contained in the actual list label.
799 2096 : while ( pWorkingNodeNum && n > 1 )
800 : {
801 0 : pWorkingNodeNum = dynamic_cast<SwNodeNum*>(pWorkingNodeNum->GetParent());
802 0 : --n;
803 : }
804 : }
805 : else
806 : {
807 892 : break;
808 : }
809 1048 : } while ( pWorkingNodeNum &&
810 2096 : pWorkingNodeNum->GetLevelInListTree() >= 0 &&
811 1048 : static_cast<sal_uInt8>(pWorkingNodeNum->GetLevelInListTree()) >= nRestrictInclToThisLevel );
812 : }
813 :
814 914 : return aRefNumStr;
815 : }
816 :
817 : /** Copy method of SwNumRule
818 :
819 : A kind of copy constructor, so that the num formats are attached to the
820 : right CharFormats of a Document.
821 : Copies the NumFormats and returns itself. */
822 40 : SwNumRule& SwNumRule::CopyNumRule( SwDoc* pDoc, const SwNumRule& rNumRule )
823 : {
824 440 : for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
825 : {
826 400 : Set( n, rNumRule.maFmts[ n ] );
827 400 : if( maFmts[ n ] && maFmts[ n ]->GetCharFmt() &&
828 0 : !pDoc->GetCharFmts()->Contains( maFmts[n]->GetCharFmt() ))
829 : // If we copy across different Documents, then copy the
830 : // corresponding CharFormat into the new Document.
831 0 : maFmts[n]->SetCharFmt( pDoc->CopyCharFmt( *maFmts[n]->
832 0 : GetCharFmt() ) );
833 : }
834 40 : meRuleType = rNumRule.meRuleType;
835 40 : msName = rNumRule.msName;
836 40 : mbAutoRuleFlag = rNumRule.mbAutoRuleFlag;
837 40 : mnPoolFmtId = rNumRule.GetPoolFmtId();
838 40 : mnPoolHelpId = rNumRule.GetPoolHelpId();
839 40 : mnPoolHlpFileId = rNumRule.GetPoolHlpFileId();
840 40 : mbInvalidRuleFlag = true;
841 40 : return *this;
842 : }
843 :
844 303846 : void SwNumRule::SetSvxRule(const SvxNumRule& rNumRule, SwDoc* pDoc)
845 : {
846 3342306 : for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
847 : {
848 3038460 : const SvxNumberFormat* pSvxFmt = rNumRule.Get(n);
849 3038460 : delete maFmts[n];
850 3038460 : maFmts[n] = pSvxFmt ? new SwNumFmt(*pSvxFmt, pDoc) : 0;
851 : }
852 :
853 303846 : mbInvalidRuleFlag = true;
854 303846 : mbContinusNum = rNumRule.IsContinuousNumbering();
855 303846 : }
856 :
857 330952 : SvxNumRule SwNumRule::MakeSvxNumRule() const
858 : {
859 : SvxNumRule aRule(NUM_CONTINUOUS|NUM_CHAR_TEXT_DISTANCE|NUM_CHAR_STYLE|
860 : NUM_ENABLE_LINKED_BMP|NUM_ENABLE_EMBEDDED_BMP,
861 : MAXLEVEL, mbContinusNum,
862 : meRuleType ==
863 : NUM_RULE ?
864 : SVX_RULETYPE_NUMBERING :
865 330952 : SVX_RULETYPE_OUTLINE_NUMBERING );
866 3640472 : for( sal_uInt16 n = 0; n < MAXLEVEL; ++n )
867 : {
868 3309520 : SwNumFmt aNumFmt = Get(n);
869 3309520 : if(aNumFmt.GetCharFmt())
870 19846 : aNumFmt.SetCharFmtName(aNumFmt.GetCharFmt()->GetName());
871 3309520 : aRule.SetLevel(n, aNumFmt, maFmts[n] != 0);
872 3309520 : }
873 330952 : return aRule;
874 : }
875 :
876 588886 : void SwNumRule::SetInvalidRule(bool bFlag)
877 : {
878 588886 : if (bFlag)
879 : {
880 291584 : std::set< SwList* > aLists;
881 291584 : tTxtNodeList::iterator aIter;
882 293662 : for ( aIter = maTxtNodeList.begin(); aIter != maTxtNodeList.end(); ++aIter )
883 : {
884 2078 : const SwTxtNode* pTxtNode = *aIter;
885 : // #i111681# - applying patch from cmc
886 2078 : SwList* pList = pTxtNode->GetDoc()->getIDocumentListsAccess().getListByName( pTxtNode->GetListId() );
887 : OSL_ENSURE( pList, "<SwNumRule::SetInvalidRule(..)> - list at which the text node is registered at does not exist. This is a serious issue --> please inform OD.");
888 2078 : if ( pList )
889 : {
890 2078 : aLists.insert( pList );
891 : }
892 : }
893 : std::for_each( aLists.begin(), aLists.end(),
894 291584 : std::mem_fun( &SwList::InvalidateListTree ) );
895 : }
896 :
897 588886 : mbInvalidRuleFlag = bFlag;
898 588886 : }
899 :
900 : /// change indent of all list levels by given difference
901 0 : void SwNumRule::ChangeIndent( const short nDiff )
902 : {
903 0 : for ( sal_uInt16 i = 0; i < MAXLEVEL; ++i )
904 : {
905 0 : SwNumFmt aTmpNumFmt( Get(i) );
906 :
907 : const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
908 0 : aTmpNumFmt.GetPositionAndSpaceMode() );
909 0 : if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
910 : {
911 : short nNewIndent = nDiff +
912 0 : aTmpNumFmt.GetAbsLSpace();
913 0 : if ( nNewIndent < 0 )
914 : {
915 0 : nNewIndent = 0;
916 : }
917 0 : aTmpNumFmt.SetAbsLSpace( nNewIndent );
918 : }
919 0 : else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
920 : {
921 : // adjust also the list tab position, if a list tab stop is applied
922 0 : if ( aTmpNumFmt.GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
923 : {
924 0 : const long nNewListTab = aTmpNumFmt.GetListtabPos() + nDiff;
925 0 : aTmpNumFmt.SetListtabPos( nNewListTab );
926 : }
927 :
928 0 : const long nNewIndent = nDiff +
929 0 : aTmpNumFmt.GetIndentAt();
930 0 : aTmpNumFmt.SetIndentAt( nNewIndent );
931 : }
932 :
933 0 : Set( i, aTmpNumFmt );
934 0 : }
935 :
936 0 : SetInvalidRule( true );
937 0 : }
938 :
939 : /// set indent of certain list level to given value
940 0 : void SwNumRule::SetIndent( const short nNewIndent,
941 : const sal_uInt16 nListLevel )
942 : {
943 0 : SwNumFmt aTmpNumFmt( Get(nListLevel) );
944 :
945 : const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
946 0 : aTmpNumFmt.GetPositionAndSpaceMode() );
947 0 : if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
948 : {
949 0 : aTmpNumFmt.SetAbsLSpace( nNewIndent );
950 : }
951 0 : else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
952 : {
953 : // adjust also the list tab position, if a list tab stop is applied
954 0 : if ( aTmpNumFmt.GetLabelFollowedBy() == SvxNumberFormat::LISTTAB )
955 : {
956 0 : const long nNewListTab = aTmpNumFmt.GetListtabPos() +
957 0 : ( nNewIndent - aTmpNumFmt.GetIndentAt() );
958 0 : aTmpNumFmt.SetListtabPos( nNewListTab );
959 : }
960 :
961 0 : aTmpNumFmt.SetIndentAt( nNewIndent );
962 : }
963 :
964 0 : SetInvalidRule( true );
965 0 : }
966 :
967 : /// set indent of first list level to given value and change other list level's
968 : /// indents accordingly
969 0 : void SwNumRule::SetIndentOfFirstListLevelAndChangeOthers( const short nNewIndent )
970 : {
971 0 : SwNumFmt aTmpNumFmt( Get(0) );
972 :
973 0 : short nDiff( 0 );
974 : const SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode(
975 0 : aTmpNumFmt.GetPositionAndSpaceMode() );
976 0 : if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_WIDTH_AND_POSITION )
977 : {
978 : nDiff = nNewIndent
979 0 : - aTmpNumFmt.GetFirstLineOffset()
980 0 : - aTmpNumFmt.GetAbsLSpace();
981 : }
982 0 : else if ( ePosAndSpaceMode == SvxNumberFormat::LABEL_ALIGNMENT )
983 : {
984 : nDiff = static_cast<short>(nNewIndent
985 0 : - aTmpNumFmt.GetIndentAt());
986 : }
987 0 : if ( nDiff != 0 )
988 : {
989 0 : ChangeIndent( nDiff );
990 0 : }
991 0 : }
992 :
993 297302 : void SwNumRule::Validate()
994 : {
995 297302 : std::set< SwList* > aLists;
996 297302 : tTxtNodeList::iterator aIter;
997 298956 : for ( aIter = maTxtNodeList.begin(); aIter != maTxtNodeList.end(); ++aIter )
998 : {
999 1654 : const SwTxtNode* pTxtNode = *aIter;
1000 1654 : aLists.insert( pTxtNode->GetDoc()->getIDocumentListsAccess().getListByName( pTxtNode->GetListId() ) );
1001 : }
1002 : std::for_each( aLists.begin(), aLists.end(),
1003 297302 : std::mem_fun( &SwList::ValidateListTree ) );
1004 :
1005 297302 : SetInvalidRule(false);
1006 297302 : }
1007 :
1008 5098 : void SwNumRule::SetCountPhantoms(bool bCountPhantoms)
1009 : {
1010 5098 : mbCountPhantoms = bCountPhantoms;
1011 5098 : }
1012 :
1013 1680 : SwNumRule::tParagraphStyleList::size_type SwNumRule::GetParagraphStyleListSize() const
1014 : {
1015 1680 : return maParagraphStyleList.size();
1016 : }
1017 :
1018 1052 : void SwNumRule::AddParagraphStyle( SwTxtFmtColl& rTxtFmtColl )
1019 : {
1020 : tParagraphStyleList::iterator aIter =
1021 1052 : std::find( maParagraphStyleList.begin(), maParagraphStyleList.end(), &rTxtFmtColl );
1022 :
1023 1052 : if ( aIter == maParagraphStyleList.end() )
1024 : {
1025 806 : maParagraphStyleList.push_back( &rTxtFmtColl );
1026 : }
1027 1052 : }
1028 :
1029 0 : void SwNumRule::RemoveParagraphStyle( SwTxtFmtColl& rTxtFmtColl )
1030 : {
1031 : tParagraphStyleList::iterator aIter =
1032 0 : std::find( maParagraphStyleList.begin(), maParagraphStyleList.end(), &rTxtFmtColl );
1033 :
1034 0 : if ( aIter != maParagraphStyleList.end() )
1035 : {
1036 0 : maParagraphStyleList.erase( aIter );
1037 : }
1038 0 : }
1039 :
1040 8834 : void SwNumRule::GetGrabBagItem(uno::Any& rVal) const
1041 : {
1042 8834 : if (mpGrabBagItem.get())
1043 8828 : mpGrabBagItem->QueryValue(rVal);
1044 : else
1045 : {
1046 6 : uno::Sequence<beans::PropertyValue> aValue(0);
1047 6 : rVal = uno::makeAny(aValue);
1048 : }
1049 8834 : }
1050 :
1051 26962 : void SwNumRule::SetGrabBagItem(const uno::Any& rVal)
1052 : {
1053 26962 : if (!mpGrabBagItem.get())
1054 26962 : mpGrabBagItem.reset(new SfxGrabBagItem);
1055 :
1056 26962 : mpGrabBagItem->PutValue(rVal);
1057 26962 : }
1058 :
1059 : namespace numfunc
1060 : {
1061 : /** class containing default bullet list configuration data */
1062 : class SwDefBulletConfig : private utl::ConfigItem
1063 : {
1064 : public:
1065 : static SwDefBulletConfig& getInstance();
1066 :
1067 6 : inline OUString GetFontname() const
1068 : {
1069 6 : return msFontname;
1070 : }
1071 :
1072 0 : inline bool IsFontnameUserDefined() const
1073 : {
1074 0 : return mbUserDefinedFontname;
1075 : }
1076 :
1077 108 : inline const vcl::Font& GetFont() const
1078 : {
1079 108 : return *mpFont;
1080 : }
1081 :
1082 187000 : inline sal_Unicode GetChar( sal_uInt8 p_nListLevel ) const
1083 : {
1084 187000 : if (p_nListLevel >= MAXLEVEL)
1085 : {
1086 0 : p_nListLevel = MAXLEVEL - 1;
1087 : }
1088 :
1089 187000 : return mnLevelChars[p_nListLevel];
1090 : }
1091 :
1092 : SwDefBulletConfig();
1093 : virtual ~SwDefBulletConfig();
1094 :
1095 : private:
1096 : /** sets internal default bullet configuration data to default values */
1097 : void SetToDefault();
1098 :
1099 : /** returns sequence of default bullet configuration property names */
1100 : uno::Sequence<OUString> GetPropNames() const;
1101 :
1102 : /** loads default bullet configuration properties and applies
1103 : values to internal data */
1104 : void LoadConfig();
1105 :
1106 : /** initialize font instance for default bullet list */
1107 : void InitFont();
1108 :
1109 : /** catches notification about changed default bullet configuration data */
1110 : virtual void Notify( const uno::Sequence<OUString>& aPropertyNames ) SAL_OVERRIDE;
1111 : virtual void Commit() SAL_OVERRIDE;
1112 :
1113 : // default bullet list configuration data
1114 : OUString msFontname;
1115 : bool mbUserDefinedFontname;
1116 : FontWeight meFontWeight;
1117 : FontItalic meFontItalic;
1118 : sal_Unicode mnLevelChars[MAXLEVEL];
1119 :
1120 : // default bullet list font instance
1121 : vcl::Font* mpFont;
1122 : };
1123 :
1124 : namespace
1125 : {
1126 : class theSwDefBulletConfig
1127 : : public rtl::Static<SwDefBulletConfig, theSwDefBulletConfig>{};
1128 : }
1129 :
1130 187114 : SwDefBulletConfig& SwDefBulletConfig::getInstance()
1131 : {
1132 187114 : return theSwDefBulletConfig::get();
1133 : }
1134 :
1135 86 : SwDefBulletConfig::SwDefBulletConfig()
1136 : : ConfigItem( OUString("Office.Writer/Numbering/DefaultBulletList") ),
1137 : // default bullet font is now OpenSymbol
1138 : msFontname( OUString("OpenSymbol") ),
1139 : mbUserDefinedFontname( false ),
1140 : meFontWeight( WEIGHT_DONTKNOW ),
1141 : meFontItalic( ITALIC_NONE ),
1142 86 : mpFont( 0 )
1143 : {
1144 86 : SetToDefault();
1145 86 : LoadConfig();
1146 86 : InitFont();
1147 :
1148 : // enable notification for changes on default bullet configuration change
1149 86 : EnableNotification( GetPropNames() );
1150 86 : }
1151 :
1152 172 : SwDefBulletConfig::~SwDefBulletConfig()
1153 : {
1154 86 : delete mpFont;
1155 86 : }
1156 :
1157 86 : void SwDefBulletConfig::SetToDefault()
1158 : {
1159 86 : msFontname = "OpenSymbol";
1160 86 : mbUserDefinedFontname = false;
1161 86 : meFontWeight = WEIGHT_DONTKNOW;
1162 86 : meFontItalic = ITALIC_NONE;
1163 :
1164 86 : mnLevelChars[0] = 0x2022;
1165 86 : mnLevelChars[1] = 0x25e6;
1166 86 : mnLevelChars[2] = 0x25aa;
1167 86 : mnLevelChars[3] = 0x2022;
1168 86 : mnLevelChars[4] = 0x25e6;
1169 86 : mnLevelChars[5] = 0x25aa;
1170 86 : mnLevelChars[6] = 0x2022;
1171 86 : mnLevelChars[7] = 0x25e6;
1172 86 : mnLevelChars[8] = 0x25aa;
1173 86 : mnLevelChars[9] = 0x2022;
1174 86 : }
1175 :
1176 172 : uno::Sequence<OUString> SwDefBulletConfig::GetPropNames() const
1177 : {
1178 172 : uno::Sequence<OUString> aPropNames(13);
1179 172 : OUString* pNames = aPropNames.getArray();
1180 172 : pNames[0] = "BulletFont/FontFamilyname";
1181 172 : pNames[1] = "BulletFont/FontWeight";
1182 172 : pNames[2] = "BulletFont/FontItalic";
1183 172 : pNames[3] = "BulletCharLvl1";
1184 172 : pNames[4] = "BulletCharLvl2";
1185 172 : pNames[5] = "BulletCharLvl3";
1186 172 : pNames[6] = "BulletCharLvl4";
1187 172 : pNames[7] = "BulletCharLvl5";
1188 172 : pNames[8] = "BulletCharLvl6";
1189 172 : pNames[9] = "BulletCharLvl7";
1190 172 : pNames[10] = "BulletCharLvl8";
1191 172 : pNames[11] = "BulletCharLvl9";
1192 172 : pNames[12] = "BulletCharLvl10";
1193 :
1194 172 : return aPropNames;
1195 : }
1196 :
1197 86 : void SwDefBulletConfig::LoadConfig()
1198 : {
1199 86 : uno::Sequence<OUString> aPropNames = GetPropNames();
1200 : uno::Sequence<uno::Any> aValues =
1201 172 : GetProperties( aPropNames );
1202 86 : const uno::Any* pValues = aValues.getConstArray();
1203 : OSL_ENSURE( aValues.getLength() == aPropNames.getLength(),
1204 : "<SwDefBulletConfig::SwDefBulletConfig()> - GetProperties failed");
1205 86 : if ( aValues.getLength() == aPropNames.getLength() )
1206 : {
1207 1204 : for ( int nProp = 0; nProp < aPropNames.getLength(); ++nProp )
1208 : {
1209 1118 : if ( pValues[nProp].hasValue() )
1210 : {
1211 0 : switch ( nProp )
1212 : {
1213 : case 0:
1214 : {
1215 0 : OUString aStr;
1216 0 : pValues[nProp] >>= aStr;
1217 0 : msFontname = aStr;
1218 0 : mbUserDefinedFontname = true;
1219 : }
1220 0 : break;
1221 : case 1:
1222 : case 2:
1223 : {
1224 0 : sal_uInt8 nTmp = 0;
1225 0 : pValues[nProp] >>= nTmp;
1226 0 : if ( nProp == 1 )
1227 0 : meFontWeight = static_cast<FontWeight>(nTmp);
1228 0 : else if ( nProp == 2 )
1229 0 : meFontItalic = static_cast<FontItalic>(nTmp);
1230 : }
1231 0 : break;
1232 : case 3:
1233 : case 4:
1234 : case 5:
1235 : case 6:
1236 : case 7:
1237 : case 8:
1238 : case 9:
1239 : case 10:
1240 : case 11:
1241 : case 12:
1242 : {
1243 0 : sal_Unicode cChar = sal_Unicode();
1244 0 : pValues[nProp] >>= cChar;
1245 0 : mnLevelChars[nProp-3] = cChar;
1246 : }
1247 0 : break;
1248 : }
1249 : }
1250 : }
1251 86 : }
1252 :
1253 86 : }
1254 :
1255 86 : void SwDefBulletConfig::InitFont()
1256 : {
1257 86 : delete mpFont;
1258 :
1259 86 : mpFont = new vcl::Font( msFontname, OUString(), Size( 0, 14 ) );
1260 86 : mpFont->SetWeight( meFontWeight );
1261 86 : mpFont->SetItalic( meFontItalic );
1262 86 : mpFont->SetCharSet( RTL_TEXTENCODING_SYMBOL );
1263 86 : }
1264 :
1265 0 : void SwDefBulletConfig::Notify( const uno::Sequence<OUString>& )
1266 : {
1267 0 : SetToDefault();
1268 0 : LoadConfig();
1269 0 : InitFont();
1270 0 : }
1271 :
1272 0 : void SwDefBulletConfig::Commit()
1273 : {
1274 0 : }
1275 :
1276 6 : OUString GetDefBulletFontname()
1277 : {
1278 6 : return SwDefBulletConfig::getInstance().GetFontname();
1279 : }
1280 :
1281 0 : bool IsDefBulletFontUserDefined()
1282 : {
1283 0 : return SwDefBulletConfig::getInstance().IsFontnameUserDefined();
1284 : }
1285 :
1286 108 : const vcl::Font& GetDefBulletFont()
1287 : {
1288 108 : return SwDefBulletConfig::getInstance().GetFont();
1289 : }
1290 :
1291 187000 : sal_Unicode GetBulletChar( sal_uInt8 nLevel )
1292 : {
1293 187000 : return SwDefBulletConfig::getInstance().GetChar( nLevel );
1294 : }
1295 :
1296 : /** class containing configuration data about user interface behavior
1297 : regarding lists and list items.
1298 : configuration item about behavior of <TAB>/<SHIFT-TAB>-key at first
1299 : position of first list item
1300 : */
1301 0 : class SwNumberingUIBehaviorConfig : private utl::ConfigItem
1302 : {
1303 : public:
1304 : static SwNumberingUIBehaviorConfig& getInstance();
1305 :
1306 0 : inline bool ChangeIndentOnTabAtFirstPosOfFirstListItem() const
1307 : {
1308 0 : return mbChangeIndentOnTabAtFirstPosOfFirstListItem;
1309 : }
1310 :
1311 : SwNumberingUIBehaviorConfig();
1312 :
1313 : private:
1314 :
1315 : /** sets internal configuration data to default values */
1316 : void SetToDefault();
1317 :
1318 : /** returns sequence of configuration property names */
1319 : com::sun::star::uno::Sequence<OUString> GetPropNames() const;
1320 :
1321 : /** loads configuration properties and applies values to internal data */
1322 : void LoadConfig();
1323 :
1324 : /** catches notification about changed configuration data */
1325 : virtual void Notify( const com::sun::star::uno::Sequence<OUString>& aPropertyNames ) SAL_OVERRIDE;
1326 : virtual void Commit() SAL_OVERRIDE;
1327 :
1328 : // configuration data
1329 : bool mbChangeIndentOnTabAtFirstPosOfFirstListItem;
1330 : };
1331 :
1332 : namespace
1333 : {
1334 : class theSwNumberingUIBehaviorConfig : public rtl::Static<SwNumberingUIBehaviorConfig, theSwNumberingUIBehaviorConfig>{};
1335 : }
1336 :
1337 0 : SwNumberingUIBehaviorConfig& SwNumberingUIBehaviorConfig::getInstance()
1338 : {
1339 0 : return theSwNumberingUIBehaviorConfig::get();
1340 : }
1341 :
1342 0 : SwNumberingUIBehaviorConfig::SwNumberingUIBehaviorConfig()
1343 : : ConfigItem( OUString("Office.Writer/Numbering/UserInterfaceBehavior") ),
1344 0 : mbChangeIndentOnTabAtFirstPosOfFirstListItem( true )
1345 : {
1346 0 : SetToDefault();
1347 0 : LoadConfig();
1348 :
1349 : // enable notification for changes on configuration change
1350 0 : EnableNotification( GetPropNames() );
1351 0 : }
1352 :
1353 0 : void SwNumberingUIBehaviorConfig::SetToDefault()
1354 : {
1355 0 : mbChangeIndentOnTabAtFirstPosOfFirstListItem = true;
1356 0 : }
1357 :
1358 0 : com::sun::star::uno::Sequence<OUString> SwNumberingUIBehaviorConfig::GetPropNames() const
1359 : {
1360 0 : com::sun::star::uno::Sequence<OUString> aPropNames(1);
1361 0 : OUString* pNames = aPropNames.getArray();
1362 0 : pNames[0] = "ChangeIndentOnTabAtFirstPosOfFirstListItem";
1363 :
1364 0 : return aPropNames;
1365 : }
1366 :
1367 0 : void SwNumberingUIBehaviorConfig::Commit() {}
1368 :
1369 0 : void SwNumberingUIBehaviorConfig::LoadConfig()
1370 : {
1371 0 : com::sun::star::uno::Sequence<OUString> aPropNames = GetPropNames();
1372 : com::sun::star::uno::Sequence<com::sun::star::uno::Any> aValues =
1373 0 : GetProperties( aPropNames );
1374 0 : const com::sun::star::uno::Any* pValues = aValues.getConstArray();
1375 : OSL_ENSURE( aValues.getLength() == aPropNames.getLength(),
1376 : "<SwNumberingUIBehaviorConfig::LoadConfig()> - GetProperties failed");
1377 0 : if ( aValues.getLength() == aPropNames.getLength() )
1378 : {
1379 0 : for ( int nProp = 0; nProp < aPropNames.getLength(); ++nProp )
1380 : {
1381 0 : if ( pValues[nProp].hasValue() )
1382 : {
1383 0 : switch ( nProp )
1384 : {
1385 : case 0:
1386 : {
1387 0 : pValues[nProp] >>= mbChangeIndentOnTabAtFirstPosOfFirstListItem;
1388 : }
1389 0 : break;
1390 : default:
1391 : {
1392 : OSL_FAIL( "<SwNumberingUIBehaviorConfig::LoadConfig()> - unknown configuration property");
1393 : }
1394 : }
1395 : }
1396 : }
1397 0 : }
1398 0 : }
1399 :
1400 0 : void SwNumberingUIBehaviorConfig::Notify( const com::sun::star::uno::Sequence<OUString>& aPropertyNames )
1401 : {
1402 : (void) aPropertyNames;
1403 0 : SetToDefault();
1404 0 : LoadConfig();
1405 0 : }
1406 :
1407 0 : bool ChangeIndentOnTabAtFirstPosOfFirstListItem()
1408 : {
1409 0 : return SwNumberingUIBehaviorConfig::getInstance().ChangeIndentOnTabAtFirstPosOfFirstListItem();
1410 : }
1411 :
1412 41426 : SvxNumberFormat::SvxNumPositionAndSpaceMode GetDefaultPositionAndSpaceMode()
1413 : {
1414 : SvxNumberFormat::SvxNumPositionAndSpaceMode ePosAndSpaceMode;
1415 41426 : SvtSaveOptions aSaveOptions;
1416 41426 : switch ( aSaveOptions.GetODFDefaultVersion() )
1417 : {
1418 : case SvtSaveOptions::ODFVER_010:
1419 : case SvtSaveOptions::ODFVER_011:
1420 : {
1421 0 : ePosAndSpaceMode = SvxNumberFormat::LABEL_WIDTH_AND_POSITION;
1422 : }
1423 0 : break;
1424 : default: // ODFVER_UNKNOWN or ODFVER_012
1425 : {
1426 41426 : ePosAndSpaceMode = SvxNumberFormat::LABEL_ALIGNMENT;
1427 : }
1428 : }
1429 :
1430 41426 : return ePosAndSpaceMode;
1431 : }
1432 270 : }
1433 :
1434 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|