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

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <hintids.hxx>
      21             : #include <svl/itemiter.hxx>
      22             : #include <sfx2/app.hxx>
      23             : #include <editeng/tstpitem.hxx>
      24             : #include <editeng/eeitem.hxx>
      25             : #include <editeng/langitem.hxx>
      26             : #include <editeng/lrspitem.hxx>
      27             : #include <editeng/formatbreakitem.hxx>
      28             : #include <editeng/rsiditem.hxx>
      29             : #include <svl/whiter.hxx>
      30             : #include <svl/zforlist.hxx>
      31             : #include <comphelper/processfactory.hxx>
      32             : #include <unotools/misccfg.hxx>
      33             : #include <com/sun/star/i18n/WordType.hpp>
      34             : #include <fmtpdsc.hxx>
      35             : #include <fmthdft.hxx>
      36             : #include <fmtcntnt.hxx>
      37             : #include <frmatr.hxx>
      38             : #include <doc.hxx>
      39             : #include <IDocumentUndoRedo.hxx>
      40             : #include <rootfrm.hxx>
      41             : #include <pagefrm.hxx>
      42             : #include <hints.hxx>
      43             : #include <ndtxt.hxx>
      44             : #include <pam.hxx>
      45             : #include <UndoCore.hxx>
      46             : #include <UndoAttribute.hxx>
      47             : #include <UndoInsert.hxx>
      48             : #include <ndgrf.hxx>
      49             : #include <pagedesc.hxx>
      50             : #include <rolbck.hxx>
      51             : #include <mvsave.hxx>
      52             : #include <txatbase.hxx>
      53             : #include <swtable.hxx>
      54             : #include <swtblfmt.hxx>
      55             : #include <charfmt.hxx>
      56             : #include <docary.hxx>
      57             : #include <paratr.hxx>
      58             : #include <redline.hxx>
      59             : #include <reffld.hxx>
      60             : #include <txtinet.hxx>
      61             : #include <fmtinfmt.hxx>
      62             : #include <breakit.hxx>
      63             : #include <SwStyleNameMapper.hxx>
      64             : #include <fmtautofmt.hxx>
      65             : #include <istyleaccess.hxx>
      66             : #include <SwUndoFmt.hxx>
      67             : #include <UndoManager.hxx>
      68             : #include <docsh.hxx>
      69             : #include <boost/scoped_ptr.hpp>
      70             : 
      71             : using namespace ::com::sun::star::i18n;
      72             : using namespace ::com::sun::star::lang;
      73             : using namespace ::com::sun::star::uno;
      74             : 
      75             : /*
      76             :  * Internal functions
      77             :  */
      78             : 
      79           0 : static void SetTxtFmtCollNext( SwTxtFmtColl* pTxtColl, const SwTxtFmtColl* pDel )
      80             : {
      81           0 :     if ( &pTxtColl->GetNextTxtFmtColl() == pDel )
      82             :     {
      83           0 :         pTxtColl->SetNextTxtFmtColl( *pTxtColl );
      84             :     }
      85           0 : }
      86             : 
      87             : /*
      88             :  * Reset the text's hard formatting
      89             :  */
      90             : 
      91             : /// Parameters for _Rst and lcl_SetTxtFmtColl
      92             : struct ParaRstFmt
      93             : {
      94             :     SwFmtColl* pFmtColl;
      95             :     SwHistory* pHistory;
      96             :     const SwPosition *pSttNd, *pEndNd;
      97             :     const SfxItemSet* pDelSet;
      98             :     sal_uInt16 nWhich;
      99             :     bool bReset;
     100             :     bool bResetListAttrs; // #i62575#
     101             :     bool bResetAll;
     102             :     bool bInclRefToxMark;
     103             :     bool bKeepOutlineLevelAttr;
     104             : 
     105           0 :     ParaRstFmt( const SwPosition* pStt, const SwPosition* pEnd,
     106             :                 SwHistory* pHst, sal_uInt16 nWhch = 0, const SfxItemSet* pSet = 0 )
     107             :         : pFmtColl(0),
     108             :           pHistory(pHst),
     109             :           pSttNd(pStt),
     110             :           pEndNd(pEnd),
     111             :           pDelSet(pSet),
     112             :           nWhich(nWhch),
     113             :           bReset( false ), // #i62675#
     114             :           bResetListAttrs( false ),
     115             :           bResetAll( true ),
     116             :           bInclRefToxMark( false ),
     117           0 :           bKeepOutlineLevelAttr( false )
     118           0 :     {}
     119             : 
     120             :     ParaRstFmt( SwHistory* pHst )
     121             :         : pFmtColl(0),
     122             :           pHistory(pHst),
     123             :           pSttNd(0),
     124             :           pEndNd(0),
     125             :           pDelSet(0),
     126             :           nWhich(0),
     127             :           bReset( false ),
     128             :           bResetListAttrs( false ), // #i62675#
     129             :           bResetAll( true ),
     130             :           bInclRefToxMark( false ),
     131             :           bKeepOutlineLevelAttr( false )
     132             :     {}
     133             : };
     134             : 
     135             : /** @params pArgs contains the document's ChrFmtTable
     136             :  *                Is need for selections at the beginning/end and with no SSelection.
     137             :  */
     138           0 : static bool lcl_RstTxtAttr( const SwNodePtr& rpNd, void* pArgs )
     139             : {
     140           0 :     ParaRstFmt* pPara = (ParaRstFmt*)pArgs;
     141           0 :     SwTxtNode * pTxtNode = (SwTxtNode*)rpNd->GetTxtNode();
     142           0 :     if( pTxtNode && pTxtNode->GetpSwpHints() )
     143             :     {
     144           0 :         SwIndex aSt( pTxtNode, 0 );
     145           0 :         sal_Int32 nEnd = pTxtNode->Len();
     146             : 
     147           0 :         if( &pPara->pSttNd->nNode.GetNode() == pTxtNode &&
     148           0 :             pPara->pSttNd->nContent.GetIndex() )
     149           0 :             aSt = pPara->pSttNd->nContent.GetIndex();
     150             : 
     151           0 :         if( &pPara->pEndNd->nNode.GetNode() == rpNd )
     152           0 :             nEnd = pPara->pEndNd->nContent.GetIndex();
     153             : 
     154           0 :         if( pPara->pHistory )
     155             :         {
     156             :             // Save all attributes for the Undo.
     157           0 :             SwRegHistory aRHst( *pTxtNode, pPara->pHistory );
     158           0 :             pTxtNode->GetpSwpHints()->Register( &aRHst );
     159           0 :             pTxtNode->RstTxtAttr( aSt, nEnd - aSt.GetIndex(), pPara->nWhich,
     160           0 :                                   pPara->pDelSet, pPara->bInclRefToxMark );
     161           0 :             if( pTxtNode->GetpSwpHints() )
     162           0 :                 pTxtNode->GetpSwpHints()->DeRegister();
     163             :         }
     164             :         else
     165           0 :             pTxtNode->RstTxtAttr( aSt, nEnd - aSt.GetIndex(), pPara->nWhich,
     166           0 :                                   pPara->pDelSet, pPara->bInclRefToxMark );
     167             :     }
     168           0 :     return true;
     169             : }
     170             : 
     171           0 : static bool lcl_RstAttr( const SwNodePtr& rpNd, void* pArgs )
     172             : {
     173           0 :     ParaRstFmt* pPara = (ParaRstFmt*)pArgs;
     174           0 :     SwCntntNode* pNode = (SwCntntNode*)rpNd->GetCntntNode();
     175           0 :     if( pNode && pNode->HasSwAttrSet() )
     176             :     {
     177           0 :         const bool bLocked = pNode->IsModifyLocked();
     178           0 :         pNode->LockModify();
     179             : 
     180           0 :         SwDoc* pDoc = pNode->GetDoc();
     181             : 
     182             :         // remove unused attribute RES_LR_SPACE
     183             :         // add list attributes
     184           0 :         SfxItemSet aSet( pDoc->GetAttrPool(),
     185             :                          RES_PAGEDESC, RES_BREAK,
     186             :                          RES_PARATR_NUMRULE, RES_PARATR_NUMRULE,
     187             :                          RES_PARATR_OUTLINELEVEL,RES_PARATR_OUTLINELEVEL,
     188             :                          RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1,
     189           0 :                          0 );
     190           0 :         const SfxItemSet* pSet = pNode->GetpSwAttrSet();
     191             : 
     192           0 :         std::vector<sal_uInt16> aClearWhichIds;
     193             :         // restoring all paragraph list attributes
     194             :         {
     195           0 :             SfxItemSet aListAttrSet( pDoc->GetAttrPool(), RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END - 1 );
     196           0 :             aListAttrSet.Set( *pSet );
     197           0 :             if ( aListAttrSet.Count() )
     198             :             {
     199           0 :                 aSet.Put( aListAttrSet );
     200           0 :                 SfxItemIter aIter( aListAttrSet );
     201           0 :                 const SfxPoolItem* pItem = aIter.GetCurItem();
     202           0 :                 while( pItem )
     203             :                 {
     204           0 :                     aClearWhichIds.push_back( pItem->Which() );
     205           0 :                     pItem = aIter.NextItem();
     206           0 :                 }
     207           0 :             }
     208             :         }
     209             : 
     210             :         const SfxPoolItem* pItem;
     211             : 
     212             :         sal_uInt16 const aSavIds[ 4 ] = { RES_PAGEDESC, RES_BREAK,
     213             :                                                 RES_PARATR_NUMRULE,
     214           0 :                                                 RES_PARATR_OUTLINELEVEL };
     215           0 :         for( sal_uInt16 n = 0; n < 4; ++n )
     216             :         {
     217           0 :             if( SFX_ITEM_SET == pSet->GetItemState( aSavIds[ n ], false, &pItem ))
     218             :             {
     219           0 :                 bool bSave = false;
     220           0 :                 switch( aSavIds[ n ] )
     221             :                 {
     222             :                     case RES_PAGEDESC:
     223           0 :                         bSave = 0 != ((SwFmtPageDesc*)pItem)->GetPageDesc();
     224           0 :                     break;
     225             :                     case RES_BREAK:
     226           0 :                         bSave = SVX_BREAK_NONE != ((SvxFmtBreakItem*)pItem)->GetBreak();
     227           0 :                     break;
     228             :                     case RES_PARATR_NUMRULE:
     229             :                     {
     230           0 :                         bSave = !((SwNumRuleItem*)pItem)->GetValue().isEmpty();
     231             :                     }
     232           0 :                     break;
     233             :                     case RES_PARATR_OUTLINELEVEL:
     234             :                     {
     235           0 :                         bSave = pPara && pPara->bKeepOutlineLevelAttr;
     236             :                     }
     237           0 :                     break;
     238             :                 }
     239           0 :                 if( bSave )
     240             :                 {
     241           0 :                     aSet.Put( *pItem );
     242           0 :                     aClearWhichIds.push_back( aSavIds[n] );
     243             :                 }
     244             :             }
     245             :         }
     246             : 
     247             :         // do not clear items directly from item set and only clear to be kept
     248             :         // attributes, if no deletion item set is found.
     249             :         const bool bKeepAttributes =
     250           0 :                     !pPara || !pPara->pDelSet || pPara->pDelSet->Count() == 0;
     251           0 :         if ( bKeepAttributes )
     252             :         {
     253           0 :             pNode->ResetAttr( aClearWhichIds );
     254             :         }
     255             : 
     256           0 :         if( !bLocked )
     257           0 :             pNode->UnlockModify();
     258             : 
     259           0 :         if( pPara )
     260             :         {
     261           0 :             SwRegHistory aRegH( pNode, *pNode, pPara->pHistory );
     262             : 
     263           0 :             if( pPara->pDelSet && pPara->pDelSet->Count() )
     264             :             {
     265             :                 OSL_ENSURE( !bKeepAttributes,
     266             :                         "<lcl_RstAttr(..)> - certain attributes are kept, but not needed. -> please inform OD" );
     267           0 :                 SfxItemIter aIter( *pPara->pDelSet );
     268           0 :                 pItem = aIter.FirstItem();
     269             :                 while( true )
     270             :                 {
     271           0 :                     if ( ( pItem->Which() != RES_PAGEDESC &&
     272           0 :                            pItem->Which() != RES_BREAK &&
     273           0 :                            pItem->Which() != RES_PARATR_NUMRULE ) ||
     274           0 :                          ( aSet.GetItemState( pItem->Which(), false ) != SFX_ITEM_SET ) )
     275             :                     {
     276           0 :                         pNode->ResetAttr( pItem->Which() );
     277             :                     }
     278           0 :                     if( aIter.IsAtEnd() )
     279           0 :                         break;
     280           0 :                     pItem = aIter.NextItem();
     281           0 :                 }
     282             :             }
     283           0 :             else if( pPara->bResetAll )
     284           0 :                 pNode->ResetAllAttr();
     285             :             else
     286           0 :                 pNode->ResetAttr( RES_PARATR_BEGIN, POOLATTR_END - 1 );
     287             :         }
     288             :         else
     289           0 :             pNode->ResetAllAttr();
     290             : 
     291             :         // only restore saved attributes, if needed
     292           0 :         if ( bKeepAttributes && aSet.Count() )
     293             :         {
     294           0 :             pNode->LockModify();
     295             : 
     296           0 :             pNode->SetAttr( aSet );
     297             : 
     298           0 :             if( !bLocked )
     299           0 :                 pNode->UnlockModify();
     300           0 :         }
     301             :     }
     302           0 :     return true;
     303             : }
     304             : 
     305           0 : void SwDoc::RstTxtAttrs(const SwPaM &rRg, bool bInclRefToxMark )
     306             : {
     307           0 :     SwHistory* pHst = 0;
     308           0 :     SwDataChanged aTmp( rRg );
     309           0 :     if (GetIDocumentUndoRedo().DoesUndo())
     310             :     {
     311           0 :         SwUndoResetAttr* pUndo = new SwUndoResetAttr( rRg, RES_CHRFMT );
     312           0 :         pHst = &pUndo->GetHistory();
     313           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     314             :     }
     315           0 :     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
     316           0 :     ParaRstFmt aPara( pStt, pEnd, pHst );
     317           0 :     aPara.bInclRefToxMark = bInclRefToxMark;
     318           0 :     GetNodes().ForEach( pStt->nNode.GetIndex(), pEnd->nNode.GetIndex()+1,
     319           0 :                         lcl_RstTxtAttr, &aPara );
     320           0 :     SetModified();
     321           0 : }
     322             : 
     323           0 : void SwDoc::ResetAttrs( const SwPaM &rRg,
     324             :                         bool bTxtAttr,
     325             :                         const std::set<sal_uInt16> &rAttrs,
     326             :                         const bool bSendDataChangedEvents )
     327             : {
     328           0 :     SwPaM* pPam = (SwPaM*)&rRg;
     329           0 :     if( !bTxtAttr && !rAttrs.empty() && RES_TXTATR_END > *(rAttrs.begin()) )
     330           0 :         bTxtAttr = true;
     331             : 
     332           0 :     if( !rRg.HasMark() )
     333             :     {
     334           0 :         SwTxtNode* pTxtNd = rRg.GetPoint()->nNode.GetNode().GetTxtNode();
     335           0 :         if( !pTxtNd )
     336           0 :             return ;
     337             : 
     338           0 :         pPam = new SwPaM( *rRg.GetPoint() );
     339             : 
     340           0 :         SwIndex& rSt = pPam->GetPoint()->nContent;
     341           0 :         sal_Int32 nMkPos, nPtPos = rSt.GetIndex();
     342             : 
     343             :         // Special case: if the Crsr is located within a URL attribute, we take over it's area
     344             :         SwTxtAttr const*const pURLAttr(
     345           0 :             pTxtNd->GetTxtAttrAt(rSt.GetIndex(), RES_TXTATR_INETFMT));
     346           0 :         if (pURLAttr && !pURLAttr->GetINetFmt().GetValue().isEmpty())
     347             :         {
     348           0 :             nMkPos = *pURLAttr->GetStart();
     349           0 :             nPtPos = *pURLAttr->End();
     350             :         }
     351             :         else
     352             :         {
     353           0 :             Boundary aBndry;
     354           0 :             if( g_pBreakIt->GetBreakIter().is() )
     355           0 :                 aBndry = g_pBreakIt->GetBreakIter()->getWordBoundary(
     356           0 :                             pTxtNd->GetTxt(), nPtPos,
     357           0 :                             g_pBreakIt->GetLocale( pTxtNd->GetLang( nPtPos ) ),
     358             :                             WordType::ANY_WORD /*ANYWORD_IGNOREWHITESPACES*/,
     359           0 :                             sal_True );
     360             : 
     361           0 :             if( aBndry.startPos < nPtPos && nPtPos < aBndry.endPos )
     362             :             {
     363           0 :                 nMkPos = aBndry.startPos;
     364           0 :                 nPtPos = aBndry.endPos;
     365             :             }
     366             :             else
     367             :             {
     368           0 :                 nPtPos = nMkPos = rSt.GetIndex();
     369           0 :                 if( bTxtAttr )
     370           0 :                     pTxtNd->DontExpandFmt( rSt, true );
     371             :             }
     372             :         }
     373             : 
     374           0 :         rSt = nMkPos;
     375           0 :         pPam->SetMark();
     376           0 :         pPam->GetPoint()->nContent = nPtPos;
     377             :     }
     378             : 
     379             :     // #i96644#
     380           0 :     boost::scoped_ptr< SwDataChanged > pDataChanged;
     381           0 :     if ( bSendDataChangedEvents )
     382             :     {
     383           0 :         pDataChanged.reset( new SwDataChanged( *pPam ) );
     384             :     }
     385           0 :     SwHistory* pHst = 0;
     386           0 :     if (GetIDocumentUndoRedo().DoesUndo())
     387             :     {
     388             :         SwUndoResetAttr* pUndo = new SwUndoResetAttr( rRg,
     389           0 :             static_cast<sal_uInt16>(bTxtAttr ? RES_CONDTXTFMTCOLL : RES_TXTFMTCOLL ));
     390           0 :         if( !rAttrs.empty() )
     391             :         {
     392           0 :             pUndo->SetAttrs( rAttrs );
     393             :         }
     394           0 :         pHst = &pUndo->GetHistory();
     395           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
     396             :     }
     397             : 
     398           0 :     const SwPosition *pStt = pPam->Start(), *pEnd = pPam->End();
     399           0 :     ParaRstFmt aPara( pStt, pEnd, pHst );
     400             : 
     401             :     // mst: not including META here; it seems attrs with CH_TXTATR are omitted
     402             :     sal_uInt16 aResetableSetRange[] = {
     403             :         RES_FRMATR_BEGIN, RES_FRMATR_END-1,
     404             :         RES_CHRATR_BEGIN, RES_CHRATR_END-1,
     405             :         RES_PARATR_BEGIN, RES_PARATR_END-1,
     406             :         RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
     407             :         RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
     408             :         RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
     409             :         RES_TXTATR_CJK_RUBY, RES_TXTATR_CJK_RUBY,
     410             :         RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
     411             :         RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
     412             :         0
     413           0 :     };
     414             : 
     415           0 :     SfxItemSet aDelSet( GetAttrPool(), aResetableSetRange );
     416           0 :     if( !rAttrs.empty() )
     417             :     {
     418           0 :         for( std::set<sal_uInt16>::const_reverse_iterator it = rAttrs.rbegin(); it != rAttrs.rend(); ++it )
     419             :         {
     420           0 :             if( POOLATTR_END > *it )
     421           0 :                 aDelSet.Put( *GetDfltAttr( *it ));
     422             :         }
     423           0 :         if( aDelSet.Count() )
     424           0 :             aPara.pDelSet = &aDelSet;
     425             :     }
     426             : 
     427           0 :     bool bAdd = true;
     428           0 :     SwNodeIndex aTmpStt( pStt->nNode );
     429           0 :     SwNodeIndex aTmpEnd( pEnd->nNode );
     430           0 :     if( pStt->nContent.GetIndex() )     // just one part
     431             :     {
     432             :         // set up a later, and all CharFmtAttr -> TxtFmtAttr
     433           0 :         SwTxtNode* pTNd = aTmpStt.GetNode().GetTxtNode();
     434           0 :         if( pTNd && pTNd->HasSwAttrSet() && pTNd->GetpSwAttrSet()->Count() )
     435             :         {
     436           0 :             if (pHst)
     437             :             {
     438           0 :                 SwRegHistory history(pTNd, *pTNd, pHst);
     439           0 :                 pTNd->FmtToTxtAttr(pTNd);
     440             :             }
     441             :             else
     442             :             {
     443           0 :                 pTNd->FmtToTxtAttr(pTNd);
     444             :             }
     445             :         }
     446             : 
     447           0 :         ++aTmpStt;
     448             :     }
     449           0 :     if( pEnd->nContent.GetIndex() == pEnd->nNode.GetNode().GetCntntNode()->Len() )
     450             :          // set up a later, and all CharFmtAttr -> TxtFmtAttr
     451           0 :         aTmpEnd++, bAdd = false;
     452           0 :     else if( pStt->nNode != pEnd->nNode || !pStt->nContent.GetIndex() )
     453             :     {
     454           0 :         SwTxtNode* pTNd = aTmpEnd.GetNode().GetTxtNode();
     455           0 :         if( pTNd && pTNd->HasSwAttrSet() && pTNd->GetpSwAttrSet()->Count() )
     456             :         {
     457           0 :             if (pHst)
     458             :             {
     459           0 :                 SwRegHistory history(pTNd, *pTNd, pHst);
     460           0 :                 pTNd->FmtToTxtAttr(pTNd);
     461             :             }
     462             :             else
     463             :             {
     464           0 :                 pTNd->FmtToTxtAttr(pTNd);
     465             :             }
     466             :         }
     467             :     }
     468             : 
     469           0 :     if( aTmpStt < aTmpEnd )
     470           0 :         GetNodes().ForEach( pStt->nNode, aTmpEnd, lcl_RstAttr, &aPara );
     471           0 :     else if( !rRg.HasMark() )
     472             :     {
     473           0 :         aPara.bResetAll = false ;
     474           0 :         ::lcl_RstAttr( &pStt->nNode.GetNode(), &aPara );
     475           0 :         aPara.bResetAll = true ;
     476             :     }
     477             : 
     478           0 :     if( bTxtAttr )
     479             :     {
     480           0 :         if( bAdd )
     481           0 :             ++aTmpEnd;
     482           0 :         GetNodes().ForEach( pStt->nNode, aTmpEnd, lcl_RstTxtAttr, &aPara );
     483             :     }
     484             : 
     485           0 :     if( pPam != &rRg )
     486           0 :         delete pPam;
     487             : 
     488           0 :     SetModified();
     489             : }
     490             : 
     491             : #define DELETECHARSETS if ( bDelete ) { delete pCharSet; delete pOtherSet; }
     492             : 
     493             : /// Insert Hints according to content types;
     494             : // Is used in SwDoc::Insert(..., SwFmtHint &rHt)
     495             : 
     496           0 : static bool lcl_InsAttr(
     497             :     SwDoc *const pDoc,
     498             :     const SwPaM &rRg,
     499             :     const SfxItemSet& rChgSet,
     500             :     const SetAttrMode nFlags,
     501             :     SwUndoAttr *const pUndo,
     502             :     const bool bExpandCharToPara=false)
     503             : {
     504             :     // Divide the Sets (for selections in Nodes)
     505           0 :     const SfxItemSet* pCharSet = 0;
     506           0 :     const SfxItemSet* pOtherSet = 0;
     507           0 :     bool bDelete = false;
     508           0 :     bool bCharAttr = false;
     509           0 :     bool bOtherAttr = false;
     510             : 
     511             :     // Check, if we can work with rChgSet or if we have to create additional SfxItemSets
     512           0 :     if ( 1 == rChgSet.Count() )
     513             :     {
     514           0 :         SfxItemIter aIter( rChgSet );
     515           0 :         const SfxPoolItem* pItem = aIter.FirstItem();
     516           0 :         if (!IsInvalidItem(pItem))
     517             :         {
     518           0 :             const sal_uInt16 nWhich = pItem->Which();
     519             : 
     520           0 :             if ( isCHRATR(nWhich) ||
     521           0 :                  (RES_TXTATR_CHARFMT == nWhich) ||
     522           0 :                  (RES_TXTATR_INETFMT == nWhich) ||
     523           0 :                  (RES_TXTATR_AUTOFMT == nWhich) ||
     524             :                  (RES_TXTATR_UNKNOWN_CONTAINER == nWhich) )
     525             :             {
     526           0 :                 pCharSet  = &rChgSet;
     527           0 :                 bCharAttr = true;
     528             :             }
     529             : 
     530           0 :             if (    isPARATR(nWhich)
     531           0 :                  || isPARATR_LIST(nWhich)
     532           0 :                  || isFRMATR(nWhich)
     533           0 :                  || isGRFATR(nWhich)
     534           0 :                  || isUNKNOWNATR(nWhich) )
     535             :             {
     536           0 :                 pOtherSet = &rChgSet;
     537           0 :                 bOtherAttr = true;
     538             :             }
     539           0 :         }
     540             :     }
     541             : 
     542             :     // Build new itemset if either
     543             :     // - rChgSet.Count() > 1 or
     544             :     // - The attribute in rChgSet does not belong to one of the above categories
     545           0 :     if ( !bCharAttr && !bOtherAttr )
     546             :     {
     547           0 :         SfxItemSet* pTmpCharItemSet = new SfxItemSet( pDoc->GetAttrPool(),
     548             :                                    RES_CHRATR_BEGIN, RES_CHRATR_END-1,
     549             :                                    RES_TXTATR_AUTOFMT, RES_TXTATR_AUTOFMT,
     550             :                                    RES_TXTATR_INETFMT, RES_TXTATR_INETFMT,
     551             :                                    RES_TXTATR_CHARFMT, RES_TXTATR_CHARFMT,
     552             :                RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
     553           0 :                                    0 );
     554             : 
     555           0 :         SfxItemSet* pTmpOtherItemSet = new SfxItemSet( pDoc->GetAttrPool(),
     556             :                                     RES_PARATR_BEGIN, RES_PARATR_END-1,
     557             :                                     RES_PARATR_LIST_BEGIN, RES_PARATR_LIST_END-1,
     558             :                                     RES_FRMATR_BEGIN, RES_FRMATR_END-1,
     559             :                                     RES_GRFATR_BEGIN, RES_GRFATR_END-1,
     560             :                                     RES_UNKNOWNATR_BEGIN, RES_UNKNOWNATR_END-1,
     561           0 :                                     0 );
     562             : 
     563           0 :         pTmpCharItemSet->Put( rChgSet );
     564           0 :         pTmpOtherItemSet->Put( rChgSet );
     565             : 
     566           0 :         pCharSet = pTmpCharItemSet;
     567           0 :         pOtherSet = pTmpOtherItemSet;
     568             : 
     569           0 :         bDelete = true;
     570             :     }
     571             : 
     572           0 :     SwHistory* pHistory = pUndo ? &pUndo->GetHistory() : 0;
     573           0 :     bool bRet = false;
     574           0 :     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
     575           0 :     SwCntntNode* pNode = pStt->nNode.GetNode().GetCntntNode();
     576             : 
     577           0 :     if( pNode && pNode->IsTxtNode() )
     578             :     {
     579             :         // #i27615#
     580           0 :         if (rRg.IsInFrontOfLabel())
     581             :         {
     582           0 :             SwTxtNode * pTxtNd = pNode->GetTxtNode();
     583           0 :             SwNumRule * pNumRule = pTxtNd->GetNumRule();
     584             : 
     585           0 :             if ( !pNumRule )
     586             :             {
     587             :                 OSL_FAIL( "<InsAttr(..)> - PaM in front of label, but text node has no numbering rule set. This is a serious defect, please inform OD." );
     588           0 :                 DELETECHARSETS
     589           0 :                 return false;
     590             :             }
     591             : 
     592           0 :             int nLevel = pTxtNd->GetActualListLevel();
     593             : 
     594           0 :             if (nLevel < 0)
     595           0 :                 nLevel = 0;
     596             : 
     597           0 :             if (nLevel >= MAXLEVEL)
     598           0 :                 nLevel = MAXLEVEL - 1;
     599             : 
     600           0 :             SwNumFmt aNumFmt = pNumRule->Get(static_cast<sal_uInt16>(nLevel));
     601             :             SwCharFmt * pCharFmt =
     602           0 :                 pDoc->FindCharFmtByName(aNumFmt.GetCharFmtName());
     603             : 
     604           0 :             if (pCharFmt)
     605             :             {
     606           0 :                 if (pHistory)
     607           0 :                     pHistory->Add(pCharFmt->GetAttrSet(), *pCharFmt);
     608             : 
     609           0 :                 if ( pCharSet )
     610           0 :                     pCharFmt->SetFmtAttr(*pCharSet);
     611             :             }
     612             : 
     613           0 :             DELETECHARSETS
     614           0 :             return true;
     615             :         }
     616             : 
     617           0 :         const SwIndex& rSt = pStt->nContent;
     618             : 
     619             :         // Attributes without an end do not have a range
     620           0 :         if ( !bCharAttr && !bOtherAttr )
     621             :         {
     622           0 :             SfxItemSet aTxtSet( pDoc->GetAttrPool(),
     623           0 :                         RES_TXTATR_NOEND_BEGIN, RES_TXTATR_NOEND_END-1 );
     624           0 :             aTxtSet.Put( rChgSet );
     625           0 :             if( aTxtSet.Count() )
     626             :             {
     627           0 :                 SwRegHistory history( pNode, *pNode, pHistory );
     628             :                 bRet = history.InsertItems(
     629           0 :                     aTxtSet, rSt.GetIndex(), rSt.GetIndex(), nFlags ) || bRet;
     630             : 
     631           0 :                 if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline()
     632           0 :                                 && !pDoc->GetRedlineTbl().empty())))
     633             :                 {
     634           0 :                     SwPaM aPam( pStt->nNode, pStt->nContent.GetIndex()-1,
     635           0 :                                 pStt->nNode, pStt->nContent.GetIndex() );
     636             : 
     637           0 :                     if( pUndo )
     638           0 :                         pUndo->SaveRedlineData( aPam, sal_True );
     639             : 
     640           0 :                     if( pDoc->IsRedlineOn() )
     641           0 :                         pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_INSERT, aPam ), true);
     642             :                     else
     643           0 :                         pDoc->SplitRedline( aPam );
     644           0 :                 }
     645           0 :             }
     646             :         }
     647             : 
     648             :         // TextAttributes with an end never expand their range
     649           0 :         if ( !bCharAttr && !bOtherAttr )
     650             :         {
     651             :             // CharFmt and URL attributes are treated separately!
     652             :             // TEST_TEMP ToDo: AutoFmt!
     653           0 :             SfxItemSet aTxtSet( pDoc->GetAttrPool(),
     654             :                                 RES_TXTATR_REFMARK, RES_TXTATR_TOXMARK,
     655             :                                 RES_TXTATR_META, RES_TXTATR_METAFIELD,
     656             :                                 RES_TXTATR_CJK_RUBY, RES_TXTATR_CJK_RUBY,
     657             :                                 RES_TXTATR_INPUTFIELD, RES_TXTATR_INPUTFIELD,
     658           0 :                                 0 );
     659             : 
     660           0 :             aTxtSet.Put( rChgSet );
     661           0 :             if( aTxtSet.Count() )
     662             :             {
     663           0 :                 const sal_Int32 nInsCnt = rSt.GetIndex();
     664           0 :                 const sal_Int32 nEnd = pStt->nNode == pEnd->nNode
     665           0 :                                 ? pEnd->nContent.GetIndex()
     666           0 :                                 : pNode->Len();
     667           0 :                 SwRegHistory history( pNode, *pNode, pHistory );
     668           0 :                 bRet = history.InsertItems( aTxtSet, nInsCnt, nEnd, nFlags )
     669           0 :                        || bRet;
     670             : 
     671           0 :                 if (bRet && (pDoc->IsRedlineOn() || (!pDoc->IsIgnoreRedline()
     672           0 :                                 && !pDoc->GetRedlineTbl().empty())))
     673             :                 {
     674             :                     // Was text content inserted? (RefMark/TOXMarks without an end)
     675           0 :                     sal_Bool bTxtIns = nInsCnt != rSt.GetIndex();
     676             :                     // Was content inserted or set over the selection?
     677             :                     SwPaM aPam( pStt->nNode, bTxtIns ? nInsCnt + 1 : nEnd,
     678           0 :                                 pStt->nNode, nInsCnt );
     679           0 :                     if( pUndo )
     680           0 :                         pUndo->SaveRedlineData( aPam, bTxtIns );
     681             : 
     682           0 :                     if( pDoc->IsRedlineOn() )
     683             :                         pDoc->AppendRedline(
     684             :                             new SwRangeRedline(
     685           0 :                                 bTxtIns ? nsRedlineType_t::REDLINE_INSERT : nsRedlineType_t::REDLINE_FORMAT, aPam ),
     686           0 :                                 true);
     687           0 :                     else if( bTxtIns )
     688           0 :                         pDoc->SplitRedline( aPam );
     689           0 :                 }
     690           0 :             }
     691             :         }
     692             :     }
     693             : 
     694             :     // We always have to set the auto flag for PageDescs that are set at the Node!
     695           0 :     if( pOtherSet && pOtherSet->Count() )
     696             :     {
     697             :         SwTableNode* pTblNd;
     698             :         const SwFmtPageDesc* pDesc;
     699           0 :         if( SFX_ITEM_SET == pOtherSet->GetItemState( RES_PAGEDESC,
     700           0 :                         false, (const SfxPoolItem**)&pDesc ))
     701             :         {
     702           0 :             if( pNode )
     703             :             {
     704             :                 // Set auto flag. Only in the template it's without auto!
     705           0 :                 SwFmtPageDesc aNew( *pDesc );
     706             : 
     707             :                 // Tables now also know line breaks
     708           0 :                 if( 0 == (nFlags & nsSetAttrMode::SETATTR_APICALL) &&
     709           0 :                     0 != ( pTblNd = pNode->FindTableNode() ) )
     710             :                 {
     711           0 :                     SwTableNode* pCurTblNd = pTblNd;
     712           0 :                     while ( 0 != ( pCurTblNd = pCurTblNd->StartOfSectionNode()->FindTableNode() ) )
     713           0 :                         pTblNd = pCurTblNd;
     714             : 
     715             :                     // set the table format
     716           0 :                     SwFrmFmt* pFmt = pTblNd->GetTable().GetFrmFmt();
     717           0 :                     SwRegHistory aRegH( pFmt, *pTblNd, pHistory );
     718           0 :                     pFmt->SetFmtAttr( aNew );
     719           0 :                     bRet = true;
     720             :                 }
     721             :                 else
     722             :                 {
     723           0 :                     SwRegHistory aRegH( pNode, *pNode, pHistory );
     724           0 :                     bRet = pNode->SetAttr( aNew ) || bRet;
     725           0 :                 }
     726             :             }
     727             : 
     728             :             // bOtherAttr = true means that pOtherSet == rChgSet. In this case
     729             :             // we know, that there is only one attribute in pOtherSet. We cannot
     730             :             // perform the following operations, instead we return:
     731           0 :             if ( bOtherAttr )
     732           0 :                 return bRet;
     733             : 
     734           0 :             const_cast<SfxItemSet*>(pOtherSet)->ClearItem( RES_PAGEDESC );
     735           0 :             if( !pOtherSet->Count() )
     736             :             {
     737           0 :                 DELETECHARSETS
     738           0 :                 return bRet;
     739             :             }
     740             :         }
     741             : 
     742             :         // Tables now also know line breaks
     743             :         const SvxFmtBreakItem* pBreak;
     744           0 :         if( pNode && 0 == (nFlags & nsSetAttrMode::SETATTR_APICALL) &&
     745           0 :             0 != (pTblNd = pNode->FindTableNode() ) &&
     746             :             SFX_ITEM_SET == pOtherSet->GetItemState( RES_BREAK,
     747           0 :                         false, (const SfxPoolItem**)&pBreak ) )
     748             :         {
     749           0 :             SwTableNode* pCurTblNd = pTblNd;
     750           0 :             while ( 0 != ( pCurTblNd = pCurTblNd->StartOfSectionNode()->FindTableNode() ) )
     751           0 :                 pTblNd = pCurTblNd;
     752             : 
     753             :              // set the table format
     754           0 :             SwFrmFmt* pFmt = pTblNd->GetTable().GetFrmFmt();
     755           0 :             SwRegHistory aRegH( pFmt, *pTblNd, pHistory );
     756           0 :             pFmt->SetFmtAttr( *pBreak );
     757           0 :             bRet = true;
     758             : 
     759             :             // bOtherAttr = true means that pOtherSet == rChgSet. In this case
     760             :             // we know, that there is only one attribute in pOtherSet. We cannot
     761             :             // perform the following operations, instead we return:
     762           0 :             if ( bOtherAttr )
     763           0 :                 return bRet;
     764             : 
     765           0 :             const_cast<SfxItemSet*>(pOtherSet)->ClearItem( RES_BREAK );
     766           0 :             if( !pOtherSet->Count() )
     767             :             {
     768           0 :                 DELETECHARSETS
     769           0 :                 return bRet;
     770           0 :             }
     771             :         }
     772             : 
     773             :         {
     774             :             // If we have a PoolNumRule, create it if needed
     775             :             const SwNumRuleItem* pRule;
     776           0 :             sal_uInt16 nPoolId=0;
     777           0 :             if( SFX_ITEM_SET == pOtherSet->GetItemState( RES_PARATR_NUMRULE,
     778           0 :                                 false, (const SfxPoolItem**)&pRule ) &&
     779           0 :                 !pDoc->FindNumRulePtr( pRule->GetValue() ) &&
     780           0 :                 USHRT_MAX != (nPoolId = SwStyleNameMapper::GetPoolIdFromUIName ( pRule->GetValue(),
     781             :                                 nsSwGetPoolIdFromName::GET_POOLID_NUMRULE )) )
     782           0 :                 pDoc->GetNumRuleFromPool( nPoolId );
     783             :         }
     784             :     }
     785             : 
     786           0 :     if( !rRg.HasMark() )        // no range
     787             :     {
     788           0 :         if( !pNode )
     789             :         {
     790           0 :             DELETECHARSETS
     791           0 :             return bRet;
     792             :         }
     793             : 
     794           0 :         if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
     795             :         {
     796           0 :             SwTxtNode* pTxtNd = static_cast<SwTxtNode*>(pNode);
     797           0 :             const SwIndex& rSt = pStt->nContent;
     798           0 :             sal_Int32 nMkPos, nPtPos = rSt.GetIndex();
     799           0 :             const OUString& rStr = pTxtNd->GetTxt();
     800             : 
     801             :             // Special case: if the Crsr is located within a URL attribute, we take over it's area
     802             :             SwTxtAttr const*const pURLAttr(
     803           0 :                 pTxtNd->GetTxtAttrAt(rSt.GetIndex(), RES_TXTATR_INETFMT));
     804           0 :             if (pURLAttr && !pURLAttr->GetINetFmt().GetValue().isEmpty())
     805             :             {
     806           0 :                 nMkPos = *pURLAttr->GetStart();
     807           0 :                 nPtPos = *pURLAttr->End();
     808             :             }
     809             :             else
     810             :             {
     811           0 :                 Boundary aBndry;
     812           0 :                 if( g_pBreakIt->GetBreakIter().is() )
     813           0 :                     aBndry = g_pBreakIt->GetBreakIter()->getWordBoundary(
     814           0 :                                 pTxtNd->GetTxt(), nPtPos,
     815           0 :                                 g_pBreakIt->GetLocale( pTxtNd->GetLang( nPtPos ) ),
     816             :                                 WordType::ANY_WORD /*ANYWORD_IGNOREWHITESPACES*/,
     817           0 :                                 sal_True );
     818             : 
     819           0 :                 if( aBndry.startPos < nPtPos && nPtPos < aBndry.endPos )
     820             :                 {
     821           0 :                     nMkPos = aBndry.startPos;
     822           0 :                     nPtPos = aBndry.endPos;
     823             :                 }
     824             :                 else
     825           0 :                     nPtPos = nMkPos = rSt.GetIndex();
     826             :             }
     827             : 
     828             :             // Remove the overriding attributes from the SwpHintsArray,
     829             :             // if the selection spans across the whole paragraph.
     830             :             // These attributes are inserted as FormatAttributes and
     831             :             // never override the TextAttributes!
     832           0 :             if( !(nFlags & nsSetAttrMode::SETATTR_DONTREPLACE ) &&
     833           0 :                 pTxtNd->HasHints() && !nMkPos && nPtPos == rStr.getLength())
     834             :             {
     835           0 :                 SwIndex aSt( pTxtNd );
     836           0 :                 if( pHistory )
     837             :                 {
     838             :                     // Save all attributes for the Undo.
     839           0 :                     SwRegHistory aRHst( *pTxtNd, pHistory );
     840           0 :                     pTxtNd->GetpSwpHints()->Register( &aRHst );
     841           0 :                     pTxtNd->RstTxtAttr( aSt, nPtPos, 0, pCharSet );
     842           0 :                     if( pTxtNd->GetpSwpHints() )
     843           0 :                         pTxtNd->GetpSwpHints()->DeRegister();
     844             :                 }
     845             :                 else
     846           0 :                     pTxtNd->RstTxtAttr( aSt, nPtPos, 0, pCharSet );
     847             :             }
     848             : 
     849             :             // the SwRegHistory inserts the attribute into the TxtNode!
     850           0 :             SwRegHistory history( pNode, *pNode, pHistory );
     851           0 :             bRet = history.InsertItems( *pCharSet, nMkPos, nPtPos, nFlags )
     852           0 :                 || bRet;
     853             : 
     854           0 :             if( pDoc->IsRedlineOn() )
     855             :             {
     856           0 :                 SwPaM aPam( *pNode, nMkPos, *pNode, nPtPos );
     857             : 
     858           0 :                 if( pUndo )
     859           0 :                     pUndo->SaveRedlineData( aPam, sal_False );
     860           0 :                 pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_FORMAT, aPam ), true);
     861           0 :             }
     862             :         }
     863           0 :         if( pOtherSet && pOtherSet->Count() )
     864             :         {
     865           0 :             SwRegHistory aRegH( pNode, *pNode, pHistory );
     866           0 :             bRet = pNode->SetAttr( *pOtherSet ) || bRet;
     867             :         }
     868             : 
     869           0 :         DELETECHARSETS
     870           0 :         return bRet;
     871             :     }
     872             : 
     873           0 :     if( pDoc->IsRedlineOn() && pCharSet && pCharSet->Count() )
     874             :     {
     875           0 :         if( pUndo )
     876           0 :             pUndo->SaveRedlineData( rRg, sal_False );
     877           0 :         pDoc->AppendRedline( new SwRangeRedline( nsRedlineType_t::REDLINE_FORMAT, rRg ), true);
     878             :     }
     879             : 
     880             :     /* now if range */
     881           0 :     sal_uLong nNodes = 0;
     882             : 
     883           0 :     SwNodeIndex aSt( pDoc->GetNodes() );
     884           0 :     SwNodeIndex aEnd( pDoc->GetNodes() );
     885           0 :     SwIndex aCntEnd( pEnd->nContent );
     886             : 
     887           0 :     if( pNode )
     888             :     {
     889           0 :         const sal_Int32 nLen = pNode->Len();
     890           0 :         if( pStt->nNode != pEnd->nNode )
     891           0 :             aCntEnd.Assign( pNode, nLen );
     892             : 
     893           0 :         if( pStt->nContent.GetIndex() != 0 || aCntEnd.GetIndex() != nLen )
     894             :         {
     895             :             // the SwRegHistory inserts the attribute into the TxtNode!
     896           0 :             if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
     897             :             {
     898           0 :                 SwRegHistory history( pNode, *pNode, pHistory );
     899             :                 bRet = history.InsertItems(*pCharSet,
     900           0 :                         pStt->nContent.GetIndex(), aCntEnd.GetIndex(), nFlags)
     901           0 :                     || bRet;
     902             :             }
     903             : 
     904           0 :             if( pOtherSet && pOtherSet->Count() )
     905             :             {
     906           0 :                 SwRegHistory aRegH( pNode, *pNode, pHistory );
     907           0 :                 bRet = pNode->SetAttr( *pOtherSet ) || bRet;
     908             :             }
     909             : 
     910             :             // Only selection in a Node.
     911           0 :             if( pStt->nNode == pEnd->nNode )
     912             :             {
     913             :             //The data parameter flag: bExpandCharToPara, comes from the data member of SwDoc,
     914             :             //Which is set in SW MS word Binary filter WW8ImplRreader. With this flag on, means that
     915             :             //current setting attribute set is a character range properties set and comes from a MS word
     916             :             //binary file, And the setting range include a paragraph end position (0X0D);
     917             :             //More specifications, as such property inside the character range properties set recorded in
     918             :             //MS word binary file are dealed and inserted into data model (SwDoc) one by one, so we
     919             :             //only dealing the scenario that the char properties set with 1 item inside;
     920             : 
     921           0 :                 if (bExpandCharToPara && pCharSet && pCharSet->Count() ==1 )
     922             :                 {
     923           0 :                     SwTxtNode* pCurrentNd = pStt->nNode.GetNode().GetTxtNode();
     924             : 
     925           0 :                     if (pCurrentNd)
     926             :                     {
     927           0 :                          pCurrentNd->TryCharSetExpandToNum(*pCharSet);
     928             : 
     929             :                     }
     930             :                 }
     931           0 :                 DELETECHARSETS
     932           0 :                 return bRet;
     933             :             }
     934           0 :             ++nNodes;
     935           0 :             aSt.Assign( pStt->nNode.GetNode(), +1 );
     936             :         }
     937             :         else
     938           0 :             aSt = pStt->nNode;
     939           0 :         aCntEnd = pEnd->nContent; // aEnd was changed!
     940             :     }
     941             :     else
     942           0 :         aSt.Assign( pStt->nNode.GetNode(), +1 );
     943             : 
     944             :     // aSt points to the first full Node now
     945             : 
     946             :     /*
     947             :      * The selection spans more than one Node.
     948             :      */
     949           0 :     if( pStt->nNode < pEnd->nNode )
     950             :     {
     951           0 :         pNode = pEnd->nNode.GetNode().GetCntntNode();
     952           0 :         if(pNode)
     953             :         {
     954           0 :             if( aCntEnd.GetIndex() != pNode->Len() )
     955             :             {
     956             :                 // the SwRegHistory inserts the attribute into the TxtNode!
     957           0 :                 if( pNode->IsTxtNode() && pCharSet && pCharSet->Count() )
     958             :                 {
     959           0 :                     SwRegHistory history( pNode, *pNode, pHistory );
     960             :                     history.InsertItems(*pCharSet,
     961           0 :                             0, aCntEnd.GetIndex(), nFlags);
     962             :                 }
     963             : 
     964           0 :                 if( pOtherSet && pOtherSet->Count() )
     965             :                 {
     966           0 :                     SwRegHistory aRegH( pNode, *pNode, pHistory );
     967           0 :                     pNode->SetAttr( *pOtherSet );
     968             :                 }
     969             : 
     970           0 :                 ++nNodes;
     971           0 :                 aEnd = pEnd->nNode;
     972             :             }
     973             :             else
     974           0 :                 aEnd.Assign( pEnd->nNode.GetNode(), +1 );
     975             :         }
     976             :         else
     977           0 :             aEnd = pEnd->nNode;
     978             :     }
     979             :     else
     980           0 :         aEnd.Assign( pEnd->nNode.GetNode(), +1 );
     981             : 
     982             :     // aEnd points BEHIND the last full node now
     983             : 
     984             :     /* Edit the fully selected Nodes. */
     985             :     // Reset all attributes from the set!
     986           0 :     if( pCharSet && pCharSet->Count() && !( nsSetAttrMode::SETATTR_DONTREPLACE & nFlags ) )
     987             :     {
     988           0 :         ParaRstFmt aPara( pStt, pEnd, pHistory, 0, pCharSet );
     989           0 :         pDoc->GetNodes().ForEach( aSt, aEnd, lcl_RstTxtAttr, &aPara );
     990             :     }
     991             : 
     992           0 :     bool bCreateSwpHints = pCharSet && (
     993           0 :         SFX_ITEM_SET == pCharSet->GetItemState( RES_TXTATR_CHARFMT, false ) ||
     994           0 :         SFX_ITEM_SET == pCharSet->GetItemState( RES_TXTATR_INETFMT, false ) );
     995             : 
     996           0 :     for(; aSt < aEnd; ++aSt )
     997             :     {
     998           0 :         pNode = aSt.GetNode().GetCntntNode();
     999           0 :         if( !pNode )
    1000           0 :             continue;
    1001             : 
    1002           0 :         SwTxtNode* pTNd = pNode->GetTxtNode();
    1003           0 :         if( pHistory )
    1004             :         {
    1005           0 :             SwRegHistory aRegH( pNode, *pNode, pHistory );
    1006             :             SwpHints *pSwpHints;
    1007             : 
    1008           0 :             if( pTNd && pCharSet && pCharSet->Count() )
    1009             :             {
    1010             :                 pSwpHints = bCreateSwpHints ? &pTNd->GetOrCreateSwpHints()
    1011           0 :                                             : pTNd->GetpSwpHints();
    1012           0 :                 if( pSwpHints )
    1013           0 :                     pSwpHints->Register( &aRegH );
    1014             : 
    1015           0 :                 pTNd->SetAttr(*pCharSet, 0, pTNd->GetTxt().getLength(), nFlags);
    1016           0 :                 if( pSwpHints )
    1017           0 :                     pSwpHints->DeRegister();
    1018             :             }
    1019           0 :             if( pOtherSet && pOtherSet->Count() )
    1020           0 :                 pNode->SetAttr( *pOtherSet );
    1021             :         }
    1022             :         else
    1023             :         {
    1024           0 :             if( pTNd && pCharSet && pCharSet->Count() )
    1025           0 :                 pTNd->SetAttr(*pCharSet, 0, pTNd->GetTxt().getLength(), nFlags);
    1026           0 :             if( pOtherSet && pOtherSet->Count() )
    1027           0 :                 pNode->SetAttr( *pOtherSet );
    1028             :         }
    1029           0 :         ++nNodes;
    1030             :     }
    1031             : 
    1032             :     //The data parameter flag: bExpandCharToPara, comes from the data member of SwDoc,
    1033             :     //Which is set in SW MS word Binary filter WW8ImplRreader. With this flag on, means that
    1034             :     //current setting attribute set is a character range properties set and comes from a MS word
    1035             :     //binary file, And the setting range include a paragraph end position (0X0D);
    1036             :     //More specifications, as such property inside the character range properties set recorded in
    1037             :     //MS word binary file are dealed and inserted into data model (SwDoc) one by one, so we
    1038             :     //only dealing the scenario that the char properties set with 1 item inside;
    1039           0 :     if (bExpandCharToPara && pCharSet && pCharSet->Count() ==1)
    1040             :     {
    1041           0 :         SwPosition aStartPos (*rRg.Start());
    1042           0 :         SwPosition aEndPos (*rRg.End());
    1043             : 
    1044           0 :         if (aEndPos.nNode.GetNode().GetTxtNode() && aEndPos.nContent != aEndPos.nNode.GetNode().GetTxtNode()->Len())
    1045           0 :             aEndPos.nNode--;
    1046             : 
    1047           0 :         sal_uLong nStart = aStartPos.nNode.GetIndex();
    1048           0 :         sal_uLong nEnd = aEndPos.nNode.GetIndex();
    1049           0 :         for(; nStart <= nEnd; ++nStart)
    1050             :         {
    1051           0 :             SwNode* pNd = pDoc->GetNodes()[ nStart ];
    1052           0 :             if (!pNd || !pNd->IsTxtNode())
    1053           0 :                 continue;
    1054           0 :             SwTxtNode *pCurrentNd = (SwTxtNode*)pNd;
    1055           0 :             pCurrentNd->TryCharSetExpandToNum(*pCharSet);
    1056           0 :         }
    1057             :     }
    1058             : 
    1059           0 :     DELETECHARSETS
    1060           0 :     return (nNodes != 0) || bRet;
    1061             : }
    1062             : 
    1063             : ///Add a para for the char attribute exp...
    1064           0 : bool SwDoc::InsertPoolItem(
    1065             :     const SwPaM &rRg,
    1066             :     const SfxPoolItem &rHt,
    1067             :     const SetAttrMode nFlags,
    1068             :     const bool bExpandCharToPara)
    1069             : {
    1070           0 :     SwDataChanged aTmp( rRg );
    1071           0 :     SwUndoAttr* pUndoAttr = 0;
    1072           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1073             :     {
    1074           0 :         GetIDocumentUndoRedo().ClearRedo();
    1075           0 :         pUndoAttr = new SwUndoAttr( rRg, rHt, nFlags );
    1076             :     }
    1077             : 
    1078           0 :     SfxItemSet aSet( GetAttrPool(), rHt.Which(), rHt.Which() );
    1079           0 :     aSet.Put( rHt );
    1080           0 :     const bool bRet = lcl_InsAttr( this, rRg, aSet, nFlags, pUndoAttr, bExpandCharToPara );
    1081             : 
    1082           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1083             :     {
    1084           0 :         GetIDocumentUndoRedo().AppendUndo( pUndoAttr );
    1085             :     }
    1086             : 
    1087           0 :     if( bRet )
    1088             :     {
    1089           0 :         SetModified();
    1090             :     }
    1091           0 :     return bRet;
    1092             : }
    1093             : 
    1094           0 : bool SwDoc::InsertItemSet ( const SwPaM &rRg, const SfxItemSet &rSet,
    1095             :                             const SetAttrMode nFlags )
    1096             : {
    1097           0 :     SwDataChanged aTmp( rRg );
    1098           0 :     SwUndoAttr* pUndoAttr = 0;
    1099           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1100             :     {
    1101           0 :         GetIDocumentUndoRedo().ClearRedo();
    1102           0 :         pUndoAttr = new SwUndoAttr( rRg, rSet, nFlags );
    1103             :     }
    1104             : 
    1105           0 :     bool bRet = lcl_InsAttr( this, rRg, rSet, nFlags, pUndoAttr );
    1106             : 
    1107           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1108             :     {
    1109           0 :         GetIDocumentUndoRedo().AppendUndo( pUndoAttr );
    1110             :     }
    1111             : 
    1112           0 :     if( bRet )
    1113           0 :         SetModified();
    1114           0 :     return bRet;
    1115             : }
    1116             : 
    1117             : /// Set the rsid of the next nLen symbols of rRg to the current session number
    1118           0 : bool SwDoc::UpdateRsid( const SwPaM &rRg, const sal_Int32 nLen )
    1119             : {
    1120           0 :     SwTxtNode *pTxtNode = rRg.GetPoint()->nNode.GetNode().GetTxtNode();
    1121           0 :     if (!pTxtNode)
    1122             :     {
    1123           0 :         return false;
    1124             :     }
    1125           0 :     const sal_Int32 nStart(rRg.GetPoint()->nContent.GetIndex() - nLen);
    1126           0 :     SvxRsidItem aRsid( mnRsid, RES_CHRATR_RSID );
    1127             : 
    1128           0 :     SfxItemSet aSet(GetAttrPool(), RES_CHRATR_RSID, RES_CHRATR_RSID);
    1129           0 :     aSet.Put(aRsid);
    1130             :     bool const bRet(pTxtNode->SetAttr(aSet, nStart,
    1131           0 :         rRg.GetPoint()->nContent.GetIndex(), nsSetAttrMode::SETATTR_DEFAULT));
    1132             : 
    1133           0 :     if (bRet && GetIDocumentUndoRedo().DoesUndo())
    1134             :     {
    1135           0 :         SwUndo *const pLastUndo = GetUndoManager().GetLastUndo();
    1136           0 :         SwUndoInsert *const pUndoInsert(dynamic_cast<SwUndoInsert*>(pLastUndo));
    1137             :         // this function is called after Insert so expects to find SwUndoInsert
    1138             :         assert(pUndoInsert);
    1139           0 :         if (pUndoInsert)
    1140             :         {
    1141           0 :             pUndoInsert->SetWithRsid();
    1142             :         }
    1143             :     }
    1144           0 :     return bRet;
    1145             : }
    1146             : 
    1147           0 : bool SwDoc::UpdateParRsid( SwTxtNode *pTxtNode, sal_uInt32 nVal )
    1148             : {
    1149           0 :     if (!pTxtNode)
    1150             :     {
    1151           0 :         return false;
    1152             :     }
    1153             : 
    1154           0 :     SvxRsidItem aRsid( nVal ? nVal : mnRsid, RES_PARATR_RSID );
    1155           0 :     return pTxtNode->SetAttr( aRsid );
    1156             : }
    1157             : 
    1158             : /// Set the attribute according to the stated format.
    1159             : /// If Undo is enabled, the old values is added to the Undo history.
    1160           0 : void SwDoc::SetAttr( const SfxPoolItem& rAttr, SwFmt& rFmt )
    1161             : {
    1162           0 :     SfxItemSet aSet( GetAttrPool(), rAttr.Which(), rAttr.Which() );
    1163           0 :     aSet.Put( rAttr );
    1164           0 :     SetAttr( aSet, rFmt );
    1165           0 : }
    1166             : 
    1167             : /// Set the attribute according to the stated format.
    1168             : /// If Undo is enabled, the old values is added to the Undo history.
    1169           0 : void SwDoc::SetAttr( const SfxItemSet& rSet, SwFmt& rFmt )
    1170             : {
    1171           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1172             :     {
    1173           0 :         SwUndoFmtAttrHelper aTmp( rFmt );
    1174           0 :         rFmt.SetFmtAttr( rSet );
    1175           0 :         if ( aTmp.GetUndo() )
    1176             :         {
    1177           0 :             GetIDocumentUndoRedo().AppendUndo( aTmp.ReleaseUndo() );
    1178             :         }
    1179             :         else
    1180             :         {
    1181           0 :             GetIDocumentUndoRedo().ClearRedo();
    1182           0 :         }
    1183             :     }
    1184             :     else
    1185             :     {
    1186           0 :         rFmt.SetFmtAttr( rSet );
    1187             :     }
    1188           0 :     SetModified();
    1189           0 : }
    1190             : 
    1191           0 : void SwDoc::ResetAttrAtFormat( const sal_uInt16 nWhichId,
    1192             :                                SwFmt& rChangedFormat )
    1193             : {
    1194           0 :     SwUndo *const pUndo = (GetIDocumentUndoRedo().DoesUndo())
    1195           0 :         ?   new SwUndoFmtResetAttr( rChangedFormat, nWhichId )
    1196           0 :         :   0;
    1197             : 
    1198           0 :     const sal_Bool bAttrReset = rChangedFormat.ResetFmtAttr( nWhichId );
    1199             : 
    1200           0 :     if ( bAttrReset )
    1201             :     {
    1202           0 :         if ( pUndo )
    1203             :         {
    1204           0 :             GetIDocumentUndoRedo().AppendUndo( pUndo );
    1205             :         }
    1206             : 
    1207           0 :         SetModified();
    1208             :     }
    1209             :     else
    1210           0 :         delete pUndo;
    1211           0 : }
    1212             : 
    1213           0 : static int lcl_SetNewDefTabStops( SwTwips nOldWidth, SwTwips nNewWidth,
    1214             :                                 SvxTabStopItem& rChgTabStop )
    1215             : {
    1216             :     // Set the default values of all TabStops to the new value.
    1217             :     // Attention: we always work with the PoolAttribut here, so that
    1218             :     // we don't calculate the same value on the same TabStop (pooled!) for all sets.
    1219             :     // We send a FmtChg to modify.
    1220             : 
    1221           0 :     sal_uInt16 nOldCnt = rChgTabStop.Count();
    1222           0 :     if( !nOldCnt || nOldWidth == nNewWidth )
    1223           0 :         return sal_False;
    1224             : 
    1225             :     // Find the default's beginning
    1226             :     sal_uInt16 n;
    1227           0 :     for( n = nOldCnt; n ; --n )
    1228           0 :         if( SVX_TAB_ADJUST_DEFAULT != rChgTabStop[n - 1].GetAdjustment() )
    1229           0 :             break;
    1230           0 :     ++n;
    1231           0 :     if( n < nOldCnt )   // delete the DefTabStops
    1232           0 :         rChgTabStop.Remove( n, nOldCnt - n );
    1233           0 :     return sal_True;
    1234             : }
    1235             : 
    1236             : /// Set the attribute as new default attribute in this document.
    1237             : /// If Undo is enabled, the old value is added to the Undo history.
    1238           0 : void SwDoc::SetDefault( const SfxPoolItem& rAttr )
    1239             : {
    1240           0 :     SfxItemSet aSet( GetAttrPool(), rAttr.Which(), rAttr.Which() );
    1241           0 :     aSet.Put( rAttr );
    1242           0 :     SetDefault( aSet );
    1243           0 : }
    1244             : 
    1245           0 : void SwDoc::SetDefault( const SfxItemSet& rSet )
    1246             : {
    1247           0 :     if( !rSet.Count() )
    1248           0 :         return;
    1249             : 
    1250           0 :     SwModify aCallMod( 0 );
    1251           0 :     SwAttrSet aOld( GetAttrPool(), rSet.GetRanges() ),
    1252           0 :             aNew( GetAttrPool(), rSet.GetRanges() );
    1253           0 :     SfxItemIter aIter( rSet );
    1254             :     sal_uInt16 nWhich;
    1255           0 :     const SfxPoolItem* pItem = aIter.GetCurItem();
    1256           0 :     SfxItemPool* pSdrPool = GetAttrPool().GetSecondaryPool();
    1257             :     while( true )
    1258             :     {
    1259           0 :         bool bCheckSdrDflt = false;
    1260           0 :         nWhich = pItem->Which();
    1261           0 :         aOld.Put( GetAttrPool().GetDefaultItem( nWhich ) );
    1262           0 :         GetAttrPool().SetPoolDefaultItem( *pItem );
    1263           0 :         aNew.Put( GetAttrPool().GetDefaultItem( nWhich ) );
    1264             : 
    1265           0 :         if (isCHRATR(nWhich) || isTXTATR(nWhich))
    1266             :         {
    1267           0 :             aCallMod.Add( mpDfltTxtFmtColl );
    1268           0 :             aCallMod.Add( mpDfltCharFmt );
    1269           0 :             bCheckSdrDflt = 0 != pSdrPool;
    1270             :         }
    1271           0 :         else if ( isPARATR(nWhich) ||
    1272           0 :                   isPARATR_LIST(nWhich) )
    1273             :         {
    1274           0 :             aCallMod.Add( mpDfltTxtFmtColl );
    1275           0 :             bCheckSdrDflt = 0 != pSdrPool;
    1276             :         }
    1277           0 :         else if (isGRFATR(nWhich))
    1278             :         {
    1279           0 :             aCallMod.Add( mpDfltGrfFmtColl );
    1280             :         }
    1281           0 :         else if (isFRMATR(nWhich))
    1282             :         {
    1283           0 :             aCallMod.Add( mpDfltGrfFmtColl );
    1284           0 :             aCallMod.Add( mpDfltTxtFmtColl );
    1285           0 :             aCallMod.Add( mpDfltFrmFmt );
    1286             :         }
    1287           0 :         else if (isBOXATR(nWhich))
    1288             :         {
    1289           0 :             aCallMod.Add( mpDfltFrmFmt );
    1290             :         }
    1291             : 
    1292             :         // also copy the defaults
    1293           0 :         if( bCheckSdrDflt )
    1294             :         {
    1295             :             sal_uInt16 nEdtWhich, nSlotId;
    1296           0 :             if( 0 != (nSlotId = GetAttrPool().GetSlotId( nWhich ) ) &&
    1297           0 :                 nSlotId != nWhich &&
    1298           0 :                 0 != (nEdtWhich = pSdrPool->GetWhich( nSlotId )) &&
    1299             :                 nSlotId != nEdtWhich )
    1300             :             {
    1301           0 :                 SfxPoolItem* pCpy = pItem->Clone();
    1302           0 :                 pCpy->SetWhich( nEdtWhich );
    1303           0 :                 pSdrPool->SetPoolDefaultItem( *pCpy );
    1304           0 :                 delete pCpy;
    1305             :             }
    1306             :         }
    1307             : 
    1308           0 :         if( aIter.IsAtEnd() )
    1309           0 :             break;
    1310           0 :         pItem = aIter.NextItem();
    1311             :     }
    1312             : 
    1313           0 :     if( aNew.Count() && aCallMod.GetDepends() )
    1314             :     {
    1315           0 :         if (GetIDocumentUndoRedo().DoesUndo())
    1316             :         {
    1317           0 :             GetIDocumentUndoRedo().AppendUndo( new SwUndoDefaultAttr( aOld ) );
    1318             :         }
    1319             : 
    1320             :         const SfxPoolItem* pTmpItem;
    1321           0 :         if( ( SFX_ITEM_SET ==
    1322           0 :                 aNew.GetItemState( RES_PARATR_TABSTOP, false, &pTmpItem ) ) &&
    1323           0 :             ((SvxTabStopItem*)pTmpItem)->Count() )
    1324             :         {
    1325             :             // Set the default values of all TabStops to the new value.
    1326             :             // Attention: we always work with the PoolAttribut here, so that
    1327             :             // we don't calculate the same value on the same TabStop (pooled!) for all sets.
    1328             :             // We send a FmtChg to modify.
    1329           0 :             SwTwips nNewWidth = (*(SvxTabStopItem*)pTmpItem)[ 0 ].GetTabPos(),
    1330           0 :                     nOldWidth = ((SvxTabStopItem&)aOld.Get(RES_PARATR_TABSTOP))[ 0 ].GetTabPos();
    1331             : 
    1332           0 :             int bChg = sal_False;
    1333           0 :             sal_uInt32 nMaxItems = GetAttrPool().GetItemCount2( RES_PARATR_TABSTOP );
    1334           0 :             for( sal_uInt32 n = 0; n < nMaxItems; ++n )
    1335           0 :                 if( 0 != (pTmpItem = GetAttrPool().GetItem2( RES_PARATR_TABSTOP, n ) ))
    1336             :                     bChg |= lcl_SetNewDefTabStops( nOldWidth, nNewWidth,
    1337           0 :                                                 *(SvxTabStopItem*)pTmpItem );
    1338             : 
    1339           0 :             aNew.ClearItem( RES_PARATR_TABSTOP );
    1340           0 :             aOld.ClearItem( RES_PARATR_TABSTOP );
    1341           0 :             if( bChg )
    1342             :             {
    1343           0 :                 SwFmtChg aChgFmt( mpDfltCharFmt );
    1344             :                 // notify the frames
    1345           0 :                 aCallMod.ModifyNotification( &aChgFmt, &aChgFmt );
    1346             :             }
    1347             :         }
    1348             :     }
    1349             : 
    1350           0 :     if( aNew.Count() && aCallMod.GetDepends() )
    1351             :     {
    1352           0 :         SwAttrSetChg aChgOld( aOld, aOld );
    1353           0 :         SwAttrSetChg aChgNew( aNew, aNew );
    1354           0 :         aCallMod.ModifyNotification( &aChgOld, &aChgNew );      // all changed are sent
    1355             :     }
    1356             : 
    1357             :     // remove the default formats from the object again
    1358             :     SwClient* pDep;
    1359           0 :     while( 0 != ( pDep = (SwClient*)aCallMod.GetDepends()) )
    1360           0 :         aCallMod.Remove( pDep );
    1361             : 
    1362           0 :     SetModified();
    1363             : }
    1364             : 
    1365             : /// Get the default attribute in this document
    1366           0 : const SfxPoolItem& SwDoc::GetDefault( sal_uInt16 nFmtHint ) const
    1367             : {
    1368           0 :     return GetAttrPool().GetDefaultItem( nFmtHint );
    1369             : }
    1370             : 
    1371             : /// Delete the formats
    1372           0 : void SwDoc::DelCharFmt(sal_uInt16 nFmt, bool bBroadcast)
    1373             : {
    1374           0 :     SwCharFmt * pDel = (*mpCharFmtTbl)[nFmt];
    1375             : 
    1376           0 :     if (bBroadcast)
    1377             :         BroadcastStyleOperation(pDel->GetName(), SFX_STYLE_FAMILY_CHAR,
    1378           0 :                                 SFX_STYLESHEET_ERASED);
    1379             : 
    1380           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1381             :     {
    1382             :         SwUndo * pUndo =
    1383           0 :             new SwUndoCharFmtDelete(pDel, this);
    1384             : 
    1385           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
    1386             :     }
    1387             : 
    1388           0 :     delete (*mpCharFmtTbl)[nFmt];
    1389           0 :     mpCharFmtTbl->erase(mpCharFmtTbl->begin() + nFmt);
    1390             : 
    1391           0 :     SetModified();
    1392           0 : }
    1393             : 
    1394           0 : void SwDoc::DelCharFmt( SwCharFmt *pFmt, bool bBroadcast )
    1395             : {
    1396           0 :     sal_uInt16 nFmt = mpCharFmtTbl->GetPos( pFmt );
    1397             :     OSL_ENSURE( USHRT_MAX != nFmt, "Fmt not found," );
    1398           0 :     DelCharFmt( nFmt, bBroadcast );
    1399           0 : }
    1400             : 
    1401           0 : void SwDoc::DelFrmFmt( SwFrmFmt *pFmt, bool bBroadcast )
    1402             : {
    1403           0 :     if( pFmt->ISA( SwTableBoxFmt ) || pFmt->ISA( SwTableLineFmt ))
    1404             :     {
    1405             :         OSL_ENSURE( !this, "Format is not in the DocArray any more, "
    1406             :                        "so it can be deleted with delete" );
    1407           0 :         delete pFmt;
    1408             :     }
    1409             :     else
    1410             :     {
    1411             : 
    1412             :         // The format has to be in the one or the other, we'll see in which one.
    1413           0 :         SwFrmFmts::iterator it = std::find( mpFrmFmtTbl->begin(), mpFrmFmtTbl->end(), pFmt );
    1414           0 :         if ( it != mpFrmFmtTbl->end() )
    1415             :         {
    1416           0 :             if (bBroadcast)
    1417             :                 BroadcastStyleOperation(pFmt->GetName(),
    1418             :                                         SFX_STYLE_FAMILY_FRAME,
    1419           0 :                                         SFX_STYLESHEET_ERASED);
    1420             : 
    1421           0 :             if (GetIDocumentUndoRedo().DoesUndo())
    1422             :             {
    1423           0 :                 SwUndo * pUndo = new SwUndoFrmFmtDelete(pFmt, this);
    1424             : 
    1425           0 :                 GetIDocumentUndoRedo().AppendUndo(pUndo);
    1426             :             }
    1427             : 
    1428           0 :             delete *it;
    1429           0 :             mpFrmFmtTbl->erase(it);
    1430             :         }
    1431             :         else
    1432             :         {
    1433           0 :             SwFrmFmts::iterator it2 = std::find( GetSpzFrmFmts()->begin(), GetSpzFrmFmts()->end(), pFmt );
    1434             :             OSL_ENSURE( it2 != GetSpzFrmFmts()->end(), "FrmFmt not found." );
    1435           0 :             if( it2 != GetSpzFrmFmts()->end() )
    1436             :             {
    1437           0 :                 delete *it2;
    1438           0 :                 GetSpzFrmFmts()->erase( it2 );
    1439             :             }
    1440             :         }
    1441             :     }
    1442           0 : }
    1443             : 
    1444           0 : void SwDoc::DelTblFrmFmt( SwTableFmt *pFmt )
    1445             : {
    1446           0 :     SwFrmFmts::iterator it = std::find( mpTblFrmFmtTbl->begin(), mpTblFrmFmtTbl->end(), pFmt );
    1447             :     OSL_ENSURE( it != mpTblFrmFmtTbl->end(), "Fmt not found," );
    1448           0 :     delete *it;
    1449           0 :     mpTblFrmFmtTbl->erase(it);
    1450           0 : }
    1451             : 
    1452             : /// Create the formats
    1453           0 : SwFlyFrmFmt *SwDoc::MakeFlyFrmFmt( const OUString &rFmtName,
    1454             :                                     SwFrmFmt *pDerivedFrom )
    1455             : {
    1456           0 :     SwFlyFrmFmt *pFmt = new SwFlyFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom );
    1457           0 :     GetSpzFrmFmts()->push_back(pFmt);
    1458           0 :     SetModified();
    1459           0 :     return pFmt;
    1460             : }
    1461             : 
    1462           0 : SwDrawFrmFmt *SwDoc::MakeDrawFrmFmt( const OUString &rFmtName,
    1463             :                                      SwFrmFmt *pDerivedFrom )
    1464             : {
    1465           0 :     SwDrawFrmFmt *pFmt = new SwDrawFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom);
    1466           0 :     GetSpzFrmFmts()->push_back(pFmt);
    1467           0 :     SetModified();
    1468           0 :     return pFmt;
    1469             : }
    1470             : 
    1471           0 : sal_uInt16 SwDoc::GetTblFrmFmtCount(bool bUsed) const
    1472             : {
    1473           0 :     sal_uInt16 nCount = mpTblFrmFmtTbl->size();
    1474           0 :     if(bUsed)
    1475             :     {
    1476           0 :         SwAutoFmtGetDocNode aGetHt( &GetNodes() );
    1477           0 :         for ( sal_uInt16 i = nCount; i; )
    1478             :         {
    1479           0 :             if((*mpTblFrmFmtTbl)[--i]->GetInfo( aGetHt ))
    1480           0 :                 --nCount;
    1481           0 :         }
    1482             :     }
    1483           0 :     return nCount;
    1484             : }
    1485             : 
    1486           0 : SwFrmFmt& SwDoc::GetTblFrmFmt(sal_uInt16 nFmt, bool bUsed ) const
    1487             : {
    1488           0 :     sal_uInt16 nRemoved = 0;
    1489           0 :     if(bUsed)
    1490             :     {
    1491           0 :         SwAutoFmtGetDocNode aGetHt( &GetNodes() );
    1492           0 :         for ( sal_uInt16 i = 0; i <= nFmt; i++ )
    1493             :         {
    1494           0 :             while ( (*mpTblFrmFmtTbl)[ i + nRemoved]->GetInfo( aGetHt ))
    1495             :             {
    1496           0 :                 nRemoved++;
    1497             :             }
    1498           0 :         }
    1499             :     }
    1500           0 :     return *((*mpTblFrmFmtTbl)[nRemoved + nFmt]);
    1501             : }
    1502             : 
    1503           0 : SwTableFmt* SwDoc::MakeTblFrmFmt( const OUString &rFmtName,
    1504             :                                     SwFrmFmt *pDerivedFrom )
    1505             : {
    1506           0 :     SwTableFmt* pFmt = new SwTableFmt( GetAttrPool(), rFmtName, pDerivedFrom );
    1507           0 :     mpTblFrmFmtTbl->push_back( pFmt );
    1508           0 :     SetModified();
    1509             : 
    1510           0 :     return pFmt;
    1511             : }
    1512             : 
    1513           0 : SwFrmFmt *SwDoc::MakeFrmFmt(const OUString &rFmtName,
    1514             :                             SwFrmFmt *pDerivedFrom,
    1515             :                             bool bBroadcast, bool bAuto)
    1516             : {
    1517           0 :     SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), rFmtName, pDerivedFrom );
    1518             : 
    1519           0 :     pFmt->SetAuto(bAuto);
    1520           0 :     mpFrmFmtTbl->push_back( pFmt );
    1521           0 :     SetModified();
    1522             : 
    1523           0 :     if (bBroadcast)
    1524             :     {
    1525             :         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
    1526           0 :                                 SFX_STYLESHEET_CREATED);
    1527             : 
    1528           0 :         if (GetIDocumentUndoRedo().DoesUndo())
    1529             :         {
    1530           0 :             SwUndo * pUndo = new SwUndoFrmFmtCreate(pFmt, pDerivedFrom, this);
    1531             : 
    1532           0 :             GetIDocumentUndoRedo().AppendUndo(pUndo);
    1533             :         }
    1534             :     }
    1535             : 
    1536           0 :     return pFmt;
    1537             : }
    1538             : 
    1539           0 : SwFmt *SwDoc::_MakeFrmFmt(const OUString &rFmtName,
    1540             :                             SwFmt *pDerivedFrom,
    1541             :                             bool bBroadcast, bool bAuto)
    1542             : {
    1543           0 :     SwFrmFmt *pFrmFmt = dynamic_cast<SwFrmFmt*>(pDerivedFrom);
    1544           0 :     pFrmFmt = MakeFrmFmt( rFmtName, pFrmFmt, bBroadcast, bAuto );
    1545           0 :     return dynamic_cast<SwFmt*>(pFrmFmt);
    1546             : }
    1547             : 
    1548             : // #i40550# - add parameter <bAuto> - not relevant
    1549           0 : SwCharFmt *SwDoc::MakeCharFmt( const OUString &rFmtName,
    1550             :                                SwCharFmt *pDerivedFrom,
    1551             :                                bool bBroadcast,
    1552             :                                bool )
    1553             : {
    1554           0 :     SwCharFmt *pFmt = new SwCharFmt( GetAttrPool(), rFmtName, pDerivedFrom );
    1555           0 :     mpCharFmtTbl->push_back( pFmt );
    1556           0 :     pFmt->SetAuto( false );
    1557           0 :     SetModified();
    1558             : 
    1559           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1560             :     {
    1561           0 :         SwUndo * pUndo = new SwUndoCharFmtCreate(pFmt, pDerivedFrom, this);
    1562             : 
    1563           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
    1564             :     }
    1565             : 
    1566           0 :     if (bBroadcast)
    1567             :     {
    1568             :         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_CHAR,
    1569           0 :                                 SFX_STYLESHEET_CREATED);
    1570             :     }
    1571             : 
    1572           0 :     return pFmt;
    1573             : }
    1574             : 
    1575           0 : SwFmt *SwDoc::_MakeCharFmt(const OUString &rFmtName,
    1576             :                             SwFmt *pDerivedFrom,
    1577             :                             bool bBroadcast, bool bAuto)
    1578             : {
    1579           0 :     SwCharFmt *pCharFmt = dynamic_cast<SwCharFmt*>(pDerivedFrom);
    1580           0 :     pCharFmt = MakeCharFmt( rFmtName, pCharFmt, bBroadcast, bAuto );
    1581           0 :     return dynamic_cast<SwFmt*>(pCharFmt);
    1582             : }
    1583             : 
    1584             : /// Create the FormatCollections
    1585           0 : SwTxtFmtColl* SwDoc::MakeTxtFmtColl( const OUString &rFmtName,
    1586             :                                      SwTxtFmtColl *pDerivedFrom,
    1587             :                                      bool bBroadcast,
    1588             :                                      bool )
    1589             : {
    1590             :     SwTxtFmtColl *pFmtColl = new SwTxtFmtColl( GetAttrPool(), rFmtName,
    1591           0 :                                                 pDerivedFrom );
    1592           0 :     mpTxtFmtCollTbl->push_back(pFmtColl);
    1593           0 :     pFmtColl->SetAuto( false );
    1594           0 :     SetModified();
    1595             : 
    1596           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1597             :     {
    1598             :         SwUndo * pUndo = new SwUndoTxtFmtCollCreate(pFmtColl, pDerivedFrom,
    1599           0 :                                                     this);
    1600           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
    1601             :     }
    1602             : 
    1603           0 :     if (bBroadcast)
    1604             :         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
    1605           0 :                                 SFX_STYLESHEET_CREATED);
    1606             : 
    1607           0 :     return pFmtColl;
    1608             : }
    1609             : 
    1610           0 : SwFmt *SwDoc::_MakeTxtFmtColl(const OUString &rFmtName,
    1611             :                             SwFmt *pDerivedFrom,
    1612             :                             bool bBroadcast, bool bAuto)
    1613             : {
    1614           0 :     SwTxtFmtColl *pTxtFmtColl = dynamic_cast<SwTxtFmtColl*>(pDerivedFrom);
    1615           0 :     pTxtFmtColl = MakeTxtFmtColl( rFmtName, pTxtFmtColl, bBroadcast, bAuto );
    1616           0 :     return dynamic_cast<SwFmt*>(pTxtFmtColl);
    1617             : }
    1618             : 
    1619             : //FEATURE::CONDCOLL
    1620           0 : SwConditionTxtFmtColl* SwDoc::MakeCondTxtFmtColl( const OUString &rFmtName,
    1621             :                                                   SwTxtFmtColl *pDerivedFrom,
    1622             :                                                   bool bBroadcast)
    1623             : {
    1624             :     SwConditionTxtFmtColl*pFmtColl = new SwConditionTxtFmtColl( GetAttrPool(),
    1625           0 :                                                     rFmtName, pDerivedFrom );
    1626           0 :     mpTxtFmtCollTbl->push_back(pFmtColl);
    1627           0 :     pFmtColl->SetAuto( false );
    1628           0 :     SetModified();
    1629             : 
    1630           0 :     if (bBroadcast)
    1631             :         BroadcastStyleOperation(rFmtName, SFX_STYLE_FAMILY_PARA,
    1632           0 :                                 SFX_STYLESHEET_CREATED);
    1633             : 
    1634           0 :     return pFmtColl;
    1635             : }
    1636             : //FEATURE::CONDCOLL
    1637             : 
    1638             : // GRF
    1639           0 : SwGrfFmtColl* SwDoc::MakeGrfFmtColl( const OUString &rFmtName,
    1640             :                                      SwGrfFmtColl *pDerivedFrom )
    1641             : {
    1642             :     SwGrfFmtColl *pFmtColl = new SwGrfFmtColl( GetAttrPool(), rFmtName,
    1643           0 :                                                 pDerivedFrom );
    1644           0 :     mpGrfFmtCollTbl->push_back( pFmtColl );
    1645           0 :     pFmtColl->SetAuto( false );
    1646           0 :     SetModified();
    1647           0 :     return pFmtColl;
    1648             : }
    1649             : 
    1650           0 : void SwDoc::DelTxtFmtColl(sal_uInt16 nFmtColl, bool bBroadcast)
    1651             : {
    1652             :     OSL_ENSURE( nFmtColl, "Remove fuer Coll 0." );
    1653             : 
    1654             :     // Who has the to-be-deleted as their Next?
    1655           0 :     SwTxtFmtColl *pDel = (*mpTxtFmtCollTbl)[nFmtColl];
    1656           0 :     if( mpDfltTxtFmtColl == pDel )
    1657           0 :         return;     // never delete default!
    1658             : 
    1659           0 :     if (bBroadcast)
    1660             :         BroadcastStyleOperation(pDel->GetName(), SFX_STYLE_FAMILY_PARA,
    1661           0 :                                 SFX_STYLESHEET_ERASED);
    1662             : 
    1663           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1664             :     {
    1665             :         SwUndoTxtFmtCollDelete * pUndo =
    1666           0 :             new SwUndoTxtFmtCollDelete(pDel, this);
    1667             : 
    1668           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
    1669             :     }
    1670             : 
    1671             :     // Remove the FmtColl
    1672           0 :     mpTxtFmtCollTbl->erase(mpTxtFmtCollTbl->begin() + nFmtColl);
    1673             :     // Correct next
    1674           0 :     for( SwTxtFmtColls::const_iterator it = mpTxtFmtCollTbl->begin() + 1; it != mpTxtFmtCollTbl->end(); ++it )
    1675           0 :         SetTxtFmtCollNext( *it, pDel );
    1676           0 :     delete pDel;
    1677           0 :     SetModified();
    1678             : }
    1679             : 
    1680           0 : void SwDoc::DelTxtFmtColl( SwTxtFmtColl *pColl, bool bBroadcast )
    1681             : {
    1682           0 :     sal_uInt16 nFmt = mpTxtFmtCollTbl->GetPos( pColl );
    1683             :     OSL_ENSURE( USHRT_MAX != nFmt, "Collection not found," );
    1684           0 :     DelTxtFmtColl( nFmt, bBroadcast );
    1685           0 : }
    1686             : 
    1687           0 : static bool lcl_SetTxtFmtColl( const SwNodePtr& rpNode, void* pArgs )
    1688             : {
    1689           0 :     SwCntntNode* pCNd = static_cast<SwCntntNode*>(rpNode->GetTxtNode());
    1690             : 
    1691           0 :     if( pCNd == NULL)
    1692           0 :         return true;
    1693             : 
    1694           0 :     ParaRstFmt* pPara = reinterpret_cast<ParaRstFmt*>(pArgs);
    1695             : 
    1696           0 :     SwTxtFmtColl* pFmt = static_cast<SwTxtFmtColl*>(pPara->pFmtColl);
    1697           0 :     if ( pPara->bReset )
    1698             :     {
    1699           0 :         if( pFmt->GetAttrOutlineLevel() == 0 )
    1700           0 :             pPara->bKeepOutlineLevelAttr = true;
    1701             : 
    1702           0 :         lcl_RstAttr( pCNd, pPara );
    1703             : 
    1704             :         // #i62675# check, if paragraph style has changed
    1705           0 :         if ( pPara->bResetListAttrs &&
    1706           0 :              pFmt != pCNd->GetFmtColl() &&
    1707           0 :              pFmt->GetItemState( RES_PARATR_NUMRULE ) == SFX_ITEM_SET )
    1708             :         {
    1709             :             // Check, if the list style of the paragraph will change.
    1710           0 :             bool bChangeOfListStyleAtParagraph( true );
    1711           0 :             SwTxtNode* pTNd( dynamic_cast<SwTxtNode*>(pCNd) );
    1712             :             OSL_ENSURE( pTNd, "<lcl_SetTxtFmtColl(..)> - text node expected -> crash" );
    1713             :             {
    1714           0 :                 SwNumRule* pNumRuleAtParagraph( pTNd->GetNumRule() );
    1715           0 :                 if ( pNumRuleAtParagraph )
    1716             :                 {
    1717             :                     const SwNumRuleItem& rNumRuleItemAtParagraphStyle =
    1718           0 :                         pFmt->GetNumRule();
    1719           0 :                     if ( rNumRuleItemAtParagraphStyle.GetValue() ==
    1720             :                             pNumRuleAtParagraph->GetName() )
    1721             :                     {
    1722           0 :                         bChangeOfListStyleAtParagraph = false;
    1723             :                     }
    1724             :                 }
    1725             :             }
    1726             : 
    1727           0 :             if ( bChangeOfListStyleAtParagraph )
    1728             :             {
    1729           0 :                 boost::scoped_ptr< SwRegHistory > pRegH;
    1730           0 :                 if ( pPara->pHistory )
    1731             :                 {
    1732           0 :                     pRegH.reset( new SwRegHistory( pTNd, *pTNd, pPara->pHistory ) );
    1733             :                 }
    1734             : 
    1735           0 :                 pCNd->ResetAttr( RES_PARATR_NUMRULE );
    1736             : 
    1737             :                 // reset all list attributes
    1738           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_LEVEL );
    1739           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_ISRESTART );
    1740           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_RESTARTVALUE );
    1741           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_ISCOUNTED );
    1742           0 :                 pCNd->ResetAttr( RES_PARATR_LIST_ID );
    1743             :             }
    1744             :         }
    1745             :     }
    1746             : 
    1747             :     // add to History so that old data is saved, if necessary
    1748           0 :     if( pPara->pHistory )
    1749             :         pPara->pHistory->Add( pCNd->GetFmtColl(), pCNd->GetIndex(),
    1750           0 :                 ND_TEXTNODE );
    1751             : 
    1752           0 :     pCNd->ChgFmtColl( pFmt );
    1753             : 
    1754           0 :     pPara->nWhich++;
    1755             : 
    1756           0 :     return true;
    1757             : }
    1758             : 
    1759           0 : bool SwDoc::SetTxtFmtColl( const SwPaM &rRg,
    1760             :                            SwTxtFmtColl *pFmt,
    1761             :                            bool bReset,
    1762             :                            bool bResetListAttrs )
    1763             : {
    1764           0 :     SwDataChanged aTmp( rRg );
    1765           0 :     const SwPosition *pStt = rRg.Start(), *pEnd = rRg.End();
    1766           0 :     SwHistory* pHst = 0;
    1767           0 :     bool bRet = true;
    1768             : 
    1769           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    1770             :     {
    1771             :         SwUndoFmtColl* pUndo = new SwUndoFmtColl( rRg, pFmt,
    1772             :                                                   bReset,
    1773           0 :                                                   bResetListAttrs );
    1774           0 :         pHst = pUndo->GetHistory();
    1775           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
    1776             :     }
    1777             : 
    1778           0 :     ParaRstFmt aPara( pStt, pEnd, pHst );
    1779           0 :     aPara.pFmtColl = pFmt;
    1780           0 :     aPara.bReset = bReset;
    1781             :     // #i62675#
    1782           0 :     aPara.bResetListAttrs = bResetListAttrs;
    1783             : 
    1784           0 :     GetNodes().ForEach( pStt->nNode.GetIndex(), pEnd->nNode.GetIndex()+1,
    1785           0 :                         lcl_SetTxtFmtColl, &aPara );
    1786           0 :     if( !aPara.nWhich )
    1787           0 :         bRet = false;           // didn't find a valid Node
    1788             : 
    1789           0 :     if( bRet )
    1790           0 :         SetModified();
    1791           0 :     return bRet;
    1792             : }
    1793             : 
    1794             : /// Copy the formats to itself
    1795           0 : SwFmt* SwDoc::CopyFmt( const SwFmt& rFmt,
    1796             :                         const SwFmtsBase& rFmtArr,
    1797             :                         FNCopyFmt fnCopyFmt, const SwFmt& rDfltFmt )
    1798             : {
    1799             :     // It's no autoformat, default format or collection format,
    1800             :     // then search for it.
    1801           0 :     if( !rFmt.IsAuto() || !rFmt.GetRegisteredIn() )
    1802           0 :         for( sal_uInt16 n = 0; n < rFmtArr.GetFmtCount(); n++ )
    1803             :         {
    1804             :             // Does the Doc already contain the template?
    1805           0 :             if( rFmtArr.GetFmt(n)->GetName()==rFmt.GetName() )
    1806           0 :                 return (SwFmt*)rFmtArr.GetFmt(n);
    1807             :         }
    1808             : 
    1809             :     // Search for the "parent" first
    1810           0 :     SwFmt* pParent = (SwFmt*)&rDfltFmt;
    1811           0 :     if( rFmt.DerivedFrom() && pParent != rFmt.DerivedFrom() )
    1812           0 :         pParent = CopyFmt( *rFmt.DerivedFrom(), rFmtArr,
    1813           0 :                                 fnCopyFmt, rDfltFmt );
    1814             : 
    1815             :     // Create the format and copy the attributes
    1816             :     // #i40550#
    1817           0 :     SwFmt* pNewFmt = (this->*fnCopyFmt)( rFmt.GetName(), pParent, false, true );
    1818           0 :     pNewFmt->SetAuto( rFmt.IsAuto() );
    1819           0 :     pNewFmt->CopyAttrs( rFmt, sal_True );           // copy the attributes
    1820             : 
    1821           0 :     pNewFmt->SetPoolFmtId( rFmt.GetPoolFmtId() );
    1822           0 :     pNewFmt->SetPoolHelpId( rFmt.GetPoolHelpId() );
    1823             : 
    1824             :     // Always set the HelpFile Id to dflt!
    1825           0 :     pNewFmt->SetPoolHlpFileId( UCHAR_MAX );
    1826             : 
    1827           0 :     return pNewFmt;
    1828             : }
    1829             : 
    1830             : /// copy the frame format
    1831           0 : SwFrmFmt* SwDoc::CopyFrmFmt( const SwFrmFmt& rFmt )
    1832             : {
    1833             : 
    1834           0 :     return (SwFrmFmt*)CopyFmt( rFmt, *GetFrmFmts(), &SwDoc::_MakeFrmFmt,
    1835           0 :                                 *GetDfltFrmFmt() );
    1836             : }
    1837             : 
    1838             : /// copy the char format
    1839           0 : SwCharFmt* SwDoc::CopyCharFmt( const SwCharFmt& rFmt )
    1840             : {
    1841           0 :     return (SwCharFmt*)CopyFmt( rFmt, *GetCharFmts(),
    1842             :                                 &SwDoc::_MakeCharFmt,
    1843           0 :                                 *GetDfltCharFmt() );
    1844             : }
    1845             : 
    1846             : /// copy TextNodes
    1847           0 : SwTxtFmtColl* SwDoc::CopyTxtColl( const SwTxtFmtColl& rColl )
    1848             : {
    1849           0 :     SwTxtFmtColl* pNewColl = FindTxtFmtCollByName( rColl.GetName() );
    1850           0 :     if( pNewColl )
    1851           0 :         return pNewColl;
    1852             : 
    1853             :     // search for the "parent" first
    1854           0 :     SwTxtFmtColl* pParent = mpDfltTxtFmtColl;
    1855           0 :     if( pParent != rColl.DerivedFrom() )
    1856           0 :         pParent = CopyTxtColl( *(SwTxtFmtColl*)rColl.DerivedFrom() );
    1857             : 
    1858             : //FEATURE::CONDCOLL
    1859           0 :     if( RES_CONDTXTFMTCOLL == rColl.Which() )
    1860             :     {
    1861             :         pNewColl = new SwConditionTxtFmtColl( GetAttrPool(), rColl.GetName(),
    1862           0 :                                                 pParent);
    1863           0 :         mpTxtFmtCollTbl->push_back( pNewColl );
    1864           0 :         pNewColl->SetAuto( false );
    1865           0 :         SetModified();
    1866             : 
    1867             :         // copy the conditions
    1868             :         ((SwConditionTxtFmtColl*)pNewColl)->SetConditions(
    1869           0 :                             ((SwConditionTxtFmtColl&)rColl).GetCondColls() );
    1870             :     }
    1871             :     else
    1872             : //FEATURE::CONDCOLL
    1873           0 :         pNewColl = MakeTxtFmtColl( rColl.GetName(), pParent );
    1874             : 
    1875             :     // copy the auto formats or the attributes
    1876           0 :     pNewColl->CopyAttrs( rColl, sal_True );
    1877             : 
    1878           0 :     if(rColl.IsAssignedToListLevelOfOutlineStyle())
    1879           0 :         pNewColl->AssignToListLevelOfOutlineStyle(rColl.GetAssignedOutlineStyleLevel());
    1880           0 :     pNewColl->SetPoolFmtId( rColl.GetPoolFmtId() );
    1881           0 :     pNewColl->SetPoolHelpId( rColl.GetPoolHelpId() );
    1882             : 
    1883             :     // Always set the HelpFile Id to dflt!
    1884           0 :     pNewColl->SetPoolHlpFileId( UCHAR_MAX );
    1885             : 
    1886           0 :     if( &rColl.GetNextTxtFmtColl() != &rColl )
    1887           0 :         pNewColl->SetNextTxtFmtColl( *CopyTxtColl( rColl.GetNextTxtFmtColl() ));
    1888             : 
    1889             :     // create the NumRule if necessary
    1890           0 :     if( this != rColl.GetDoc() )
    1891             :     {
    1892             :         const SfxPoolItem* pItem;
    1893           0 :         if( SFX_ITEM_SET == pNewColl->GetItemState( RES_PARATR_NUMRULE,
    1894           0 :             sal_False, &pItem ))
    1895             :         {
    1896             :             const SwNumRule* pRule;
    1897           0 :             const OUString& rName = ((SwNumRuleItem*)pItem)->GetValue();
    1898           0 :             if( !rName.isEmpty() &&
    1899           0 :                 0 != ( pRule = rColl.GetDoc()->FindNumRulePtr( rName )) &&
    1900           0 :                 !pRule->IsAutoRule() )
    1901             :             {
    1902           0 :                 SwNumRule* pDestRule = FindNumRulePtr( rName );
    1903           0 :                 if( pDestRule )
    1904           0 :                     pDestRule->SetInvalidRule( sal_True );
    1905             :                 else
    1906           0 :                     MakeNumRule( rName, pRule );
    1907             :             }
    1908             :         }
    1909             :     }
    1910           0 :     return pNewColl;
    1911             : }
    1912             : 
    1913             : /// copy the graphic nodes
    1914           0 : SwGrfFmtColl* SwDoc::CopyGrfColl( const SwGrfFmtColl& rColl )
    1915             : {
    1916           0 :     SwGrfFmtColl* pNewColl = FindGrfFmtCollByName( rColl.GetName() );
    1917           0 :     if( pNewColl )
    1918           0 :         return pNewColl;
    1919             : 
    1920             :      // Search for the "parent" first
    1921           0 :     SwGrfFmtColl* pParent = mpDfltGrfFmtColl;
    1922           0 :     if( pParent != rColl.DerivedFrom() )
    1923           0 :         pParent = CopyGrfColl( *(SwGrfFmtColl*)rColl.DerivedFrom() );
    1924             : 
    1925             :     // if not, copy them
    1926           0 :     pNewColl = MakeGrfFmtColl( rColl.GetName(), pParent );
    1927             : 
    1928             :     // copy the attributes
    1929           0 :     pNewColl->CopyAttrs( rColl );
    1930             : 
    1931           0 :     pNewColl->SetPoolFmtId( rColl.GetPoolFmtId() );
    1932           0 :     pNewColl->SetPoolHelpId( rColl.GetPoolHelpId() );
    1933             : 
    1934             :     // Always set the HelpFile Id to dflt!
    1935           0 :     pNewColl->SetPoolHlpFileId( UCHAR_MAX );
    1936             : 
    1937           0 :     return pNewColl;
    1938             : }
    1939             : 
    1940           0 : static SwPageDesc* lcl_FindPageDesc( const SwPageDescs& rArr, const OUString& rName )
    1941             : {
    1942           0 :     for( sal_uInt16 n = rArr.size(); n; )
    1943             :     {
    1944           0 :         SwPageDesc* pDesc = rArr[ --n ];
    1945           0 :         if( pDesc->GetName() == rName )
    1946           0 :             return pDesc;
    1947             :     }
    1948           0 :     return 0;
    1949             : }
    1950             : 
    1951           0 : void SwDoc::CopyFmtArr( const SwFmtsBase& rSourceArr,
    1952             :                         SwFmtsBase& rDestArr,
    1953             :                         FNCopyFmt fnCopyFmt,
    1954             :                         SwFmt& rDfltFmt )
    1955             : {
    1956             :     sal_uInt16 nSrc;
    1957             :     SwFmt* pSrc, *pDest;
    1958             : 
    1959             :     // 1st step: Create all formats (skip the 0th - it's the default one)
    1960           0 :     for( nSrc = rSourceArr.GetFmtCount(); nSrc > 1; )
    1961             :     {
    1962           0 :         pSrc = (SwFmt*)rSourceArr.GetFmt( --nSrc );
    1963           0 :         if( pSrc->IsDefault() || pSrc->IsAuto() )
    1964           0 :             continue;
    1965             : 
    1966           0 :         if( 0 == FindFmtByName( rDestArr, pSrc->GetName() ) )
    1967             :         {
    1968           0 :             if( RES_CONDTXTFMTCOLL == pSrc->Which() )
    1969           0 :                 MakeCondTxtFmtColl( pSrc->GetName(), (SwTxtFmtColl*)&rDfltFmt );
    1970             :             else
    1971             :                 // #i40550#
    1972           0 :                 (this->*fnCopyFmt)( pSrc->GetName(), &rDfltFmt, false, true );
    1973             :         }
    1974             :     }
    1975             : 
    1976             :     // 2nd step: Copy all attributes, set the right parents
    1977           0 :     for( nSrc = rSourceArr.GetFmtCount(); nSrc > 1; )
    1978             :     {
    1979           0 :         pSrc = (SwFmt*)rSourceArr.GetFmt( --nSrc );
    1980           0 :         if( pSrc->IsDefault() || pSrc->IsAuto() )
    1981           0 :             continue;
    1982             : 
    1983           0 :         pDest = FindFmtByName( rDestArr, pSrc->GetName() );
    1984           0 :         pDest->SetAuto( false );
    1985           0 :         pDest->DelDiffs( *pSrc );
    1986             : 
    1987             :         // #i94285#: existing <SwFmtPageDesc> instance, before copying attributes
    1988             :         const SfxPoolItem* pItem;
    1989           0 :         if( &GetAttrPool() != pSrc->GetAttrSet().GetPool() &&
    1990           0 :             SFX_ITEM_SET == pSrc->GetAttrSet().GetItemState(
    1991           0 :             RES_PAGEDESC, false, &pItem ) &&
    1992           0 :             ((SwFmtPageDesc*)pItem)->GetPageDesc() )
    1993             :         {
    1994           0 :             SwFmtPageDesc aPageDesc( *(SwFmtPageDesc*)pItem );
    1995           0 :             const OUString& rNm = aPageDesc.GetPageDesc()->GetName();
    1996           0 :             SwPageDesc* pPageDesc = ::lcl_FindPageDesc( maPageDescs, rNm );
    1997           0 :             if( !pPageDesc )
    1998             :             {
    1999           0 :                 pPageDesc = maPageDescs[ MakePageDesc( rNm ) ];
    2000             :             }
    2001           0 :             aPageDesc.RegisterToPageDesc( *pPageDesc );
    2002           0 :             SwAttrSet aTmpAttrSet( pSrc->GetAttrSet() );
    2003           0 :             aTmpAttrSet.Put( aPageDesc );
    2004           0 :             pDest->SetFmtAttr( aTmpAttrSet );
    2005             :         }
    2006             :         else
    2007             :         {
    2008           0 :             pDest->SetFmtAttr( pSrc->GetAttrSet() );
    2009             :         }
    2010             : 
    2011           0 :         pDest->SetPoolFmtId( pSrc->GetPoolFmtId() );
    2012           0 :         pDest->SetPoolHelpId( pSrc->GetPoolHelpId() );
    2013             : 
    2014             :         // Always set the HelpFile Id to dflt!
    2015           0 :         pDest->SetPoolHlpFileId( UCHAR_MAX );
    2016             : 
    2017           0 :         if( pSrc->DerivedFrom() )
    2018             :             pDest->SetDerivedFrom( FindFmtByName( rDestArr,
    2019           0 :                                         pSrc->DerivedFrom()->GetName() ) );
    2020           0 :         if( RES_TXTFMTCOLL == pSrc->Which() ||
    2021           0 :             RES_CONDTXTFMTCOLL == pSrc->Which() )
    2022             :         {
    2023           0 :             SwTxtFmtColl* pSrcColl = (SwTxtFmtColl*)pSrc,
    2024           0 :                         * pDstColl = (SwTxtFmtColl*)pDest;
    2025           0 :             if( &pSrcColl->GetNextTxtFmtColl() != pSrcColl )
    2026             :                 pDstColl->SetNextTxtFmtColl( *(SwTxtFmtColl*)FindFmtByName(
    2027           0 :                     rDestArr, pSrcColl->GetNextTxtFmtColl().GetName() ) );
    2028             : 
    2029           0 :             if(pSrcColl->IsAssignedToListLevelOfOutlineStyle())
    2030           0 :                 pDstColl->AssignToListLevelOfOutlineStyle(pSrcColl->GetAssignedOutlineStyleLevel());
    2031             : 
    2032             : //FEATURE::CONDCOLL
    2033           0 :             if( RES_CONDTXTFMTCOLL == pSrc->Which() )
    2034             :                 // Copy the conditions, but delete the old ones first!
    2035             :                 ((SwConditionTxtFmtColl*)pDstColl)->SetConditions(
    2036           0 :                             ((SwConditionTxtFmtColl*)pSrc)->GetCondColls() );
    2037             : //FEATURE::CONDCOLL
    2038             :         }
    2039             :     }
    2040           0 : }
    2041             : 
    2042           0 : void SwDoc::CopyPageDescHeaderFooterImpl( bool bCpyHeader,
    2043             :                                 const SwFrmFmt& rSrcFmt, SwFrmFmt& rDestFmt )
    2044             : {
    2045             :     // Treat the header and footer attributes in the right way:
    2046             :     // Copy content nodes across documents!
    2047           0 :     sal_uInt16 nAttr = static_cast<sal_uInt16>( bCpyHeader ? RES_HEADER : RES_FOOTER );
    2048             :     const SfxPoolItem* pItem;
    2049           0 :     if( SFX_ITEM_SET != rSrcFmt.GetAttrSet().GetItemState( nAttr, false, &pItem ))
    2050           0 :         return ;
    2051             : 
    2052             :     // The header only contains the reference to the format from the other document!
    2053           0 :     SfxPoolItem* pNewItem = pItem->Clone();
    2054             : 
    2055             :     SwFrmFmt* pOldFmt;
    2056           0 :     if( bCpyHeader )
    2057           0 :          pOldFmt = ((SwFmtHeader*)pNewItem)->GetHeaderFmt();
    2058             :     else
    2059           0 :          pOldFmt = ((SwFmtFooter*)pNewItem)->GetFooterFmt();
    2060             : 
    2061           0 :     if( pOldFmt )
    2062             :     {
    2063             :         SwFrmFmt* pNewFmt = new SwFrmFmt( GetAttrPool(), "CpyDesc",
    2064           0 :                                             GetDfltFrmFmt() );
    2065           0 :         pNewFmt->CopyAttrs( *pOldFmt, sal_True );
    2066             : 
    2067           0 :         if( SFX_ITEM_SET == pNewFmt->GetAttrSet().GetItemState(
    2068           0 :             RES_CNTNT, false, &pItem ))
    2069             :         {
    2070           0 :             SwFmtCntnt* pCntnt = (SwFmtCntnt*)pItem;
    2071           0 :             if( pCntnt->GetCntntIdx() )
    2072             :             {
    2073           0 :                 SwNodeIndex aTmpIdx( GetNodes().GetEndOfAutotext() );
    2074           0 :                 const SwNodes& rSrcNds = rSrcFmt.GetDoc()->GetNodes();
    2075           0 :                 SwStartNode* pSttNd = GetNodes().MakeEmptySection( aTmpIdx,
    2076             :                                                 bCpyHeader
    2077             :                                                     ? SwHeaderStartNode
    2078           0 :                                                     : SwFooterStartNode );
    2079           0 :                 const SwNode& rCSttNd = pCntnt->GetCntntIdx()->GetNode();
    2080           0 :                 SwNodeRange aRg( rCSttNd, 0, *rCSttNd.EndOfSectionNode() );
    2081           0 :                 aTmpIdx = *pSttNd->EndOfSectionNode();
    2082           0 :                 rSrcNds._Copy( aRg, aTmpIdx );
    2083           0 :                 aTmpIdx = *pSttNd;
    2084           0 :                 rSrcFmt.GetDoc()->CopyFlyInFlyImpl( aRg, 0, aTmpIdx );
    2085           0 :                 pNewFmt->SetFmtAttr( SwFmtCntnt( pSttNd ));
    2086             :             }
    2087             :             else
    2088           0 :                 pNewFmt->ResetFmtAttr( RES_CNTNT );
    2089             :         }
    2090           0 :         if( bCpyHeader )
    2091           0 :             ((SwFmtHeader*)pNewItem)->RegisterToFormat(*pNewFmt);
    2092             :         else
    2093           0 :             ((SwFmtFooter*)pNewItem)->RegisterToFormat(*pNewFmt);
    2094           0 :         rDestFmt.SetFmtAttr( *pNewItem );
    2095             :     }
    2096           0 :     delete pNewItem;
    2097             : }
    2098             : 
    2099           0 : void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc,
    2100             :                             bool bCopyPoolIds )
    2101             : {
    2102           0 :     bool bNotifyLayout = false;
    2103           0 :     SwRootFrm* pTmpRoot = GetCurrentLayout();
    2104             : 
    2105           0 :     rDstDesc.SetLandscape( rSrcDesc.GetLandscape() );
    2106           0 :     rDstDesc.SetNumType( rSrcDesc.GetNumType() );
    2107           0 :     if( rDstDesc.ReadUseOn() != rSrcDesc.ReadUseOn() )
    2108             :     {
    2109           0 :         rDstDesc.WriteUseOn( rSrcDesc.ReadUseOn() );
    2110           0 :         bNotifyLayout = true;
    2111             :     }
    2112             : 
    2113           0 :     if( bCopyPoolIds )
    2114             :     {
    2115           0 :         rDstDesc.SetPoolFmtId( rSrcDesc.GetPoolFmtId() );
    2116           0 :         rDstDesc.SetPoolHelpId( rSrcDesc.GetPoolHelpId() );
    2117             :         // Always set the HelpFile Id to dflt!
    2118           0 :         rDstDesc.SetPoolHlpFileId( UCHAR_MAX );
    2119             :     }
    2120             : 
    2121           0 :     if( rSrcDesc.GetFollow() != &rSrcDesc )
    2122             :     {
    2123             :         SwPageDesc* pFollow = ::lcl_FindPageDesc( maPageDescs,
    2124           0 :                                     rSrcDesc.GetFollow()->GetName() );
    2125           0 :         if( !pFollow )
    2126             :         {
    2127             :             // copy
    2128           0 :             sal_uInt16 nPos = MakePageDesc( rSrcDesc.GetFollow()->GetName() );
    2129           0 :             pFollow = maPageDescs[ nPos ];
    2130           0 :             CopyPageDesc( *rSrcDesc.GetFollow(), *pFollow );
    2131             :         }
    2132           0 :         rDstDesc.SetFollow( pFollow );
    2133           0 :         bNotifyLayout = true;
    2134             :     }
    2135             : 
    2136             :     // the header and footer attributes are copied separately
    2137             :     // the content sections have to be copied in their entirety
    2138             :     {
    2139           0 :         SfxItemSet aAttrSet( rSrcDesc.GetMaster().GetAttrSet() );
    2140           0 :         aAttrSet.ClearItem( RES_HEADER );
    2141           0 :         aAttrSet.ClearItem( RES_FOOTER );
    2142             : 
    2143           0 :         rDstDesc.GetMaster().DelDiffs( aAttrSet );
    2144           0 :         rDstDesc.GetMaster().SetFmtAttr( aAttrSet );
    2145             : 
    2146           0 :         aAttrSet.ClearItem();
    2147           0 :         aAttrSet.Put( rSrcDesc.GetLeft().GetAttrSet() );
    2148           0 :         aAttrSet.ClearItem( RES_HEADER );
    2149           0 :         aAttrSet.ClearItem( RES_FOOTER );
    2150             : 
    2151           0 :         rDstDesc.GetLeft().DelDiffs( aAttrSet );
    2152           0 :         rDstDesc.GetLeft().SetFmtAttr( aAttrSet );
    2153             :     }
    2154             : 
    2155           0 :     CopyHeader( rSrcDesc.GetMaster(), rDstDesc.GetMaster() );
    2156           0 :     CopyFooter( rSrcDesc.GetMaster(), rDstDesc.GetMaster() );
    2157           0 :     if( !rDstDesc.IsHeaderShared() )
    2158           0 :         CopyHeader( rSrcDesc.GetLeft(), rDstDesc.GetLeft() );
    2159             :     else
    2160           0 :         rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetHeader() );
    2161           0 :     if( !rDstDesc.IsFirstShared() )
    2162             :     {
    2163           0 :         CopyHeader( rSrcDesc.GetFirstMaster(), rDstDesc.GetFirstMaster() );
    2164           0 :         rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetFirstMaster().GetHeader());
    2165             :     }
    2166             :     else
    2167             :     {
    2168           0 :         rDstDesc.GetFirstMaster().SetFmtAttr( rDstDesc.GetMaster().GetHeader() );
    2169           0 :         rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetLeft().GetHeader());
    2170             :     }
    2171             : 
    2172           0 :     if( !rDstDesc.IsFooterShared() )
    2173           0 :         CopyFooter( rSrcDesc.GetLeft(), rDstDesc.GetLeft() );
    2174             :     else
    2175           0 :         rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetFooter() );
    2176           0 :     if( !rDstDesc.IsFirstShared() )
    2177             :     {
    2178           0 :         CopyFooter( rSrcDesc.GetFirstMaster(), rDstDesc.GetFirstMaster() );
    2179           0 :         rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetFirstMaster().GetFooter());
    2180             :     }
    2181             :     else
    2182             :     {
    2183           0 :         rDstDesc.GetFirstMaster().SetFmtAttr( rDstDesc.GetMaster().GetFooter() );
    2184           0 :         rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetLeft().GetFooter());
    2185             :     }
    2186             : 
    2187           0 :     if( bNotifyLayout && pTmpRoot )
    2188             :     {
    2189           0 :         std::set<SwRootFrm*> aAllLayouts = GetAllLayouts();
    2190           0 :         std::for_each( aAllLayouts.begin(), aAllLayouts.end(),std::mem_fun(&SwRootFrm::AllCheckPageDescs));
    2191             :     }
    2192             : 
    2193             :     // If foot notes change the pages have to be triggered
    2194           0 :     if( !(rDstDesc.GetFtnInfo() == rSrcDesc.GetFtnInfo()) )
    2195             :     {
    2196           0 :         rDstDesc.SetFtnInfo( rSrcDesc.GetFtnInfo() );
    2197           0 :         SwMsgPoolItem  aInfo( RES_PAGEDESC_FTNINFO );
    2198             :         {
    2199           0 :             rDstDesc.GetMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
    2200             :         }
    2201             :         {
    2202           0 :             rDstDesc.GetLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) );
    2203           0 :         }
    2204             :     }
    2205           0 : }
    2206             : 
    2207           0 : void SwDoc::ReplaceStyles( const SwDoc& rSource, bool bIncludePageStyles )
    2208             : {
    2209           0 :     ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo());
    2210             : 
    2211             :     CopyFmtArr( *rSource.mpCharFmtTbl, *mpCharFmtTbl,
    2212           0 :                 &SwDoc::_MakeCharFmt, *mpDfltCharFmt );
    2213             :     CopyFmtArr( *rSource.mpFrmFmtTbl, *mpFrmFmtTbl,
    2214           0 :                 &SwDoc::_MakeFrmFmt, *mpDfltFrmFmt );
    2215             :     CopyFmtArr( *rSource.mpTxtFmtCollTbl, *mpTxtFmtCollTbl,
    2216           0 :                 &SwDoc::_MakeTxtFmtColl, *mpDfltTxtFmtColl );
    2217             : 
    2218             :     sal_uInt16 nCnt;
    2219             : 
    2220             :     //To-Do:
    2221             :     //  a) in rtf export don't export our hideous pgdsctbl
    2222             :     //  extension to rtf anymore
    2223             :     //  b) in sd rtf import (View::InsertData) don't use
    2224             :     //  a super-fragile test for mere presence of \trowd to
    2225             :     //  indicate import of rtf into a table
    2226             :     //  c) then drop use of bIncludePageStyles
    2227           0 :     if (bIncludePageStyles)
    2228             :     {
    2229             :         // and now the page templates
    2230           0 :         nCnt = rSource.maPageDescs.size();
    2231           0 :         if( nCnt )
    2232             :         {
    2233             :             // a different Doc -> Number formatter needs to be merged
    2234           0 :             SwTblNumFmtMerge aTNFM( rSource, *this );
    2235             : 
    2236             :             // 1st step: Create all formats (skip the 0th - it's the default!)
    2237           0 :             while( nCnt )
    2238             :             {
    2239           0 :                 SwPageDesc *pSrc = rSource.maPageDescs[ --nCnt ];
    2240           0 :                 if( 0 == ::lcl_FindPageDesc( maPageDescs, pSrc->GetName() ) )
    2241           0 :                     MakePageDesc( pSrc->GetName() );
    2242             :             }
    2243             : 
    2244             :             // 2nd step: Copy all attributes, set the right parents
    2245           0 :             for( nCnt = rSource.maPageDescs.size(); nCnt; )
    2246             :             {
    2247           0 :                 SwPageDesc *pSrc = rSource.maPageDescs[ --nCnt ];
    2248           0 :                 CopyPageDesc( *pSrc, *::lcl_FindPageDesc( maPageDescs, pSrc->GetName() ));
    2249           0 :             }
    2250             :         }
    2251             :     }
    2252             : 
    2253             :     // then there are the numbering templates
    2254           0 :     nCnt = rSource.GetNumRuleTbl().size();
    2255           0 :     if( nCnt )
    2256             :     {
    2257           0 :         const SwNumRuleTbl& rArr = rSource.GetNumRuleTbl();
    2258           0 :         for( sal_uInt16 n = 0; n < nCnt; ++n )
    2259             :         {
    2260           0 :             const SwNumRule& rR = *rArr[ n ];
    2261           0 :             if( !rR.IsAutoRule() )
    2262             :             {
    2263           0 :                 SwNumRule* pNew = FindNumRulePtr( rR.GetName());
    2264           0 :                 if( pNew )
    2265           0 :                     pNew->CopyNumRule( this, rR );
    2266             :                 else
    2267           0 :                     MakeNumRule( rR.GetName(), &rR );
    2268             :             }
    2269             :         }
    2270             :     }
    2271             : 
    2272           0 :     if (undoGuard.UndoWasEnabled())
    2273             :     {
    2274             :         // nodes array was modified!
    2275           0 :         GetIDocumentUndoRedo().DelAllUndoObj();
    2276             :     }
    2277             : 
    2278           0 :     SetModified();
    2279           0 : }
    2280             : 
    2281           0 : SwFmt* SwDoc::FindFmtByName( const SwFmtsBase& rFmtArr,
    2282             :                              const OUString& rName ) const
    2283             : {
    2284           0 :     SwFmt* pFnd = 0;
    2285           0 :     for( sal_uInt16 n = 0; n < rFmtArr.GetFmtCount(); n++ )
    2286             :     {
    2287             :         // Does the Doc already contain the template?
    2288           0 :         if( rFmtArr.GetFmt(n)->GetName() == rName )
    2289             :         {
    2290           0 :             pFnd = (SwFmt*)rFmtArr.GetFmt(n);
    2291           0 :             break;
    2292             :         }
    2293             :     }
    2294           0 :     return pFnd;
    2295             : }
    2296             : 
    2297           0 : void SwDoc::MoveLeftMargin( const SwPaM& rPam, bool bRight, bool bModulus )
    2298             : {
    2299           0 :     SwHistory* pHistory = 0;
    2300           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    2301             :     {
    2302             :         SwUndoMoveLeftMargin* pUndo = new SwUndoMoveLeftMargin( rPam, bRight,
    2303           0 :                                                                 bModulus );
    2304           0 :         pHistory = &pUndo->GetHistory();
    2305           0 :         GetIDocumentUndoRedo().AppendUndo( pUndo );
    2306             :     }
    2307             : 
    2308           0 :     const SvxTabStopItem& rTabItem = (SvxTabStopItem&)GetDefault( RES_PARATR_TABSTOP );
    2309           0 :     sal_uInt16 nDefDist = rTabItem.Count() ?
    2310           0 :         static_cast<sal_uInt16>(rTabItem[0].GetTabPos()) : 1134;
    2311           0 :     const SwPosition &rStt = *rPam.Start(), &rEnd = *rPam.End();
    2312           0 :     SwNodeIndex aIdx( rStt.nNode );
    2313           0 :     while( aIdx <= rEnd.nNode )
    2314             :     {
    2315           0 :         SwTxtNode* pTNd = aIdx.GetNode().GetTxtNode();
    2316           0 :         if( pTNd )
    2317             :         {
    2318           0 :             SvxLRSpaceItem aLS( (SvxLRSpaceItem&)pTNd->SwCntntNode::GetAttr( RES_LR_SPACE ) );
    2319             : 
    2320             :             // #i93873# See also lcl_MergeListLevelIndentAsLRSpaceItem in thints.cxx
    2321           0 :             if ( pTNd->AreListLevelIndentsApplicable() )
    2322             :             {
    2323           0 :                 const SwNumRule* pRule = pTNd->GetNumRule();
    2324           0 :                 if ( pRule )
    2325             :                 {
    2326           0 :                     const int nListLevel = pTNd->GetActualListLevel();
    2327           0 :                     if ( nListLevel >= 0 )
    2328             :                     {
    2329           0 :                         const SwNumFmt& rFmt = pRule->Get(static_cast<sal_uInt16>(nListLevel));
    2330           0 :                         if ( rFmt.GetPositionAndSpaceMode() == SvxNumberFormat::LABEL_ALIGNMENT )
    2331             :                         {
    2332           0 :                             aLS.SetTxtLeft( rFmt.GetIndentAt() );
    2333           0 :                             aLS.SetTxtFirstLineOfst( static_cast<short>(rFmt.GetFirstLineIndent()) );
    2334             :                         }
    2335             :                     }
    2336             :                 }
    2337             :             }
    2338             : 
    2339           0 :             long nNext = aLS.GetTxtLeft();
    2340           0 :             if( bModulus )
    2341           0 :                 nNext = ( nNext / nDefDist ) * nDefDist;
    2342             : 
    2343           0 :             if( bRight )
    2344           0 :                 nNext += nDefDist;
    2345             :             else
    2346           0 :                 if(nNext >0) // fdo#75936 set limit for decreasing indent
    2347           0 :                     nNext -= nDefDist;
    2348             : 
    2349           0 :             aLS.SetTxtLeft( nNext );
    2350             : 
    2351           0 :             SwRegHistory aRegH( pTNd, *pTNd, pHistory );
    2352           0 :             pTNd->SetAttr( aLS );
    2353             :         }
    2354           0 :         ++aIdx;
    2355             :     }
    2356           0 :     SetModified();
    2357           0 : }
    2358             : 
    2359           0 : bool SwDoc::DontExpandFmt( const SwPosition& rPos, bool bFlag )
    2360             : {
    2361           0 :     bool bRet = false;
    2362           0 :     SwTxtNode* pTxtNd = rPos.nNode.GetNode().GetTxtNode();
    2363           0 :     if( pTxtNd )
    2364             :     {
    2365           0 :         bRet = pTxtNd->DontExpandFmt( rPos.nContent, bFlag );
    2366           0 :         if( bRet && GetIDocumentUndoRedo().DoesUndo() )
    2367             :         {
    2368           0 :             GetIDocumentUndoRedo().AppendUndo( new SwUndoDontExpandFmt(rPos) );
    2369             :         }
    2370             :     }
    2371           0 :     return bRet;
    2372             : }
    2373             : 
    2374           0 : SwTableBoxFmt* SwDoc::MakeTableBoxFmt()
    2375             : {
    2376             :     SwTableBoxFmt* pFmt = new SwTableBoxFmt( GetAttrPool(), aEmptyOUStr,
    2377           0 :                                                 mpDfltFrmFmt );
    2378           0 :     SetModified();
    2379           0 :     return pFmt;
    2380             : }
    2381             : 
    2382           0 : SwTableLineFmt* SwDoc::MakeTableLineFmt()
    2383             : {
    2384             :     SwTableLineFmt* pFmt = new SwTableLineFmt( GetAttrPool(), aEmptyOUStr,
    2385           0 :                                                 mpDfltFrmFmt );
    2386           0 :     SetModified();
    2387           0 :     return pFmt;
    2388             : }
    2389             : 
    2390           0 : void SwDoc::_CreateNumberFormatter()
    2391             : {
    2392             :     OSL_ENSURE( !mpNumberFormatter, "is already there" );
    2393             : 
    2394           0 :     LanguageType eLang = LANGUAGE_SYSTEM;
    2395             : 
    2396           0 :     mpNumberFormatter = new SvNumberFormatter( comphelper::getProcessComponentContext(), eLang );
    2397           0 :     mpNumberFormatter->SetEvalDateFormat( NF_EVALDATEFORMAT_FORMAT_INTL );
    2398           0 :     mpNumberFormatter->SetYear2000(static_cast<sal_uInt16>(::utl::MiscCfg().GetYear2000()));
    2399           0 : }
    2400             : 
    2401           0 : SwTblNumFmtMerge::SwTblNumFmtMerge( const SwDoc& rSrc, SwDoc& rDest )
    2402           0 :     : pNFmt( 0 )
    2403             : {
    2404             :     // a different Doc -> Number formatter needs to be merged
    2405             :     SvNumberFormatter* pN;
    2406           0 :     if( &rSrc != &rDest && 0 != ( pN = ((SwDoc&)rSrc).GetNumberFormatter( sal_False ) ))
    2407           0 :         ( pNFmt = rDest.GetNumberFormatter( sal_True ))->MergeFormatter( *pN );
    2408             : 
    2409           0 :     if( &rSrc != &rDest )
    2410           0 :         ((SwGetRefFieldType*)rSrc.GetSysFldType( RES_GETREFFLD ))->
    2411           0 :             MergeWithOtherDoc( rDest );
    2412           0 : }
    2413             : 
    2414           0 : SwTblNumFmtMerge::~SwTblNumFmtMerge()
    2415             : {
    2416           0 :     if( pNFmt )
    2417           0 :         pNFmt->ClearMergeTable();
    2418           0 : }
    2419             : 
    2420           0 : void SwDoc::SetTxtFmtCollByAutoFmt( const SwPosition& rPos, sal_uInt16 nPoolId,
    2421             :                                     const SfxItemSet* pSet )
    2422             : {
    2423           0 :     SwPaM aPam( rPos );
    2424           0 :     SwTxtNode* pTNd = rPos.nNode.GetNode().GetTxtNode();
    2425             :     assert(pTNd);
    2426             : 
    2427           0 :     if (mbIsAutoFmtRedline)
    2428             :     {
    2429             :         // create the redline object
    2430           0 :         const SwTxtFmtColl& rColl = *pTNd->GetTxtColl();
    2431           0 :         SwRangeRedline* pRedl = new SwRangeRedline( nsRedlineType_t::REDLINE_FMTCOLL, aPam );
    2432           0 :         pRedl->SetMark();
    2433             : 
    2434             :         // Only those items that are not set by the Set again in the Node
    2435             :         // are of interest. Thus, we take the difference.
    2436             :         SwRedlineExtraData_FmtColl aExtraData( rColl.GetName(),
    2437           0 :                                                 rColl.GetPoolFmtId() );
    2438           0 :         if( pSet && pTNd->HasSwAttrSet() )
    2439             :         {
    2440           0 :             SfxItemSet aTmp( *pTNd->GetpSwAttrSet() );
    2441           0 :             aTmp.Differentiate( *pSet );
    2442             :             // we handle the adjust item separately
    2443             :             const SfxPoolItem* pItem;
    2444           0 :             if( SFX_ITEM_SET == pTNd->GetpSwAttrSet()->GetItemState(
    2445           0 :                     RES_PARATR_ADJUST, false, &pItem ))
    2446           0 :                 aTmp.Put( *pItem );
    2447           0 :             aExtraData.SetItemSet( aTmp );
    2448             :         }
    2449           0 :         pRedl->SetExtraData( &aExtraData );
    2450             : 
    2451             :         //TODO: Undo is still missing!
    2452           0 :         AppendRedline( pRedl, true );
    2453             :     }
    2454             : 
    2455           0 :     SetTxtFmtColl( aPam, GetTxtCollFromPool( nPoolId ) );
    2456             : 
    2457           0 :     if (pSet && pSet->Count())
    2458             :     {
    2459           0 :         aPam.SetMark();
    2460           0 :         aPam.GetMark()->nContent.Assign(pTNd, pTNd->GetTxt().getLength());
    2461           0 :         InsertItemSet( aPam, *pSet, 0 );
    2462           0 :     }
    2463           0 : }
    2464             : 
    2465           0 : void SwDoc::SetFmtItemByAutoFmt( const SwPaM& rPam, const SfxItemSet& rSet )
    2466             : {
    2467           0 :     SwTxtNode* pTNd = rPam.GetPoint()->nNode.GetNode().GetTxtNode();
    2468             :     assert(pTNd);
    2469             : 
    2470           0 :     RedlineMode_t eOld = GetRedlineMode();
    2471             : 
    2472           0 :     if (mbIsAutoFmtRedline)
    2473             :     {
    2474             :         // create the redline object
    2475           0 :         SwRangeRedline* pRedl = new SwRangeRedline( nsRedlineType_t::REDLINE_FORMAT, rPam );
    2476           0 :         if( !pRedl->HasMark() )
    2477           0 :             pRedl->SetMark();
    2478             : 
    2479             :         // Only those items that are not set by the Set again in the Node
    2480             :         // are of interest. Thus, we take the difference.
    2481           0 :         SwRedlineExtraData_Format aExtraData( rSet );
    2482             : 
    2483           0 :         pRedl->SetExtraData( &aExtraData );
    2484             : 
    2485             :         //TODO: Undo is still missing!
    2486           0 :         AppendRedline( pRedl, true );
    2487             : 
    2488           0 :         SetRedlineMode_intern( (RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE));
    2489             :     }
    2490             : 
    2491           0 :     const sal_Int32 nEnd(rPam.End()->nContent.GetIndex());
    2492           0 :     std::vector<sal_uInt16> whichIds;
    2493           0 :     SfxItemIter iter(rSet);
    2494           0 :     for (SfxPoolItem const* pItem = iter.FirstItem();
    2495             :             pItem; pItem = iter.NextItem())
    2496             :     {
    2497           0 :         whichIds.push_back(pItem->Which());
    2498           0 :         whichIds.push_back(pItem->Which());
    2499             :     }
    2500           0 :     whichIds.push_back(0);
    2501           0 :     SfxItemSet currentSet(GetAttrPool(), &whichIds[0]);
    2502           0 :     pTNd->GetAttr(currentSet, nEnd, nEnd, false, true, false);
    2503           0 :     for (size_t i = 0; whichIds[i]; i += 2)
    2504             :     {   // yuk - want to explicitly set the pool defaults too :-/
    2505           0 :         currentSet.Put(currentSet.Get(whichIds[i], true));
    2506             :     }
    2507             : 
    2508           0 :     InsertItemSet( rPam, rSet, nsSetAttrMode::SETATTR_DONTEXPAND );
    2509             : 
    2510             :     // fdo#62536: DONTEXPAND does not work when there is already an AUTOFMT
    2511             :     // here, so insert the old attributes as an empty hint to stop expand
    2512           0 :     SwPaM endPam(*pTNd, nEnd);
    2513           0 :     endPam.SetMark();
    2514           0 :     InsertItemSet(endPam, currentSet, nsSetAttrMode::SETATTR_DEFAULT);
    2515             : 
    2516           0 :     SetRedlineMode_intern( eOld );
    2517           0 : }
    2518             : 
    2519           0 : void SwDoc::ChgFmt(SwFmt & rFmt, const SfxItemSet & rSet)
    2520             : {
    2521           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    2522             :     {
    2523             :         // copying <rSet> to <aSet>
    2524           0 :         SfxItemSet aSet(rSet);
    2525             :         // remove from <aSet> all items, which are already set at the format
    2526           0 :         aSet.Differentiate(rFmt.GetAttrSet());
    2527             :         // <aSet> contains now all *new* items for the format
    2528             : 
    2529             :         // copying current format item set to <aOldSet>
    2530           0 :         SfxItemSet aOldSet(rFmt.GetAttrSet());
    2531             :         // insert new items into <aOldSet>
    2532           0 :         aOldSet.Put(aSet);
    2533             :         // invalidate all new items in <aOldSet> in order to clear these items,
    2534             :         // if the undo action is triggered.
    2535             :         {
    2536           0 :             SfxItemIter aIter(aSet);
    2537             : 
    2538           0 :             const SfxPoolItem * pItem = aIter.FirstItem();
    2539           0 :             while (pItem != NULL)
    2540             :             {
    2541           0 :                 aOldSet.InvalidateItem(pItem->Which());
    2542             : 
    2543           0 :                 pItem = aIter.NextItem();
    2544           0 :             }
    2545             :         }
    2546             : 
    2547           0 :         SwUndo * pUndo = new SwUndoFmtAttr(aOldSet, rFmt);
    2548             : 
    2549           0 :         GetIDocumentUndoRedo().AppendUndo(pUndo);
    2550             :     }
    2551             : 
    2552           0 :     rFmt.SetFmtAttr(rSet);
    2553           0 : }
    2554             : 
    2555           0 : void SwDoc::RenameFmt(SwFmt & rFmt, const OUString & sNewName,
    2556             :                       bool bBroadcast)
    2557             : {
    2558           0 :     SfxStyleFamily eFamily = SFX_STYLE_FAMILY_ALL;
    2559             : 
    2560           0 :     if (GetIDocumentUndoRedo().DoesUndo())
    2561             :     {
    2562           0 :         SwUndo * pUndo = NULL;
    2563             : 
    2564           0 :         switch (rFmt.Which())
    2565             :         {
    2566             :         case RES_CHRFMT:
    2567           0 :             pUndo = new SwUndoRenameCharFmt(rFmt.GetName(), sNewName, this);
    2568           0 :             eFamily = SFX_STYLE_FAMILY_PARA;
    2569           0 :             break;
    2570             :         case RES_TXTFMTCOLL:
    2571           0 :             pUndo = new SwUndoRenameFmtColl(rFmt.GetName(), sNewName, this);
    2572           0 :             eFamily = SFX_STYLE_FAMILY_CHAR;
    2573           0 :             break;
    2574             :         case RES_FRMFMT:
    2575           0 :             pUndo = new SwUndoRenameFrmFmt(rFmt.GetName(), sNewName, this);
    2576           0 :             eFamily = SFX_STYLE_FAMILY_FRAME;
    2577           0 :             break;
    2578             : 
    2579             :         default:
    2580           0 :             break;
    2581             :         }
    2582             : 
    2583           0 :         if (pUndo)
    2584             :         {
    2585           0 :             GetIDocumentUndoRedo().AppendUndo(pUndo);
    2586             :         }
    2587             :     }
    2588             : 
    2589           0 :     rFmt.SetName(sNewName);
    2590             : 
    2591           0 :     if (bBroadcast)
    2592           0 :         BroadcastStyleOperation(sNewName, eFamily, SFX_STYLESHEET_MODIFIED);
    2593           0 : }
    2594             : 
    2595             : // #i69627#
    2596             : namespace docfunc
    2597             : {
    2598           0 :     bool HasOutlineStyleToBeWrittenAsNormalListStyle( SwDoc& rDoc )
    2599             :     {
    2600             :         // If a parent paragraph style of one of the parargraph styles, which
    2601             :         // are assigned to the list levels of the outline style, has a list style
    2602             :         // set or inherits a list style from its parent style, the outline style
    2603             :         // has to be written as a normal list style to the OpenDocument file
    2604             :         // format or the OpenOffice.org file format.
    2605           0 :         bool bRet( false );
    2606             : 
    2607           0 :         const SwTxtFmtColls* pTxtFmtColls( rDoc.GetTxtFmtColls() );
    2608           0 :         if ( pTxtFmtColls )
    2609             :         {
    2610           0 :             const sal_uInt16 nCount = pTxtFmtColls->size();
    2611           0 :             for ( sal_uInt16 i = 0; i < nCount; ++i )
    2612             :             {
    2613           0 :                 SwTxtFmtColl* pTxtFmtColl = (*pTxtFmtColls)[i];
    2614             : 
    2615           0 :                 if ( pTxtFmtColl->IsDefault() ||
    2616           0 :                     ! pTxtFmtColl->IsAssignedToListLevelOfOutlineStyle() )
    2617             :                 {
    2618           0 :                     continue;
    2619             :                 }
    2620             : 
    2621             :                 const SwTxtFmtColl* pParentTxtFmtColl =
    2622           0 :                    dynamic_cast<const SwTxtFmtColl*>( pTxtFmtColl->DerivedFrom());
    2623           0 :                 if ( !pParentTxtFmtColl )
    2624           0 :                     continue;
    2625             : 
    2626           0 :                 if ( SFX_ITEM_SET == pParentTxtFmtColl->GetItemState( RES_PARATR_NUMRULE ) )
    2627             :                 {
    2628             :                     // #i106218# consider that the outline style is set
    2629           0 :                     const SwNumRuleItem& rDirectItem = pParentTxtFmtColl->GetNumRule();
    2630           0 :                     if ( rDirectItem.GetValue() != rDoc.GetOutlineNumRule()->GetName() )
    2631             :                     {
    2632           0 :                         bRet = true;
    2633           0 :                         break;
    2634             :                     }
    2635             :                 }
    2636             :             }
    2637             : 
    2638             :         }
    2639           0 :         return bRet;
    2640             :     }
    2641             : }
    2642             : 
    2643           0 : SwFmtsBase::~SwFmtsBase() {}
    2644             : 
    2645           0 : sal_uInt16 SwFrmFmts::GetPos(const SwFrmFmt* p) const
    2646             : {
    2647           0 :     const_iterator it = std::find(begin(), end(), p);
    2648           0 :     return it == end() ? USHRT_MAX : it - begin();
    2649             : }
    2650             : 
    2651           0 : bool SwFrmFmts::Contains(const SwFrmFmt* p) const
    2652             : {
    2653           0 :     return std::find(begin(), end(), p) != end();
    2654             : }
    2655             : 
    2656           0 : SwFrmFmts::~SwFrmFmts()
    2657             : {
    2658           0 :     for(const_iterator it = begin(); it != end(); ++it)
    2659           0 :         delete *it;
    2660           0 : }
    2661             : 
    2662           0 : sal_uInt16 SwCharFmts::GetPos(const SwCharFmt* p) const
    2663             : {
    2664           0 :     const_iterator it = std::find(begin(), end(), p);
    2665           0 :     return it == end() ? USHRT_MAX : it - begin();
    2666             : }
    2667             : 
    2668           0 : bool SwCharFmts::Contains(const SwCharFmt* p) const
    2669             : {
    2670           0 :     return std::find(begin(), end(), p) != end();
    2671             : }
    2672             : 
    2673           0 : SwCharFmts::~SwCharFmts()
    2674             : {
    2675           0 :     for(const_iterator it = begin(); it != end(); ++it)
    2676           0 :         delete *it;
    2677           0 : }
    2678             : 
    2679             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10