LCOV - code coverage report
Current view: top level - sw/source/core/undo - unattr.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 171 551 31.0 %
Date: 2015-06-13 12:38:46 Functions: 37 71 52.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <sal/config.h>
      21             : 
      22             : #include <utility>
      23             : 
      24             : #include <UndoAttribute.hxx>
      25             : #include <svl/itemiter.hxx>
      26             : #include <editeng/tstpitem.hxx>
      27             : #include <svx/svdmodel.hxx>
      28             : #include <svx/svdpage.hxx>
      29             : #include <drawdoc.hxx>
      30             : #include <hintids.hxx>
      31             : #include <fmtflcnt.hxx>
      32             : #include <txtftn.hxx>
      33             : #include <fmtornt.hxx>
      34             : #include <fmtanchr.hxx>
      35             : #include <fmtfsize.hxx>
      36             : #include <frmfmt.hxx>
      37             : #include <fmtcntnt.hxx>
      38             : #include <ftnidx.hxx>
      39             : #include <doc.hxx>
      40             : #include <IDocumentUndoRedo.hxx>
      41             : #include <IDocumentDrawModelAccess.hxx>
      42             : #include <IDocumentLayoutAccess.hxx>
      43             : #include <IDocumentRedlineAccess.hxx>
      44             : #include <IShellCursorSupplier.hxx>
      45             : #include <docary.hxx>
      46             : #include <swundo.hxx>
      47             : #include <pam.hxx>
      48             : #include <ndtxt.hxx>
      49             : #include <swtable.hxx>
      50             : #include <swtblfmt.hxx>
      51             : #include <UndoCore.hxx>
      52             : #include <hints.hxx>
      53             : #include <rolbck.hxx>
      54             : #include <ndnotxt.hxx>
      55             : #include <dcontact.hxx>
      56             : #include <ftninfo.hxx>
      57             : #include <redline.hxx>
      58             : #include <section.hxx>
      59             : #include <charfmt.hxx>
      60             : #include <calbck.hxx>
      61             : 
      62          76 : SwUndoFormatAttrHelper::SwUndoFormatAttrHelper( SwFormat& rFormat, bool bSvDrwPt )
      63             :     : SwClient( &rFormat )
      64          76 :     , m_bSaveDrawPt( bSvDrwPt )
      65             : {
      66          76 : }
      67             : 
      68          76 : void SwUndoFormatAttrHelper::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
      69             : {
      70          76 :     if( pOld ) {
      71          76 :         if ( pOld->Which() == RES_OBJECTDYING ) {
      72           0 :             CheckRegistration( pOld, pNew );
      73          76 :         } else if ( pNew ) {
      74          76 :             if( POOLATTR_END >= pOld->Which() ) {
      75           0 :                 if ( GetUndo() ) {
      76           0 :                     m_pUndo->PutAttr( *pOld );
      77             :                 } else {
      78             :                     m_pUndo.reset( new SwUndoFormatAttr( *pOld,
      79           0 :                                                       *static_cast<SwFormat*>(GetRegisteredInNonConst()), m_bSaveDrawPt ) );
      80             :                 }
      81          76 :             } else if ( RES_ATTRSET_CHG == pOld->Which() ) {
      82          76 :                 if ( GetUndo() ) {
      83             :                     SfxItemIter aIter(
      84           5 :                         *(static_cast<const SwAttrSetChg*>(pOld))->GetChgSet() );
      85           5 :                     const SfxPoolItem* pItem = aIter.GetCurItem();
      86          14 :                     while ( pItem ) {
      87           9 :                         m_pUndo->PutAttr( *pItem );
      88           9 :                         if( aIter.IsAtEnd() )
      89           5 :                             break;
      90           4 :                         pItem = aIter.NextItem();
      91           5 :                     }
      92             :                 } else {
      93             :                     m_pUndo.reset( new SwUndoFormatAttr(
      94          71 :                                        *static_cast<const SwAttrSetChg*>(pOld)->GetChgSet(),
      95          71 :                                        *static_cast<SwFormat*>(GetRegisteredInNonConst()), m_bSaveDrawPt ) );
      96             :                 }
      97             :             }
      98             :         }
      99             :     }
     100          76 : }
     101             : 
     102        1865 : SwUndoFormatAttr::SwUndoFormatAttr( const SfxItemSet& rOldSet,
     103             :                               SwFormat& rChgFormat,
     104             :                               bool bSaveDrawPt )
     105             :     : SwUndo( UNDO_INSFMTATTR )
     106             :     , m_pFormat( &rChgFormat )
     107             :     // #i56253#
     108        1865 :     , m_pOldSet( new SfxItemSet( rOldSet ) )
     109             :     , m_nNodeIndex( 0 )
     110        1865 :     , m_nFormatWhich( rChgFormat.Which() )
     111        5595 :     , m_bSaveDrawPt( bSaveDrawPt )
     112             : {
     113        1865 :     Init();
     114        1865 : }
     115             : 
     116           0 : SwUndoFormatAttr::SwUndoFormatAttr( const SfxPoolItem& rItem, SwFormat& rChgFormat,
     117             :                               bool bSaveDrawPt )
     118             :     : SwUndo( UNDO_INSFMTATTR )
     119             :     , m_pFormat( &rChgFormat )
     120           0 :     , m_pOldSet( m_pFormat->GetAttrSet().Clone( false ) )
     121             :     , m_nNodeIndex( 0 )
     122           0 :     , m_nFormatWhich( rChgFormat.Which() )
     123           0 :     , m_bSaveDrawPt( bSaveDrawPt )
     124             : {
     125           0 :     m_pOldSet->Put( rItem );
     126           0 :     Init();
     127           0 : }
     128             : 
     129        1865 : void SwUndoFormatAttr::Init()
     130             : {
     131             :     // treat change of anchor specially
     132        1865 :     if ( SfxItemState::SET == m_pOldSet->GetItemState( RES_ANCHOR, false )) {
     133           5 :         SaveFlyAnchor( m_bSaveDrawPt );
     134        1860 :     } else if ( RES_FRMFMT == m_nFormatWhich ) {
     135         114 :         SwDoc* pDoc = m_pFormat->GetDoc();
     136         114 :         if ( pDoc->GetTableFrameFormats()->Contains( m_pFormat )) {
     137             :             // Table Format: save table position, table formats are volatile!
     138          22 :             SwTable * pTable = SwIterator<SwTable,SwFormat>( *m_pFormat ).First();
     139          22 :             if ( pTable ) {
     140          22 :                 m_nNodeIndex = pTable->GetTabSortBoxes()[ 0 ]->GetSttNd()
     141          22 :                                ->FindTableNode()->GetIndex();
     142             :             }
     143          92 :         } else if ( pDoc->GetSections().Contains( m_pFormat )) {
     144           0 :             m_nNodeIndex = m_pFormat->GetContent().GetContentIdx()->GetIndex();
     145          92 :         } else if ( 0 != dynamic_cast< SwTableBoxFormat* >( m_pFormat ) ) {
     146           2 :             SwTableBox * pTableBox = SwIterator<SwTableBox,SwFormat>( *m_pFormat ).First();
     147           2 :             if ( pTableBox ) {
     148           2 :                 m_nNodeIndex = pTableBox->GetSttIdx();
     149             :             }
     150             :         }
     151             :     }
     152        1865 : }
     153             : 
     154        3730 : SwUndoFormatAttr::~SwUndoFormatAttr()
     155             : {
     156        3730 : }
     157             : 
     158           2 : void SwUndoFormatAttr::UndoImpl(::sw::UndoRedoContext & rContext)
     159             : {
     160             :     // OD 2004-10-26 #i35443#
     161             :     // Important note: <Undo(..)> also called by <ReDo(..)>
     162             : 
     163           2 :     if ( !m_pOldSet.get() || !m_pFormat || !IsFormatInDoc( &rContext.GetDoc() ))
     164           2 :         return;
     165             : 
     166             :     // #i35443# - If anchor attribute has been successful
     167             :     // restored, all other attributes are also restored.
     168             :     // Thus, keep track of its restoration
     169           2 :     bool bAnchorAttrRestored( false );
     170           2 :     if ( SfxItemState::SET == m_pOldSet->GetItemState( RES_ANCHOR, false )) {
     171           0 :         bAnchorAttrRestored = RestoreFlyAnchor(rContext);
     172           0 :         if ( bAnchorAttrRestored ) {
     173             :             // Anchor attribute successful restored.
     174             :             // Thus, keep anchor position for redo
     175           0 :             SaveFlyAnchor();
     176             :         } else {
     177             :             // Anchor attribute not restored due to invalid anchor position.
     178             :             // Thus, delete anchor attribute.
     179           0 :             m_pOldSet->ClearItem( RES_ANCHOR );
     180             :         }
     181             :     }
     182             : 
     183           2 :     if ( !bAnchorAttrRestored ) {
     184           2 :         SwUndoFormatAttrHelper aTmp( *m_pFormat, m_bSaveDrawPt );
     185           2 :         m_pFormat->SetFormatAttr( *m_pOldSet );
     186           2 :         if ( aTmp.GetUndo() ) {
     187             :             // transfer ownership of helper object's old set
     188           2 :             m_pOldSet = std::move(aTmp.GetUndo()->m_pOldSet);
     189             :         } else {
     190           0 :             m_pOldSet->ClearItem();
     191             :         }
     192             : 
     193           2 :         if ( RES_FLYFRMFMT == m_nFormatWhich || RES_DRAWFRMFMT == m_nFormatWhich ) {
     194           0 :             rContext.SetSelections(static_cast<SwFrameFormat*>(m_pFormat), 0);
     195           2 :         }
     196             :     }
     197             : }
     198             : 
     199           2 : bool SwUndoFormatAttr::IsFormatInDoc( SwDoc* pDoc )
     200             : {
     201             :     // search for the Format in the Document; if it does not exist any more,
     202             :     // the attribute is not restored!
     203           2 :     bool bFound = false;
     204           2 :     switch ( m_nFormatWhich )
     205             :     {
     206             :         case RES_TXTFMTCOLL:
     207           0 :             bFound = pDoc->GetTextFormatColls()->Contains( m_pFormat );
     208           0 :             break;
     209             : 
     210             :         case RES_GRFFMTCOLL:
     211           0 :             bFound = pDoc->GetGrfFormatColls()->Contains(
     212           0 :                     static_cast<const SwGrfFormatColl*>(m_pFormat) );
     213           0 :             break;
     214             : 
     215             :         case RES_CHRFMT:
     216           0 :             bFound = pDoc->GetCharFormats()->Contains( m_pFormat );
     217           0 :             break;
     218             : 
     219             :         case RES_FRMFMT:
     220           2 :             if ( m_nNodeIndex && (m_nNodeIndex < pDoc->GetNodes().Count()) )
     221             :             {
     222           2 :                 SwNode* pNd = pDoc->GetNodes()[ m_nNodeIndex ];
     223           2 :                 if ( pNd->IsTableNode() )
     224             :                 {
     225             :                     m_pFormat =
     226           1 :                         static_cast<SwTableNode*>(pNd)->GetTable().GetFrameFormat();
     227           1 :                     bFound = true;
     228           1 :                     break;
     229             :                 }
     230           1 :                 else if ( pNd->IsSectionNode() )
     231             :                 {
     232             :                     m_pFormat =
     233           0 :                         static_cast<SwSectionNode*>(pNd)->GetSection().GetFormat();
     234           0 :                     bFound = true;
     235           0 :                     break;
     236             :                 }
     237           2 :                 else if ( pNd->IsStartNode() && (SwTableBoxStartNode ==
     238           1 :                     static_cast< SwStartNode* >(pNd)->GetStartNodeType()) )
     239             :                 {
     240           1 :                     SwTableNode* pTableNode = pNd->FindTableNode();
     241           1 :                     if ( pTableNode )
     242             :                     {
     243             :                         SwTableBox* pBox =
     244           1 :                             pTableNode->GetTable().GetTableBox( m_nNodeIndex );
     245           1 :                         if ( pBox )
     246             :                         {
     247           1 :                             m_pFormat = pBox->GetFrameFormat();
     248           1 :                             bFound = true;
     249           1 :                             break;
     250             :                         }
     251             :                     }
     252             :                 }
     253             :             }
     254             :             // no break!
     255             :         case RES_DRAWFRMFMT:
     256             :         case RES_FLYFRMFMT:
     257           0 :             bFound = pDoc->GetSpzFrameFormats()->Contains( m_pFormat );
     258           0 :             if ( !bFound )
     259             :             {
     260           0 :                 bFound = pDoc->GetFrameFormats()->Contains( m_pFormat );
     261             :             }
     262           0 :             break;
     263             :     }
     264             : 
     265           2 :     if ( !bFound )
     266             :     {
     267             :         // Format does not exist; reset
     268           0 :         m_pFormat = 0;
     269             :     }
     270             : 
     271           2 :     return 0 != m_pFormat;
     272             : }
     273             : 
     274             : // Check if it is still in Doc
     275           0 : SwFormat* SwUndoFormatAttr::GetFormat( SwDoc& rDoc )
     276             : {
     277           0 :     return m_pFormat && IsFormatInDoc( &rDoc ) ? m_pFormat : 0;
     278             : }
     279             : 
     280           0 : void SwUndoFormatAttr::RedoImpl(::sw::UndoRedoContext & rContext)
     281             : {
     282             :     // #i35443# - Because the undo stores the attributes for
     283             :     // redo, the same code as for <Undo(..)> can be applied for <Redo(..)>
     284           0 :     UndoImpl(rContext);
     285           0 : }
     286             : 
     287           0 : void SwUndoFormatAttr::RepeatImpl(::sw::RepeatContext & rContext)
     288             : {
     289           0 :     if ( !m_pOldSet.get() )
     290           0 :         return;
     291             : 
     292           0 :     SwDoc & rDoc(rContext.GetDoc());
     293             : 
     294           0 :     switch ( m_nFormatWhich ) {
     295             :     case RES_GRFFMTCOLL: {
     296             :         SwNoTextNode *const pNd =
     297           0 :             rContext.GetRepeatPaM().GetNode().GetNoTextNode();
     298           0 :         if( pNd ) {
     299           0 :             rDoc.SetAttr( m_pFormat->GetAttrSet(), *pNd->GetFormatColl() );
     300             :         }
     301             :     }
     302           0 :     break;
     303             : 
     304             :     case RES_TXTFMTCOLL: {
     305             :         SwTextNode *const pNd =
     306           0 :             rContext.GetRepeatPaM().GetNode().GetTextNode();
     307           0 :         if( pNd ) {
     308           0 :             rDoc.SetAttr( m_pFormat->GetAttrSet(), *pNd->GetFormatColl() );
     309             :         }
     310             :     }
     311           0 :     break;
     312             : 
     313             :     case RES_FLYFRMFMT: {
     314             :         // Check if the cursor is in a flying frame
     315             :         // Steps: search in all FlyFrmFormats for the FlyContent attribute
     316             :         // and validate if the cursor is in the respective section
     317             :         SwFrameFormat *const pFly =
     318           0 :             rContext.GetRepeatPaM().GetNode().GetFlyFormat();
     319           0 :         if( pFly ) {
     320             :             // Bug 43672: do not set all attributes!
     321           0 :             if (SfxItemState::SET ==
     322           0 :                 m_pFormat->GetAttrSet().GetItemState( RES_CNTNT )) {
     323           0 :                 SfxItemSet aTmpSet( m_pFormat->GetAttrSet() );
     324           0 :                 aTmpSet.ClearItem( RES_CNTNT );
     325           0 :                 if( aTmpSet.Count() ) {
     326           0 :                     rDoc.SetAttr( aTmpSet, *pFly );
     327           0 :                 }
     328             :             } else {
     329           0 :                 rDoc.SetAttr( m_pFormat->GetAttrSet(), *pFly );
     330             :             }
     331             :         }
     332           0 :         break;
     333             :     }
     334             :     }
     335             : }
     336             : 
     337        1863 : SwRewriter SwUndoFormatAttr::GetRewriter() const
     338             : {
     339        1863 :     SwRewriter aRewriter;
     340             : 
     341        1863 :     if (m_pFormat) {
     342        1863 :         aRewriter.AddRule(UndoArg1, m_pFormat->GetName());
     343             :     }
     344             : 
     345        1863 :     return aRewriter;
     346             : }
     347             : 
     348           9 : void SwUndoFormatAttr::PutAttr( const SfxPoolItem& rItem )
     349             : {
     350           9 :     m_pOldSet->Put( rItem );
     351           9 :     if ( RES_ANCHOR == rItem.Which() ) {
     352           0 :         SaveFlyAnchor( m_bSaveDrawPt );
     353             :     }
     354           9 : }
     355             : 
     356           5 : void SwUndoFormatAttr::SaveFlyAnchor( bool bSvDrwPt )
     357             : {
     358             :     // Format is valid, otherwise you would not reach this point here
     359           5 :     if( bSvDrwPt ) {
     360           5 :         if ( RES_DRAWFRMFMT == m_pFormat->Which() ) {
     361           0 :             Point aPt( static_cast<SwFrameFormat*>(m_pFormat)->FindSdrObject()
     362           0 :                        ->GetRelativePos() );
     363             :             // store old value as attribute, to keep SwUndoFormatAttr small
     364           0 :             m_pOldSet->Put( SwFormatFrmSize( ATT_VAR_SIZE, aPt.X(), aPt.Y() ) );
     365             :         }
     366             :     }
     367             : 
     368             :     const SwFormatAnchor& rAnchor =
     369           5 :         static_cast<const SwFormatAnchor&>( m_pOldSet->Get( RES_ANCHOR, false ) );
     370           5 :     if( !rAnchor.GetContentAnchor() )
     371           0 :         return;
     372             : 
     373           5 :     sal_Int32 nContent = 0;
     374           5 :     switch( rAnchor.GetAnchorId() ) {
     375             :     case FLY_AS_CHAR:
     376             :     case FLY_AT_CHAR:
     377           5 :         nContent = rAnchor.GetContentAnchor()->nContent.GetIndex();
     378             :         // fallthrough
     379             :     case FLY_AT_PARA:
     380             :     case FLY_AT_FLY:
     381           5 :         m_nNodeIndex = rAnchor.GetContentAnchor()->nNode.GetIndex();
     382           5 :         break;
     383             :     default:
     384           0 :         return;
     385             :     }
     386             : 
     387           5 :     SwFormatAnchor aAnchor( rAnchor.GetAnchorId(), nContent );
     388           5 :     m_pOldSet->Put( aAnchor );
     389             : }
     390             : 
     391             : // #i35443# - Add return value, type <bool>.
     392             : // Return value indicates, if anchor attribute is restored.
     393             : // Note: If anchor attribute is restored, all other existing attributes
     394             : //       are also restored.
     395           0 : bool SwUndoFormatAttr::RestoreFlyAnchor(::sw::UndoRedoContext & rContext)
     396             : {
     397           0 :     SwDoc *const pDoc = & rContext.GetDoc();
     398           0 :     SwFlyFrameFormat* pFrameFormat = static_cast<SwFlyFrameFormat*>(m_pFormat);
     399             :     const SwFormatAnchor& rAnchor =
     400           0 :         static_cast<const SwFormatAnchor&>( m_pOldSet->Get( RES_ANCHOR, false ) );
     401             : 
     402           0 :     SwFormatAnchor aNewAnchor( rAnchor.GetAnchorId() );
     403           0 :     if (FLY_AT_PAGE != rAnchor.GetAnchorId()) {
     404           0 :         SwNode* pNd = pDoc->GetNodes()[ m_nNodeIndex  ];
     405             : 
     406           0 :         if (  (FLY_AT_FLY == rAnchor.GetAnchorId())
     407           0 :               ? ( !pNd->IsStartNode() || (SwFlyStartNode !=
     408           0 :                                           static_cast<SwStartNode*>(pNd)->GetStartNodeType()) )
     409           0 :               : !pNd->IsTextNode() ) {
     410             :             // #i35443# - invalid position.
     411             :             // Thus, anchor attribute not restored
     412           0 :             return false;
     413             :         }
     414             : 
     415           0 :         SwPosition aPos( *pNd );
     416           0 :         if ((FLY_AS_CHAR == rAnchor.GetAnchorId()) ||
     417           0 :             (FLY_AT_CHAR == rAnchor.GetAnchorId())) {
     418           0 :             aPos.nContent.Assign( static_cast<SwTextNode*>(pNd), rAnchor.GetPageNum() );
     419           0 :             if ( aPos.nContent.GetIndex() > pNd->GetTextNode()->GetText().getLength()) {
     420             :                 // #i35443# - invalid position.
     421             :                 // Thus, anchor attribute not restored
     422           0 :                 return false;
     423             :             }
     424             :         }
     425           0 :         aNewAnchor.SetAnchor( &aPos );
     426             :     } else
     427           0 :         aNewAnchor.SetPageNum( rAnchor.GetPageNum() );
     428             : 
     429           0 :     Point aDrawSavePt, aDrawOldPt;
     430           0 :     if( pDoc->getIDocumentLayoutAccess().GetCurrentViewShell() ) {
     431           0 :         if( RES_DRAWFRMFMT == pFrameFormat->Which() ) {
     432             :             // get the old cached value
     433             :             const SwFormatFrmSize& rOldSize = static_cast<const SwFormatFrmSize&>(
     434           0 :                                                m_pOldSet->Get( RES_FRM_SIZE ) );
     435           0 :             aDrawSavePt.X() = rOldSize.GetWidth();
     436           0 :             aDrawSavePt.Y() = rOldSize.GetHeight();
     437           0 :             m_pOldSet->ClearItem( RES_FRM_SIZE );
     438             : 
     439             :             // write the current value into cache
     440           0 :             aDrawOldPt = pFrameFormat->FindSdrObject()->GetRelativePos();
     441             :         } else {
     442           0 :             pFrameFormat->DelFrms();         // delete Frms
     443             :         }
     444             :     }
     445             : 
     446           0 :     const SwFormatAnchor &rOldAnch = pFrameFormat->GetAnchor();
     447             :     // #i54336#
     448             :     // Consider case, that as-character anchored object has moved its anchor position.
     449           0 :     if (FLY_AS_CHAR == rOldAnch.GetAnchorId()) {
     450             :         // With InContents it's tricky: the text attribute needs to be deleted.
     451             :         // Unfortunately, this not only destroys the Frms but also the format.
     452             :         // To prevent that, first detach the connection between attribute and
     453             :         // format.
     454           0 :         const SwPosition *pPos = rOldAnch.GetContentAnchor();
     455           0 :         SwTextNode *pTextNode = static_cast<SwTextNode*>(&pPos->nNode.GetNode());
     456             :         OSL_ENSURE( pTextNode->HasHints(), "Missing FlyInCnt-Hint." );
     457           0 :         const sal_Int32 nIdx = pPos->nContent.GetIndex();
     458             :         SwTextAttr * const pHint =
     459           0 :             pTextNode->GetTextAttrForCharAt( nIdx, RES_TXTATR_FLYCNT );
     460             :         OSL_ENSURE( pHint && pHint->Which() == RES_TXTATR_FLYCNT,
     461             :                     "Missing FlyInCnt-Hint." );
     462             :         OSL_ENSURE( pHint && pHint->GetFlyCnt().GetFrameFormat() == pFrameFormat,
     463             :                     "Wrong TextFlyCnt-Hint." );
     464           0 :         const_cast<SwFormatFlyCnt&>(pHint->GetFlyCnt()).SetFlyFormat();
     465             : 
     466             :         // Connection is now detached, therefore the attribute can be deleted
     467           0 :         pTextNode->DeleteAttributes( RES_TXTATR_FLYCNT, nIdx, nIdx );
     468             :     }
     469             : 
     470             :     {
     471           0 :         m_pOldSet->Put( aNewAnchor );
     472           0 :         SwUndoFormatAttrHelper aTmp( *m_pFormat, m_bSaveDrawPt );
     473           0 :         m_pFormat->SetFormatAttr( *m_pOldSet );
     474           0 :         if ( aTmp.GetUndo() ) {
     475           0 :             m_nNodeIndex = aTmp.GetUndo()->m_nNodeIndex;
     476             :             // transfer ownership of helper object's old set
     477           0 :             m_pOldSet = std::move(aTmp.GetUndo()->m_pOldSet);
     478             :         } else {
     479           0 :             m_pOldSet->ClearItem();
     480           0 :         }
     481             :     }
     482             : 
     483           0 :     if ( RES_DRAWFRMFMT == pFrameFormat->Which() ) {
     484             :         SwDrawContact *pCont =
     485           0 :             static_cast<SwDrawContact*>(pFrameFormat->FindContactObj());
     486             :         // The Draw model also prepared an Undo object for its right positioning
     487             :         // which unfortunately is relative. Therefore block here a position
     488             :         // change of the Contact object by setting the anchor.
     489           0 :         SdrObject* pObj = pCont->GetMaster();
     490             : 
     491           0 :         if( pCont->GetAnchorFrm() && !pObj->IsInserted() ) {
     492             :             OSL_ENSURE( pDoc->getIDocumentDrawModelAccess().GetDrawModel(),
     493             :                         "RestoreFlyAnchor without DrawModel" );
     494           0 :             pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage( 0 )->InsertObject( pObj );
     495             :         }
     496           0 :         pObj->SetRelativePos( aDrawSavePt );
     497             : 
     498             :         // cache the old value again
     499             :         m_pOldSet->Put(
     500           0 :             SwFormatFrmSize( ATT_VAR_SIZE, aDrawOldPt.X(), aDrawOldPt.Y() ) );
     501             :     }
     502             : 
     503           0 :     if (FLY_AS_CHAR == aNewAnchor.GetAnchorId()) {
     504           0 :         const SwPosition* pPos = aNewAnchor.GetContentAnchor();
     505           0 :         SwTextNode* pTextNd = pPos->nNode.GetNode().GetTextNode();
     506             :         OSL_ENSURE( pTextNd, "no Text Node at position." );
     507           0 :         SwFormatFlyCnt aFormat( pFrameFormat );
     508           0 :         pTextNd->InsertItem( aFormat, pPos->nContent.GetIndex(), 0 );
     509             :     }
     510             : 
     511           0 :     if( RES_DRAWFRMFMT != pFrameFormat->Which() )
     512           0 :         pFrameFormat->MakeFrms();
     513             : 
     514           0 :     rContext.SetSelections(pFrameFormat, 0);
     515             : 
     516             :     // #i35443# - anchor attribute restored.
     517           0 :     return true;
     518             : }
     519             : 
     520           0 : SwUndoFormatResetAttr::SwUndoFormatResetAttr( SwFormat& rChangedFormat,
     521             :                                         const sal_uInt16 nWhichId )
     522             :     : SwUndo( UNDO_RESETATTR )
     523             :     , m_pChangedFormat( &rChangedFormat )
     524           0 :     , m_nWhichId( nWhichId )
     525             : {
     526           0 :     const SfxPoolItem* pItem = 0;
     527           0 :     if (rChangedFormat.GetItemState(nWhichId, false, &pItem ) == SfxItemState::SET && pItem) {
     528           0 :         m_pOldItem.reset( pItem->Clone() );
     529             :     }
     530           0 : }
     531             : 
     532           0 : SwUndoFormatResetAttr::~SwUndoFormatResetAttr()
     533             : {
     534           0 : }
     535             : 
     536           0 : void SwUndoFormatResetAttr::UndoImpl(::sw::UndoRedoContext &)
     537             : {
     538           0 :     if ( m_pOldItem.get() ) {
     539           0 :         m_pChangedFormat->SetFormatAttr( *m_pOldItem );
     540             :     }
     541           0 : }
     542             : 
     543           0 : void SwUndoFormatResetAttr::RedoImpl(::sw::UndoRedoContext &)
     544             : {
     545           0 :     if ( m_pOldItem.get() ) {
     546           0 :         m_pChangedFormat->ResetFormatAttr( m_nWhichId );
     547             :     }
     548           0 : }
     549             : 
     550           9 : SwUndoResetAttr::SwUndoResetAttr( const SwPaM& rRange, sal_uInt16 nFormatId )
     551             :     : SwUndo( UNDO_RESETATTR ), SwUndRng( rRange )
     552           9 :     , m_pHistory( new SwHistory )
     553          18 :     , m_nFormatId( nFormatId )
     554             : {
     555           9 : }
     556             : 
     557           5 : SwUndoResetAttr::SwUndoResetAttr( const SwPosition& rPos, sal_uInt16 nFormatId )
     558             :     : SwUndo( UNDO_RESETATTR )
     559           5 :     , m_pHistory( new SwHistory )
     560          10 :     , m_nFormatId( nFormatId )
     561             : {
     562           5 :     nSttNode = nEndNode = rPos.nNode.GetIndex();
     563           5 :     nSttContent = nEndContent = rPos.nContent.GetIndex();
     564           5 : }
     565             : 
     566          28 : SwUndoResetAttr::~SwUndoResetAttr()
     567             : {
     568          28 : }
     569             : 
     570           0 : void SwUndoResetAttr::UndoImpl(::sw::UndoRedoContext & rContext)
     571             : {
     572             :     // reset old values
     573           0 :     SwDoc & rDoc = rContext.GetDoc();
     574           0 :     m_pHistory->TmpRollback( &rDoc, 0 );
     575           0 :     m_pHistory->SetTmpEnd( m_pHistory->Count() );
     576             : 
     577           0 :     if ((RES_CONDTXTFMTCOLL == m_nFormatId) &&
     578           0 :         (nSttNode == nEndNode) && (nSttContent == nEndContent)) {
     579           0 :         SwTextNode* pTNd = rDoc.GetNodes()[ nSttNode ]->GetTextNode();
     580           0 :         if( pTNd ) {
     581           0 :             SwIndex aIdx( pTNd, nSttContent );
     582           0 :             pTNd->DontExpandFormat( aIdx, false );
     583             :         }
     584             :     }
     585             : 
     586           0 :     AddUndoRedoPaM(rContext);
     587           0 : }
     588             : 
     589           0 : void SwUndoResetAttr::RedoImpl(::sw::UndoRedoContext & rContext)
     590             : {
     591           0 :     SwDoc & rDoc = rContext.GetDoc();
     592           0 :     SwPaM & rPam = AddUndoRedoPaM(rContext);
     593             : 
     594           0 :     switch ( m_nFormatId ) {
     595             :     case RES_CHRFMT:
     596           0 :         rDoc.RstTextAttrs(rPam);
     597           0 :         break;
     598             :     case RES_TXTFMTCOLL:
     599           0 :         rDoc.ResetAttrs(rPam, false, m_Ids );
     600           0 :         break;
     601             :     case RES_CONDTXTFMTCOLL:
     602           0 :         rDoc.ResetAttrs(rPam, true, m_Ids );
     603             : 
     604           0 :         break;
     605             :     case RES_TXTATR_TOXMARK:
     606             :         // special treatment for TOXMarks
     607             :     {
     608           0 :         SwTOXMarks aArr;
     609           0 :         SwNodeIndex aIdx( rDoc.GetNodes(), nSttNode );
     610           0 :         SwPosition aPos( aIdx, SwIndex( aIdx.GetNode().GetContentNode(),
     611           0 :                                         nSttContent ));
     612             : 
     613           0 :         sal_uInt16 nCnt = SwDoc::GetCurTOXMark( aPos, aArr );
     614           0 :         if( nCnt ) {
     615           0 :             if( 1 < nCnt ) {
     616             :                 // search for the right one
     617           0 :                 SwHistoryHint* pHHint = (GetHistory())[ 0 ];
     618           0 :                 if( pHHint && HSTRY_SETTOXMARKHNT == pHHint->Which() ) {
     619           0 :                     while( nCnt ) {
     620           0 :                         if ( static_cast<SwHistorySetTOXMark*>(pHHint)
     621           0 :                              ->IsEqual( *aArr[ --nCnt ] ) ) {
     622           0 :                             ++nCnt;
     623           0 :                             break;
     624             :                         }
     625             :                     }
     626             :                 } else
     627           0 :                     nCnt = 0;
     628             :             }
     629             :             // found one, thus delete it
     630           0 :             if( nCnt-- ) {
     631           0 :                 rDoc.DeleteTOXMark( aArr[ nCnt ] );
     632             :             }
     633           0 :         }
     634             :     }
     635           0 :     break;
     636             :     }
     637           0 : }
     638             : 
     639           0 : void SwUndoResetAttr::RepeatImpl(::sw::RepeatContext & rContext)
     640             : {
     641           0 :     if (m_nFormatId < RES_FMT_BEGIN) {
     642           0 :         return;
     643             :     }
     644             : 
     645           0 :     switch ( m_nFormatId ) {
     646             :     case RES_CHRFMT:
     647           0 :         rContext.GetDoc().RstTextAttrs(rContext.GetRepeatPaM());
     648           0 :         break;
     649             :     case RES_TXTFMTCOLL:
     650           0 :         rContext.GetDoc().ResetAttrs(rContext.GetRepeatPaM(), false, m_Ids);
     651           0 :         break;
     652             :     case RES_CONDTXTFMTCOLL:
     653           0 :         rContext.GetDoc().ResetAttrs(rContext.GetRepeatPaM(), true, m_Ids);
     654           0 :         break;
     655             :     }
     656             : }
     657             : 
     658           2 : void SwUndoResetAttr::SetAttrs( const std::set<sal_uInt16> &rAttrs )
     659             : {
     660           2 :     m_Ids.clear();
     661           2 :     m_Ids.insert( rAttrs.begin(), rAttrs.end() );
     662           2 : }
     663             : 
     664         344 : SwUndoAttr::SwUndoAttr( const SwPaM& rRange, const SfxPoolItem& rAttr,
     665             :                         const SetAttrMode nFlags )
     666             :     : SwUndo( UNDO_INSATTR ), SwUndRng( rRange )
     667        1032 :     , m_AttrSet( rRange.GetDoc()->GetAttrPool(), rAttr.Which(), rAttr.Which() )
     668         344 :     , m_pHistory( new SwHistory )
     669             :     , m_nNodeIndex( ULONG_MAX )
     670        1720 :     , m_nInsertFlags( nFlags )
     671             : {
     672         344 :     m_AttrSet.Put( rAttr );
     673         344 : }
     674             : 
     675        8934 : SwUndoAttr::SwUndoAttr( const SwPaM& rRange, const SfxItemSet& rSet,
     676             :                         const SetAttrMode nFlags )
     677             :     : SwUndo( UNDO_INSATTR ), SwUndRng( rRange )
     678             :     , m_AttrSet( rSet )
     679        8934 :     , m_pHistory( new SwHistory )
     680             :     , m_nNodeIndex( ULONG_MAX )
     681       17868 :     , m_nInsertFlags( nFlags )
     682             : {
     683        8934 : }
     684             : 
     685       18552 : SwUndoAttr::~SwUndoAttr()
     686             : {
     687       18552 : }
     688             : 
     689           0 : void SwUndoAttr::SaveRedlineData( const SwPaM& rPam, bool bIsContent )
     690             : {
     691           0 :     SwDoc* pDoc = rPam.GetDoc();
     692           0 :     if ( pDoc->getIDocumentRedlineAccess().IsRedlineOn() ) {
     693             :         m_pRedlineData.reset( new SwRedlineData( bIsContent
     694             :                               ? nsRedlineType_t::REDLINE_INSERT
     695             :                               : nsRedlineType_t::REDLINE_FORMAT,
     696           0 :                               pDoc->getIDocumentRedlineAccess().GetRedlineAuthor() ) );
     697             :     }
     698             : 
     699           0 :     m_pRedlineSaveData.reset( new SwRedlineSaveDatas );
     700           0 :     if ( !FillSaveDataForFormat( rPam, *m_pRedlineSaveData )) {
     701           0 :         m_pRedlineSaveData.reset(0);
     702             :     }
     703             : 
     704           0 :     SetRedlineMode( pDoc->getIDocumentRedlineAccess().GetRedlineMode() );
     705           0 :     if ( bIsContent ) {
     706           0 :         m_nNodeIndex = rPam.GetPoint()->nNode.GetIndex();
     707             :     }
     708           0 : }
     709             : 
     710           1 : void SwUndoAttr::UndoImpl(::sw::UndoRedoContext & rContext)
     711             : {
     712           1 :     SwDoc *const pDoc = & rContext.GetDoc();
     713             : 
     714           1 :     RemoveIdx( *pDoc );
     715             : 
     716           1 :     if( IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ) ) {
     717           0 :         SwPaM aPam(pDoc->GetNodes().GetEndOfContent());
     718           0 :         if ( ULONG_MAX != m_nNodeIndex ) {
     719           0 :             aPam.DeleteMark();
     720           0 :             aPam.GetPoint()->nNode = m_nNodeIndex;
     721           0 :             aPam.GetPoint()->nContent.Assign( aPam.GetContentNode(), nSttContent );
     722           0 :             aPam.SetMark();
     723           0 :             ++aPam.GetPoint()->nContent;
     724           0 :             pDoc->getIDocumentRedlineAccess().DeleteRedline(aPam, false, USHRT_MAX);
     725             :         } else {
     726             :             // remove all format redlines, will be recreated if needed
     727           0 :             SetPaM(aPam);
     728           0 :             pDoc->getIDocumentRedlineAccess().DeleteRedline(aPam, false, nsRedlineType_t::REDLINE_FORMAT);
     729           0 :             if ( m_pRedlineSaveData.get() ) {
     730           0 :                 SetSaveData( *pDoc, *m_pRedlineSaveData );
     731             :             }
     732           0 :         }
     733             :     }
     734             : 
     735           1 :     const bool bToLast =  (1 == m_AttrSet.Count())
     736           1 :                           && (RES_TXTATR_FIELD <= *m_AttrSet.GetRanges())
     737           1 :                           && (*m_AttrSet.GetRanges() <= RES_TXTATR_ANNOTATION);
     738             : 
     739             :     // restore old values
     740           1 :     m_pHistory->TmpRollback( pDoc, 0, !bToLast );
     741           1 :     m_pHistory->SetTmpEnd( m_pHistory->Count() );
     742             : 
     743             :     // set cursor onto Undo area
     744           1 :     AddUndoRedoPaM(rContext);
     745           1 : }
     746             : 
     747           0 : void SwUndoAttr::RepeatImpl(::sw::RepeatContext & rContext)
     748             : {
     749             :     // RefMarks are not repeat capable
     750           0 :     if ( SfxItemState::SET != m_AttrSet.GetItemState( RES_TXTATR_REFMARK, false ) ) {
     751           0 :         rContext.GetDoc().getIDocumentContentOperations().InsertItemSet( rContext.GetRepeatPaM(),
     752           0 :                 m_AttrSet, m_nInsertFlags );
     753           0 :     } else if ( 1 < m_AttrSet.Count() ) {
     754           0 :         SfxItemSet aTmpSet( m_AttrSet );
     755           0 :         aTmpSet.ClearItem( RES_TXTATR_REFMARK );
     756           0 :         rContext.GetDoc().getIDocumentContentOperations().InsertItemSet( rContext.GetRepeatPaM(),
     757           0 :                 aTmpSet, m_nInsertFlags );
     758             :     }
     759           0 : }
     760             : 
     761           0 : void SwUndoAttr::RedoImpl(::sw::UndoRedoContext & rContext)
     762             : {
     763           0 :     SwDoc & rDoc = rContext.GetDoc();
     764           0 :     SwPaM & rPam = AddUndoRedoPaM(rContext);
     765             : 
     766           0 :     if ( m_pRedlineData.get() &&
     767           0 :          IDocumentRedlineAccess::IsRedlineOn( GetRedlineMode() ) ) {
     768           0 :         RedlineMode_t eOld = rDoc.getIDocumentRedlineAccess().GetRedlineMode();
     769           0 :         rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern(static_cast<RedlineMode_t>(
     770           0 :                     eOld & ~nsRedlineMode_t::REDLINE_IGNORE));
     771           0 :         rDoc.getIDocumentContentOperations().InsertItemSet( rPam, m_AttrSet, m_nInsertFlags );
     772             : 
     773           0 :         if ( ULONG_MAX != m_nNodeIndex ) {
     774           0 :             rPam.SetMark();
     775           0 :             if ( rPam.Move( fnMoveBackward ) ) {
     776           0 :                 rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *m_pRedlineData, rPam ),
     777           0 :                         true);
     778             :             }
     779           0 :             rPam.DeleteMark();
     780             :         } else {
     781           0 :             rDoc.getIDocumentRedlineAccess().AppendRedline( new SwRangeRedline( *m_pRedlineData, rPam ), true);
     782             :         }
     783             : 
     784           0 :         rDoc.getIDocumentRedlineAccess().SetRedlineMode_intern( eOld );
     785             :     } else {
     786           0 :         rDoc.getIDocumentContentOperations().InsertItemSet( rPam, m_AttrSet, m_nInsertFlags );
     787             :     }
     788           0 : }
     789             : 
     790           1 : void SwUndoAttr::RemoveIdx( SwDoc& rDoc )
     791             : {
     792           1 :     if ( SfxItemState::SET != m_AttrSet.GetItemState( RES_TXTATR_FTN, false ))
     793           1 :         return ;
     794             : 
     795           0 :     SwNodes& rNds = rDoc.GetNodes();
     796           0 :     for ( sal_uInt16 n = 0; n < m_pHistory->Count(); ++n ) {
     797           0 :         sal_Int32 nContent = 0;
     798           0 :         sal_uLong nNode = 0;
     799           0 :         SwHistoryHint* pHstHint = (*m_pHistory)[ n ];
     800           0 :         switch ( pHstHint->Which() ) {
     801             :         case HSTRY_RESETTXTHNT: {
     802             :             SwHistoryResetText * pHistoryHint
     803           0 :                 = static_cast<SwHistoryResetText*>(pHstHint);
     804           0 :             if ( RES_TXTATR_FTN == pHistoryHint->GetWhich() ) {
     805           0 :                 nNode = pHistoryHint->GetNode();
     806           0 :                 nContent = pHistoryHint->GetContent();
     807             :             }
     808             :         }
     809           0 :         break;
     810             : 
     811             :         case HSTRY_RESETATTRSET: {
     812             :             SwHistoryResetAttrSet * pHistoryHint
     813           0 :                 = static_cast<SwHistoryResetAttrSet*>(pHstHint);
     814           0 :             nContent = pHistoryHint->GetContent();
     815           0 :             if ( COMPLETE_STRING != nContent ) {
     816           0 :                 const std::vector<sal_uInt16>& rArr = pHistoryHint->GetArr();
     817           0 :                 for ( size_t i = rArr.size(); i; ) {
     818           0 :                     if ( RES_TXTATR_FTN == rArr[ --i ] ) {
     819           0 :                         nNode = pHistoryHint->GetNode();
     820           0 :                         break;
     821             :                     }
     822             :                 }
     823             :             }
     824             :         }
     825           0 :         break;
     826             : 
     827             :         default:
     828           0 :             break;
     829             :         }
     830             : 
     831           0 :         if( nNode ) {
     832           0 :             SwTextNode* pTextNd = rNds[ nNode ]->GetTextNode();
     833           0 :             if( pTextNd ) {
     834             :                 SwTextAttr *const pTextHt =
     835           0 :                     pTextNd->GetTextAttrForCharAt(nContent, RES_TXTATR_FTN);
     836           0 :                 if( pTextHt ) {
     837             :                     // ok, so get values
     838           0 :                     SwTextFootnote* pFootnote = static_cast<SwTextFootnote*>(pTextHt);
     839           0 :                     RemoveIdxFromSection( rDoc, pFootnote->GetStartNode()->GetIndex() );
     840           0 :                     return ;
     841             :                 }
     842             :             }
     843             :         }
     844             :     }
     845             : }
     846             : 
     847         392 : SwUndoDefaultAttr::SwUndoDefaultAttr( const SfxItemSet& rSet )
     848         392 :     : SwUndo( UNDO_SETDEFTATTR )
     849             : {
     850             :     const SfxPoolItem* pItem;
     851         392 :     if( SfxItemState::SET == rSet.GetItemState( RES_PARATR_TABSTOP, false, &pItem ) ) {
     852             :         // store separately, because it may change!
     853          68 :         m_pTabStop.reset( static_cast<SvxTabStopItem*>(pItem->Clone()) );
     854          68 :         if ( 1 != rSet.Count() ) { // are there more attributes?
     855           5 :             m_pOldSet.reset( new SfxItemSet( rSet ) );
     856             :         }
     857             :     } else {
     858         324 :         m_pOldSet.reset( new SfxItemSet( rSet ) );
     859             :     }
     860         392 : }
     861             : 
     862         784 : SwUndoDefaultAttr::~SwUndoDefaultAttr()
     863             : {
     864         784 : }
     865             : 
     866           0 : void SwUndoDefaultAttr::UndoImpl(::sw::UndoRedoContext & rContext)
     867             : {
     868           0 :     SwDoc & rDoc = rContext.GetDoc();
     869           0 :     if ( m_pOldSet.get() ) {
     870             :         SwUndoFormatAttrHelper aTmp(
     871           0 :             *rDoc.GetDfltTextFormatColl() );
     872           0 :         rDoc.SetDefault( *m_pOldSet );
     873           0 :         m_pOldSet.reset( 0 );
     874           0 :         if ( aTmp.GetUndo() ) {
     875             :             // transfer ownership of helper object's old set
     876           0 :             m_pOldSet = std::move(aTmp.GetUndo()->m_pOldSet);
     877           0 :         }
     878             :     }
     879           0 :     if ( m_pTabStop.get() ) {
     880             :         SvxTabStopItem* pOld = static_cast<SvxTabStopItem*>(
     881           0 :                                    rDoc.GetDefault( RES_PARATR_TABSTOP ).Clone() );
     882           0 :         rDoc.SetDefault( *m_pTabStop );
     883           0 :         m_pTabStop.reset( pOld );
     884             :     }
     885           0 : }
     886             : 
     887           0 : void SwUndoDefaultAttr::RedoImpl(::sw::UndoRedoContext & rContext)
     888             : {
     889           0 :     UndoImpl(rContext);
     890           0 : }
     891             : 
     892           0 : SwUndoMoveLeftMargin::SwUndoMoveLeftMargin(
     893             :     const SwPaM& rPam, bool bFlag, bool bMod )
     894             :     : SwUndo( bFlag ? UNDO_INC_LEFTMARGIN : UNDO_DEC_LEFTMARGIN )
     895             :     , SwUndRng( rPam )
     896           0 :     , m_pHistory( new SwHistory )
     897           0 :     , m_bModulus( bMod )
     898             : {
     899           0 : }
     900             : 
     901           0 : SwUndoMoveLeftMargin::~SwUndoMoveLeftMargin()
     902             : {
     903           0 : }
     904             : 
     905           0 : void SwUndoMoveLeftMargin::UndoImpl(::sw::UndoRedoContext & rContext)
     906             : {
     907           0 :     SwDoc & rDoc = rContext.GetDoc();
     908             : 
     909             :     // restore old values
     910           0 :     m_pHistory->TmpRollback( & rDoc, 0 );
     911           0 :     m_pHistory->SetTmpEnd( m_pHistory->Count() );
     912             : 
     913           0 :     AddUndoRedoPaM(rContext);
     914           0 : }
     915             : 
     916           0 : void SwUndoMoveLeftMargin::RedoImpl(::sw::UndoRedoContext & rContext)
     917             : {
     918           0 :     SwDoc & rDoc = rContext.GetDoc();
     919           0 :     SwPaM & rPam = AddUndoRedoPaM(rContext);
     920             : 
     921             :     rDoc.MoveLeftMargin( rPam,
     922           0 :                          GetId() == UNDO_INC_LEFTMARGIN, m_bModulus );
     923           0 : }
     924             : 
     925           0 : void SwUndoMoveLeftMargin::RepeatImpl(::sw::RepeatContext & rContext)
     926             : {
     927           0 :     SwDoc & rDoc = rContext.GetDoc();
     928           0 :     rDoc.MoveLeftMargin(rContext.GetRepeatPaM(), GetId() == UNDO_INC_LEFTMARGIN,
     929           0 :                         m_bModulus );
     930           0 : }
     931             : 
     932           2 : SwUndoChangeFootNote::SwUndoChangeFootNote(
     933             :     const SwPaM& rRange, const OUString& rText,
     934             :     sal_uInt16 nNum, bool bIsEndNote )
     935             :     : SwUndo( UNDO_CHGFTN ), SwUndRng( rRange )
     936           0 :     , m_pHistory( new SwHistory() )
     937             :     , m_Text( rText )
     938             :     , m_nNumber( nNum )
     939           2 :     , m_bEndNote( bIsEndNote )
     940             : {
     941           2 : }
     942             : 
     943           4 : SwUndoChangeFootNote::~SwUndoChangeFootNote()
     944             : {
     945           4 : }
     946             : 
     947           0 : void SwUndoChangeFootNote::UndoImpl(::sw::UndoRedoContext & rContext)
     948             : {
     949           0 :     SwDoc & rDoc = rContext.GetDoc();
     950             : 
     951           0 :     m_pHistory->TmpRollback( &rDoc, 0 );
     952           0 :     m_pHistory->SetTmpEnd( m_pHistory->Count() );
     953             : 
     954           0 :     rDoc.GetFootnoteIdxs().UpdateAllFootnote();
     955             : 
     956           0 :     AddUndoRedoPaM(rContext);
     957           0 : }
     958             : 
     959           0 : void SwUndoChangeFootNote::RedoImpl(::sw::UndoRedoContext & rContext)
     960             : {
     961           0 :     SwDoc & rDoc( rContext.GetDoc() );
     962           0 :     SwPaM & rPaM = AddUndoRedoPaM(rContext);
     963           0 :     rDoc.SetCurFootnote(rPaM, m_Text, m_nNumber, m_bEndNote);
     964           0 :     SetPaM(rPaM);
     965           0 : }
     966             : 
     967           0 : void SwUndoChangeFootNote::RepeatImpl(::sw::RepeatContext & rContext)
     968             : {
     969           0 :     SwDoc & rDoc = rContext.GetDoc();
     970           0 :     rDoc.SetCurFootnote( rContext.GetRepeatPaM(), m_Text, m_nNumber, m_bEndNote );
     971           0 : }
     972             : 
     973          13 : SwUndoFootNoteInfo::SwUndoFootNoteInfo( const SwFootnoteInfo &rInfo )
     974             :     : SwUndo( UNDO_FTNINFO )
     975          13 :     , m_pFootNoteInfo( new SwFootnoteInfo( rInfo ) )
     976             : {
     977          13 : }
     978             : 
     979          26 : SwUndoFootNoteInfo::~SwUndoFootNoteInfo()
     980             : {
     981          26 : }
     982             : 
     983           0 : void SwUndoFootNoteInfo::UndoImpl(::sw::UndoRedoContext & rContext)
     984             : {
     985           0 :     SwDoc & rDoc = rContext.GetDoc();
     986           0 :     SwFootnoteInfo *pInf = new SwFootnoteInfo( rDoc.GetFootnoteInfo() );
     987           0 :     rDoc.SetFootnoteInfo( *m_pFootNoteInfo );
     988           0 :     m_pFootNoteInfo.reset( pInf );
     989           0 : }
     990             : 
     991           0 : void SwUndoFootNoteInfo::RedoImpl(::sw::UndoRedoContext & rContext)
     992             : {
     993           0 :     SwDoc & rDoc = rContext.GetDoc();
     994           0 :     SwFootnoteInfo *pInf = new SwFootnoteInfo( rDoc.GetFootnoteInfo() );
     995           0 :     rDoc.SetFootnoteInfo( *m_pFootNoteInfo );
     996           0 :     m_pFootNoteInfo.reset( pInf );
     997           0 : }
     998             : 
     999           7 : SwUndoEndNoteInfo::SwUndoEndNoteInfo( const SwEndNoteInfo &rInfo )
    1000             :     : SwUndo( UNDO_FTNINFO )
    1001           7 :     , m_pEndNoteInfo( new SwEndNoteInfo( rInfo ) )
    1002             : {
    1003           7 : }
    1004             : 
    1005          14 : SwUndoEndNoteInfo::~SwUndoEndNoteInfo()
    1006             : {
    1007          14 : }
    1008             : 
    1009           0 : void SwUndoEndNoteInfo::UndoImpl(::sw::UndoRedoContext & rContext)
    1010             : {
    1011           0 :     SwDoc & rDoc = rContext.GetDoc();
    1012           0 :     SwEndNoteInfo *pInf = new SwEndNoteInfo( rDoc.GetEndNoteInfo() );
    1013           0 :     rDoc.SetEndNoteInfo( *m_pEndNoteInfo );
    1014           0 :     m_pEndNoteInfo.reset( pInf );
    1015           0 : }
    1016             : 
    1017           0 : void SwUndoEndNoteInfo::RedoImpl(::sw::UndoRedoContext & rContext)
    1018             : {
    1019           0 :     SwDoc & rDoc = rContext.GetDoc();
    1020           0 :     SwEndNoteInfo *pInf = new SwEndNoteInfo( rDoc.GetEndNoteInfo() );
    1021           0 :     rDoc.SetEndNoteInfo( *m_pEndNoteInfo );
    1022           0 :     m_pEndNoteInfo.reset( pInf );
    1023           0 : }
    1024             : 
    1025           1 : SwUndoDontExpandFormat::SwUndoDontExpandFormat( const SwPosition& rPos )
    1026             :     : SwUndo( UNDO_DONTEXPAND )
    1027           1 :     , m_nNodeIndex( rPos.nNode.GetIndex() )
    1028           2 :     , m_nContentIndex( rPos.nContent.GetIndex() )
    1029             : {
    1030           1 : }
    1031             : 
    1032           0 : void SwUndoDontExpandFormat::UndoImpl(::sw::UndoRedoContext & rContext)
    1033             : {
    1034           0 :     SwPaM *const pPam(& rContext.GetCursorSupplier().CreateNewShellCursor());
    1035           0 :     SwDoc *const pDoc = & rContext.GetDoc();
    1036             : 
    1037           0 :     SwPosition& rPos = *pPam->GetPoint();
    1038           0 :     rPos.nNode = m_nNodeIndex;
    1039           0 :     rPos.nContent.Assign( rPos.nNode.GetNode().GetContentNode(), m_nContentIndex);
    1040           0 :     pDoc->DontExpandFormat( rPos, false );
    1041           0 : }
    1042             : 
    1043           0 : void SwUndoDontExpandFormat::RedoImpl(::sw::UndoRedoContext & rContext)
    1044             : {
    1045           0 :     SwPaM *const pPam(& rContext.GetCursorSupplier().CreateNewShellCursor());
    1046           0 :     SwDoc *const pDoc = & rContext.GetDoc();
    1047             : 
    1048           0 :     SwPosition& rPos = *pPam->GetPoint();
    1049           0 :     rPos.nNode = m_nNodeIndex;
    1050           0 :     rPos.nContent.Assign( rPos.nNode.GetNode().GetContentNode(), m_nContentIndex);
    1051           0 :     pDoc->DontExpandFormat( rPos );
    1052           0 : }
    1053             : 
    1054           0 : void SwUndoDontExpandFormat::RepeatImpl(::sw::RepeatContext & rContext)
    1055             : {
    1056           0 :     SwPaM & rPam = rContext.GetRepeatPaM();
    1057           0 :     SwDoc & rDoc = rContext.GetDoc();
    1058           0 :     rDoc.DontExpandFormat( *rPam.GetPoint() );
    1059         177 : }
    1060             : 
    1061             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11