LCOV - code coverage report
Current view: top level - sw/source/core/doc - docfmt.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 717 988 72.6 %
Date: 2014-11-03 Functions: 57 70 81.4 %
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 <hintids.hxx>
      21             : #include <svl/itemiter.hxx>
      22             : #include <sfx2/app.hxx>
      23             : #include <editeng/tstpitem.hxx>
      24             : #include <editeng/eeitem.hxx>
      25             : #include <editeng/langitem.hxx>
      26             : #include <editeng/lrspitem.hxx>
      27             : #include <editeng/formatbreakitem.hxx>
      28             : #include <editeng/rsiditem.hxx>
      29             : #include <editeng/colritem.hxx>
      30             : #include <svl/whiter.hxx>
      31             : #include <svl/zforlist.hxx>
      32             : #include <comphelper/processfactory.hxx>
      33             : #include <unotools/misccfg.hxx>
      34             : #include <com/sun/star/i18n/WordType.hpp>
      35             : #include <fmtpdsc.hxx>
      36             : #include <fmthdft.hxx>
      37             : #include <fmtcntnt.hxx>
      38             : #include <frmatr.hxx>
      39             : #include <doc.hxx>
      40             : #include <IDocumentUndoRedo.hxx>
      41             : #include <DocumentContentOperationsManager.hxx>
      42             : #include <IDocumentFieldsAccess.hxx>
      43             : #include <IDocumentState.hxx>
      44             : #include <IDocumentLayoutAccess.hxx>
      45             : #include <IDocumentStylePoolAccess.hxx>
      46             : #include <rootfrm.hxx>
      47             : #include <pagefrm.hxx>
      48             : #include <hints.hxx>
      49             : #include <ndtxt.hxx>
      50             : #include <pam.hxx>
      51             : #include <UndoCore.hxx>
      52             : #include <UndoAttribute.hxx>
      53             : #include <UndoInsert.hxx>
      54             : #include <ndgrf.hxx>
      55             : #include <pagedesc.hxx>
      56             : #include <rolbck.hxx>
      57             : #include <mvsave.hxx>
      58             : #include <txatbase.hxx>
      59             : #include <swtable.hxx>
      60             : #include <swtblfmt.hxx>
      61             : #include <charfmt.hxx>
      62             : #include <docary.hxx>
      63             : #include <paratr.hxx>
      64             : #include <redline.hxx>
      65             : #include <reffld.hxx>
      66             : #include <txtinet.hxx>
      67             : #include <fmtinfmt.hxx>
      68             : #include <breakit.hxx>
      69             : #include <SwStyleNameMapper.hxx>
      70             : #include <fmtautofmt.hxx>
      71             : #include <istyleaccess.hxx>
      72             : #include <SwUndoFmt.hxx>
      73             : #include <UndoManager.hxx>
      74             : #include <docsh.hxx>
      75             : #include <boost/scoped_ptr.hpp>
      76             : 
      77             : using namespace ::com::sun::star::i18n;
      78             : using namespace ::com::sun::star::lang;
      79             : using namespace ::com::sun::star::uno;
      80             : 
      81             : /*
      82             :  * Internal functions
      83             :  */
      84             : 
      85           0 : static void SetTxtFmtCollNext( SwTxtFmtColl* pTxtColl, const SwTxtFmtColl* pDel )
      86             : {
      87           0 :     if ( &pTxtColl->GetNextTxtFmtColl() == pDel )
      88             :     {
      89           0 :         pTxtColl->SetNextTxtFmtColl( *pTxtColl );
      90             :     }
      91           0 : }
      92             : 
      93      120306 : static bool lcl_RstAttr( const SwNodePtr& rpNd, void* pArgs )
      94             : {
      95      120306 :     const sw::DocumentContentOperationsManager::ParaRstFmt* pPara = (sw::DocumentContentOperationsManager::ParaRstFmt*)pArgs;
      96      120306 :     SwCntntNode* pNode = (SwCntntNode*)rpNd->GetCntntNode();
      97      120306 :     if( pNode && pNode->HasSwAttrSet() )
      98             :     {
      99        5508 :         const bool bLocked = pNode->IsModifyLocked();
     100        5508 :         pNode->LockModify();
     101             : 
     102        5508 :         SwDoc* pDoc = pNode->GetDoc();
     103             : 
     104             :         // remove unused attribute RES_LR_SPACE
     105             :         // add list attributes
     106        5508 :         SfxItemSet aSavedAttrsSet(pDoc->GetAttrPool(), RES_PAGEDESC, RES_BREAK,
     107             :                                   RES_PARATR_NUMRULE, RES_PARATR_NUMRULE,
     108             :                                   RES_PARATR_LIST_BEGIN,
     109        5508 :                                   RES_PARATR_LIST_END - 1, 0);
     110        5508 :         const SfxItemSet* pAttrSetOfNode = pNode->GetpSwAttrSet();
     111             : 
     112       11016 :         std::vector<sal_uInt16> aClearWhichIds;
     113             :         // restoring all paragraph list attributes
     114             :         {
     115        5508 :             SfxItemSet aListAttrSet( pDoc->GetAttrPool(), RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1 );
     116        5508 :             aListAttrSet.Set(*pAttrSetOfNode);
     117        5508 :             if ( aListAttrSet.Count() )
     118             :             {
     119        2648 :                 aSavedAttrsSet.Put(aListAttrSet);
     120        2648 :                 SfxItemIter aIter( aListAttrSet );
     121        2648 :                 const SfxPoolItem* pItem = aIter.GetCurItem();
     122        7944 :                 while( pItem )
     123             :                 {
     124        2648 :                     aClearWhichIds.push_back( pItem->Which() );
     125        2648 :                     pItem = aIter.NextItem();
     126        2648 :                 }
     127        5508 :             }
     128             :         }
     129             : 
     130             :         const SfxPoolItem* pItem;
     131             : 
     132        5508 :         sal_uInt16 const aSavIds[3] = { RES_PAGEDESC, RES_BREAK, RES_PARATR_NUMRULE };
     133       22032 :         for (sal_uInt16 n = 0; n < 3; ++n)
     134             :         {
     135       16524 :             if (SfxItemState::SET == pAttrSetOfNode->GetItemState(aSavIds[n], false, &pItem))
     136             :             {
     137        1248 :                 bool bSave = false;
     138        1248 :                 switch( aSavIds[ n ] )
     139             :                 {
     140             :                     case RES_PAGEDESC:
     141          68 :                         bSave = 0 != ((SwFmtPageDesc*)pItem)->GetPageDesc();
     142          68 :                     break;
     143             :                     case RES_BREAK:
     144         362 :                         bSave = SVX_BREAK_NONE != ((SvxFmtBreakItem*)pItem)->GetBreak();
     145         362 :                     break;
     146             :                     case RES_PARATR_NUMRULE:
     147         818 :                         bSave = !((SwNumRuleItem*)pItem)->GetValue().isEmpty();
     148         818 :                     break;
     149             :                 }
     150        1248 :                 if( bSave )
     151             :                 {
     152        1174 :                     aSavedAttrsSet.Put(*pItem);
     153        1174 :                     aClearWhichIds.push_back(aSavIds[n]);
     154             :                 }
     155             :             }
     156             :         }
     157             : 
     158             :         // do not clear items directly from item set and only clear to be kept
     159             :         // attributes, if no deletion item set is found.
     160             :         const bool bKeepAttributes =
     161        5508 :                     !pPara || !pPara->pDelSet || pPara->pDelSet->Count() == 0;
     162        5508 :         if ( bKeepAttributes )
     163             :         {
     164        5220 :             pNode->ResetAttr( aClearWhichIds );
     165             :         }
     166             : 
     167        5508 :         if( !bLocked )
     168        5508 :             pNode->UnlockModify();
     169             : 
     170        5508 :         if( pPara )
     171             :         {
     172        5508 :             SwRegHistory aRegH( pNode, *pNode, pPara->pHistory );
     173             : 
     174        5508 :             if( pPara->pDelSet && pPara->pDelSet->Count() )
     175             :             {
     176             :                 OSL_ENSURE( !bKeepAttributes,
     177             :                         "<lcl_RstAttr(..)> - certain attributes are kept, but not needed. -> please inform OD" );
     178         288 :                 SfxItemIter aIter( *pPara->pDelSet );
     179         288 :                 pItem = aIter.FirstItem();
     180             :                 while( true )
     181             :                 {
     182        4672 :                     if ( ( pItem->Which() != RES_PAGEDESC &&
     183        3110 :                            pItem->Which() != RES_BREAK &&
     184        3118 :                            pItem->Which() != RES_PARATR_NUMRULE ) ||
     185           6 :                          ( aSavedAttrsSet.GetItemState( pItem->Which(), false ) != SfxItemState::SET ) )
     186             :                     {
     187        1558 :                         pNode->ResetAttr( pItem->Which() );
     188             :                     }
     189        1558 :                     if (aIter.IsAtEnd())
     190         288 :                         break;
     191        1270 :                     pItem = aIter.NextItem();
     192         288 :                 }
     193             :             }
     194        5220 :             else if( pPara->bResetAll )
     195        5220 :                 pNode->ResetAllAttr();
     196             :             else
     197           0 :                 pNode->ResetAttr( RES_PARATR_BEGIN, POOLATTR_END - 1 );
     198             :         }
     199             :         else
     200           0 :             pNode->ResetAllAttr();
     201             : 
     202             :         // only restore saved attributes, if needed
     203        5508 :         if (bKeepAttributes && aSavedAttrsSet.Count())
     204             :         {
     205        2788 :             pNode->LockModify();
     206             : 
     207        2788 :             pNode->SetAttr(aSavedAttrsSet);
     208             : 
     209        2788 :             if( !bLocked )
     210        2788 :                 pNode->UnlockModify();
     211        5508 :         }
     212             :     }
     213      120306 :     return true;
     214             : }
     215             : 
     216           0 : void SwDoc::RstTxtAttrs(const SwPaM &rRg, bool bInclRefToxMark )
     217             : {
     218           0 :     SwHistory* pHst = 0;
     219           0 :     SwDataChanged aTmp( rRg );
     220           0 :     if (GetIDocumentUndoRedo().DoesUndo())
     221             :     {
     222           0 :         SwUndoResetAttr* pUndo = new SwUndoResetAttr( rRg, RES_CHRFMT );
     223           0 :         pHst = &pUndo->GetHistory();
     224           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     225             :     }
     226           0 :     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
     227           0 :     sw::DocumentContentOperationsManager::ParaRstFmt aPara( pStt, pEnd, pHst );
     228           0 :     aPara.bInclRefToxMark = bInclRefToxMark;
     229           0 :     GetNodes().ForEach( pStt->nNode.GetIndex(), pEnd->nNode.GetIndex()+1,
     230           0 :                         sw::DocumentContentOperationsManager::lcl_RstTxtAttr, &aPara );
     231           0 :     getIDocumentState().SetModified();
     232           0 : }
     233             : 
     234       49304 : void SwDoc::ResetAttrs( const SwPaM &rRg,
     235             :                         bool bTxtAttr,
     236             :                         const std::set<sal_uInt16> &rAttrs,
     237             :                         const bool bSendDataChangedEvents )
     238             : {
     239       49304 :     SwPaM* pPam = (SwPaM*)&rRg;
     240       49304 :     if( !bTxtAttr && !rAttrs.empty() && RES_TXTATR_END > *(rAttrs.begin()) )
     241           0 :         bTxtAttr = true;
     242             : 
     243       49304 :     if( !rRg.HasMark() )
     244             :     {
     245       47920 :         SwTxtNode* pTxtNd = rRg.GetPoint()->nNode.GetNode().GetTxtNode();
     246       47920 :         if( !pTxtNd )
     247           0 :             return ;
     248             : 
     249       47920 :         pPam = new SwPaM( *rRg.GetPoint() );
     250             : 
     251       47920 :         SwIndex& rSt = pPam->GetPoint()->nContent;
     252       47920 :         sal_Int32 nMkPos, nPtPos = rSt.GetIndex();
     253             : 
     254             :         // Special case: if the Crsr is located within a URL attribute, we take over it's area
     255             :         SwTxtAttr const*const pURLAttr(
     256       47920 :             pTxtNd->GetTxtAttrAt(rSt.GetIndex(), RES_TXTATR_INETFMT));
     257       47920 :         if (pURLAttr && !pURLAttr->GetINetFmt().GetValue().isEmpty())
     258             :         {
     259           0 :             nMkPos = pURLAttr->GetStart();
     260           0 :             nPtPos = *pURLAttr->End();
     261             :         }
     262             :         else
     263             :         {
     264       47920 :             Boundary aBndry;
     265       47920 :             if( g_pBreakIt->GetBreakIter().is() )
     266       95840 :                 aBndry = g_pBreakIt->GetBreakIter()->getWordBoundary(
     267       47920 :                             pTxtNd->GetTxt(), nPtPos,
     268       47920 :                             g_pBreakIt->GetLocale( pTxtNd->GetLang( nPtPos ) ),
     269             :                             WordType::ANY_WORD /*ANYWORD_IGNOREWHITESPACES*/,
     270       95840 :                             sal_True );
     271             : 
     272       47920 :             if( aBndry.startPos < nPtPos && nPtPos < aBndry.endPos )
     273             :             {
     274           0 :                 nMkPos = aBndry.startPos;
     275           0 :                 nPtPos = aBndry.endPos;
     276             :             }
     277             :             else
     278             :             {
     279       47920 :                 nPtPos = nMkPos = rSt.GetIndex();
     280       47920 :                 if( bTxtAttr )
     281       47632 :                     pTxtNd->DontExpandFmt( rSt, true );
     282             :             }
     283             :         }
     284             : 
     285       47920 :         rSt = nMkPos;
     286       47920 :         pPam->SetMark();
     287       47920 :         pPam->GetPoint()->nContent = nPtPos;
     288             :     }
     289             : 
     290             :     // #i96644#
     291       49304 :     boost::scoped_ptr< SwDataChanged > pDataChanged;
     292       49304 :     if ( bSendDataChangedEvents )
     293             :     {
     294       49016 :         pDataChanged.reset( new SwDataChanged( *pPam ) );
     295             :     }
     296       49304 :     SwHistory* pHst = 0;
     297       49304 :     if (GetIDocumentUndoRedo().DoesUndo())
     298             :     {
     299             :         SwUndoResetAttr* pUndo = new SwUndoResetAttr( rRg,
     300          22 :             static_cast<sal_uInt16>(bTxtAttr ? RES_CONDTXTFMTCOLL : RES_TXTFMTCOLL ));
     301          22 :         if( !rAttrs.empty() )
     302             :         {
     303           6 :             pUndo->SetAttrs( rAttrs );
     304             :         }
     305          22 :         pHst = &pUndo->GetHistory();
     306          22 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     307             :     }
     308             : 
     309       49304 :     const SwPosition *pStt = pPam->Start(), *pEnd = pPam->End();
     310       49304 :     sw::DocumentContentOperationsManager::ParaRstFmt aPara( pStt, pEnd, pHst );
     311             : 
     312             :     // mst: not including META here; it seems attrs with CH_TXTATR are omitted
     313             :     sal_uInt16 aResetableSetRange[] = {
     314             :         RES_FRMATR_BEGIN, RES_FRMATR_END-1,
     315             :         RES_CHRATR_BEGIN, RES_CHRATR_END-1,
     316             :         RES_PARATR_BEGIN, RES_PARATR_END-1,
     317             :         RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
     318             :         RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
     319             :         RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
     320             :         RES_TXTATR_CJK_RUBY, RES_TXTATR_CJK_RUBY,
     321             :         RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
     322             :         RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
     323             :         0
     324       49304 :     };
     325             : 
     326       98608 :     SfxItemSet aDelSet( GetAttrPool(), aResetableSetRange );
     327       49304 :     if( !rAttrs.empty() )
     328             :     {
     329        1948 :         for( std::set<sal_uInt16>::const_reverse_iterator it = rAttrs.rbegin(); it != rAttrs.rend(); ++it )
     330             :         {
     331        1656 :             if( POOLATTR_END > *it )
     332        1656 :                 aDelSet.Put( *GetDfltAttr( *it ));
     333             :         }
     334         292 :         if( aDelSet.Count() )
     335         292 :             aPara.pDelSet = &aDelSet;
     336             :     }
     337             : 
     338       49304 :     bool bAdd = true;
     339       98608 :     SwNodeIndex aTmpStt( pStt->nNode );
     340       98608 :     SwNodeIndex aTmpEnd( pEnd->nNode );
     341       49304 :     if( pStt->nContent.GetIndex() )     // just one part
     342             :     {
     343             :         // set up a later, and all CharFmtAttr -> TxtFmtAttr
     344        1352 :         SwTxtNode* pTNd = aTmpStt.GetNode().GetTxtNode();
     345        1352 :         if( pTNd && pTNd->HasSwAttrSet() && pTNd->GetpSwAttrSet()->Count() )
     346             :         {
     347          96 :             if (pHst)
     348             :             {
     349          10 :                 SwRegHistory history(pTNd, *pTNd, pHst);
     350          10 :                 pTNd->FmtToTxtAttr(pTNd);
     351             :             }
     352             :             else
     353             :             {
     354          86 :                 pTNd->FmtToTxtAttr(pTNd);
     355             :             }
     356             :         }
     357             : 
     358        1352 :         ++aTmpStt;
     359             :     }
     360       49304 :     if( pEnd->nContent.GetIndex() == pEnd->nNode.GetNode().GetCntntNode()->Len() )
     361             :          // set up a later, and all CharFmtAttr -> TxtFmtAttr
     362       49144 :         aTmpEnd++, bAdd = false;
     363         160 :     else if( pStt->nNode != pEnd->nNode || !pStt->nContent.GetIndex() )
     364             :     {
     365         160 :         SwTxtNode* pTNd = aTmpEnd.GetNode().GetTxtNode();
     366         160 :         if( pTNd && pTNd->HasSwAttrSet() && pTNd->GetpSwAttrSet()->Count() )
     367             :         {
     368         160 :             if (pHst)
     369             :             {
     370           2 :                 SwRegHistory history(pTNd, *pTNd, pHst);
     371           2 :                 pTNd->FmtToTxtAttr(pTNd);
     372             :             }
     373             :             else
     374             :             {
     375         158 :                 pTNd->FmtToTxtAttr(pTNd);
     376             :             }
     377             :         }
     378             :     }
     379             : 
     380       49304 :     if( aTmpStt < aTmpEnd )
     381       49142 :         GetNodes().ForEach( pStt->nNode, aTmpEnd, lcl_RstAttr, &aPara );
     382         162 :     else if( !rRg.HasMark() )
     383             :     {
     384         162 :         aPara.bResetAll = false ;
     385         162 :         ::lcl_RstAttr( &pStt->nNode.GetNode(), &aPara );
     386         162 :         aPara.bResetAll = true ;
     387             :     }
     388             : 
     389       49304 :     if( bTxtAttr )
     390             :     {
     391       49016 :         if( bAdd )
     392           0 :             ++aTmpEnd;
     393       49016 :         GetNodes().ForEach( pStt->nNode, aTmpEnd, sw::DocumentContentOperationsManager::lcl_RstTxtAttr, &aPara );
     394             :     }
     395             : 
     396       49304 :     if( pPam != &rRg )
     397       47920 :         delete pPam;
     398             : 
     399       98608 :     getIDocumentState().SetModified();
     400             : }
     401             : 
     402             : /// Set the rsid of the next nLen symbols of rRg to the current session number
     403         572 : bool SwDoc::UpdateRsid( const SwPaM &rRg, const sal_Int32 nLen )
     404             : {
     405         572 :     SwTxtNode *pTxtNode = rRg.GetPoint()->nNode.GetNode().GetTxtNode();
     406         572 :     if (!pTxtNode)
     407             :     {
     408           0 :         return false;
     409             :     }
     410         572 :     const sal_Int32 nStart(rRg.GetPoint()->nContent.GetIndex() - nLen);
     411         572 :     SvxRsidItem aRsid( mnRsid, RES_CHRATR_RSID );
     412             : 
     413        1144 :     SfxItemSet aSet(GetAttrPool(), RES_CHRATR_RSID, RES_CHRATR_RSID);
     414         572 :     aSet.Put(aRsid);
     415             :     bool const bRet(pTxtNode->SetAttr(aSet, nStart,
     416         572 :         rRg.GetPoint()->nContent.GetIndex(), nsSetAttrMode::SETATTR_DEFAULT));
     417             : 
     418         572 :     if (bRet && GetIDocumentUndoRedo().DoesUndo())
     419             :     {
     420          18 :         SwUndo *const pLastUndo = GetUndoManager().GetLastUndo();
     421          18 :         SwUndoInsert *const pUndoInsert(dynamic_cast<SwUndoInsert*>(pLastUndo));
     422             :         // this function is called after Insert so expects to find SwUndoInsert
     423             :         assert(pUndoInsert);
     424          18 :         if (pUndoInsert)
     425             :         {
     426          18 :             pUndoInsert->SetWithRsid();
     427             :         }
     428             :     }
     429        1144 :     return bRet;
     430             : }
     431             : 
     432         764 : bool SwDoc::UpdateParRsid( SwTxtNode *pTxtNode, sal_uInt32 nVal )
     433             : {
     434         764 :     if (!pTxtNode)
     435             :     {
     436           0 :         return false;
     437             :     }
     438             : 
     439         764 :     SvxRsidItem aRsid( nVal ? nVal : mnRsid, RES_PARATR_RSID );
     440         764 :     return pTxtNode->SetAttr( aRsid );
     441             : }
     442             : 
     443             : /// Set the attribute according to the stated format.
     444             : /// If Undo is enabled, the old values is added to the Undo history.
     445       18288 : void SwDoc::SetAttr( const SfxPoolItem& rAttr, SwFmt& rFmt )
     446             : {
     447       18288 :     SfxItemSet aSet( GetAttrPool(), rAttr.Which(), rAttr.Which() );
     448       18288 :     aSet.Put( rAttr );
     449       18288 :     SetAttr( aSet, rFmt );
     450       18288 : }
     451             : 
     452             : /// Set the attribute according to the stated format.
     453             : /// If Undo is enabled, the old values is added to the Undo history.
     454      166126 : void SwDoc::SetAttr( const SfxItemSet& rSet, SwFmt& rFmt )
     455             : {
     456      166126 :     if (GetIDocumentUndoRedo().DoesUndo())
     457             :     {
     458         116 :         SwUndoFmtAttrHelper aTmp( rFmt );
     459         116 :         rFmt.SetFmtAttr( rSet );
     460         116 :         if ( aTmp.GetUndo() )
     461             :         {
     462         106 :             GetIDocumentUndoRedo().AppendUndo( aTmp.ReleaseUndo() );
     463             :         }
     464             :         else
     465             :         {
     466          10 :             GetIDocumentUndoRedo().ClearRedo();
     467         116 :         }
     468             :     }
     469             :     else
     470             :     {
     471      166010 :         rFmt.SetFmtAttr( rSet );
     472             :     }
     473      166126 :     getIDocumentState().SetModified();
     474      166126 : }
     475             : 
     476           0 : void SwDoc::ResetAttrAtFormat( const sal_uInt16 nWhichId,
     477             :                                SwFmt& rChangedFormat )
     478             : {
     479           0 :     SwUndo *const pUndo = (GetIDocumentUndoRedo().DoesUndo())
     480           0 :         ?   new SwUndoFmtResetAttr( rChangedFormat, nWhichId )
     481           0 :         :   0;
     482             : 
     483           0 :     const bool bAttrReset = rChangedFormat.ResetFmtAttr( nWhichId );
     484             : 
     485           0 :     if ( bAttrReset )
     486             :     {
     487           0 :         if ( pUndo )
     488             :         {
     489           0 :             GetIDocumentUndoRedo().AppendUndo( pUndo );
     490             :         }
     491             : 
     492           0 :         getIDocumentState().SetModified();
     493             :     }
     494             :     else
     495           0 :         delete pUndo;
     496           0 : }
     497             : 
     498       17294 : static int lcl_SetNewDefTabStops( SwTwips nOldWidth, SwTwips nNewWidth,
     499             :                                 SvxTabStopItem& rChgTabStop )
     500             : {
     501             :     // Set the default values of all TabStops to the new value.
     502             :     // Attention: we always work with the PoolAttribut here, so that
     503             :     // we don't calculate the same value on the same TabStop (pooled!) for all sets.
     504             :     // We send a FmtChg to modify.
     505             : 
     506       17294 :     sal_uInt16 nOldCnt = rChgTabStop.Count();
     507       17294 :     if( !nOldCnt || nOldWidth == nNewWidth )
     508         524 :         return sal_False;
     509             : 
     510             :     // Find the default's beginning
     511             :     sal_uInt16 n;
     512       33526 :     for( n = nOldCnt; n ; --n )
     513       16770 :         if( SVX_TAB_ADJUST_DEFAULT != rChgTabStop[n - 1].GetAdjustment() )
     514          14 :             break;
     515       16770 :     ++n;
     516       16770 :     if( n < nOldCnt )   // delete the DefTabStops
     517           0 :         rChgTabStop.Remove( n, nOldCnt - n );
     518       16770 :     return sal_True;
     519             : }
     520             : 
     521             : /// Set the attribute as new default attribute in this document.
     522             : /// If Undo is enabled, the old value is added to the Undo history.
     523       98034 : void SwDoc::SetDefault( const SfxPoolItem& rAttr )
     524             : {
     525       98034 :     SfxItemSet aSet( GetAttrPool(), rAttr.Which(), rAttr.Which() );
     526       98034 :     aSet.Put( rAttr );
     527       98034 :     SetDefault( aSet );
     528       98034 : }
     529             : 
     530      102790 : void SwDoc::SetDefault( const SfxItemSet& rSet )
     531             : {
     532      102790 :     if( !rSet.Count() )
     533      102790 :         return;
     534             : 
     535      102790 :     SwModify aCallMod( 0 );
     536      205580 :     SwAttrSet aOld( GetAttrPool(), rSet.GetRanges() ),
     537      205580 :             aNew( GetAttrPool(), rSet.GetRanges() );
     538      205580 :     SfxItemIter aIter( rSet );
     539             :     sal_uInt16 nWhich;
     540      102790 :     const SfxPoolItem* pItem = aIter.GetCurItem();
     541      102790 :     SfxItemPool* pSdrPool = GetAttrPool().GetSecondaryPool();
     542             :     while( true )
     543             :     {
     544      126556 :         bool bCheckSdrDflt = false;
     545      126556 :         nWhich = pItem->Which();
     546      126556 :         aOld.Put( GetAttrPool().GetDefaultItem( nWhich ) );
     547      126556 :         GetAttrPool().SetPoolDefaultItem( *pItem );
     548      126556 :         aNew.Put( GetAttrPool().GetDefaultItem( nWhich ) );
     549             : 
     550      126556 :         if (isCHRATR(nWhich) || isTXTATR(nWhich))
     551             :         {
     552       92009 :             aCallMod.Add( mpDfltTxtFmtColl );
     553       92009 :             aCallMod.Add( mpDfltCharFmt );
     554       92009 :             bCheckSdrDflt = 0 != pSdrPool;
     555             :         }
     556       45967 :         else if ( isPARATR(nWhich) ||
     557       11420 :                   isPARATR_LIST(nWhich) )
     558             :         {
     559       23127 :             aCallMod.Add( mpDfltTxtFmtColl );
     560       23127 :             bCheckSdrDflt = 0 != pSdrPool;
     561             :         }
     562       11420 :         else if (isGRFATR(nWhich))
     563             :         {
     564           0 :             aCallMod.Add( mpDfltGrfFmtColl );
     565             :         }
     566       11420 :         else if (isFRMATR(nWhich) || isDrawingLayerAttribute(nWhich) ) //UUUU
     567             :         {
     568       11420 :             aCallMod.Add( mpDfltGrfFmtColl );
     569       11420 :             aCallMod.Add( mpDfltTxtFmtColl );
     570       11420 :             aCallMod.Add( mpDfltFrmFmt );
     571             :         }
     572           0 :         else if (isBOXATR(nWhich))
     573             :         {
     574           0 :             aCallMod.Add( mpDfltFrmFmt );
     575             :         }
     576             : 
     577             :         // also copy the defaults
     578      126556 :         if( bCheckSdrDflt )
     579             :         {
     580             :             sal_uInt16 nEdtWhich, nSlotId;
     581      345408 :             if( 0 != (nSlotId = GetAttrPool().GetSlotId( nWhich ) ) &&
     582      110051 :                 nSlotId != nWhich &&
     583      335238 :                 0 != (nEdtWhich = pSdrPool->GetWhich( nSlotId )) &&
     584             :                 nSlotId != nEdtWhich )
     585             :             {
     586       99022 :                 SfxPoolItem* pCpy = pItem->Clone();
     587       99022 :                 pCpy->SetWhich( nEdtWhich );
     588       99022 :                 pSdrPool->SetPoolDefaultItem( *pCpy );
     589       99022 :                 delete pCpy;
     590             :             }
     591             :         }
     592             : 
     593      126556 :         if( aIter.IsAtEnd() )
     594      102790 :             break;
     595       23766 :         pItem = aIter.NextItem();
     596             :     }
     597             : 
     598      102790 :     if( aNew.Count() && aCallMod.GetDepends() )
     599             :     {
     600      102790 :         if (GetIDocumentUndoRedo().DoesUndo())
     601             :         {
     602         750 :             GetIDocumentUndoRedo().AppendUndo( new SwUndoDefaultAttr( aOld ) );
     603             :         }
     604             : 
     605             :         const SfxPoolItem* pTmpItem;
     606      102790 :         if( ( SfxItemState::SET ==
     607      111434 :                 aNew.GetItemState( RES_PARATR_TABSTOP, false, &pTmpItem ) ) &&
     608        8644 :             ((SvxTabStopItem*)pTmpItem)->Count() )
     609             :         {
     610             :             // Set the default values of all TabStops to the new value.
     611             :             // Attention: we always work with the PoolAttribut here, so that
     612             :             // we don't calculate the same value on the same TabStop (pooled!) for all sets.
     613             :             // We send a FmtChg to modify.
     614        8644 :             SwTwips nNewWidth = (*(SvxTabStopItem*)pTmpItem)[ 0 ].GetTabPos(),
     615        8644 :                     nOldWidth = ((SvxTabStopItem&)aOld.Get(RES_PARATR_TABSTOP))[ 0 ].GetTabPos();
     616             : 
     617        8644 :             int bChg = sal_False;
     618        8644 :             sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_PARATR_TABSTOP );
     619       26026 :             for( sal_uInt32 n = 0; n < nMaxItems; ++n )
     620       17382 :                 if( 0 != (pTmpItem = GetAttrPool().GetItem2( RES_PARATR_TABSTOP, n ) ))
     621             :                     bChg |= lcl_SetNewDefTabStops( nOldWidth, nNewWidth,
     622       17294 :                                                 *(SvxTabStopItem*)pTmpItem );
     623             : 
     624        8644 :             aNew.ClearItem( RES_PARATR_TABSTOP );
     625        8644 :             aOld.ClearItem( RES_PARATR_TABSTOP );
     626        8644 :             if( bChg )
     627             :             {
     628        8378 :                 SwFmtChg aChgFmt( mpDfltCharFmt );
     629             :                 // notify the frames
     630        8378 :                 aCallMod.ModifyNotification( &aChgFmt, &aChgFmt );
     631             :             }
     632             :         }
     633             :     }
     634             : 
     635      102790 :     if( aNew.Count() && aCallMod.GetDepends() )
     636             :     {
     637       98892 :         SwAttrSetChg aChgOld( aOld, aOld );
     638      197784 :         SwAttrSetChg aChgNew( aNew, aNew );
     639      197784 :         aCallMod.ModifyNotification( &aChgOld, &aChgNew );      // all changed are sent
     640             :     }
     641             : 
     642             :     // remove the default formats from the object again
     643             :     SwClient* pDep;
     644      408903 :     while( 0 != ( pDep = (SwClient*)aCallMod.GetDepends()) )
     645      203323 :         aCallMod.Remove( pDep );
     646             : 
     647      205580 :     getIDocumentState().SetModified();
     648             : }
     649             : 
     650             : /// Get the default attribute in this document
     651      382006 : const SfxPoolItem& SwDoc::GetDefault( sal_uInt16 nFmtHint ) const
     652             : {
     653      382006 :     return GetAttrPool().GetDefaultItem( nFmtHint );
     654             : }
     655             : 
     656             : /// Delete the formats
     657          78 : void SwDoc::DelCharFmt(sal_uInt16 nFmt, bool bBroadcast)
     658             : {
     659          78 :     SwCharFmt * pDel = (*mpCharFmtTbl)[nFmt];
     660             : 
     661          78 :     if (bBroadcast)
     662             :         BroadcastStyleOperation(pDel->GetName(), SFX_STYLE_FAMILY_CHAR,
     663           0 :                                 SFX_STYLESHEET_ERASED);
     664             : 
     665          78 :     if (GetIDocumentUndoRedo().DoesUndo())
     666             :     {
     667             :         SwUndo * pUndo =
     668           2 :             new SwUndoCharFmtDelete(pDel, this);
     669             : 
     670           2 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     671             :     }
     672             : 
     673          78 :     delete (*mpCharFmtTbl)[nFmt];
     674          78 :     mpCharFmtTbl->erase(mpCharFmtTbl->begin() + nFmt);
     675             : 
     676          78 :     getIDocumentState().SetModified();
     677          78 : }
     678             : 
     679           2 : void SwDoc::DelCharFmt( SwCharFmt *pFmt, bool bBroadcast )
     680             : {
     681           2 :     sal_uInt16 nFmt = mpCharFmtTbl->GetPos( pFmt );
     682             :     OSL_ENSURE( USHRT_MAX != nFmt, "Fmt not found," );
     683           2 :     DelCharFmt( nFmt, bBroadcast );
     684           2 : }
     685             : 
     686        9852 : void SwDoc::DelFrmFmt( SwFrmFmt *pFmt, bool bBroadcast )
     687             : {
     688        9852 :     if( pFmt->ISA( SwTableBoxFmt ) || pFmt->ISA( SwTableLineFmt ))
     689             :     {
     690             :         OSL_ENSURE( false, "Format is not in the DocArray any more, "
     691             :                        "so it can be deleted with delete" );
     692           0 :         delete pFmt;
     693             :     }
     694             :     else
     695             :     {
     696             : 
     697             :         // The format has to be in the one or the other, we'll see in which one.
     698        9852 :         SwFrmFmts::iterator it = std::find( mpFrmFmtTbl->begin(), mpFrmFmtTbl->end(), pFmt );
     699        9852 :         if ( it != mpFrmFmtTbl->end() )
     700             :         {
     701        5638 :             if (bBroadcast)
     702             :                 BroadcastStyleOperation(pFmt->GetName(),
     703             :                                         SFX_STYLE_FAMILY_FRAME,
     704           0 :                                         SFX_STYLESHEET_ERASED);
     705             : 
     706        5638 :             if (GetIDocumentUndoRedo().DoesUndo())
     707             :             {
     708        5070 :                 SwUndo * pUndo = new SwUndoFrmFmtDelete(pFmt, this);
     709             : 
     710        5070 :                 GetIDocumentUndoRedo().AppendUndo(pUndo);
     711             :             }
     712             : 
     713        5638 :             delete *it;
     714        5638 :             mpFrmFmtTbl->erase(it);
     715             :         }
     716             :         else
     717             :         {
     718        4214 :             SwFrmFmts::iterator it2 = std::find( GetSpzFrmFmts()->begin(), GetSpzFrmFmts()->end(), pFmt );
     719             :             OSL_ENSURE( it2 != GetSpzFrmFmts()->end(), "FrmFmt not found." );
     720        4214 :             if( it2 != GetSpzFrmFmts()->end() )
     721             :             {
     722        4214 :                 delete *it2;
     723        4214 :                 GetSpzFrmFmts()->erase( it2 );
     724             :             }
     725             :         }
     726             :     }
     727        9852 : }
     728             : 
     729        1814 : void SwDoc::DelTblFrmFmt( SwTableFmt *pFmt )
     730             : {
     731        1814 :     SwFrmFmts::iterator it = std::find( mpTblFrmFmtTbl->begin(), mpTblFrmFmtTbl->end(), pFmt );
     732             :     OSL_ENSURE( it != mpTblFrmFmtTbl->end(), "Fmt not found," );
     733        1814 :     delete *it;
     734        1814 :     mpTblFrmFmtTbl->erase(it);
     735        1814 : }
     736             : 
     737             : /// Create the formats
     738        3916 : SwFlyFrmFmt *SwDoc::MakeFlyFrmFmt( const OUString &rFmtName,
     739             :                                     SwFrmFmt *pDerivedFrom )
     740             : {
     741        3916 :     SwFlyFrmFmt *pFmt = new SwFlyFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom );
     742        3916 :     GetSpzFrmFmts()->push_back(pFmt);
     743        3916 :     getIDocumentState().SetModified();
     744        3916 :     return pFmt;
     745             : }
     746             : 
     747        4470 : SwDrawFrmFmt *SwDoc::MakeDrawFrmFmt( const OUString &rFmtName,
     748             :                                      SwFrmFmt *pDerivedFrom )
     749             : {
     750        4470 :     SwDrawFrmFmt *pFmt = new SwDrawFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom);
     751        4470 :     GetSpzFrmFmts()->push_back(pFmt);
     752        4470 :     getIDocumentState().SetModified();
     753        4470 :     return pFmt;
     754             : }
     755             : 
     756         464 : sal_uInt16 SwDoc::GetTblFrmFmtCount(bool bUsed) const
     757             : {
     758         464 :     sal_uInt16 nCount = mpTblFrmFmtTbl->size();
     759         464 :     if(bUsed)
     760             :     {
     761         464 :         SwAutoFmtGetDocNode aGetHt( &GetNodes() );
     762        1302 :         for ( sal_uInt16 i = nCount; i; )
     763             :         {
     764         374 :             if((*mpTblFrmFmtTbl)[--i]->GetInfo( aGetHt ))
     765           0 :                 --nCount;
     766         464 :         }
     767             :     }
     768         464 :     return nCount;
     769             : }
     770             : 
     771         180 : SwFrmFmt& SwDoc::GetTblFrmFmt(sal_uInt16 nFmt, bool bUsed ) const
     772             : {
     773         180 :     sal_uInt16 nRemoved = 0;
     774         180 :     if(bUsed)
     775             :     {
     776         180 :         SwAutoFmtGetDocNode aGetHt( &GetNodes() );
     777         418 :         for ( sal_uInt16 i = 0; i <= nFmt; i++ )
     778             :         {
     779         476 :             while ( (*mpTblFrmFmtTbl)[ i + nRemoved]->GetInfo( aGetHt ))
     780             :             {
     781           0 :                 nRemoved++;
     782             :             }
     783         180 :         }
     784             :     }
     785         180 :     return *((*mpTblFrmFmtTbl)[nRemoved + nFmt]);
     786             : }
     787             : 
     788        1816 : SwTableFmt* SwDoc::MakeTblFrmFmt( const OUString &rFmtName,
     789             :                                     SwFrmFmt *pDerivedFrom )
     790             : {
     791        1816 :     SwTableFmt* pFmt = new SwTableFmt( GetAttrPool(), rFmtName, pDerivedFrom );
     792        1816 :     mpTblFrmFmtTbl->push_back( pFmt );
     793        1816 :     getIDocumentState().SetModified();
     794             : 
     795        1816 :     return pFmt;
     796             : }
     797             : 
     798        8378 : SwFrmFmt *SwDoc::MakeFrmFmt(const OUString &rFmtName,
     799             :                             SwFrmFmt *pDerivedFrom,
     800             :                             bool bBroadcast, bool bAuto)
     801             : {
     802        8378 :     SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom );
     803             : 
     804        8378 :     pFmt->SetAuto(bAuto);
     805        8378 :     mpFrmFmtTbl->push_back( pFmt );
     806        8378 :     getIDocumentState().SetModified();
     807             : 
     808        8378 :     if (GetIDocumentUndoRedo().DoesUndo())
     809             :     {
     810          44 :         SwUndo * pUndo = new SwUndoFrmFmtCreate(pFmt, pDerivedFrom, this);
     811             : 
     812          44 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     813             :     }
     814             : 
     815        8378 :     if (bBroadcast)
     816             :     {
     817             :         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_FRAME,
     818           0 :                                 SFX_STYLESHEET_CREATED);
     819             :     }
     820             : 
     821        8378 :     return pFmt;
     822             : }
     823             : 
     824        2692 : SwFmt *SwDoc::_MakeFrmFmt(const OUString &rFmtName,
     825             :                             SwFmt *pDerivedFrom,
     826             :                             bool bBroadcast, bool bAuto)
     827             : {
     828        2692 :     SwFrmFmt *pFrmFmt = dynamic_cast<SwFrmFmt*>(pDerivedFrom);
     829        2692 :     pFrmFmt = MakeFrmFmt( rFmtName, pFrmFmt, bBroadcast, bAuto );
     830        2692 :     return dynamic_cast<SwFmt*>(pFrmFmt);
     831             : }
     832             : 
     833             : // #i40550# - add parameter <bAuto> - not relevant
     834       25280 : SwCharFmt *SwDoc::MakeCharFmt( const OUString &rFmtName,
     835             :                                SwCharFmt *pDerivedFrom,
     836             :                                bool bBroadcast,
     837             :                                bool )
     838             : {
     839       25280 :     SwCharFmt *pFmt = new SwCharFmt( GetAttrPool(), rFmtName, pDerivedFrom );
     840       25280 :     mpCharFmtTbl->push_back( pFmt );
     841       25280 :     pFmt->SetAuto( false );
     842       25280 :     getIDocumentState().SetModified();
     843             : 
     844       25280 :     if (GetIDocumentUndoRedo().DoesUndo())
     845             :     {
     846         430 :         SwUndo * pUndo = new SwUndoCharFmtCreate(pFmt, pDerivedFrom, this);
     847             : 
     848         430 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     849             :     }
     850             : 
     851       25280 :     if (bBroadcast)
     852             :     {
     853             :         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_CHAR,
     854           0 :                                 SFX_STYLESHEET_CREATED);
     855             :     }
     856             : 
     857       25280 :     return pFmt;
     858             : }
     859             : 
     860        2140 : SwFmt *SwDoc::_MakeCharFmt(const OUString &rFmtName,
     861             :                             SwFmt *pDerivedFrom,
     862             :                             bool bBroadcast, bool bAuto)
     863             : {
     864        2140 :     SwCharFmt *pCharFmt = dynamic_cast<SwCharFmt*>(pDerivedFrom);
     865        2140 :     pCharFmt = MakeCharFmt( rFmtName, pCharFmt, bBroadcast, bAuto );
     866        2140 :     return dynamic_cast<SwFmt*>(pCharFmt);
     867             : }
     868             : 
     869             : /// Create the FormatCollections
     870       18334 : SwTxtFmtColl* SwDoc::MakeTxtFmtColl( const OUString &rFmtName,
     871             :                                      SwTxtFmtColl *pDerivedFrom,
     872             :                                      bool bBroadcast,
     873             :                                      bool )
     874             : {
     875             :     SwTxtFmtColl *pFmtColl = new SwTxtFmtColl( GetAttrPool(), rFmtName,
     876       18334 :                                                 pDerivedFrom );
     877       18334 :     mpTxtFmtCollTbl->push_back(pFmtColl);
     878       18334 :     pFmtColl->SetAuto( false );
     879       18334 :     getIDocumentState().SetModified();
     880             : 
     881       18334 :     if (GetIDocumentUndoRedo().DoesUndo())
     882             :     {
     883             :         SwUndo * pUndo = new SwUndoTxtFmtCollCreate(pFmtColl, pDerivedFrom,
     884          16 :                                                     this);
     885          16 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     886             :     }
     887             : 
     888       18334 :     if (bBroadcast)
     889             :         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
     890           0 :                                 SFX_STYLESHEET_CREATED);
     891             : 
     892       18334 :     return pFmtColl;
     893             : }
     894             : 
     895         234 : SwFmt *SwDoc::_MakeTxtFmtColl(const OUString &rFmtName,
     896             :                             SwFmt *pDerivedFrom,
     897             :                             bool bBroadcast, bool bAuto)
     898             : {
     899         234 :     SwTxtFmtColl *pTxtFmtColl = dynamic_cast<SwTxtFmtColl*>(pDerivedFrom);
     900         234 :     pTxtFmtColl = MakeTxtFmtColl( rFmtName, pTxtFmtColl, bBroadcast, bAuto );
     901         234 :     return dynamic_cast<SwFmt*>(pTxtFmtColl);
     902             : }
     903             : 
     904             : //FEATURE::CONDCOLL
     905          10 : SwConditionTxtFmtColl* SwDoc::MakeCondTxtFmtColl( const OUString &rFmtName,
     906             :                                                   SwTxtFmtColl *pDerivedFrom,
     907             :                                                   bool bBroadcast)
     908             : {
     909             :     SwConditionTxtFmtColl*pFmtColl = new SwConditionTxtFmtColl( GetAttrPool(),
     910          10 :                                                     rFmtName, pDerivedFrom );
     911          10 :     mpTxtFmtCollTbl->push_back(pFmtColl);
     912          10 :     pFmtColl->SetAuto( false );
     913          10 :     getIDocumentState().SetModified();
     914             : 
     915          10 :     if (GetIDocumentUndoRedo().DoesUndo())
     916             :     {
     917             :         SwUndo * pUndo = new SwUndoCondTxtFmtCollCreate(pFmtColl, pDerivedFrom,
     918           4 :                                                         this);
     919           4 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     920             :     }
     921             : 
     922          10 :     if (bBroadcast)
     923             :         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
     924           0 :                                 SFX_STYLESHEET_CREATED);
     925             : 
     926          10 :     return pFmtColl;
     927             : }
     928             : //FEATURE::CONDCOLL
     929             : 
     930             : // GRF
     931           0 : SwGrfFmtColl* SwDoc::MakeGrfFmtColl( const OUString &rFmtName,
     932             :                                      SwGrfFmtColl *pDerivedFrom )
     933             : {
     934             :     SwGrfFmtColl *pFmtColl = new SwGrfFmtColl( GetAttrPool(), rFmtName,
     935           0 :                                                 pDerivedFrom );
     936           0 :     mpGrfFmtCollTbl->push_back( pFmtColl );
     937           0 :     pFmtColl->SetAuto( false );
     938           0 :     getIDocumentState().SetModified();
     939           0 :     return pFmtColl;
     940             : }
     941             : 
     942           0 : void SwDoc::DelTxtFmtColl(sal_uInt16 nFmtColl, bool bBroadcast)
     943             : {
     944             :     OSL_ENSURE( nFmtColl, "Remove fuer Coll 0." );
     945             : 
     946             :     // Who has the to-be-deleted as their Next?
     947           0 :     SwTxtFmtColl *pDel = (*mpTxtFmtCollTbl)[nFmtColl];
     948           0 :     if( mpDfltTxtFmtColl == pDel )
     949           0 :         return;     // never delete default!
     950             : 
     951           0 :     if (bBroadcast)
     952             :         BroadcastStyleOperation(pDel->GetName(), SFX_STYLE_FAMILY_PARA,
     953           0 :                                 SFX_STYLESHEET_ERASED);
     954             : 
     955           0 :     if (GetIDocumentUndoRedo().DoesUndo())
     956             :     {
     957             :         SwUndoTxtFmtCollDelete * pUndo;
     958           0 :         if (RES_CONDTXTFMTCOLL == pDel->Which())
     959             :         {
     960           0 :             pUndo = new SwUndoCondTxtFmtCollDelete(pDel, this);
     961             :         }
     962             :         else
     963             :         {
     964           0 :             pUndo = new SwUndoTxtFmtCollDelete(pDel, this);
     965             :         }
     966             : 
     967           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     968             :     }
     969             : 
     970             :     // Remove the FmtColl
     971           0 :     mpTxtFmtCollTbl->erase(mpTxtFmtCollTbl->begin() + nFmtColl);
     972             :     // Correct next
     973           0 :     for( SwTxtFmtColls::const_iterator it = mpTxtFmtCollTbl->begin() + 1; it != mpTxtFmtCollTbl->end(); ++it )
     974           0 :         SetTxtFmtCollNext( *it, pDel );
     975           0 :     delete pDel;
     976           0 :     getIDocumentState().SetModified();
     977             : }
     978             : 
     979           0 : void SwDoc::DelTxtFmtColl( SwTxtFmtColl *pColl, bool bBroadcast )
     980             : {
     981           0 :     sal_uInt16 nFmt = mpTxtFmtCollTbl->GetPos( pColl );
     982             :     OSL_ENSURE( USHRT_MAX != nFmt, "Collection not found," );
     983           0 :     DelTxtFmtColl( nFmt, bBroadcast );
     984           0 : }
     985             : 
     986       69624 : static bool lcl_SetTxtFmtColl( const SwNodePtr& rpNode, void* pArgs )
     987             : {
     988       69624 :     SwCntntNode* pCNd = static_cast<SwCntntNode*>(rpNode->GetTxtNode());
     989             : 
     990       69624 :     if( pCNd == NULL)
     991           0 :         return true;
     992             : 
     993       69624 :     sw::DocumentContentOperationsManager::ParaRstFmt* pPara = reinterpret_cast<sw::DocumentContentOperationsManager::ParaRstFmt*>(pArgs);
     994             : 
     995       69624 :     SwTxtFmtColl* pFmt = static_cast<SwTxtFmtColl*>(pPara->pFmtColl);
     996       69624 :     if ( pPara->bReset )
     997             :     {
     998       69624 :         lcl_RstAttr(pCNd, pPara);
     999             : 
    1000             :         // #i62675# check, if paragraph style has changed
    1001       69624 :         if ( pPara->bResetListAttrs &&
    1002       69624 :              pFmt != pCNd->GetFmtColl() &&
    1003           0 :              pFmt->GetItemState( RES_PARATR_NUMRULE ) == SfxItemState::SET )
    1004             :         {
    1005             :             // Check, if the list style of the paragraph will change.
    1006           0 :             bool bChangeOfListStyleAtParagraph( true );
    1007           0 :             SwTxtNode* pTNd( dynamic_cast<SwTxtNode*>(pCNd) );
    1008             :             OSL_ENSURE( pTNd, "<lcl_SetTxtFmtColl(..)> - text node expected -> crash" );
    1009             :             {
    1010           0 :                 SwNumRule* pNumRuleAtParagraph( pTNd->GetNumRule() );
    1011           0 :                 if ( pNumRuleAtParagraph )
    1012             :                 {
    1013             :                     const SwNumRuleItem& rNumRuleItemAtParagraphStyle =
    1014           0 :                         pFmt->GetNumRule();
    1015           0 :                     if ( rNumRuleItemAtParagraphStyle.GetValue() ==
    1016             :                             pNumRuleAtParagraph->GetName() )
    1017             :                     {
    1018           0 :                         bChangeOfListStyleAtParagraph = false;
    1019             :                     }
    1020             :                 }
    1021             :             }
    1022             : 
    1023           0 :             if ( bChangeOfListStyleAtParagraph )
    1024             :             {
    1025           0 :                 boost::scoped_ptr< SwRegHistory > pRegH;
    1026           0 :                 if ( pPara->pHistory )
    1027             :                 {
    1028           0 :                     pRegH.reset( new SwRegHistory( pTNd, *pTNd, pPara->pHistory ) );
    1029             :                 }
    1030             : 
    1031           0 :                 pCNd->ResetAttr( RES_PARATR_NUMRULE );
    1032             : 
    1033             :                 // reset all list attributes
    1034           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_LEVEL );
    1035           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_ISRESTART );
    1036           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
    1037           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_ISCOUNTED );
    1038           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_ID );
    1039             :             }
    1040             :         }
    1041             :     }
    1042             : 
    1043             :     // add to History so that old data is saved, if necessary
    1044       69624 :     if( pPara->pHistory )
    1045             :         pPara->pHistory->Add( pCNd->GetFmtColl(), pCNd->GetIndex(),
    1046        3970 :                 ND_TEXTNODE );
    1047             : 
    1048       69624 :     pCNd->ChgFmtColl( pFmt );
    1049             : 
    1050       69624 :     pPara->nWhich++;
    1051             : 
    1052       69624 :     return true;
    1053             : }
    1054             : 
    1055       69520 : bool SwDoc::SetTxtFmtColl(const SwPaM &rRg,
    1056             :                           SwTxtFmtColl *pFmt,
    1057             :                           const bool bReset,
    1058             :                           const bool bResetListAttrs)
    1059             : {
    1060       69520 :     SwDataChanged aTmp( rRg );
    1061       69520 :     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
    1062       69520 :     SwHistory* pHst = 0;
    1063       69520 :     bool bRet = true;
    1064             : 
    1065       69520 :     if (GetIDocumentUndoRedo().DoesUndo())
    1066             :     {
    1067             :         SwUndoFmtColl* pUndo = new SwUndoFmtColl( rRg, pFmt,
    1068             :                                                   bReset,
    1069        3866 :                                                   bResetListAttrs );
    1070        3866 :         pHst = pUndo->GetHistory();
    1071        3866 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
    1072             :     }
    1073             : 
    1074       69520 :     sw::DocumentContentOperationsManager::ParaRstFmt aPara( pStt, pEnd, pHst );
    1075       69520 :     aPara.pFmtColl = pFmt;
    1076       69520 :     aPara.bReset = bReset;
    1077             :     // #i62675#
    1078       69520 :     aPara.bResetListAttrs = bResetListAttrs;
    1079             : 
    1080      139040 :     GetNodes().ForEach( pStt->nNode.GetIndex(), pEnd->nNode.GetIndex()+1,
    1081      139040 :                         lcl_SetTxtFmtColl, &aPara );
    1082       69520 :     if( !aPara.nWhich )
    1083           0 :         bRet = false;           // didn't find a valid Node
    1084             : 
    1085       69520 :     if (bRet)
    1086             :     {
    1087       69520 :         getIDocumentState().SetModified();
    1088             :     }
    1089             : 
    1090       69520 :     return bRet;
    1091             : }
    1092             : 
    1093             : /// Copy the formats to itself
    1094         708 : SwFmt* SwDoc::CopyFmt( const SwFmt& rFmt,
    1095             :                         const SwFmtsBase& rFmtArr,
    1096             :                         FNCopyFmt fnCopyFmt, const SwFmt& rDfltFmt )
    1097             : {
    1098             :     // It's no autoformat, default format or collection format,
    1099             :     // then search for it.
    1100         708 :     if( !rFmt.IsAuto() || !rFmt.GetRegisteredIn() )
    1101        1654 :         for( sal_uInt16 n = 0; n < rFmtArr.GetFmtCount(); n++ )
    1102             :         {
    1103             :             // Does the Doc already contain the template?
    1104        1652 :             if( rFmtArr.GetFmt(n)->GetName()==rFmt.GetName() )
    1105         706 :                 return (SwFmt*)rFmtArr.GetFmt(n);
    1106             :         }
    1107             : 
    1108             :     // Search for the "parent" first
    1109           2 :     SwFmt* pParent = (SwFmt*)&rDfltFmt;
    1110           2 :     if( rFmt.DerivedFrom() && pParent != rFmt.DerivedFrom() )
    1111           2 :         pParent = CopyFmt( *rFmt.DerivedFrom(), rFmtArr,
    1112           2 :                                 fnCopyFmt, rDfltFmt );
    1113             : 
    1114             :     // Create the format and copy the attributes
    1115             :     // #i40550#
    1116           2 :     SwFmt* pNewFmt = (this->*fnCopyFmt)( rFmt.GetName(), pParent, false, true );
    1117           2 :     pNewFmt->SetAuto( rFmt.IsAuto() );
    1118           2 :     pNewFmt->CopyAttrs( rFmt, true );           // copy the attributes
    1119             : 
    1120           2 :     pNewFmt->SetPoolFmtId( rFmt.GetPoolFmtId() );
    1121           2 :     pNewFmt->SetPoolHelpId( rFmt.GetPoolHelpId() );
    1122             : 
    1123             :     // Always set the HelpFile Id to default!
    1124           2 :     pNewFmt->SetPoolHlpFileId( UCHAR_MAX );
    1125             : 
    1126           2 :     return pNewFmt;
    1127             : }
    1128             : 
    1129             : /// copy the frame format
    1130         706 : SwFrmFmt* SwDoc::CopyFrmFmt( const SwFrmFmt& rFmt )
    1131             : {
    1132             : 
    1133         706 :     return (SwFrmFmt*)CopyFmt( rFmt, *GetFrmFmts(), &SwDoc::_MakeFrmFmt,
    1134        1412 :                                 *GetDfltFrmFmt() );
    1135             : }
    1136             : 
    1137             : /// copy the char format
    1138           0 : SwCharFmt* SwDoc::CopyCharFmt( const SwCharFmt& rFmt )
    1139             : {
    1140           0 :     return (SwCharFmt*)CopyFmt( rFmt, *GetCharFmts(),
    1141             :                                 &SwDoc::_MakeCharFmt,
    1142           0 :                                 *GetDfltCharFmt() );
    1143             : }
    1144             : 
    1145             : /// copy TextNodes
    1146       10516 : SwTxtFmtColl* SwDoc::CopyTxtColl( const SwTxtFmtColl& rColl )
    1147             : {
    1148       10516 :     SwTxtFmtColl* pNewColl = FindTxtFmtCollByName( rColl.GetName() );
    1149       10516 :     if( pNewColl )
    1150       10514 :         return pNewColl;
    1151             : 
    1152             :     // search for the "parent" first
    1153           2 :     SwTxtFmtColl* pParent = mpDfltTxtFmtColl;
    1154           2 :     if( pParent != rColl.DerivedFrom() )
    1155           2 :         pParent = CopyTxtColl( *(SwTxtFmtColl*)rColl.DerivedFrom() );
    1156             : 
    1157             : //FEATURE::CONDCOLL
    1158           2 :     if( RES_CONDTXTFMTCOLL == rColl.Which() )
    1159             :     {
    1160             :         pNewColl = new SwConditionTxtFmtColl( GetAttrPool(), rColl.GetName(),
    1161           0 :                                                 pParent);
    1162           0 :         mpTxtFmtCollTbl->push_back( pNewColl );
    1163           0 :         pNewColl->SetAuto( false );
    1164           0 :         getIDocumentState().SetModified();
    1165             : 
    1166             :         // copy the conditions
    1167             :         ((SwConditionTxtFmtColl*)pNewColl)->SetConditions(
    1168           0 :                             ((SwConditionTxtFmtColl&)rColl).GetCondColls() );
    1169             :     }
    1170             :     else
    1171             : //FEATURE::CONDCOLL
    1172           2 :         pNewColl = MakeTxtFmtColl( rColl.GetName(), pParent );
    1173             : 
    1174             :     // copy the auto formats or the attributes
    1175           2 :     pNewColl->CopyAttrs( rColl, true );
    1176             : 
    1177           2 :     if(rColl.IsAssignedToListLevelOfOutlineStyle())
    1178           0 :         pNewColl->AssignToListLevelOfOutlineStyle(rColl.GetAssignedOutlineStyleLevel());
    1179           2 :     pNewColl->SetPoolFmtId( rColl.GetPoolFmtId() );
    1180           2 :     pNewColl->SetPoolHelpId( rColl.GetPoolHelpId() );
    1181             : 
    1182             :     // Always set the HelpFile Id to default!
    1183           2 :     pNewColl->SetPoolHlpFileId( UCHAR_MAX );
    1184             : 
    1185           2 :     if( &rColl.GetNextTxtFmtColl() != &rColl )
    1186           0 :         pNewColl->SetNextTxtFmtColl( *CopyTxtColl( rColl.GetNextTxtFmtColl() ));
    1187             : 
    1188             :     // create the NumRule if necessary
    1189           2 :     if( this != rColl.GetDoc() )
    1190             :     {
    1191             :         const SfxPoolItem* pItem;
    1192           2 :         if( SfxItemState::SET == pNewColl->GetItemState( RES_PARATR_NUMRULE,
    1193           2 :             false, &pItem ))
    1194             :         {
    1195             :             const SwNumRule* pRule;
    1196           0 :             const OUString& rName = ((SwNumRuleItem*)pItem)->GetValue();
    1197           0 :             if( !rName.isEmpty() &&
    1198           0 :                 0 != ( pRule = rColl.GetDoc()->FindNumRulePtr( rName )) &&
    1199           0 :                 !pRule->IsAutoRule() )
    1200             :             {
    1201           0 :                 SwNumRule* pDestRule = FindNumRulePtr( rName );
    1202           0 :                 if( pDestRule )
    1203           0 :                     pDestRule->SetInvalidRule( true );
    1204             :                 else
    1205           0 :                     MakeNumRule( rName, pRule );
    1206             :             }
    1207             :         }
    1208             :     }
    1209           2 :     return pNewColl;
    1210             : }
    1211             : 
    1212             : /// copy the graphic nodes
    1213         278 : SwGrfFmtColl* SwDoc::CopyGrfColl( const SwGrfFmtColl& rColl )
    1214             : {
    1215         278 :     SwGrfFmtColl* pNewColl = FindGrfFmtCollByName( rColl.GetName() );
    1216         278 :     if( pNewColl )
    1217         278 :         return pNewColl;
    1218             : 
    1219             :      // Search for the "parent" first
    1220           0 :     SwGrfFmtColl* pParent = mpDfltGrfFmtColl;
    1221           0 :     if( pParent != rColl.DerivedFrom() )
    1222           0 :         pParent = CopyGrfColl( *(SwGrfFmtColl*)rColl.DerivedFrom() );
    1223             : 
    1224             :     // if not, copy them
    1225           0 :     pNewColl = MakeGrfFmtColl( rColl.GetName(), pParent );
    1226             : 
    1227             :     // copy the attributes
    1228           0 :     pNewColl->CopyAttrs( rColl );
    1229             : 
    1230           0 :     pNewColl->SetPoolFmtId( rColl.GetPoolFmtId() );
    1231           0 :     pNewColl->SetPoolHelpId( rColl.GetPoolHelpId() );
    1232             : 
    1233             :     // Always set the HelpFile Id to default!
    1234           0 :     pNewColl->SetPoolHlpFileId( UCHAR_MAX );
    1235             : 
    1236           0 :     return pNewColl;
    1237             : }
    1238             : 
    1239        2260 : static SwPageDesc* lcl_FindPageDesc( const SwPageDescs& rArr, const OUString& rName )
    1240             : {
    1241        7148 :     for( sal_uInt16 n = rArr.size(); n; )
    1242             :     {
    1243        4850 :         SwPageDesc* pDesc = rArr[ --n ];
    1244        4850 :         if( pDesc->GetName() == rName )
    1245        2222 :             return pDesc;
    1246             :     }
    1247          38 :     return 0;
    1248             : }
    1249             : 
    1250         120 : void SwDoc::CopyFmtArr( const SwFmtsBase& rSourceArr,
    1251             :                         SwFmtsBase& rDestArr,
    1252             :                         FNCopyFmt fnCopyFmt,
    1253             :                         SwFmt& rDfltFmt )
    1254             : {
    1255             :     sal_uInt16 nSrc;
    1256             :     SwFmt* pSrc, *pDest;
    1257             : 
    1258             :     // 1st step: Create all formats (skip the 0th - it's the default one)
    1259         766 :     for( nSrc = rSourceArr.GetFmtCount(); nSrc > 1; )
    1260             :     {
    1261         526 :         pSrc = (SwFmt*)rSourceArr.GetFmt( --nSrc );
    1262         526 :         if( pSrc->IsDefault() || pSrc->IsAuto() )
    1263          16 :             continue;
    1264             : 
    1265         510 :         if( 0 == FindFmtByName( rDestArr, pSrc->GetName() ) )
    1266             :         {
    1267         300 :             if( RES_CONDTXTFMTCOLL == pSrc->Which() )
    1268           6 :                 MakeCondTxtFmtColl( pSrc->GetName(), (SwTxtFmtColl*)&rDfltFmt );
    1269             :             else
    1270             :                 // #i40550#
    1271         294 :                 (this->*fnCopyFmt)( pSrc->GetName(), &rDfltFmt, false, true );
    1272             :         }
    1273             :     }
    1274             : 
    1275             :     // 2nd step: Copy all attributes, set the right parents
    1276         766 :     for( nSrc = rSourceArr.GetFmtCount(); nSrc > 1; )
    1277             :     {
    1278         526 :         pSrc = (SwFmt*)rSourceArr.GetFmt( --nSrc );
    1279         526 :         if( pSrc->IsDefault() || pSrc->IsAuto() )
    1280          16 :             continue;
    1281             : 
    1282         510 :         pDest = FindFmtByName( rDestArr, pSrc->GetName() );
    1283         510 :         pDest->SetAuto( false );
    1284         510 :         pDest->DelDiffs( *pSrc );
    1285             : 
    1286             :         // #i94285#: existing <SwFmtPageDesc> instance, before copying attributes
    1287             :         const SfxPoolItem* pItem;
    1288        1530 :         if( &GetAttrPool() != pSrc->GetAttrSet().GetPool() &&
    1289         510 :             SfxItemState::SET == pSrc->GetAttrSet().GetItemState(
    1290        1020 :             RES_PAGEDESC, false, &pItem ) &&
    1291           0 :             ((SwFmtPageDesc*)pItem)->GetPageDesc() )
    1292             :         {
    1293           0 :             SwFmtPageDesc aPageDesc( *(SwFmtPageDesc*)pItem );
    1294           0 :             const OUString& rNm = aPageDesc.GetPageDesc()->GetName();
    1295           0 :             SwPageDesc* pPageDesc = ::lcl_FindPageDesc( maPageDescs, rNm );
    1296           0 :             if( !pPageDesc )
    1297             :             {
    1298           0 :                 pPageDesc = MakePageDesc(rNm);
    1299             :             }
    1300           0 :             aPageDesc.RegisterToPageDesc( *pPageDesc );
    1301           0 :             SwAttrSet aTmpAttrSet( pSrc->GetAttrSet() );
    1302           0 :             aTmpAttrSet.Put( aPageDesc );
    1303           0 :             pDest->SetFmtAttr( aTmpAttrSet );
    1304             :         }
    1305             :         else
    1306             :         {
    1307         510 :             pDest->SetFmtAttr( pSrc->GetAttrSet() );
    1308             :         }
    1309             : 
    1310         510 :         pDest->SetPoolFmtId( pSrc->GetPoolFmtId() );
    1311         510 :         pDest->SetPoolHelpId( pSrc->GetPoolHelpId() );
    1312             : 
    1313             :         // Always set the HelpFile Id to default!
    1314         510 :         pDest->SetPoolHlpFileId( UCHAR_MAX );
    1315             : 
    1316         510 :         if( pSrc->DerivedFrom() )
    1317             :             pDest->SetDerivedFrom( FindFmtByName( rDestArr,
    1318         510 :                                         pSrc->DerivedFrom()->GetName() ) );
    1319         610 :         if( RES_TXTFMTCOLL == pSrc->Which() ||
    1320         100 :             RES_CONDTXTFMTCOLL == pSrc->Which() )
    1321             :         {
    1322         450 :             SwTxtFmtColl* pSrcColl = (SwTxtFmtColl*)pSrc,
    1323         450 :                         * pDstColl = (SwTxtFmtColl*)pDest;
    1324         450 :             if( &pSrcColl->GetNextTxtFmtColl() != pSrcColl )
    1325             :                 pDstColl->SetNextTxtFmtColl( *(SwTxtFmtColl*)FindFmtByName(
    1326          90 :                     rDestArr, pSrcColl->GetNextTxtFmtColl().GetName() ) );
    1327             : 
    1328         450 :             if(pSrcColl->IsAssignedToListLevelOfOutlineStyle())
    1329           0 :                 pDstColl->AssignToListLevelOfOutlineStyle(pSrcColl->GetAssignedOutlineStyleLevel());
    1330             : 
    1331             : //FEATURE::CONDCOLL
    1332         450 :             if( RES_CONDTXTFMTCOLL == pSrc->Which() )
    1333             :                 // Copy the conditions, but delete the old ones first!
    1334             :                 ((SwConditionTxtFmtColl*)pDstColl)->SetConditions(
    1335          40 :                             ((SwConditionTxtFmtColl*)pSrc)->GetCondColls() );
    1336             : //FEATURE::CONDCOLL
    1337             :         }
    1338             :     }
    1339         120 : }
    1340             : 
    1341       22162 : void SwDoc::CopyPageDescHeaderFooterImpl( bool bCpyHeader,
    1342             :                                 const SwFrmFmt& rSrcFmt, SwFrmFmt& rDestFmt )
    1343             : {
    1344             :     // Treat the header and footer attributes in the right way:
    1345             :     // Copy content nodes across documents!
    1346       22162 :     sal_uInt16 nAttr = static_cast<sal_uInt16>( bCpyHeader ? RES_HEADER : RES_FOOTER );
    1347             :     const SfxPoolItem* pItem;
    1348       22162 :     if( SfxItemState::SET != rSrcFmt.GetAttrSet().GetItemState( nAttr, false, &pItem ))
    1349       30996 :         return ;
    1350             : 
    1351             :     // The header only contains the reference to the format from the other document!
    1352       13328 :     SfxPoolItem* pNewItem = pItem->Clone();
    1353             : 
    1354             :     SwFrmFmt* pOldFmt;
    1355       13328 :     if( bCpyHeader )
    1356        6830 :          pOldFmt = ((SwFmtHeader*)pNewItem)->GetHeaderFmt();
    1357             :     else
    1358        6498 :          pOldFmt = ((SwFmtFooter*)pNewItem)->GetFooterFmt();
    1359             : 
    1360       13328 :     if( pOldFmt )
    1361             :     {
    1362             :         SwFrmFmt* pNewFmt = new SwFrmFmt( GetAttrPool(), "CpyDesc",
    1363        6216 :                                             GetDfltFrmFmt() );
    1364        6216 :         pNewFmt->CopyAttrs( *pOldFmt, true );
    1365             : 
    1366       12432 :         if( SfxItemState::SET == pNewFmt->GetAttrSet().GetItemState(
    1367        6216 :             RES_CNTNT, false, &pItem ))
    1368             :         {
    1369        6216 :             SwFmtCntnt* pCntnt = (SwFmtCntnt*)pItem;
    1370        6216 :             if( pCntnt->GetCntntIdx() )
    1371             :             {
    1372        6216 :                 SwNodeIndex aTmpIdx( GetNodes().GetEndOfAutotext() );
    1373        6216 :                 const SwNodes& rSrcNds = rSrcFmt.GetDoc()->GetNodes();
    1374        6216 :                 SwStartNode* pSttNd = GetNodes().MakeEmptySection( aTmpIdx,
    1375             :                                                 bCpyHeader
    1376             :                                                     ? SwHeaderStartNode
    1377       12432 :                                                     : SwFooterStartNode );
    1378        6216 :                 const SwNode& rCSttNd = pCntnt->GetCntntIdx()->GetNode();
    1379       12432 :                 SwNodeRange aRg( rCSttNd, 0, *rCSttNd.EndOfSectionNode() );
    1380        6216 :                 aTmpIdx = *pSttNd->EndOfSectionNode();
    1381        6216 :                 rSrcNds._Copy( aRg, aTmpIdx );
    1382        6216 :                 aTmpIdx = *pSttNd;
    1383        6216 :                 rSrcFmt.GetDoc()->GetDocumentContentOperationsManager().CopyFlyInFlyImpl( aRg, 0, aTmpIdx );
    1384       12432 :                 pNewFmt->SetFmtAttr( SwFmtCntnt( pSttNd ));
    1385             :             }
    1386             :             else
    1387           0 :                 pNewFmt->ResetFmtAttr( RES_CNTNT );
    1388             :         }
    1389        6216 :         if( bCpyHeader )
    1390        4050 :             ((SwFmtHeader*)pNewItem)->RegisterToFormat(*pNewFmt);
    1391             :         else
    1392        2166 :             ((SwFmtFooter*)pNewItem)->RegisterToFormat(*pNewFmt);
    1393        6216 :         rDestFmt.SetFmtAttr( *pNewItem );
    1394             :     }
    1395       13328 :     delete pNewItem;
    1396             : }
    1397             : 
    1398       10596 : void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc,
    1399             :                             bool bCopyPoolIds )
    1400             : {
    1401       10596 :     bool bNotifyLayout = false;
    1402       10596 :     SwRootFrm* pTmpRoot = getIDocumentLayoutAccess().GetCurrentLayout();
    1403             : 
    1404       10596 :     rDstDesc.SetLandscape( rSrcDesc.GetLandscape() );
    1405       10596 :     rDstDesc.SetNumType( rSrcDesc.GetNumType() );
    1406       10596 :     if( rDstDesc.ReadUseOn() != rSrcDesc.ReadUseOn() )
    1407             :     {
    1408           0 :         rDstDesc.WriteUseOn( rSrcDesc.ReadUseOn() );
    1409           0 :         bNotifyLayout = true;
    1410             :     }
    1411             : 
    1412       10596 :     if( bCopyPoolIds )
    1413             :     {
    1414       10594 :         rDstDesc.SetPoolFmtId( rSrcDesc.GetPoolFmtId() );
    1415       10594 :         rDstDesc.SetPoolHelpId( rSrcDesc.GetPoolHelpId() );
    1416             :         // Always set the HelpFile Id to default!
    1417       10594 :         rDstDesc.SetPoolHlpFileId( UCHAR_MAX );
    1418             :     }
    1419             : 
    1420       10596 :     if( rSrcDesc.GetFollow() != &rSrcDesc )
    1421             :     {
    1422             :         SwPageDesc* pFollow = ::lcl_FindPageDesc( maPageDescs,
    1423        2108 :                                     rSrcDesc.GetFollow()->GetName() );
    1424        2108 :         if( !pFollow )
    1425             :         {
    1426             :             // copy
    1427           0 :             pFollow = MakePageDesc(rSrcDesc.GetFollow()->GetName());
    1428           0 :             CopyPageDesc( *rSrcDesc.GetFollow(), *pFollow );
    1429             :         }
    1430        2108 :         rDstDesc.SetFollow( pFollow );
    1431        2108 :         bNotifyLayout = true;
    1432             :     }
    1433             : 
    1434             :     // the header and footer attributes are copied separately
    1435             :     // the content sections have to be copied in their entirety
    1436             :     {
    1437       10596 :         SfxItemSet aAttrSet( rSrcDesc.GetMaster().GetAttrSet() );
    1438       10596 :         aAttrSet.ClearItem( RES_HEADER );
    1439       10596 :         aAttrSet.ClearItem( RES_FOOTER );
    1440             : 
    1441       10596 :         rDstDesc.GetMaster().DelDiffs( aAttrSet );
    1442       10596 :         rDstDesc.GetMaster().SetFmtAttr( aAttrSet );
    1443             : 
    1444       10596 :         aAttrSet.ClearItem();
    1445       10596 :         aAttrSet.Put( rSrcDesc.GetLeft().GetAttrSet() );
    1446       10596 :         aAttrSet.ClearItem( RES_HEADER );
    1447       10596 :         aAttrSet.ClearItem( RES_FOOTER );
    1448             : 
    1449       10596 :         rDstDesc.GetLeft().DelDiffs( aAttrSet );
    1450       10596 :         rDstDesc.GetLeft().SetFmtAttr( aAttrSet );
    1451             : 
    1452       10596 :         aAttrSet.ClearItem();
    1453       10596 :         aAttrSet.Put( rSrcDesc.GetFirstMaster().GetAttrSet() );
    1454       10596 :         aAttrSet.ClearItem( RES_HEADER );
    1455       10596 :         aAttrSet.ClearItem( RES_FOOTER );
    1456             : 
    1457       10596 :         rDstDesc.GetFirstMaster().DelDiffs( aAttrSet );
    1458       10596 :         rDstDesc.GetFirstMaster().SetFmtAttr( aAttrSet );
    1459             : 
    1460       10596 :         aAttrSet.ClearItem();
    1461       10596 :         aAttrSet.Put( rSrcDesc.GetFirstLeft().GetAttrSet() );
    1462       10596 :         aAttrSet.ClearItem( RES_HEADER );
    1463       10596 :         aAttrSet.ClearItem( RES_FOOTER );
    1464             : 
    1465       10596 :         rDstDesc.GetFirstLeft().DelDiffs( aAttrSet );
    1466       10596 :         rDstDesc.GetFirstLeft().SetFmtAttr( aAttrSet );
    1467             :     }
    1468             : 
    1469       10596 :     CopyHeader( rSrcDesc.GetMaster(), rDstDesc.GetMaster() );
    1470       10596 :     CopyFooter( rSrcDesc.GetMaster(), rDstDesc.GetMaster() );
    1471       10596 :     if( !rDstDesc.IsHeaderShared() )
    1472         550 :         CopyHeader( rSrcDesc.GetLeft(), rDstDesc.GetLeft() );
    1473             :     else
    1474       10046 :         rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetHeader() );
    1475       10596 :     if( !rDstDesc.IsFirstShared() )
    1476             :     {
    1477          80 :         CopyHeader( rSrcDesc.GetFirstMaster(), rDstDesc.GetFirstMaster() );
    1478          80 :         rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetFirstMaster().GetHeader());
    1479             :     }
    1480             :     else
    1481             :     {
    1482       10516 :         rDstDesc.GetFirstMaster().SetFmtAttr( rDstDesc.GetMaster().GetHeader() );
    1483       10516 :         rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetLeft().GetHeader());
    1484             :     }
    1485             : 
    1486       10596 :     if( !rDstDesc.IsFooterShared() )
    1487         228 :         CopyFooter( rSrcDesc.GetLeft(), rDstDesc.GetLeft() );
    1488             :     else
    1489       10368 :         rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetFooter() );
    1490       10596 :     if( !rDstDesc.IsFirstShared() )
    1491             :     {
    1492          80 :         CopyFooter( rSrcDesc.GetFirstMaster(), rDstDesc.GetFirstMaster() );
    1493          80 :         rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetFirstMaster().GetFooter());
    1494             :     }
    1495             :     else
    1496             :     {
    1497       10516 :         rDstDesc.GetFirstMaster().SetFmtAttr( rDstDesc.GetMaster().GetFooter() );
    1498       10516 :         rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetLeft().GetFooter());
    1499             :     }
    1500             : 
    1501       10596 :     if( bNotifyLayout && pTmpRoot )
    1502             :     {
    1503          32 :         std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();
    1504          32 :         std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllCheckPageDescs));
    1505             :     }
    1506             : 
    1507             :     // If foot notes change the pages have to be triggered
    1508       10596 :     if( !(rDstDesc.GetFtnInfo() == rSrcDesc.GetFtnInfo()) )
    1509             :     {
    1510          14 :         rDstDesc.SetFtnInfo( rSrcDesc.GetFtnInfo() );
    1511          14 :         SwMsgPoolItem  aInfo( RES_PAGEDESC_FTNINFO );
    1512             :         {
    1513          14 :             rDstDesc.GetMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
    1514             :         }
    1515             :         {
    1516          14 :             rDstDesc.GetLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
    1517             :         }
    1518             :         {
    1519          14 :             rDstDesc.GetFirstMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
    1520             :         }
    1521             :         {
    1522          14 :             rDstDesc.GetFirstLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
    1523          14 :         }
    1524             :     }
    1525       10596 : }
    1526             : 
    1527          40 : void SwDoc::ReplaceStyles( const SwDoc& rSource, bool bIncludePageStyles )
    1528             : {
    1529          40 :     ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo());
    1530             : 
    1531             :     CopyFmtArr( *rSource.mpCharFmtTbl, *mpCharFmtTbl,
    1532          40 :                 &SwDoc::_MakeCharFmt, *mpDfltCharFmt );
    1533             :     CopyFmtArr( *rSource.mpFrmFmtTbl, *mpFrmFmtTbl,
    1534          40 :                 &SwDoc::_MakeFrmFmt, *mpDfltFrmFmt );
    1535             :     CopyFmtArr( *rSource.mpTxtFmtCollTbl, *mpTxtFmtCollTbl,
    1536          40 :                 &SwDoc::_MakeTxtFmtColl, *mpDfltTxtFmtColl );
    1537             : 
    1538             :     sal_uInt16 nCnt;
    1539             : 
    1540             :     //To-Do:
    1541             :     //  a) in rtf export don't export our hideous pgdsctbl
    1542             :     //  extension to rtf anymore
    1543             :     //  b) in sd rtf import (View::InsertData) don't use
    1544             :     //  a super-fragile test for mere presence of \trowd to
    1545             :     //  indicate import of rtf into a table
    1546             :     //  c) then drop use of bIncludePageStyles
    1547          40 :     if (bIncludePageStyles)
    1548             :     {
    1549             :         // and now the page templates
    1550          38 :         nCnt = rSource.maPageDescs.size();
    1551          38 :         if( nCnt )
    1552             :         {
    1553             :             // a different Doc -> Number formatter needs to be merged
    1554          38 :             SwTblNumFmtMerge aTNFM( rSource, *this );
    1555             : 
    1556             :             // 1st step: Create all formats (skip the 0th - it's the default!)
    1557         152 :             while( nCnt )
    1558             :             {
    1559          76 :                 SwPageDesc *pSrc = rSource.maPageDescs[ --nCnt ];
    1560          76 :                 if( 0 == ::lcl_FindPageDesc( maPageDescs, pSrc->GetName() ) )
    1561          38 :                     MakePageDesc( pSrc->GetName() );
    1562             :             }
    1563             : 
    1564             :             // 2nd step: Copy all attributes, set the right parents
    1565         152 :             for( nCnt = rSource.maPageDescs.size(); nCnt; )
    1566             :             {
    1567          76 :                 SwPageDesc *pSrc = rSource.maPageDescs[ --nCnt ];
    1568          76 :                 CopyPageDesc( *pSrc, *::lcl_FindPageDesc( maPageDescs, pSrc->GetName() ));
    1569          38 :             }
    1570             :         }
    1571             :     }
    1572             : 
    1573             :     // then there are the numbering templates
    1574          40 :     nCnt = rSource.GetNumRuleTbl().size();
    1575          40 :     if( nCnt )
    1576             :     {
    1577          40 :         const SwNumRuleTbl& rArr = rSource.GetNumRuleTbl();
    1578          80 :         for( sal_uInt16 n = 0; n < nCnt; ++n )
    1579             :         {
    1580          40 :             const SwNumRule& rR = *rArr[ n ];
    1581          40 :             SwNumRule* pNew = FindNumRulePtr( rR.GetName());
    1582          40 :             if( pNew )
    1583          40 :                 pNew->CopyNumRule( this, rR );
    1584             :             else
    1585             :             {
    1586           0 :                 if( !rR.IsAutoRule() )
    1587           0 :                     MakeNumRule( rR.GetName(), &rR );
    1588             :                 else
    1589             :                 {
    1590             :                     // as we reset all styles, there shouldn't be any unknown
    1591             :                     // automatic SwNumRules, because all should have been
    1592             :                     // created by the style copying!
    1593             :                     // So just warn and ignore.
    1594             :                     SAL_WARN( "sw.styles", "Found unknown auto SwNumRule during reset!" );
    1595             :                 }
    1596             :             }
    1597             :         }
    1598             :     }
    1599             : 
    1600          40 :     if (undoGuard.UndoWasEnabled())
    1601             :     {
    1602             :         // nodes array was modified!
    1603           4 :         GetIDocumentUndoRedo().DelAllUndoObj();
    1604             :     }
    1605             : 
    1606          40 :     getIDocumentState().SetModified();
    1607          40 : }
    1608             : 
    1609     1390820 : SwFmt* SwDoc::FindFmtByName( const SwFmtsBase& rFmtArr,
    1610             :                              const OUString& rName ) const
    1611             : {
    1612     1390820 :     SwFmt* pFnd = 0;
    1613    28240971 :     for( sal_uInt16 n = 0; n < rFmtArr.GetFmtCount(); n++ )
    1614             :     {
    1615             :         // Does the Doc already contain the template?
    1616    27729228 :         if( rFmtArr.GetFmt(n)->GetName() == rName )
    1617             :         {
    1618      879077 :             pFnd = (SwFmt*)rFmtArr.GetFmt(n);
    1619      879077 :             break;
    1620             :         }
    1621             :     }
    1622     1390820 :     return pFnd;
    1623             : }
    1624             : 
    1625           0 : void SwDoc::MoveLeftMargin( const SwPaM& rPam, bool bRight, bool bModulus )
    1626             : {
    1627           0 :     SwHistory* pHistory = 0;
    1628           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1629             :     {
    1630             :         SwUndoMoveLeftMargin* pUndo = new SwUndoMoveLeftMargin( rPam, bRight,
    1631           0 :                                                                 bModulus );
    1632           0 :         pHistory = &pUndo->GetHistory();
    1633           0 :         GetIDocumentUndoRedo().AppendUndo( pUndo );
    1634             :     }
    1635             : 
    1636           0 :     const SvxTabStopItem& rTabItem = (SvxTabStopItem&)GetDefault( RES_PARATR_TABSTOP );
    1637           0 :     sal_uInt16 nDefDist = rTabItem.Count() ?
    1638           0 :         static_cast<sal_uInt16>(rTabItem[0].GetTabPos()) : 1134;
    1639           0 :     const SwPosition &rStt = *rPam.Start(), &rEnd = *rPam.End();
    1640           0 :     SwNodeIndex aIdx( rStt.nNode );
    1641           0 :     while( aIdx <= rEnd.nNode )
    1642             :     {
    1643           0 :         SwTxtNode* pTNd = aIdx.GetNode().GetTxtNode();
    1644           0 :         if( pTNd )
    1645             :         {
    1646           0 :             SvxLRSpaceItem aLS( (SvxLRSpaceItem&)pTNd->SwCntntNode::GetAttr( RES_LR_SPACE ) );
    1647             : 
    1648             :             // #i93873# See also lcl_MergeListLevelIndentAsLRSpaceItem in thints.cxx
    1649           0 :             if ( pTNd->AreListLevelIndentsApplicable() )
    1650             :             {
    1651           0 :                 const SwNumRule* pRule = pTNd->GetNumRule();
    1652           0 :                 if ( pRule )
    1653             :                 {
    1654           0 :                     const int nListLevel = pTNd->GetActualListLevel();
    1655           0 :                     if ( nListLevel >= 0 )
    1656             :                     {
    1657           0 :                         const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(nListLevel));
    1658           0 :                         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
    1659             :                         {
    1660           0 :                             aLS.SetTxtLeft( rFmt.GetIndentAt() );
    1661           0 :                             aLS.SetTxtFirstLineOfst( static_cast<short>(rFmt.GetFirstLineIndent()) );
    1662             :                         }
    1663             :                     }
    1664             :                 }
    1665             :             }
    1666             : 
    1667           0 :             long nNext = aLS.GetTxtLeft();
    1668           0 :             if( bModulus )
    1669           0 :                 nNext = ( nNext / nDefDist ) * nDefDist;
    1670             : 
    1671           0 :             if( bRight )
    1672           0 :                 nNext += nDefDist;
    1673             :             else
    1674           0 :                 if(nNext >0) // fdo#75936 set limit for decreasing indent
    1675           0 :                     nNext -= nDefDist;
    1676             : 
    1677           0 :             aLS.SetTxtLeft( nNext );
    1678             : 
    1679           0 :             SwRegHistory aRegH( pTNd, *pTNd, pHistory );
    1680           0 :             pTNd->SetAttr( aLS );
    1681             :         }
    1682           0 :         ++aIdx;
    1683             :     }
    1684           0 :     getIDocumentState().SetModified();
    1685           0 : }
    1686             : 
    1687       87112 : bool SwDoc::DontExpandFmt( const SwPosition& rPos, bool bFlag )
    1688             : {
    1689       87112 :     bool bRet = false;
    1690       87112 :     SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
    1691       87112 :     if( pTxtNd )
    1692             :     {
    1693       87112 :         bRet = pTxtNd->DontExpandFmt( rPos.nContent, bFlag );
    1694       87112 :         if( bRet && GetIDocumentUndoRedo().DoesUndo() )
    1695             :         {
    1696           2 :             GetIDocumentUndoRedo().AppendUndo( new SwUndoDontExpandFmt(rPos) );
    1697             :         }
    1698             :     }
    1699       87112 :     return bRet;
    1700             : }
    1701             : 
    1702       19810 : SwTableBoxFmt* SwDoc::MakeTableBoxFmt()
    1703             : {
    1704             :     SwTableBoxFmt* pFmt = new SwTableBoxFmt( GetAttrPool(), aEmptyOUStr,
    1705       19810 :                                                 mpDfltFrmFmt );
    1706       19810 :     getIDocumentState().SetModified();
    1707       19810 :     return pFmt;
    1708             : }
    1709             : 
    1710        6808 : SwTableLineFmt* SwDoc::MakeTableLineFmt()
    1711             : {
    1712             :     SwTableLineFmt* pFmt = new SwTableLineFmt( GetAttrPool(), aEmptyOUStr,
    1713        6808 :                                                 mpDfltFrmFmt );
    1714        6808 :     getIDocumentState().SetModified();
    1715        6808 :     return pFmt;
    1716             : }
    1717             : 
    1718        4740 : void SwDoc::_CreateNumberFormatter()
    1719             : {
    1720             :     OSL_ENSURE( !mpNumberFormatter, "is already there" );
    1721             : 
    1722        4740 :     LanguageType eLang = LANGUAGE_SYSTEM;
    1723             : 
    1724        4740 :     mpNumberFormatter = new SvNumberFormatter( comphelper::getProcessComponentContext(), eLang );
    1725        4740 :     mpNumberFormatter->SetEvalDateFormat( NF_EVALDATEFORMAT_FORMAT_INTL );
    1726        4740 :     mpNumberFormatter->SetYear2000(static_cast<sal_uInt16>(::utl::MiscCfg().GetYear2000()));
    1727        4740 : }
    1728             : 
    1729         444 : SwTblNumFmtMerge::SwTblNumFmtMerge( const SwDoc& rSrc, SwDoc& rDest )
    1730         444 :     : pNFmt( 0 )
    1731             : {
    1732             :     // a different Doc -> Number formatter needs to be merged
    1733             :     SvNumberFormatter* pN;
    1734         444 :     if( &rSrc != &rDest && 0 != ( pN = ((SwDoc&)rSrc).GetNumberFormatter( false ) ))
    1735          56 :         ( pNFmt = rDest.GetNumberFormatter( true ))->MergeFormatter( *pN );
    1736             : 
    1737         444 :     if( &rSrc != &rDest )
    1738          74 :         ((SwGetRefFieldType*)rSrc.getIDocumentFieldsAccess().GetSysFldType( RES_GETREFFLD ))->
    1739          74 :             MergeWithOtherDoc( rDest );
    1740         444 : }
    1741             : 
    1742         444 : SwTblNumFmtMerge::~SwTblNumFmtMerge()
    1743             : {
    1744         444 :     if( pNFmt )
    1745          56 :         pNFmt->ClearMergeTable();
    1746         444 : }
    1747             : 
    1748           0 : void SwDoc::SetTxtFmtCollByAutoFmt( const SwPosition& rPos, sal_uInt16 nPoolId,
    1749             :                                     const SfxItemSet* pSet )
    1750             : {
    1751           0 :     SwPaM aPam( rPos );
    1752           0 :     SwTxtNode* pTNd = rPos.nNode.GetNode().GetTxtNode();
    1753             :     assert(pTNd);
    1754             : 
    1755           0 :     if (mbIsAutoFmtRedline)
    1756             :     {
    1757             :         // create the redline object
    1758           0 :         const SwTxtFmtColl& rColl = *pTNd->GetTxtColl();
    1759           0 :         SwRangeRedline* pRedl = new SwRangeRedline( nsRedlineType_t::REDLINE_FMTCOLL, aPam );
    1760           0 :         pRedl->SetMark();
    1761             : 
    1762             :         // Only those items that are not set by the Set again in the Node
    1763             :         // are of interest. Thus, we take the difference.
    1764             :         SwRedlineExtraData_FmtColl aExtraData( rColl.GetName(),
    1765           0 :                                                 rColl.GetPoolFmtId() );
    1766           0 :         if( pSet && pTNd->HasSwAttrSet() )
    1767             :         {
    1768           0 :             SfxItemSet aTmp( *pTNd->GetpSwAttrSet() );
    1769           0 :             aTmp.Differentiate( *pSet );
    1770             :             // we handle the adjust item separately
    1771             :             const SfxPoolItem* pItem;
    1772           0 :             if( SfxItemState::SET == pTNd->GetpSwAttrSet()->GetItemState(
    1773           0 :                     RES_PARATR_ADJUST, false, &pItem ))
    1774           0 :                 aTmp.Put( *pItem );
    1775           0 :             aExtraData.SetItemSet( aTmp );
    1776             :         }
    1777           0 :         pRedl->SetExtraData( &aExtraData );
    1778             : 
    1779             :         //TODO: Undo is still missing!
    1780           0 :         getIDocumentRedlineAccess().AppendRedline( pRedl, true );
    1781             :     }
    1782             : 
    1783           0 :     SetTxtFmtColl( aPam, getIDocumentStylePoolAccess().GetTxtCollFromPool( nPoolId ) );
    1784             : 
    1785           0 :     if (pSet && pSet->Count())
    1786             :     {
    1787           0 :         aPam.SetMark();
    1788           0 :         aPam.GetMark()->nContent.Assign(pTNd, pTNd->GetTxt().getLength());
    1789           0 :         getIDocumentContentOperations().InsertItemSet( aPam, *pSet, 0 );
    1790           0 :     }
    1791           0 : }
    1792             : 
    1793           0 : void SwDoc::SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxItemSet& rSet )
    1794             : {
    1795           0 :     SwTxtNode* pTNd = rPam.GetPoint()->nNode.GetNode().GetTxtNode();
    1796             :     assert(pTNd);
    1797             : 
    1798           0 :     RedlineMode_t eOld = getIDocumentRedlineAccess().GetRedlineMode();
    1799             : 
    1800           0 :     if (mbIsAutoFmtRedline)
    1801             :     {
    1802             :         // create the redline object
    1803           0 :         SwRangeRedline* pRedl = new SwRangeRedline( nsRedlineType_t::REDLINE_FORMAT, rPam );
    1804           0 :         if( !pRedl->HasMark() )
    1805           0 :             pRedl->SetMark();
    1806             : 
    1807             :         // Only those items that are not set by the Set again in the Node
    1808             :         // are of interest. Thus, we take the difference.
    1809           0 :         SwRedlineExtraData_Format aExtraData( rSet );
    1810             : 
    1811           0 :         pRedl->SetExtraData( &aExtraData );
    1812             : 
    1813             :         //TODO: Undo is still missing!
    1814           0 :         getIDocumentRedlineAccess().AppendRedline( pRedl, true );
    1815             : 
    1816           0 :         getIDocumentRedlineAccess().SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE));
    1817             :     }
    1818             : 
    1819           0 :     const sal_Int32 nEnd(rPam.End()->nContent.GetIndex());
    1820           0 :     std::vector<sal_uInt16> whichIds;
    1821           0 :     SfxItemIter iter(rSet);
    1822           0 :     for (SfxPoolItem const* pItem = iter.FirstItem();
    1823             :             pItem; pItem = iter.NextItem())
    1824             :     {
    1825           0 :         whichIds.push_back(pItem->Which());
    1826           0 :         whichIds.push_back(pItem->Which());
    1827             :     }
    1828           0 :     whichIds.push_back(0);
    1829           0 :     SfxItemSet currentSet(GetAttrPool(), &whichIds[0]);
    1830           0 :     pTNd->GetAttr(currentSet, nEnd, nEnd, false, true, false);
    1831           0 :     for (size_t i = 0; whichIds[i]; i += 2)
    1832             :     {   // yuk - want to explicitly set the pool defaults too :-/
    1833           0 :         currentSet.Put(currentSet.Get(whichIds[i], true));
    1834             :     }
    1835             : 
    1836           0 :     getIDocumentContentOperations().InsertItemSet( rPam, rSet, nsSetAttrMode::SETATTR_DONTEXPAND );
    1837             : 
    1838             :     // fdo#62536: DONTEXPAND does not work when there is already an AUTOFMT
    1839             :     // here, so insert the old attributes as an empty hint to stop expand
    1840           0 :     SwPaM endPam(*pTNd, nEnd);
    1841           0 :     endPam.SetMark();
    1842           0 :     getIDocumentContentOperations().InsertItemSet(endPam, currentSet, nsSetAttrMode::SETATTR_DEFAULT);
    1843             : 
    1844           0 :     getIDocumentRedlineAccess().SetRedlineMode_intern( eOld );
    1845           0 : }
    1846             : 
    1847      295916 : void SwDoc::ChgFmt(SwFmt & rFmt, const SfxItemSet & rSet)
    1848             : {
    1849      295916 :     if (GetIDocumentUndoRedo().DoesUndo())
    1850             :     {
    1851             :         // copying <rSet> to <aSet>
    1852        3484 :         SfxItemSet aSet(rSet);
    1853             :         // remove from <aSet> all items, which are already set at the format
    1854        3484 :         aSet.Differentiate(rFmt.GetAttrSet());
    1855             :         // <aSet> contains now all *new* items for the format
    1856             : 
    1857             :         // copying current format item set to <aOldSet>
    1858        6968 :         SfxItemSet aOldSet(rFmt.GetAttrSet());
    1859             :         // insert new items into <aOldSet>
    1860        3484 :         aOldSet.Put(aSet);
    1861             :         // invalidate all new items in <aOldSet> in order to clear these items,
    1862             :         // if the undo action is triggered.
    1863             :         {
    1864        3484 :             SfxItemIter aIter(aSet);
    1865             : 
    1866        3484 :             const SfxPoolItem * pItem = aIter.FirstItem();
    1867       14220 :             while (pItem != NULL)
    1868             :             {
    1869        7252 :                 aOldSet.InvalidateItem(pItem->Which());
    1870             : 
    1871        7252 :                 pItem = aIter.NextItem();
    1872        3484 :             }
    1873             :         }
    1874             : 
    1875        3484 :         SwUndo * pUndo = new SwUndoFmtAttr(aOldSet, rFmt);
    1876             : 
    1877        6968 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
    1878             :     }
    1879             : 
    1880      295916 :     rFmt.SetFmtAttr(rSet);
    1881      295916 : }
    1882             : 
    1883          12 : void SwDoc::RenameFmt(SwFmt & rFmt, const OUString & sNewName,
    1884             :                       bool bBroadcast)
    1885             : {
    1886          12 :     SfxStyleFamily eFamily = SFX_STYLE_FAMILY_ALL;
    1887             : 
    1888          12 :     if (GetIDocumentUndoRedo().DoesUndo())
    1889             :     {
    1890          12 :         SwUndo * pUndo = NULL;
    1891             : 
    1892          12 :         switch (rFmt.Which())
    1893             :         {
    1894             :         case RES_CHRFMT:
    1895           4 :             pUndo = new SwUndoRenameCharFmt(rFmt.GetName(), sNewName, this);
    1896           4 :             eFamily = SFX_STYLE_FAMILY_CHAR;
    1897           4 :             break;
    1898             :         case RES_TXTFMTCOLL:
    1899           4 :             pUndo = new SwUndoRenameFmtColl(rFmt.GetName(), sNewName, this);
    1900           4 :             eFamily = SFX_STYLE_FAMILY_PARA;
    1901           4 :             break;
    1902             :         case RES_FRMFMT:
    1903           0 :             pUndo = new SwUndoRenameFrmFmt(rFmt.GetName(), sNewName, this);
    1904           0 :             eFamily = SFX_STYLE_FAMILY_FRAME;
    1905           0 :             break;
    1906             : 
    1907             :         default:
    1908           4 :             break;
    1909             :         }
    1910             : 
    1911          12 :         if (pUndo)
    1912             :         {
    1913           8 :             GetIDocumentUndoRedo().AppendUndo(pUndo);
    1914             :         }
    1915             :     }
    1916             : 
    1917          12 :     rFmt.SetName(sNewName);
    1918             : 
    1919          12 :     if (bBroadcast)
    1920           0 :         BroadcastStyleOperation(sNewName, eFamily, SFX_STYLESHEET_MODIFIED);
    1921          12 : }
    1922             : 
    1923             : 
    1924           0 : std::vector<Color> SwDoc::GetDocColors()
    1925             : {
    1926           0 :     std::vector<Color> docColors;
    1927             : 
    1928           0 :     for(unsigned int i = 0; i < m_pNodes->Count(); ++i)
    1929             :     {
    1930           0 :         const SwNode* pNode = (*m_pNodes)[i];
    1931           0 :         if( ! pNode->IsTxtNode() )
    1932           0 :             continue;
    1933             : 
    1934           0 :         const SfxItemSet* pItemSet = pNode->GetTxtNode()->GetpSwAttrSet();
    1935           0 :         if( pItemSet == 0 )
    1936           0 :             continue;
    1937             : 
    1938           0 :         SfxWhichIter aIter( *pItemSet );
    1939           0 :         sal_uInt16 nWhich = aIter.FirstWhich();
    1940           0 :         while( nWhich )
    1941             :         {
    1942             :             const SfxPoolItem *pItem;
    1943           0 :             if( SfxItemState::SET == pItemSet->GetItemState( nWhich, false, &pItem ) )
    1944             :             {
    1945           0 :                 sal_uInt16 aWhich = pItem->Which();
    1946           0 :                 switch (aWhich)
    1947             :                 {
    1948             :                     // list of color attributes to collect
    1949             :                     case RES_CHRATR_COLOR:
    1950             :                     case RES_CHRATR_HIGHLIGHT:
    1951             :                     case RES_BACKGROUND:
    1952             :                         {
    1953           0 :                             Color aColor( ((SvxColorItem*)pItem)->GetValue() );
    1954           0 :                             if( COL_AUTO != aColor.GetColor() &&
    1955           0 :                                     std::find(docColors.begin(), docColors.end(), aColor) == docColors.end() )
    1956             :                             {
    1957           0 :                                 docColors.push_back( aColor );
    1958             :                             }
    1959             :                         }
    1960           0 :                         break;
    1961             :                     default:
    1962           0 :                         break;
    1963             :                 }
    1964             :             }
    1965             : 
    1966           0 :             nWhich = aIter.NextWhich();
    1967             :         }
    1968           0 :     }
    1969           0 :     return docColors;
    1970             : }
    1971             : 
    1972             : // #i69627#
    1973             : namespace docfunc
    1974             : {
    1975          60 :     bool HasOutlineStyleToBeWrittenAsNormalListStyle( SwDoc& rDoc )
    1976             :     {
    1977             :         // If a parent paragraph style of one of the parargraph styles, which
    1978             :         // are assigned to the list levels of the outline style, has a list style
    1979             :         // set or inherits a list style from its parent style, the outline style
    1980             :         // has to be written as a normal list style to the OpenDocument file
    1981             :         // format or the OpenOffice.org file format.
    1982          60 :         bool bRet( false );
    1983             : 
    1984          60 :         const SwTxtFmtColls* pTxtFmtColls( rDoc.GetTxtFmtColls() );
    1985          60 :         if ( pTxtFmtColls )
    1986             :         {
    1987          60 :             const sal_uInt16 nCount = pTxtFmtColls->size();
    1988         624 :             for ( sal_uInt16 i = 0; i < nCount; ++i )
    1989             :             {
    1990         564 :                 SwTxtFmtColl* pTxtFmtColl = (*pTxtFmtColls)[i];
    1991             : 
    1992        1068 :                 if ( pTxtFmtColl->IsDefault() ||
    1993         504 :                     ! pTxtFmtColl->IsAssignedToListLevelOfOutlineStyle() )
    1994             :                 {
    1995         564 :                     continue;
    1996             :                 }
    1997             : 
    1998             :                 const SwTxtFmtColl* pParentTxtFmtColl =
    1999           0 :                    dynamic_cast<const SwTxtFmtColl*>( pTxtFmtColl->DerivedFrom());
    2000           0 :                 if ( !pParentTxtFmtColl )
    2001           0 :                     continue;
    2002             : 
    2003           0 :                 if ( SfxItemState::SET == pParentTxtFmtColl->GetItemState( RES_PARATR_NUMRULE ) )
    2004             :                 {
    2005             :                     // #i106218# consider that the outline style is set
    2006           0 :                     const SwNumRuleItem& rDirectItem = pParentTxtFmtColl->GetNumRule();
    2007           0 :                     if ( rDirectItem.GetValue() != rDoc.GetOutlineNumRule()->GetName() )
    2008             :                     {
    2009           0 :                         bRet = true;
    2010           0 :                         break;
    2011             :                     }
    2012             :                 }
    2013             :             }
    2014             : 
    2015             :         }
    2016          60 :         return bRet;
    2017             :     }
    2018             : }
    2019             : 
    2020       41725 : SwFmtsBase::~SwFmtsBase() {}
    2021             : 
    2022         336 : sal_uInt16 SwFrmFmts::GetPos(const SwFrmFmt* p) const
    2023             : {
    2024         336 :     const_iterator it = std::find(begin(), end(), p);
    2025         336 :     return it == end() ? USHRT_MAX : it - begin();
    2026             : }
    2027             : 
    2028         228 : bool SwFrmFmts::Contains(const SwFrmFmt* p) const
    2029             : {
    2030         228 :     return std::find(begin(), end(), p) != end();
    2031             : }
    2032             : 
    2033       58205 : SwFrmFmts::~SwFrmFmts()
    2034             : {
    2035       24265 :     for(const_iterator it = begin(); it != end(); ++it)
    2036        2730 :         delete *it;
    2037       36670 : }
    2038             : 
    2039           2 : sal_uInt16 SwCharFmts::GetPos(const SwCharFmt* p) const
    2040             : {
    2041           2 :     const_iterator it = std::find(begin(), end(), p);
    2042           2 :     return it == end() ? USHRT_MAX : it - begin();
    2043             : }
    2044             : 
    2045           0 : bool SwCharFmts::Contains(const SwCharFmt* p) const
    2046             : {
    2047           0 :     return std::find(begin(), end(), p) != end();
    2048             : }
    2049             : 
    2050       15135 : SwCharFmts::~SwCharFmts()
    2051             : {
    2052       30239 :     for(const_iterator it = begin(); it != end(); ++it)
    2053       25194 :         delete *it;
    2054       10360 : }
    2055             : 
    2056             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10