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

Generated by: LCOV version 1.11