LCOV - code coverage report
Current view: top level - sw/source/core/doc - fmtcol.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 320 0.0 %
Date: 2014-04-14 Functions: 0 50 0.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10