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 <sal/macros.h>
21 : #include <hintids.hxx>
22 : #include <editeng/ulspitem.hxx>
23 : #include <editeng/lrspitem.hxx>
24 : #include <editeng/fhgtitem.hxx>
25 : #include <doc.hxx>
26 : #include <fmtcol.hxx>
27 : #include <fmtcolfunc.hxx>
28 : #include <hints.hxx>
29 : #include <calc.hxx>
30 : #include <node.hxx>
31 : #include <numrule.hxx>
32 : #include <paratr.hxx>
33 : #include <switerator.hxx>
34 : #include <svl/intitem.hxx>
35 :
36 0 : TYPEINIT1( SwTxtFmtColl, SwFmtColl );
37 0 : TYPEINIT1( SwGrfFmtColl, SwFmtColl );
38 0 : TYPEINIT1( SwConditionTxtFmtColl, SwTxtFmtColl );
39 0 : TYPEINIT1( SwCollCondition, SwClient );
40 :
41 : namespace TxtFmtCollFunc
42 : {
43 : // #i71574#
44 0 : void CheckTxtFmtCollForDeletionOfAssignmentToOutlineStyle(
45 : SwFmt* pFmt,
46 : const SwNumRuleItem* pNewNumRuleItem )
47 : {
48 0 : SwTxtFmtColl* pTxtFmtColl = dynamic_cast<SwTxtFmtColl*>(pFmt);
49 0 : if ( !pTxtFmtColl )
50 : {
51 : OSL_FAIL( "<TxtFmtCollFunc::CheckTxtFmtCollFuncForDeletionOfAssignmentToOutlineStyle> - misuse of method - it's only for instances of <SwTxtFmtColl>" );
52 0 : return;
53 : }
54 :
55 : // #i73790#
56 0 : if ( !pTxtFmtColl->StayAssignedToListLevelOfOutlineStyle() &&
57 0 : pTxtFmtColl->IsAssignedToListLevelOfOutlineStyle() )
58 : {
59 0 : if ( !pNewNumRuleItem )
60 : {
61 0 : pTxtFmtColl->GetItemState( RES_PARATR_NUMRULE, sal_False, (const SfxPoolItem**)&pNewNumRuleItem );
62 : }
63 0 : if ( pNewNumRuleItem )
64 : {
65 0 : OUString sNumRuleName = pNewNumRuleItem->GetValue();
66 0 : if ( sNumRuleName.isEmpty() ||
67 0 : sNumRuleName != pTxtFmtColl->GetDoc()->GetOutlineNumRule()->GetName() )
68 : {
69 : // delete assignment of paragraph style to list level of outline style.
70 0 : pTxtFmtColl->DeleteAssignmentToListLevelOfOutlineStyle();
71 0 : }
72 : }
73 : }
74 : }
75 :
76 0 : SwNumRule* GetNumRule( SwTxtFmtColl& rTxtFmtColl )
77 : {
78 0 : SwNumRule* pNumRule( 0 );
79 :
80 0 : const SwNumRuleItem* pNumRuleItem( 0 );
81 0 : rTxtFmtColl.GetItemState( RES_PARATR_NUMRULE, sal_False, (const SfxPoolItem**)&pNumRuleItem );
82 0 : if ( pNumRuleItem )
83 : {
84 0 : const OUString sNumRuleName = pNumRuleItem->GetValue();
85 0 : if ( !sNumRuleName.isEmpty() )
86 : {
87 0 : pNumRule = rTxtFmtColl.GetDoc()->FindNumRulePtr( sNumRuleName );
88 0 : }
89 : }
90 :
91 0 : return pNumRule;
92 : }
93 :
94 0 : void AddToNumRule( SwTxtFmtColl& rTxtFmtColl )
95 : {
96 0 : SwNumRule* pNumRule = GetNumRule( rTxtFmtColl );
97 0 : if ( pNumRule )
98 : {
99 0 : pNumRule->AddParagraphStyle( rTxtFmtColl );
100 : }
101 0 : }
102 :
103 0 : void RemoveFromNumRule( SwTxtFmtColl& rTxtFmtColl )
104 : {
105 0 : SwNumRule* pNumRule = GetNumRule( rTxtFmtColl );
106 0 : if ( pNumRule )
107 : {
108 0 : pNumRule->RemoveParagraphStyle( rTxtFmtColl );
109 : }
110 0 : }
111 : } // end of namespace TxtFmtCollFunc
112 :
113 0 : void SwTxtFmtColl::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
114 : {
115 0 : if( GetDoc()->IsInDtor() )
116 : {
117 0 : SwFmtColl::Modify( pOld, pNew );
118 0 : return;
119 : }
120 :
121 0 : bool bNewParent( false ); // #i66431# - adjust type of <bNewParent>
122 0 : SvxULSpaceItem *pNewULSpace = 0, *pOldULSpace = 0;
123 0 : SvxLRSpaceItem *pNewLRSpace = 0, *pOldLRSpace = 0;
124 0 : SvxFontHeightItem* aFontSizeArr[3] = {0,0,0};
125 : // #i70223#
126 0 : const bool bAssignedToListLevelOfOutlineStyle(IsAssignedToListLevelOfOutlineStyle());
127 0 : const SwNumRuleItem* pNewNumRuleItem( 0L );
128 :
129 0 : SwAttrSetChg *pNewChgSet = 0, *pOldChgSet = 0;
130 :
131 0 : switch( pOld ? pOld->Which() : pNew ? pNew->Which() : 0 )
132 : {
133 : case RES_ATTRSET_CHG:
134 : // Only recalculate if we're not the sender!
135 0 : pNewChgSet = (SwAttrSetChg*)pNew;
136 0 : pOldChgSet = (SwAttrSetChg*)pOld;
137 0 : pNewChgSet->GetChgSet()->GetItemState(
138 0 : RES_LR_SPACE, false, (const SfxPoolItem**)&pNewLRSpace );
139 0 : pNewChgSet->GetChgSet()->GetItemState(
140 0 : RES_UL_SPACE, false, (const SfxPoolItem**)&pNewULSpace );
141 0 : pNewChgSet->GetChgSet()->GetItemState( RES_CHRATR_FONTSIZE,
142 0 : false, (const SfxPoolItem**)&(aFontSizeArr[0]) );
143 0 : pNewChgSet->GetChgSet()->GetItemState( RES_CHRATR_CJK_FONTSIZE,
144 0 : false, (const SfxPoolItem**)&(aFontSizeArr[1]) );
145 0 : pNewChgSet->GetChgSet()->GetItemState( RES_CHRATR_CTL_FONTSIZE,
146 0 : false, (const SfxPoolItem**)&(aFontSizeArr[2]) );
147 : // #i70223#, #i84745#
148 : // check, if attribute set is applied to this paragraph style
149 0 : if ( bAssignedToListLevelOfOutlineStyle &&
150 0 : pNewChgSet->GetTheChgdSet() == &GetAttrSet() )
151 : {
152 0 : pNewChgSet->GetChgSet()->GetItemState( RES_PARATR_NUMRULE, false,
153 0 : (const SfxPoolItem**)&pNewNumRuleItem );
154 : }
155 :
156 0 : break;
157 :
158 : case RES_FMT_CHG:
159 0 : if( GetAttrSet().GetParent() )
160 : {
161 0 : const SfxItemSet* pParent = GetAttrSet().GetParent();
162 0 : pNewLRSpace = (SvxLRSpaceItem*)&pParent->Get( RES_LR_SPACE );
163 0 : pNewULSpace = (SvxULSpaceItem*)&pParent->Get( RES_UL_SPACE );
164 0 : aFontSizeArr[0] = (SvxFontHeightItem*)&pParent->Get( RES_CHRATR_FONTSIZE );
165 0 : aFontSizeArr[1] = (SvxFontHeightItem*)&pParent->Get( RES_CHRATR_CJK_FONTSIZE );
166 0 : aFontSizeArr[2] = (SvxFontHeightItem*)&pParent->Get( RES_CHRATR_CTL_FONTSIZE );
167 : // #i66431# - modify has to be propagated, because of new parent format.
168 0 : bNewParent = true;
169 : }
170 0 : break;
171 :
172 : case RES_LR_SPACE:
173 0 : pNewLRSpace = (SvxLRSpaceItem*)pNew;
174 0 : break;
175 : case RES_UL_SPACE:
176 0 : pNewULSpace = (SvxULSpaceItem*)pNew;
177 0 : break;
178 : case RES_CHRATR_FONTSIZE:
179 0 : aFontSizeArr[0] = (SvxFontHeightItem*)pNew;
180 0 : break;
181 : case RES_CHRATR_CJK_FONTSIZE:
182 0 : aFontSizeArr[1] = (SvxFontHeightItem*)pNew;
183 0 : break;
184 : case RES_CHRATR_CTL_FONTSIZE:
185 0 : aFontSizeArr[2] = (SvxFontHeightItem*)pNew;
186 0 : break;
187 : // #i70223#
188 : case RES_PARATR_NUMRULE:
189 : {
190 0 : if ( bAssignedToListLevelOfOutlineStyle )
191 : {
192 0 : pNewNumRuleItem = (SwNumRuleItem*)pNew;
193 : }
194 : }
195 : default:
196 0 : break;
197 : }
198 :
199 : // #i70223#
200 0 : if ( bAssignedToListLevelOfOutlineStyle && pNewNumRuleItem )
201 : {
202 : TxtFmtCollFunc::CheckTxtFmtCollForDeletionOfAssignmentToOutlineStyle(
203 0 : this, pNewNumRuleItem );
204 : }
205 :
206 0 : bool bContinue = true;
207 :
208 : // Check against the own attributes
209 0 : if( pNewLRSpace && SFX_ITEM_SET == GetItemState( RES_LR_SPACE, sal_False,
210 0 : (const SfxPoolItem**)&pOldLRSpace ))
211 : {
212 0 : bool bChg = false;
213 0 : if( pOldLRSpace != pNewLRSpace ) // Avoid recursion (SetAttr!)
214 : {
215 0 : SvxLRSpaceItem aNew( *pOldLRSpace );
216 : // We had a relative value -> recalculate
217 0 : if( 100 != aNew.GetPropLeft() )
218 : {
219 0 : long nTmp = aNew.GetLeft(); // keep so that we can compare
220 0 : aNew.SetLeft( pNewLRSpace->GetLeft(), aNew.GetPropLeft() );
221 0 : bChg |= nTmp != aNew.GetLeft();
222 : }
223 : // We had a relative value -> recalculate
224 0 : if( 100 != aNew.GetPropRight() )
225 : {
226 0 : long nTmp = aNew.GetRight(); // keep so that we can compare
227 0 : aNew.SetRight( pNewLRSpace->GetRight(), aNew.GetPropRight() );
228 0 : bChg |= nTmp != aNew.GetRight();
229 : }
230 : // We had a relative value -> recalculate
231 0 : if( 100 != aNew.GetPropTxtFirstLineOfst() )
232 : {
233 0 : short nTmp = aNew.GetTxtFirstLineOfst(); // keep so that we can compare
234 0 : aNew.SetTxtFirstLineOfst( pNewLRSpace->GetTxtFirstLineOfst(),
235 0 : aNew.GetPropTxtFirstLineOfst() );
236 0 : bChg |= nTmp != aNew.GetTxtFirstLineOfst();
237 : }
238 0 : if( bChg )
239 : {
240 0 : SetFmtAttr( aNew );
241 0 : bContinue = 0 != pOldChgSet || bNewParent;
242 : }
243 : // We set it to absolute -> do not propagate it further, unless
244 : // we set it!
245 0 : else if( pNewChgSet )
246 0 : bContinue = pNewChgSet->GetTheChgdSet() == &GetAttrSet();
247 : }
248 : }
249 :
250 0 : if( pNewULSpace && SFX_ITEM_SET == GetItemState(
251 0 : RES_UL_SPACE, sal_False, (const SfxPoolItem**)&pOldULSpace ) &&
252 0 : pOldULSpace != pNewULSpace ) // Avoid recursion (SetAttr!)
253 : {
254 0 : SvxULSpaceItem aNew( *pOldULSpace );
255 0 : bool bChg = false;
256 : // We had a relative value -> recalculate
257 0 : if( 100 != aNew.GetPropUpper() )
258 : {
259 0 : sal_uInt16 nTmp = aNew.GetUpper(); // keep so that we can compare
260 0 : aNew.SetUpper( pNewULSpace->GetUpper(), aNew.GetPropUpper() );
261 0 : bChg |= nTmp != aNew.GetUpper();
262 : }
263 : // We had a relative value -> recalculate
264 0 : if( 100 != aNew.GetPropLower() )
265 : {
266 0 : sal_uInt16 nTmp = aNew.GetLower(); // keep so that we can compare
267 0 : aNew.SetLower( pNewULSpace->GetLower(), aNew.GetPropLower() );
268 0 : bChg |= nTmp != aNew.GetLower();
269 : }
270 0 : if( bChg )
271 : {
272 0 : SetFmtAttr( aNew );
273 0 : bContinue = 0 != pOldChgSet || bNewParent;
274 : }
275 : // We set it to absolute -> do not propagate it further, unless
276 : // we set it!
277 0 : else if( pNewChgSet )
278 0 : bContinue = pNewChgSet->GetTheChgdSet() == &GetAttrSet();
279 : }
280 :
281 0 : for( int nC = 0, nArrLen = sizeof(aFontSizeArr) / sizeof( aFontSizeArr[0]);
282 : nC < nArrLen; ++nC )
283 : {
284 0 : SvxFontHeightItem *pFSize = aFontSizeArr[ nC ], *pOldFSize;
285 0 : if( pFSize && SFX_ITEM_SET == GetItemState(
286 0 : pFSize->Which(), sal_False, (const SfxPoolItem**)&pOldFSize ) &&
287 : // Avoid recursion (SetAttr!)
288 0 : pFSize != pOldFSize )
289 : {
290 0 : if( 100 == pOldFSize->GetProp() &&
291 0 : SFX_MAPUNIT_RELATIVE == pOldFSize->GetPropUnit() )
292 : {
293 : // We set it to absolute -> do not propagate it further, unless
294 : // we set it!
295 0 : if( pNewChgSet )
296 0 : bContinue = pNewChgSet->GetTheChgdSet() == &GetAttrSet();
297 : }
298 : else
299 : {
300 : // We had a relative value -> recalculate
301 0 : sal_uInt32 nTmp = pOldFSize->GetHeight(); // keep so that we can compare
302 0 : SvxFontHeightItem aNew(240 , 100, pFSize->Which());
303 0 : aNew.SetHeight( pFSize->GetHeight(), pOldFSize->GetProp(),
304 0 : pOldFSize->GetPropUnit() );
305 0 : if( nTmp != aNew.GetHeight() )
306 : {
307 0 : SetFmtAttr( aNew );
308 0 : bContinue = 0 != pOldChgSet || bNewParent;
309 : }
310 : // We set it to absolute -> do not propagate it further, unless
311 : // we set it!
312 0 : else if( pNewChgSet )
313 0 : bContinue = pNewChgSet->GetTheChgdSet() == &GetAttrSet();
314 : }
315 : }
316 : }
317 :
318 0 : if( bContinue )
319 0 : SwFmtColl::Modify( pOld, pNew );
320 : }
321 :
322 0 : bool SwTxtFmtColl::IsAtDocNodeSet() const
323 : {
324 0 : SwIterator<SwCntntNode,SwFmtColl> aIter( *this );
325 0 : const SwNodes& rNds = GetDoc()->GetNodes();
326 0 : for( SwCntntNode* pNode = aIter.First(); pNode; pNode = aIter.Next() )
327 0 : if( &(pNode->GetNodes()) == &rNds )
328 0 : return true;
329 :
330 0 : return false;
331 : }
332 :
333 0 : bool SwTxtFmtColl::SetFmtAttr( const SfxPoolItem& rAttr )
334 : {
335 0 : const bool bIsNumRuleItem = rAttr.Which() == RES_PARATR_NUMRULE;
336 0 : if ( bIsNumRuleItem )
337 : {
338 0 : TxtFmtCollFunc::RemoveFromNumRule( *this );
339 : }
340 :
341 0 : const bool bRet = SwFmtColl::SetFmtAttr( rAttr );
342 :
343 0 : if ( bIsNumRuleItem )
344 : {
345 0 : TxtFmtCollFunc::AddToNumRule( *this );
346 : }
347 :
348 0 : return bRet;
349 : }
350 :
351 0 : bool SwTxtFmtColl::SetFmtAttr( const SfxItemSet& rSet )
352 : {
353 : const bool bIsNumRuleItemAffected =
354 0 : rSet.GetItemState( RES_PARATR_NUMRULE, false ) == SFX_ITEM_SET;
355 0 : if ( bIsNumRuleItemAffected )
356 : {
357 0 : TxtFmtCollFunc::RemoveFromNumRule( *this );
358 : }
359 :
360 0 : const bool bRet = SwFmtColl::SetFmtAttr( rSet );
361 :
362 0 : if ( bIsNumRuleItemAffected )
363 : {
364 0 : TxtFmtCollFunc::AddToNumRule( *this );
365 : }
366 :
367 0 : return bRet;
368 : }
369 :
370 0 : bool SwTxtFmtColl::ResetFmtAttr( sal_uInt16 nWhich1, sal_uInt16 nWhich2 )
371 : {
372 : const bool bIsNumRuleItemAffected =
373 0 : ( nWhich2 != 0 && nWhich2 > nWhich1 )
374 0 : ? ( nWhich1 <= RES_PARATR_NUMRULE &&
375 : RES_PARATR_NUMRULE <= nWhich2 )
376 0 : : nWhich1 == RES_PARATR_NUMRULE;
377 0 : if ( bIsNumRuleItemAffected )
378 : {
379 0 : TxtFmtCollFunc::RemoveFromNumRule( *this );
380 : }
381 :
382 0 : const bool bRet = SwFmtColl::ResetFmtAttr( nWhich1, nWhich2 );
383 :
384 0 : return bRet;
385 : }
386 :
387 : // #i73790#
388 0 : sal_uInt16 SwTxtFmtColl::ResetAllFmtAttr()
389 : {
390 0 : const bool bOldState( mbStayAssignedToListLevelOfOutlineStyle );
391 0 : mbStayAssignedToListLevelOfOutlineStyle = true;
392 : // #i70748#
393 : // Outline level is no longer a member, it is a attribute now.
394 : // Thus, it needs to be restored, if the paragraph style is assigned
395 : // to the outline style
396 0 : const int nAssignedOutlineStyleLevel = IsAssignedToListLevelOfOutlineStyle()
397 : ? GetAssignedOutlineStyleLevel()
398 0 : : -1;
399 :
400 0 : sal_uInt16 nRet = SwFmtColl::ResetAllFmtAttr();
401 :
402 : // #i70748#
403 0 : if ( nAssignedOutlineStyleLevel != -1 )
404 : {
405 0 : AssignToListLevelOfOutlineStyle( nAssignedOutlineStyleLevel );
406 : }
407 :
408 0 : mbStayAssignedToListLevelOfOutlineStyle = bOldState;
409 :
410 0 : return nRet;
411 : }
412 :
413 0 : bool SwTxtFmtColl::AreListLevelIndentsApplicable() const
414 : {
415 0 : bool bAreListLevelIndentsApplicable( true );
416 :
417 0 : if ( GetItemState( RES_PARATR_NUMRULE ) != SFX_ITEM_SET )
418 : {
419 : // no list style applied to paragraph style
420 0 : bAreListLevelIndentsApplicable = false;
421 : }
422 0 : else if ( GetItemState( RES_LR_SPACE, sal_False ) == SFX_ITEM_SET )
423 : {
424 : // paragraph style has hard-set indent attributes
425 0 : bAreListLevelIndentsApplicable = false;
426 : }
427 0 : else if ( GetItemState( RES_PARATR_NUMRULE, sal_False ) == SFX_ITEM_SET )
428 : {
429 : // list style is directly applied to paragraph style and paragraph
430 : // style has no hard-set indent attributes
431 0 : bAreListLevelIndentsApplicable = true;
432 : }
433 : else
434 : {
435 : // list style is applied through one of the parent paragraph styles and
436 : // paragraph style has no hard-set indent attributes
437 :
438 : // check parent paragraph styles
439 0 : const SwTxtFmtColl* pColl = dynamic_cast<const SwTxtFmtColl*>(DerivedFrom());
440 0 : while ( pColl )
441 : {
442 0 : if ( pColl->GetAttrSet().GetItemState( RES_LR_SPACE, false ) == SFX_ITEM_SET )
443 : {
444 : // indent attributes found in the paragraph style hierarchy.
445 0 : bAreListLevelIndentsApplicable = false;
446 0 : break;
447 : }
448 :
449 0 : if ( pColl->GetAttrSet().GetItemState( RES_PARATR_NUMRULE, false ) == SFX_ITEM_SET )
450 : {
451 : // paragraph style with the list style found and until now no
452 : // indent attributes are found in the paragraph style hierarchy.
453 0 : bAreListLevelIndentsApplicable = true;
454 0 : break;
455 : }
456 :
457 0 : pColl = dynamic_cast<const SwTxtFmtColl*>(pColl->DerivedFrom());
458 : OSL_ENSURE( pColl,
459 : "<SwTxtFmtColl::AreListLevelIndentsApplicable()> - something wrong in paragraph style hierarchy. The applied list style is not found." );
460 : }
461 : }
462 :
463 0 : return bAreListLevelIndentsApplicable;
464 : }
465 :
466 : //FEATURE::CONDCOLL
467 :
468 0 : SwCollCondition::SwCollCondition( SwTxtFmtColl* pColl, sal_uLong nMasterCond,
469 : sal_uLong nSubCond )
470 0 : : SwClient( pColl ), nCondition( nMasterCond )
471 : {
472 0 : aSubCondition.nSubCondition = nSubCond;
473 0 : }
474 :
475 0 : SwCollCondition::SwCollCondition( SwTxtFmtColl* pColl, sal_uLong nMasterCond,
476 : const OUString& rSubExp )
477 0 : : SwClient( pColl ), nCondition( nMasterCond )
478 : {
479 0 : if( USRFLD_EXPRESSION & nCondition )
480 0 : aSubCondition.pFldExpression = new OUString( rSubExp );
481 : else
482 0 : aSubCondition.nSubCondition = 0;
483 0 : }
484 :
485 0 : SwCollCondition::SwCollCondition( const SwCollCondition& rCopy )
486 0 : : SwClient( (SwModify*)rCopy.GetRegisteredIn() ), nCondition( rCopy.nCondition )
487 : {
488 0 : if( USRFLD_EXPRESSION & rCopy.nCondition )
489 0 : aSubCondition.pFldExpression = new OUString( *rCopy.GetFldExpression() );
490 : else
491 0 : aSubCondition.nSubCondition = rCopy.aSubCondition.nSubCondition;
492 0 : }
493 :
494 0 : SwCollCondition::~SwCollCondition()
495 : {
496 0 : if( USRFLD_EXPRESSION & nCondition )
497 0 : delete aSubCondition.pFldExpression;
498 0 : }
499 :
500 0 : void SwCollCondition::RegisterToFormat( SwFmt& rFmt )
501 : {
502 0 : rFmt.Add( this );
503 0 : }
504 :
505 0 : bool SwCollCondition::operator==( const SwCollCondition& rCmp ) const
506 : {
507 0 : bool nRet = false;
508 0 : if( nCondition == rCmp.nCondition )
509 : {
510 0 : if( USRFLD_EXPRESSION & nCondition )
511 : {
512 : // The SubCondition contains the expression for the UserField
513 0 : const OUString* pTmp = aSubCondition.pFldExpression;
514 0 : if( !pTmp )
515 0 : pTmp = rCmp.aSubCondition.pFldExpression;
516 0 : if( pTmp )
517 : {
518 0 : SwTxtFmtColl* pColl = GetTxtFmtColl();
519 0 : if( !pColl )
520 0 : pColl = rCmp.GetTxtFmtColl();
521 :
522 0 : if( pColl )
523 : {
524 0 : SwCalc aCalc( *pColl->GetDoc() );
525 0 : nRet = 0 != aCalc.Calculate( *pTmp ).GetBool();
526 : }
527 : }
528 : }
529 0 : else if( aSubCondition.nSubCondition ==
530 : rCmp.aSubCondition.nSubCondition )
531 0 : nRet = true;
532 : }
533 0 : return nRet;
534 : }
535 :
536 0 : void SwCollCondition::SetCondition( sal_uLong nCond, sal_uLong nSubCond )
537 : {
538 0 : if( USRFLD_EXPRESSION & nCondition )
539 0 : delete aSubCondition.pFldExpression;
540 0 : nCondition = nCond;
541 0 : aSubCondition.nSubCondition = nSubCond;
542 0 : }
543 :
544 0 : SwConditionTxtFmtColl::~SwConditionTxtFmtColl()
545 : {
546 0 : }
547 :
548 0 : const SwCollCondition* SwConditionTxtFmtColl::HasCondition(
549 : const SwCollCondition& rCond ) const
550 : {
551 0 : const SwCollCondition* pFnd = 0;
552 : sal_uInt16 n;
553 :
554 0 : for( n = 0; n < aCondColls.size(); ++n )
555 0 : if( *( pFnd = &aCondColls[ n ]) == rCond )
556 0 : break;
557 :
558 0 : return n < aCondColls.size() ? pFnd : 0;
559 : }
560 :
561 0 : void SwConditionTxtFmtColl::InsertCondition( const SwCollCondition& rCond )
562 : {
563 0 : for( sal_uInt16 n = 0; n < aCondColls.size(); ++n )
564 0 : if( aCondColls[ n ] == rCond )
565 : {
566 0 : aCondColls.erase( aCondColls.begin() + n );
567 0 : break;
568 : }
569 :
570 : // Not found -> so insert it
571 0 : SwCollCondition* pNew = new SwCollCondition( rCond );
572 0 : aCondColls.push_back( pNew );
573 0 : }
574 :
575 0 : bool SwConditionTxtFmtColl::RemoveCondition( const SwCollCondition& rCond )
576 : {
577 0 : bool bRet = false;
578 0 : for( sal_uInt16 n = 0; n < aCondColls.size(); ++n )
579 0 : if( aCondColls[ n ] == rCond )
580 : {
581 0 : aCondColls.erase( aCondColls.begin() + n );
582 0 : bRet = true;
583 : }
584 :
585 0 : return bRet;
586 : }
587 :
588 0 : void SwConditionTxtFmtColl::SetConditions( const SwFmtCollConditions& rCndClls )
589 : {
590 : // Copy the Conditions, but first delete the old ones
591 0 : aCondColls.clear();
592 0 : SwDoc& rDoc = *GetDoc();
593 0 : for( sal_uInt16 n = 0; n < rCndClls.size(); ++n )
594 : {
595 0 : const SwCollCondition* pFnd = &rCndClls[ n ];
596 0 : SwTxtFmtColl* pTmpColl = pFnd->GetTxtFmtColl()
597 0 : ? rDoc.CopyTxtColl( *pFnd->GetTxtFmtColl() )
598 0 : : 0;
599 : SwCollCondition* pNew;
600 0 : if( USRFLD_EXPRESSION & pFnd->GetCondition() )
601 : pNew = new SwCollCondition( pTmpColl, pFnd->GetCondition(),
602 0 : *pFnd->GetFldExpression() );
603 : else
604 : pNew = new SwCollCondition( pTmpColl, pFnd->GetCondition(),
605 0 : pFnd->GetSubCondition() );
606 0 : aCondColls.push_back( pNew );
607 : }
608 0 : }
609 :
610 0 : void SwTxtFmtColl::SetAttrOutlineLevel( int nLevel)
611 : {
612 : OSL_ENSURE( 0 <= nLevel && nLevel <= MAXLEVEL ,"SwTxtFmtColl: Level Out Of Range" );
613 : SetFmtAttr( SfxUInt16Item( RES_PARATR_OUTLINELEVEL,
614 0 : static_cast<sal_uInt16>(nLevel) ) );
615 0 : }
616 :
617 0 : int SwTxtFmtColl::GetAttrOutlineLevel() const
618 : {
619 0 : return ((const SfxUInt16Item &)GetFmtAttr(RES_PARATR_OUTLINELEVEL)).GetValue();
620 : }
621 :
622 0 : int SwTxtFmtColl::GetAssignedOutlineStyleLevel() const
623 : {
624 : OSL_ENSURE( IsAssignedToListLevelOfOutlineStyle(),
625 : "<SwTxtFmtColl::GetAssignedOutlineStyleLevel()> - misuse of method");
626 0 : return GetAttrOutlineLevel() - 1;
627 : }
628 :
629 0 : void SwTxtFmtColl::AssignToListLevelOfOutlineStyle(const int nAssignedListLevel)
630 : {
631 0 : mbAssignedToOutlineStyle = true;
632 0 : SetAttrOutlineLevel(nAssignedListLevel+1);
633 :
634 : // #i100277#
635 0 : SwIterator<SwTxtFmtColl,SwFmtColl> aIter( *this );
636 0 : SwTxtFmtColl* pDerivedTxtFmtColl = aIter.First();
637 0 : while ( pDerivedTxtFmtColl != 0 )
638 : {
639 0 : if ( !pDerivedTxtFmtColl->IsAssignedToListLevelOfOutlineStyle() )
640 : {
641 0 : if ( pDerivedTxtFmtColl->GetItemState( RES_PARATR_NUMRULE, sal_False ) == SFX_ITEM_DEFAULT )
642 : {
643 0 : SwNumRuleItem aItem(aEmptyOUStr);
644 0 : pDerivedTxtFmtColl->SetFmtAttr( aItem );
645 : }
646 0 : if ( pDerivedTxtFmtColl->GetItemState( RES_PARATR_OUTLINELEVEL, sal_False ) == SFX_ITEM_DEFAULT )
647 : {
648 0 : pDerivedTxtFmtColl->SetAttrOutlineLevel( 0 );
649 : }
650 : }
651 :
652 0 : pDerivedTxtFmtColl = aIter.Next();
653 0 : }
654 0 : }
655 :
656 0 : void SwTxtFmtColl::DeleteAssignmentToListLevelOfOutlineStyle()
657 : {
658 0 : mbAssignedToOutlineStyle = false;
659 0 : ResetFmtAttr(RES_PARATR_OUTLINELEVEL);
660 0 : }
661 :
662 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|