diff options
Diffstat (limited to 'sw/source/core/docnode/ndtbl.cxx')
-rw-r--r-- | sw/source/core/docnode/ndtbl.cxx | 373 |
1 files changed, 201 insertions, 172 deletions
diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx index 5f21e32df796..d91506721fb6 100644 --- a/sw/source/core/docnode/ndtbl.cxx +++ b/sw/source/core/docnode/ndtbl.cxx @@ -30,9 +30,6 @@ #include <com/sun/star/chart2/XChartDocument.hpp> -#ifdef WTC -#define private public -#endif #include <hintids.hxx> #include <editeng/lrspitem.hxx> @@ -53,6 +50,8 @@ #include <pagefrm.hxx> #include <tabcol.hxx> #include <doc.hxx> +#include <IDocumentUndoRedo.hxx> +#include <UndoManager.hxx> #include <cntfrm.hxx> #include <pam.hxx> #include <swcrsr.hxx> @@ -64,7 +63,11 @@ #include <fldbas.hxx> #include <poolfmt.hxx> #include <tabfrm.hxx> -#include <undobj.hxx> +#include <UndoCore.hxx> +#include <UndoRedline.hxx> +#include <UndoDelete.hxx> +#include <UndoTable.hxx> +#include <hints.hxx> #include <tblafmt.hxx> #include <swcache.hxx> #include <ddefld.hxx> @@ -83,9 +86,7 @@ #include <section.hxx> #include <frmtool.hxx> #include <node2lay.hxx> -#ifndef _COMCORE_HRC #include <comcore.hrc> -#endif #include "docsh.hxx" #include <tabcol.hxx> #include <unochart.hxx> @@ -137,7 +138,7 @@ public: lcl_DelRedlines::lcl_DelRedlines( SwPaM & rPam) : pDoc( rPam.GetDoc() ) { - pDoc->StartUndo(UNDO_EMPTY, NULL); + pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL); if( !pDoc->IsIgnoreRedline() && pDoc->GetRedlineTbl().Count() ) pDoc->AcceptRedline( rPam, true ); } @@ -390,10 +391,10 @@ const SwTable* SwDoc::InsertTable( const SwInsertTableOptions& rInsTblOpts, String aTblName = GetUniqueTblName(); - if( DoesUndo() ) + if( GetIDocumentUndoRedo().DoesUndo() ) { - ClearRedo(); - AppendUndo( new SwUndoInsTbl( rPos, nCols, nRows, static_cast<USHORT>(eAdjust), + GetIDocumentUndoRedo().AppendUndo( + new SwUndoInsTbl( rPos, nCols, nRows, static_cast<USHORT>(eAdjust), rInsTblOpts, pTAFmt, pColArr, aTblName)); } @@ -692,15 +693,15 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts, #endif SwUndoTxtToTbl* pUndo = 0; - if( DoesUndo() ) + if( GetIDocumentUndoRedo().DoesUndo() ) { - StartUndo( UNDO_TEXTTOTABLE, NULL ); + GetIDocumentUndoRedo().StartUndo( UNDO_TEXTTOTABLE, NULL ); pUndo = new SwUndoTxtToTbl( aOriginal, rInsTblOpts, cCh, static_cast<USHORT>(eAdjust), pTAFmt ); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); // das Splitten vom TextNode nicht in die Undohistory aufnehmen - DoUndo( FALSE ); + GetIDocumentUndoRedo().DoUndo( false ); } ::PaMCorrAbs( aOriginal, *pEnd ); @@ -739,7 +740,7 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts, // Wir gehen jetzt immer ueber die Upper, um die Tabelle einzufuegen: SwNode2Layout aNode2Layout( aRg.aStart.GetNode() ); - DoUndo( 0 != pUndo ); + GetIDocumentUndoRedo().DoUndo( 0 != pUndo ); // dann erstelle die Box/Line/Table-Struktur SwTableBoxFmt* pBoxFmt = MakeTableBoxFmt(); @@ -916,7 +917,9 @@ const SwTable* SwDoc::TextToTable( const SwInsertTableOptions& rInsTblOpts, } if( pUndo ) - EndUndo( UNDO_TEXTTOTABLE, NULL ); + { + GetIDocumentUndoRedo().EndUndo( UNDO_TEXTTOTABLE, NULL ); + } SetModified(); SetFieldsDirty(true, NULL, 0); @@ -1146,15 +1149,16 @@ const SwTable* SwDoc::TextToTable( const std::vector< std::vector<SwNodeRange> > lcl_DelRedlines aDelRedl( aOriginal ); #endif - SwUndoTxtToTbl* pUndo = 0; - if( DoesUndo() ) +// SwUndoTxtToTbl* pUndo = 0; + bool const bUndo(GetIDocumentUndoRedo().DoesUndo()); + if (bUndo) { -// StartUndo( UNDO_TEXTTOTABLE ); +// GetIDocumentUndoRedo().StartUndo( UNDO_TEXTTOTABLE ); // pUndo = new SwUndoTxtToTbl( aOriginal, rInsTblOpts, cCh, eAdjust, pTAFmt ); -// AppendUndo( pUndo ); +// GetIDocumentUndoRedo().AppendUndo(pUndo); // das Splitten vom TextNode nicht in die Undohistory aufnehmen - DoUndo( FALSE ); + GetIDocumentUndoRedo().DoUndo(false); } ::PaMCorrAbs( aOriginal, *pEnd ); @@ -1193,7 +1197,7 @@ const SwTable* SwDoc::TextToTable( const std::vector< std::vector<SwNodeRange> > // Wir gehen jetzt immer ueber die Upper, um die Tabelle einzufuegen: SwNode2Layout aNode2Layout( aRg.aStart.GetNode() ); - DoUndo( 0 != pUndo ); + GetIDocumentUndoRedo().DoUndo(bUndo); // dann erstelle die Box/Line/Table-Struktur SwTableBoxFmt* pBoxFmt = MakeTableBoxFmt(); @@ -1264,7 +1268,7 @@ const SwTable* SwDoc::TextToTable( const std::vector< std::vector<SwNodeRange> > } // if( pUndo ) -// EndUndo( UNDO_TEXTTOTABLE ); +// GetIDocumentUndoRedo().EndUndo( UNDO_TEXTTOTABLE ); SetModified(); SetFieldsDirty( true, NULL, 0 ); @@ -1530,9 +1534,9 @@ BOOL SwDoc::TableToText( const SwTableNode* pTblNd, sal_Unicode cCh ) SwNodeRange aRg( *pTblNd, 0, *pTblNd->EndOfSectionNode() ); SwUndoTblToTxt* pUndo = 0; SwNodeRange* pUndoRg = 0; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - ClearRedo(); + GetIDocumentUndoRedo().ClearRedo(); pUndoRg = new SwNodeRange( aRg.aStart, -1, aRg.aEnd, +1 ); pUndo = new SwUndoTblToTxt( pTblNd->GetTable(), cCh ); } @@ -1547,7 +1551,7 @@ BOOL SwDoc::TableToText( const SwTableNode* pTblNd, sal_Unicode cCh ) pUndoRg->aStart++; pUndoRg->aEnd--; pUndo->SetRange( *pUndoRg ); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo(pUndo); delete pUndoRg; } @@ -1659,7 +1663,7 @@ BOOL SwNodes::TableToText( const SwNodeRange& rRange, sal_Unicode cCh, // ist eine Tabelle selektiert ? SwTableNode* pTblNd; if( rRange.aStart.GetIndex() >= rRange.aEnd.GetIndex() || - 0 == ( pTblNd = (*this)[ rRange.aStart ]->GetTableNode()) || + 0 == ( pTblNd = rRange.aStart.GetNode().GetTableNode()) || &rRange.aEnd.GetNode() != pTblNd->EndOfSectionNode() ) return FALSE; @@ -1802,34 +1806,36 @@ BOOL SwDoc::InsertCol( const SwSelBoxes& rBoxes, USHORT nCnt, BOOL bBehind ) SwTableSortBoxes aTmpLst( 0, 5 ); SwUndoTblNdsChg* pUndo = 0; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - DoUndo( FALSE ); pUndo = new SwUndoTblNdsChg( UNDO_TABLE_INSCOL, rBoxes, *pTblNd, 0, 0, nCnt, bBehind, FALSE ); aTmpLst.Insert( &rTbl.GetTabSortBoxes(), 0, rTbl.GetTabSortBoxes().Count() ); } - SwTableFmlUpdate aMsgHnt( &rTbl ); - aMsgHnt.eFlags = TBL_BOXPTR; - UpdateTblFlds( &aMsgHnt ); - - BOOL bRet = rTbl.InsertCol( this, rBoxes, nCnt, bBehind ); - if( bRet ) + bool bRet(false); { - SetModified(); - ::ClearFEShellTabCols(); - SetFieldsDirty( true, NULL, 0 ); + ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo()); + + SwTableFmlUpdate aMsgHnt( &rTbl ); + aMsgHnt.eFlags = TBL_BOXPTR; + UpdateTblFlds( &aMsgHnt ); + + bRet = rTbl.InsertCol( this, rBoxes, nCnt, bBehind ); + if (bRet) + { + SetModified(); + ::ClearFEShellTabCols(); + SetFieldsDirty( true, NULL, 0 ); + } } if( pUndo ) { - DoUndo( TRUE ); if( bRet ) { - ClearRedo(); pUndo->SaveNewBoxes( *pTblNd, aTmpLst ); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } else delete pUndo; @@ -1867,34 +1873,36 @@ BOOL SwDoc::InsertRow( const SwSelBoxes& rBoxes, USHORT nCnt, BOOL bBehind ) SwTableSortBoxes aTmpLst( 0, 5 ); SwUndoTblNdsChg* pUndo = 0; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - DoUndo( FALSE ); pUndo = new SwUndoTblNdsChg( UNDO_TABLE_INSROW,rBoxes, *pTblNd, 0, 0, nCnt, bBehind, FALSE ); aTmpLst.Insert( &rTbl.GetTabSortBoxes(), 0, rTbl.GetTabSortBoxes().Count() ); } - SwTableFmlUpdate aMsgHnt( &rTbl ); - aMsgHnt.eFlags = TBL_BOXPTR; - UpdateTblFlds( &aMsgHnt ); - - BOOL bRet = rTbl.InsertRow( this, rBoxes, nCnt, bBehind ); - if( bRet ) + bool bRet(false); { - SetModified(); - ::ClearFEShellTabCols(); - SetFieldsDirty( true, NULL, 0 ); + ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo()); + + SwTableFmlUpdate aMsgHnt( &rTbl ); + aMsgHnt.eFlags = TBL_BOXPTR; + UpdateTblFlds( &aMsgHnt ); + + bRet = rTbl.InsertRow( this, rBoxes, nCnt, bBehind ); + if (bRet) + { + SetModified(); + ::ClearFEShellTabCols(); + SetFieldsDirty( true, NULL, 0 ); + } } if( pUndo ) { - DoUndo( TRUE ); if( bRet ) { - ClearRedo(); pUndo->SaveNewBoxes( *pTblNd, aTmpLst ); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } else delete pUndo; @@ -2004,9 +2012,9 @@ BOOL SwDoc::DeleteRow( const SwCursor& rCursor ) // dann loesche doch die Zeilen - StartUndo(UNDO_ROW_DELETE, NULL); + GetIDocumentUndoRedo().StartUndo(UNDO_ROW_DELETE, NULL); BOOL bResult = DeleteRowCol( aBoxes ); - EndUndo(UNDO_ROW_DELETE, NULL); + GetIDocumentUndoRedo().EndUndo(UNDO_ROW_DELETE, NULL); return bResult; } @@ -2030,9 +2038,9 @@ BOOL SwDoc::DeleteCol( const SwCursor& rCursor ) } // dann loesche doch die Spalten - StartUndo(UNDO_COL_DELETE, NULL); + GetIDocumentUndoRedo().StartUndo(UNDO_COL_DELETE, NULL); BOOL bResult = DeleteRowCol( aBoxes, true ); - EndUndo(UNDO_COL_DELETE, NULL); + GetIDocumentUndoRedo().EndUndo(UNDO_COL_DELETE, NULL); return bResult; } @@ -2107,9 +2115,9 @@ BOOL SwDoc::DeleteRowCol( const SwSelBoxes& rBoxes, bool bColumn ) // kein Fly ?? also Kopf- oder Fusszeile: dann immer einen // TextNode ueberig lassen. aIdx++; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - ClearRedo(); + GetIDocumentUndoRedo().ClearRedo(); SwPaM aPaM( *pTblNd->EndOfSectionNode(), aIdx.GetNode() ); if( bNewTxtNd ) @@ -2165,7 +2173,7 @@ BOOL SwDoc::DeleteRowCol( const SwSelBoxes& rBoxes, bool bColumn ) pUndo->SetTblDelLastNd(); pUndo->SetPgBrkFlags( bSavePageBreak, bSavePageDesc ); pUndo->SetTableName(pTblNd->GetTable().GetFrmFmt()->GetName()); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } else { @@ -2212,39 +2220,41 @@ BOOL SwDoc::DeleteRowCol( const SwSelBoxes& rBoxes, bool bColumn ) } SwUndoTblNdsChg* pUndo = 0; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - DoUndo( FALSE ); pUndo = new SwUndoTblNdsChg( UNDO_TABLE_DELBOX, aSelBoxes, *pTblNd, nMin, nMax, 0, FALSE, FALSE ); } - SwTableFmlUpdate aMsgHnt( &pTblNd->GetTable() ); - aMsgHnt.eFlags = TBL_BOXPTR; - UpdateTblFlds( &aMsgHnt ); - - if( rTable.IsNewModel() ) + bool bRet(false); { - if( bColumn ) - rTable.PrepareDeleteCol( nMin, nMax ); - rTable.FindSuperfluousRows( aSelBoxes ); - if( pUndo ) - pUndo->ReNewBoxes( aSelBoxes ); - } - const BOOL bRet = rTable.DeleteSel( this, aSelBoxes, 0, pUndo, TRUE, TRUE ); - if( bRet ) - { - SetModified(); - SetFieldsDirty( true, NULL, 0 ); + ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo()); + + SwTableFmlUpdate aMsgHnt( &pTblNd->GetTable() ); + aMsgHnt.eFlags = TBL_BOXPTR; + UpdateTblFlds( &aMsgHnt ); + + if (rTable.IsNewModel()) + { + if (bColumn) + rTable.PrepareDeleteCol( nMin, nMax ); + rTable.FindSuperfluousRows( aSelBoxes ); + if (pUndo) + pUndo->ReNewBoxes( aSelBoxes ); + } + bRet = rTable.DeleteSel( this, aSelBoxes, 0, pUndo, TRUE, TRUE ); + if (bRet) + { + SetModified(); + SetFieldsDirty( true, NULL, 0 ); + } } if( pUndo ) { - DoUndo( TRUE ); if( bRet ) { - ClearRedo(); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } else delete pUndo; @@ -2276,10 +2286,8 @@ BOOL SwDoc::SplitTbl( const SwSelBoxes& rBoxes, sal_Bool bVert, USHORT nCnt, SvULongs aNdsCnts; SwTableSortBoxes aTmpLst( 0, 5 ); SwUndoTblNdsChg* pUndo = 0; - BOOL bDoUndo = DoesUndo(); - if( bDoUndo ) + if (GetIDocumentUndoRedo().DoesUndo()) { - DoUndo( FALSE ); pUndo = new SwUndoTblNdsChg( UNDO_TABLE_SPLIT, rBoxes, *pTblNd, 0, 0, nCnt, bVert, bSameHeight ); @@ -2295,33 +2303,35 @@ BOOL SwDoc::SplitTbl( const SwSelBoxes& rBoxes, sal_Bool bVert, USHORT nCnt, } } - SwTableFmlUpdate aMsgHnt( &rTbl ); - aMsgHnt.eFlags = TBL_BOXPTR; - UpdateTblFlds( &aMsgHnt ); + bool bRet(false); + { + ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo()); - BOOL bRet; - if( bVert ) - bRet = rTbl.SplitCol( this, rBoxes, nCnt ); - else - bRet = rTbl.SplitRow( this, rBoxes, nCnt, bSameHeight ); + SwTableFmlUpdate aMsgHnt( &rTbl ); + aMsgHnt.eFlags = TBL_BOXPTR; + UpdateTblFlds( &aMsgHnt ); - if( bRet ) - { - SetModified(); - SetFieldsDirty( true, NULL, 0 ); + if (bVert) + bRet = rTbl.SplitCol( this, rBoxes, nCnt ); + else + bRet = rTbl.SplitRow( this, rBoxes, nCnt, bSameHeight ); + + if (bRet) + { + SetModified(); + SetFieldsDirty( true, NULL, 0 ); + } } - DoUndo( bDoUndo ); if( pUndo ) { if( bRet ) { - ClearRedo(); if( bVert ) pUndo->SaveNewBoxes( *pTblNd, aTmpLst ); else pUndo->SaveNewBoxes( *pTblNd, aTmpLst, rBoxes, aNdsCnts ); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } else delete pUndo; @@ -2350,7 +2360,7 @@ USHORT SwDoc::MergeTbl( SwPaM& rPam ) } // --> FME 2004-10-08 #i33394# - StartUndo( UNDO_TABLE_MERGE, NULL ); + GetIDocumentUndoRedo().StartUndo( UNDO_TABLE_MERGE, NULL ); // <-- #ifdef DEL_TABLE_REDLINES @@ -2360,9 +2370,9 @@ USHORT SwDoc::MergeTbl( SwPaM& rPam ) RedlineMode_t eOld = GetRedlineMode(); SetRedlineMode_intern((RedlineMode_t)(eOld | nsRedlineMode_t::REDLINE_IGNORE)); - SwUndoTblMerge* pUndo = 0; - if( DoesUndo() ) - pUndo = new SwUndoTblMerge( rPam ); + SwUndoTblMerge *const pUndo( (GetIDocumentUndoRedo().DoesUndo()) + ? new SwUndoTblMerge( rPam ) + : 0 ); // lasse ueber das Layout die Boxen suchen SwSelBoxes aBoxes; @@ -2375,13 +2385,19 @@ USHORT SwDoc::MergeTbl( SwPaM& rPam ) if( pUndo ) { delete pUndo; - if( UNDO_REDLINE == GetUndoIds(NULL, NULL) ) + SwUndoId nLastUndoId(UNDO_EMPTY); + if (GetIDocumentUndoRedo().GetLastUndoInfo(0, & nLastUndoId) + && (UNDO_REDLINE == nLastUndoId)) { - SwUndoRedline* pU = (SwUndoRedline*)RemoveLastUndo( UNDO_REDLINE ); + // FIXME: why is this horrible cleanup necessary? + SwUndoRedline *const pU = dynamic_cast<SwUndoRedline*>( + GetUndoManager().RemoveLastUndo()); if( pU->GetRedlSaveCount() ) { - SwUndoIter aUndoIter( &rPam, UNDO_REDLINE ); - pU->Undo( aUndoIter ); + SwEditShell *const pEditShell(GetEditShell(0)); + OSL_ASSERT(pEditShell); + ::sw::UndoRedoContext context(*this, *pEditShell); + static_cast<SfxUndoAction *>(pU)->UndoWithContext(context); } delete pU; } @@ -2418,7 +2434,9 @@ USHORT SwDoc::MergeTbl( SwPaM& rPam ) SetModified(); SetFieldsDirty( true, NULL, 0 ); if( pUndo ) - AppendUndo( pUndo ); + { + GetIDocumentUndoRedo().AppendUndo( pUndo ); + } } else if( pUndo ) delete pUndo; @@ -2429,7 +2447,7 @@ USHORT SwDoc::MergeTbl( SwPaM& rPam ) ::ClearFEShellTabCols(); SetRedlineMode_intern( eOld ); } - EndUndo( UNDO_TABLE_MERGE, NULL ); + GetIDocumentUndoRedo().EndUndo( UNDO_TABLE_MERGE, NULL ); return nRet; } @@ -2929,7 +2947,7 @@ void SwDoc::SetTabRows( const SwTabCols &rNew, BOOL bCurColOnly, const SwCursor* GetTabRows( aOld, 0, pBoxFrm ); - StartUndo( UNDO_TABLE_ATTR, NULL ); + GetIDocumentUndoRedo().StartUndo( UNDO_TABLE_ATTR, NULL ); // check for differences between aOld and rNew: const USHORT nCount = rNew.Count(); @@ -3012,7 +3030,7 @@ void SwDoc::SetTabRows( const SwTabCols &rNew, BOOL bCurColOnly, const SwCursor* } } - EndUndo( UNDO_TABLE_ATTR, NULL ); + GetIDocumentUndoRedo().EndUndo( UNDO_TABLE_ATTR, NULL ); ::ClearFEShellTabCols(); } @@ -3023,10 +3041,10 @@ void SwDoc::SetTabRows( const SwTabCols &rNew, BOOL bCurColOnly, const SwCursor* void SwDoc::SetTabCols(SwTable& rTab, const SwTabCols &rNew, const SwTabCols &rOld, const SwTableBox *pStart, BOOL bCurRowOnly ) { - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - ClearRedo(); - AppendUndo( new SwUndoAttrTbl( *rTab.GetTableNode(), TRUE )); + GetIDocumentUndoRedo().AppendUndo( + new SwUndoAttrTbl( *rTab.GetTableNode(), TRUE )); } rTab.SetTabCols( rNew, rOld, pStart, bCurRowOnly ); ::ClearFEShellTabCols(); @@ -3038,10 +3056,10 @@ void SwDoc::SetRowsToRepeat( SwTable &rTable, USHORT nSet ) if( nSet == rTable.GetRowsToRepeat() ) return; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - ClearRedo(); - AppendUndo( new SwUndoTblHeadline( rTable, rTable.GetRowsToRepeat() , nSet) ); + GetIDocumentUndoRedo().AppendUndo( + new SwUndoTblHeadline(rTable, rTable.GetRowsToRepeat(), nSet) ); } SwMsgPoolItem aChg( RES_TBLHEADLINECHG ); @@ -3249,8 +3267,10 @@ BOOL SwDoc::SplitTable( const SwPosition& rPos, USHORT eHdlnMode, SwTableFmlUpdate aMsgHnt( &rTbl ); SwHistory aHistory; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) + { aMsgHnt.pHistory = &aHistory; + } { ULONG nSttIdx = pNd->FindTableBoxStartNode()->GetIndex(); @@ -3287,10 +3307,11 @@ BOOL SwDoc::SplitTable( const SwPosition& rPos, USHORT eHdlnMode, { SwSaveRowSpan* pSaveRowSp = pNew->GetTable().CleanUpTopRowSpan( rTbl.GetTabLines().Count() ); SwUndoSplitTbl* pUndo = 0; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - ClearRedo(); - AppendUndo( pUndo = new SwUndoSplitTbl( *pNew, pSaveRowSp, eHdlnMode, bCalcNewSize )); + pUndo = new SwUndoSplitTbl( + *pNew, pSaveRowSp, eHdlnMode, bCalcNewSize); + GetIDocumentUndoRedo().AppendUndo(pUndo); if( aHistory.Count() ) pUndo->SaveFormula( aHistory ); } @@ -3612,11 +3633,10 @@ BOOL SwDoc::MergeTable( const SwPosition& rPos, BOOL bWithPrev, USHORT nMode ) // beide Tabellen vorhanden, also kanns losgehen SwUndoMergeTbl* pUndo = 0; SwHistory* pHistory = 0; - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - ClearRedo(); - AppendUndo( pUndo = new SwUndoMergeTbl( *pTblNd, *pDelTblNd, - bWithPrev, nMode )); + pUndo = new SwUndoMergeTbl( *pTblNd, *pDelTblNd, bWithPrev, nMode ); + GetIDocumentUndoRedo().AppendUndo(pUndo); pHistory = new SwHistory; } @@ -3873,11 +3893,12 @@ BOOL SwDoc::SetTableAutoFmt( const SwSelBoxes& rBoxes, const SwTableAutoFmt& rNe // Undo abschalten, Attribute werden sich vorher gemerkt SwUndoTblAutoFmt* pUndo = 0; - if( DoesUndo() ) + bool const bUndo(GetIDocumentUndoRedo().DoesUndo()); + if (bUndo) { - ClearRedo(); - AppendUndo( pUndo = new SwUndoTblAutoFmt( *pTblNd, rNew ) ); - DoUndo( FALSE ); + pUndo = new SwUndoTblAutoFmt( *pTblNd, rNew ); + GetIDocumentUndoRedo().AppendUndo(pUndo); + GetIDocumentUndoRedo().DoUndo(false); } _SetAFmtTabPara aPara( rNew ); @@ -3909,7 +3930,9 @@ BOOL SwDoc::SetTableAutoFmt( const SwSelBoxes& rBoxes, const SwTableAutoFmt& rNe } if( pUndo ) - DoUndo( TRUE ); + { + GetIDocumentUndoRedo().DoUndo(bUndo); + } SetModified(); SetFieldsDirty( true, NULL, 0 ); @@ -4062,6 +4085,7 @@ BOOL SwDoc::SetColRowWidthHeight( SwTableBox& rAktBox, USHORT eType, aMsgHnt.eFlags = TBL_BOXPTR; UpdateTblFlds( &aMsgHnt ); + bool const bUndo(GetIDocumentUndoRedo().DoesUndo()); BOOL bRet = FALSE; switch( eType & 0xff ) { @@ -4072,7 +4096,7 @@ BOOL SwDoc::SetColRowWidthHeight( SwTableBox& rAktBox, USHORT eType, { bRet = pTblNd->GetTable().SetColWidth( rAktBox, eType, nAbsDiff, nRelDiff, - DoesUndo() ? &pUndo : 0 ); + (bUndo) ? &pUndo : 0 ); } break; case nsTblChgWidthHeightType::WH_ROW_TOP: @@ -4081,15 +4105,14 @@ BOOL SwDoc::SetColRowWidthHeight( SwTableBox& rAktBox, USHORT eType, case nsTblChgWidthHeightType::WH_CELL_BOTTOM: bRet = pTblNd->GetTable().SetRowHeight( rAktBox, eType, nAbsDiff, nRelDiff, - DoesUndo() ? &pUndo : 0 ); + (bUndo) ? &pUndo : 0 ); break; } + GetIDocumentUndoRedo().DoUndo(bUndo); // SetColWidth can turn it off if( pUndo ) { - ClearRedo(); - AppendUndo( pUndo ); - DoUndo( TRUE ); // im SetColWidth kann es abgeschaltet werden! + GetIDocumentUndoRedo().AppendUndo( pUndo ); } if( bRet ) @@ -4123,9 +4146,9 @@ void SwDoc::ChkBoxNumFmt( SwTableBox& rBox, BOOL bCallUpdate ) bChgd = FALSE; else { - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - StartUndo( UNDO_TABLE_AUTOFMT, NULL ); + GetIDocumentUndoRedo().StartUndo( UNDO_TABLE_AUTOFMT, NULL ); pUndo = new SwUndoTblNumFmt( rBox ); pUndo->SetNumFmt( nFmtIdx, fNumber ); } @@ -4198,9 +4221,9 @@ void SwDoc::ChkBoxNumFmt( SwTableBox& rBox, BOOL bCallUpdate ) SFX_ITEM_SET == pBoxFmt->GetItemState( RES_BOXATR_VALUE, FALSE, &pValueItem )) { - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - StartUndo( UNDO_TABLE_AUTOFMT, NULL ); + GetIDocumentUndoRedo().StartUndo( UNDO_TABLE_AUTOFMT, NULL ); pUndo = new SwUndoTblNumFmt( rBox ); } @@ -4231,8 +4254,8 @@ void SwDoc::ChkBoxNumFmt( SwTableBox& rBox, BOOL bCallUpdate ) if( pUndo ) { pUndo->SetBox( rBox ); - AppendUndo( pUndo ); - EndUndo( UNDO_END, NULL ); + GetIDocumentUndoRedo().AppendUndo(pUndo); + GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL ); } const SwTableNode* pTblNd = rBox.GetSttNd()->FindTableNode(); @@ -4252,10 +4275,9 @@ void SwDoc::ChkBoxNumFmt( SwTableBox& rBox, BOOL bCallUpdate ) void SwDoc::SetTblBoxFormulaAttrs( SwTableBox& rBox, const SfxItemSet& rSet ) { - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - ClearRedo(); - AppendUndo( new SwUndoTblNumFmt( rBox, &rSet ) ); + GetIDocumentUndoRedo().AppendUndo( new SwUndoTblNumFmt(rBox, &rSet) ); } SwFrmFmt* pBoxFmt = rBox.ClaimFrmFmt(); @@ -4278,7 +4300,7 @@ void SwDoc::SetTblBoxFormulaAttrs( SwTableBox& rBox, const SfxItemSet& rSet ) void SwDoc::ClearBoxNumAttrs( const SwNodeIndex& rNode ) { SwStartNode* pSttNd; - if( 0 != ( pSttNd = GetNodes()[ rNode ]-> + if( 0 != ( pSttNd = rNode.GetNode(). FindSttNodeByType( SwTableBoxStartNode )) && 2 == pSttNd->EndOfSectionIndex() - pSttNd->GetIndex() ) { @@ -4291,10 +4313,9 @@ void SwDoc::ClearBoxNumAttrs( const SwNodeIndex& rNode ) SFX_ITEM_SET == rSet.GetItemState( RES_BOXATR_FORMULA, FALSE ) || SFX_ITEM_SET == rSet.GetItemState( RES_BOXATR_VALUE, FALSE )) { - if( DoesUndo() ) + if (GetIDocumentUndoRedo().DoesUndo()) { - ClearRedo(); - AppendUndo( new SwUndoTblNumFmt( *pBox ) ); + GetIDocumentUndoRedo().AppendUndo(new SwUndoTblNumFmt(*pBox)); } SwFrmFmt* pBoxFmt = pBox->ClaimFrmFmt(); @@ -4331,32 +4352,38 @@ BOOL SwDoc::InsCopyOfTbl( SwPosition& rInsPos, const SwSelBoxes& rBoxes, ? pCpyTbl->GetTableNode() : rBoxes[ 0 ]->GetSttNd()->FindTableNode(); - SwTableNode* pInsTblNd = GetNodes()[ rInsPos.nNode ]->FindTableNode(); + SwTableNode * pInsTblNd = rInsPos.nNode.GetNode().FindTableNode(); + bool const bUndo( GetIDocumentUndoRedo().DoesUndo() ); if( !pCpyTbl && !pInsTblNd ) { SwUndoCpyTbl* pUndo = 0; - if( DoesUndo() ) + if (bUndo) { - ClearRedo(); + GetIDocumentUndoRedo().ClearRedo(); pUndo = new SwUndoCpyTbl; - DoUndo( FALSE ); } - bRet = pSrcTblNd->GetTable().MakeCopy( this, rInsPos, rBoxes, + { + ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo()); + bRet = pSrcTblNd->GetTable().MakeCopy( this, rInsPos, rBoxes, TRUE, bCpyName ); + } + if( pUndo ) { if( !bRet ) + { delete pUndo; + pUndo = 0; + } else { pInsTblNd = GetNodes()[ rInsPos.nNode.GetIndex() - 1 ]->FindTableNode(); pUndo->SetTableSttIdx( pInsTblNd->GetIndex() ); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } - DoUndo( TRUE ); } } else @@ -4368,11 +4395,11 @@ BOOL SwDoc::InsCopyOfTbl( SwPosition& rInsPos, const SwSelBoxes& rBoxes, nsRedlineMode_t::REDLINE_SHOW_DELETE)); SwUndoTblCpyTbl* pUndo = 0; - if( DoesUndo() ) + if (bUndo) { - ClearRedo(); + GetIDocumentUndoRedo().ClearRedo(); pUndo = new SwUndoTblCpyTbl; - DoUndo( FALSE ); + GetIDocumentUndoRedo().DoUndo(false); } SwDoc* pCpyDoc = (SwDoc*)pSrcTblNd->GetDoc(); @@ -4392,8 +4419,9 @@ BOOL SwDoc::InsCopyOfTbl( SwPosition& rInsPos, const SwSelBoxes& rBoxes, if( pUndo ) { - DoUndo( TRUE ); + GetIDocumentUndoRedo().DoUndo(bUndo); delete pUndo; + pUndo = 0; } return FALSE; } @@ -4445,11 +4473,13 @@ BOOL SwDoc::InsCopyOfTbl( SwPosition& rInsPos, const SwSelBoxes& rBoxes, { // falls die Tabelle nicht kopiert werden konnte, das Undo-Object // wieder loeschen + GetIDocumentUndoRedo().DoUndo(bUndo); if( !bRet && pUndo->IsEmpty() ) delete pUndo; else - AppendUndo( pUndo ); - DoUndo( TRUE ); + { + GetIDocumentUndoRedo().AppendUndo(pUndo); + } } if( bCorrPos ) @@ -4473,8 +4503,9 @@ BOOL SwDoc::InsCopyOfTbl( SwPosition& rInsPos, const SwSelBoxes& rBoxes, BOOL SwDoc::_UnProtectTblCells( SwTable& rTbl ) { BOOL bChgd = FALSE; - SwUndoAttrTbl* pUndo = DoesUndo() ? new SwUndoAttrTbl( *rTbl.GetTableNode() ) - : 0; + SwUndoAttrTbl *const pUndo = (GetIDocumentUndoRedo().DoesUndo()) + ? new SwUndoAttrTbl( *rTbl.GetTableNode() ) + : 0; SwTableSortBoxes& rSrtBox = rTbl.GetTabSortBoxes(); for( USHORT i = rSrtBox.Count(); i; ) @@ -4491,8 +4522,7 @@ BOOL SwDoc::_UnProtectTblCells( SwTable& rTbl ) { if( bChgd ) { - ClearRedo(); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } else delete pUndo; @@ -4520,7 +4550,7 @@ BOOL SwDoc::UnProtectCells( const SwSelBoxes& rBoxes ) BOOL bChgd = FALSE; if( rBoxes.Count() ) { - SwUndoAttrTbl* pUndo = DoesUndo() + SwUndoAttrTbl *const pUndo = (GetIDocumentUndoRedo().DoesUndo()) ? new SwUndoAttrTbl( *rBoxes[0]->GetSttNd()->FindTableNode() ) : 0; @@ -4549,8 +4579,7 @@ BOOL SwDoc::UnProtectCells( const SwSelBoxes& rBoxes ) { if( bChgd ) { - ClearRedo(); - AppendUndo( pUndo ); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } else delete pUndo; @@ -4561,7 +4590,7 @@ BOOL SwDoc::UnProtectCells( const SwSelBoxes& rBoxes ) BOOL SwDoc::UnProtectTbls( const SwPaM& rPam ) { - StartUndo(UNDO_EMPTY, NULL); + GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL); BOOL bChgd = FALSE, bHasSel = rPam.HasMark() || rPam.GetNext() != (SwPaM*)&rPam; @@ -4595,7 +4624,7 @@ BOOL SwDoc::UnProtectTbls( const SwPaM& rPam ) bChgd |= _UnProtectTblCells( *pTbl ); } - EndUndo(UNDO_EMPTY, NULL); + GetIDocumentUndoRedo().EndUndo(UNDO_EMPTY, NULL); if( bChgd ) SetModified(); |