diff options
author | Oliver-Rainer Wittmann <orw@apache.org> | 2014-02-27 14:00:06 +0000 |
---|---|---|
committer | Oliver-Rainer Wittmann <orw@apache.org> | 2014-02-27 14:00:06 +0000 |
commit | e8613c7e3b76a83d804d28199fdeacc6369569c6 (patch) | |
tree | eaaa437ce8b7c63ec9d814c6c295336fd203e4a2 /sw | |
parent | 9956ed1303545cd61901e33b110698c4e5e224c4 (diff) |
123480: assure correct Undo/Redo with not shown tracked changes
Notes
Notes:
merged as: 22aea93d508d8051a5f5d1a472874ba4eca2f296
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/doc/docedt.cxx | 48 | ||||
-rw-r--r-- | sw/source/core/doc/docredln.cxx | 16 | ||||
-rw-r--r-- | sw/source/core/edit/edundo.cxx | 2 | ||||
-rw-r--r-- | sw/source/core/inc/UndoRedline.hxx | 10 | ||||
-rw-r--r-- | sw/source/core/undo/undobj.cxx | 97 | ||||
-rw-r--r-- | sw/source/core/undo/unredln.cxx | 54 |
6 files changed, 120 insertions, 107 deletions
diff --git a/sw/source/core/doc/docedt.cxx b/sw/source/core/doc/docedt.cxx index fa42f2d49ceb..d8f10087666a 100644 --- a/sw/source/core/doc/docedt.cxx +++ b/sw/source/core/doc/docedt.cxx @@ -1561,50 +1561,48 @@ bool SwDoc::DeleteAndJoinWithRedlineImpl( SwPaM & rPam, const bool ) { SwUndoRedlineDelete* pUndo = 0; RedlineMode_t eOld = GetRedlineMode(); - checkRedlining(eOld); + checkRedlining( eOld ); if (GetIDocumentUndoRedo().DoesUndo()) { - //JP 06.01.98: MUSS noch optimiert werden!!! - SetRedlineMode( - (RedlineMode_t)(nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE )); + //JP 06.01.98: MUSS noch optimiert werden!!! + SetRedlineMode( + (RedlineMode_t) ( nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE ) ); - GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL); + GetIDocumentUndoRedo().StartUndo( UNDO_DELETE, NULL ); pUndo = new SwUndoRedlineDelete( rPam, UNDO_DELETE ); - GetIDocumentUndoRedo().AppendUndo(pUndo); + GetIDocumentUndoRedo().AppendUndo( pUndo ); } - if( *rPam.GetPoint() != *rPam.GetMark() ) - AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_DELETE, rPam ), true); + + if ( *rPam.GetPoint() != *rPam.GetMark() ) + AppendRedline( new SwRedline( nsRedlineType_t::REDLINE_DELETE, rPam ), true ); SetModified(); - if( pUndo ) + if ( pUndo ) { - GetIDocumentUndoRedo().EndUndo(UNDO_EMPTY, NULL); + GetIDocumentUndoRedo().EndUndo( UNDO_EMPTY, NULL ); // ??? why the hell is the AppendUndo not below the // CanGrouping, so this hideous cleanup wouldn't be necessary? // bah, this is redlining, probably changing this would break it... - if (GetIDocumentUndoRedo().DoesGroupUndo()) + if ( GetIDocumentUndoRedo().DoesGroupUndo() ) { - SwUndo *const pLastUndo( GetUndoManager().GetLastUndo() ); - SwUndoRedlineDelete *const pUndoRedlineDel( - dynamic_cast<SwUndoRedlineDelete*>(pLastUndo) ); - if (pUndoRedlineDel) + SwUndo * const pLastUndo( GetUndoManager().GetLastUndo() ); + SwUndoRedlineDelete * const pUndoRedlineDel( dynamic_cast< SwUndoRedlineDelete* >( pLastUndo ) ); + if ( pUndoRedlineDel ) { - bool const bMerged = pUndoRedlineDel->CanGrouping(*pUndo); - if (bMerged) + bool const bMerged = pUndoRedlineDel->CanGrouping( *pUndo ); + if ( bMerged ) { - ::sw::UndoGuard const undoGuard(GetIDocumentUndoRedo()); - SwUndo const*const pDeleted = - GetUndoManager().RemoveLastUndo(); - OSL_ENSURE(pDeleted == pUndo, - "DeleteAndJoinWithRedlineImpl: " - "undo removed is not undo inserted?"); + ::sw::UndoGuard const undoGuard( GetIDocumentUndoRedo() ); + SwUndo const* const pDeleted = GetUndoManager().RemoveLastUndo(); + OSL_ENSURE( pDeleted == pUndo, "DeleteAndJoinWithRedlineImpl: " + "undo removed is not undo inserted?" ); delete pDeleted; } } } -//JP 06.01.98: MUSS noch optimiert werden!!! -SetRedlineMode( eOld ); + //JP 06.01.98: MUSS noch optimiert werden!!! + SetRedlineMode( eOld ); } return true; } diff --git a/sw/source/core/doc/docredln.cxx b/sw/source/core/doc/docredln.cxx index cffb44f2c4cb..29861ad4be7d 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -3013,12 +3013,16 @@ SwRedlineData::SwRedlineData( RedlineType_t eT, sal_uInt16 nAut ) aStamp.Set100Sec( 0 ); } -SwRedlineData::SwRedlineData( const SwRedlineData& rCpy, sal_Bool bCpyNext ) - : - pNext( (bCpyNext && rCpy.pNext) ? new SwRedlineData( *rCpy.pNext ) : 0 ), - pExtraData( rCpy.pExtraData ? rCpy.pExtraData->CreateNew() : 0 ), - sComment( rCpy.sComment ), aStamp( rCpy.aStamp ), eType( rCpy.eType ), - nAuthor( rCpy.nAuthor ), nSeqNo( rCpy.nSeqNo ) +SwRedlineData::SwRedlineData( + const SwRedlineData& rCpy, + sal_Bool bCpyNext ) + : pNext( ( bCpyNext && rCpy.pNext ) ? new SwRedlineData( *rCpy.pNext ) : 0 ) + , pExtraData( rCpy.pExtraData ? rCpy.pExtraData->CreateNew() : 0 ) + , sComment( rCpy.sComment ) + , aStamp( rCpy.aStamp ) + , eType( rCpy.eType ) + , nAuthor( rCpy.nAuthor ) + , nSeqNo( rCpy.nSeqNo ) { } diff --git a/sw/source/core/edit/edundo.cxx b/sw/source/core/edit/edundo.cxx index db8f9d31839f..045c6988a830 100644 --- a/sw/source/core/edit/edundo.cxx +++ b/sw/source/core/edit/edundo.cxx @@ -125,7 +125,7 @@ bool SwEditShell::Undo(sal_uInt16 const nCount) // Erkennung darf nur noch fuer die neue "Box" erfolgen! ClearTblBoxCntnt(); - RedlineMode_t eOld = GetDoc()->GetRedlineMode(); + const RedlineMode_t eOld = GetDoc()->GetRedlineMode(); try { for (sal_uInt16 i = 0; i < nCount; ++i) diff --git a/sw/source/core/inc/UndoRedline.hxx b/sw/source/core/inc/UndoRedline.hxx index 95c07f4cda0b..a531dc6a24e2 100644 --- a/sw/source/core/inc/UndoRedline.hxx +++ b/sw/source/core/inc/UndoRedline.hxx @@ -38,10 +38,10 @@ class SwUndoDelete; class SwUndoRedline : public SwUndo, public SwUndRng { protected: - SwRedlineData* pRedlData; - SwRedlineSaveDatas* pRedlSaveData; - SwUndoId nUserId; - sal_Bool bHiddenRedlines; + SwRedlineData* mpRedlData; + SwRedlineSaveDatas* mpRedlSaveData; + SwUndoId mnUserId; + sal_Bool mbHiddenRedlines; virtual void UndoRedlineImpl(SwDoc & rDoc, SwPaM & rPam); virtual void RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam); @@ -54,7 +54,7 @@ public: virtual void UndoImpl( ::sw::UndoRedoContext & ); virtual void RedoImpl( ::sw::UndoRedoContext & ); - SwUndoId GetUserId() const { return nUserId; } + SwUndoId GetUserId() const { return mnUserId; } sal_uInt16 GetRedlSaveCount() const; }; diff --git a/sw/source/core/undo/undobj.cxx b/sw/source/core/undo/undobj.cxx index b6b40756ebe3..fd6e3765079b 100644 --- a/sw/source/core/undo/undobj.cxx +++ b/sw/source/core/undo/undobj.cxx @@ -47,17 +47,23 @@ #include <comcore.hrc> #include <docsh.hxx> -class SwRedlineSaveData : public SwUndRng, public SwRedlineData, - private SwUndoSaveSection +class SwRedlineSaveData: public SwUndRng, public SwRedlineData, private SwUndoSaveSection { public: - SwRedlineSaveData( SwComparePosition eCmpPos, - const SwPosition& rSttPos, const SwPosition& rEndPos, - SwRedline& rRedl, sal_Bool bCopyNext ); + SwRedlineSaveData( + SwComparePosition eCmpPos, + const SwPosition& rSttPos, + const SwPosition& rEndPos, + SwRedline& rRedl ); + ~SwRedlineSaveData(); + void RedlineToDoc( SwPaM& rPam ); + SwNodeIndex* GetMvSttIdx() const - { return SwUndoSaveSection::GetMvSttIdx(); } + { + return SwUndoSaveSection::GetMvSttIdx(); + } #ifdef DBG_UTIL sal_uInt16 nRedlineCount; @@ -246,7 +252,7 @@ void SwUndo::UndoWithContext(SfxUndoContext & rContext) dynamic_cast< ::sw::UndoRedoContext * >(& rContext)); OSL_ASSERT(pContext); if (!pContext) { return; } - UndoRedoRedlineGuard(*pContext, *this); + const UndoRedoRedlineGuard aUndoRedoRedlineGuard(*pContext, *this); UndoImpl(*pContext); } @@ -256,7 +262,7 @@ void SwUndo::RedoWithContext(SfxUndoContext & rContext) dynamic_cast< ::sw::UndoRedoContext * >(& rContext)); OSL_ASSERT(pContext); if (!pContext) { return; } - UndoRedoRedlineGuard(*pContext, *this); + const UndoRedoRedlineGuard aUndoRedoRedlineGuard(*pContext, *this); RedoImpl(*pContext); } @@ -990,18 +996,17 @@ void SwUndoSaveSection::RestoreSection( SwDoc* pDoc, const SwNodeIndex& rInsPos // sicher und setze die RedlineDaten -SwRedlineSaveData::SwRedlineSaveData( SwComparePosition eCmpPos, - const SwPosition& rSttPos, - const SwPosition& rEndPos, - SwRedline& rRedl, - sal_Bool bCopyNext ) - : SwUndRng( rRedl ), - SwRedlineData( rRedl.GetRedlineData(), bCopyNext ) +SwRedlineSaveData::SwRedlineSaveData( + SwComparePosition eCmpPos, + const SwPosition& rSttPos, + const SwPosition& rEndPos, + SwRedline& rRedl ) + : SwUndRng( rRedl ) + , SwRedlineData( rRedl.GetRedlineData(), sal_True ) { - ASSERT( POS_OUTSIDE == eCmpPos || - !rRedl.GetContentIdx(), "Redline mit Content" ); + ASSERT( POS_OUTSIDE == eCmpPos || !rRedl.GetContentIdx(), "Redline mit Content" ); - switch( eCmpPos ) + switch (eCmpPos) { case POS_OVERLAP_BEFORE: // Pos1 ueberlappt Pos2 am Anfang nEndNode = rEndPos.nNode.GetIndex(); @@ -1020,7 +1025,7 @@ SwRedlineSaveData::SwRedlineSaveData( SwComparePosition eCmpPos, break; case POS_OUTSIDE: // Pos2 liegt vollstaendig in Pos1 - if( rRedl.GetContentIdx() ) + if ( rRedl.GetContentIdx() ) { // dann den Bereich ins UndoArray verschieben und merken SaveSection( rRedl.GetDoc(), *rRedl.GetContentIdx() ); @@ -1078,39 +1083,48 @@ void SwRedlineSaveData::RedlineToDoc( SwPaM& rPam ) rDoc.SetRedlineMode_intern( eOld ); } -sal_Bool SwUndo::FillSaveData( const SwPaM& rRange, SwRedlineSaveDatas& rSData, - sal_Bool bDelRange, sal_Bool bCopyNext ) +sal_Bool SwUndo::FillSaveData( + const SwPaM& rRange, + SwRedlineSaveDatas& rSData, + sal_Bool bDelRange, + sal_Bool bCopyNext ) { - if( rSData.Count() ) + if ( rSData.Count() ) + { rSData.DeleteAndDestroy( 0, rSData.Count() ); + } SwRedlineSaveData* pNewData; - const SwPosition *pStt = rRange.Start(), *pEnd = rRange.End(); + const SwPosition* pStt = rRange.Start(); + const SwPosition* pEnd = rRange.End(); const SwRedlineTbl& rTbl = rRange.GetDoc()->GetRedlineTbl(); sal_uInt16 n = 0; rRange.GetDoc()->GetRedline( *pStt, &n ); - for( ; n < rTbl.Count(); ++n ) + for ( ; n < rTbl.Count(); ++n ) { - SwRedline* pRedl = rTbl[ n ]; - const SwPosition *pRStt = pRedl->Start(), *pREnd = pRedl->End(); - - SwComparePosition eCmpPos = ComparePosition( *pStt, *pEnd, *pRStt, *pREnd ); - if( POS_BEFORE != eCmpPos && POS_BEHIND != eCmpPos && - POS_COLLIDE_END != eCmpPos && POS_COLLIDE_START != eCmpPos ) + SwRedline* pRedl = rTbl[n]; + const SwComparePosition eCmpPos = + ComparePosition( *pStt, *pEnd, *pRedl->Start(), *pRedl->End() ); + if ( eCmpPos != POS_BEFORE + && eCmpPos != POS_BEHIND + && eCmpPos != POS_COLLIDE_END + && eCmpPos != POS_COLLIDE_START ) { - pNewData = new SwRedlineSaveData( eCmpPos, *pStt, *pEnd, - *pRedl, bCopyNext ); + pNewData = new SwRedlineSaveData( eCmpPos, *pStt, *pEnd, *pRedl ); rSData.Insert( pNewData, rSData.Count() ); } } - if( rSData.Count() && bDelRange ) + + if ( rSData.Count() && bDelRange ) rRange.GetDoc()->DeleteRedline( rRange, false, USHRT_MAX ); return 0 != rSData.Count(); } -sal_Bool SwUndo::FillSaveDataForFmt( const SwPaM& rRange, SwRedlineSaveDatas& rSData ) +sal_Bool SwUndo::FillSaveDataForFmt( + const SwPaM& rRange, + SwRedlineSaveDatas& rSData ) { - if( rSData.Count() ) + if ( rSData.Count() ) rSData.DeleteAndDestroy( 0, rSData.Count() ); SwRedlineSaveData* pNewData; @@ -1118,23 +1132,20 @@ sal_Bool SwUndo::FillSaveDataForFmt( const SwPaM& rRange, SwRedlineSaveDatas& rS const SwRedlineTbl& rTbl = rRange.GetDoc()->GetRedlineTbl(); sal_uInt16 n = 0; rRange.GetDoc()->GetRedline( *pStt, &n ); - for( ; n < rTbl.Count(); ++n ) + for ( ; n < rTbl.Count(); ++n ) { - SwRedline* pRedl = rTbl[ n ]; - if( nsRedlineType_t::REDLINE_FORMAT == pRedl->GetType() ) + SwRedline* pRedl = rTbl[n]; + if ( nsRedlineType_t::REDLINE_FORMAT == pRedl->GetType() ) { const SwPosition *pRStt = pRedl->Start(), *pREnd = pRedl->End(); SwComparePosition eCmpPos = ComparePosition( *pStt, *pEnd, *pRStt, *pREnd ); - if( POS_BEFORE != eCmpPos && POS_BEHIND != eCmpPos && - POS_COLLIDE_END != eCmpPos && POS_COLLIDE_START != eCmpPos ) + if ( POS_BEFORE != eCmpPos && POS_BEHIND != eCmpPos && POS_COLLIDE_END != eCmpPos && POS_COLLIDE_START != eCmpPos ) { - pNewData = new SwRedlineSaveData( eCmpPos, *pStt, *pEnd, - *pRedl, sal_True ); + pNewData = new SwRedlineSaveData( eCmpPos, *pStt, *pEnd, *pRedl ); rSData.Insert( pNewData, rSData.Count() ); } - } } return 0 != rSData.Count(); diff --git a/sw/source/core/undo/unredln.cxx b/sw/source/core/undo/unredln.cxx index 779cd2c827b4..1b00bb2c5d53 100644 --- a/sw/source/core/undo/unredln.cxx +++ b/sw/source/core/undo/unredln.cxx @@ -46,18 +46,18 @@ extern void lcl_GetJoinFlags( SwPaM& rPam, sal_Bool& rJoinTxt, sal_Bool& rJoinPr SwUndoRedline::SwUndoRedline( SwUndoId nUsrId, const SwPaM& rRange ) : SwUndo( UNDO_REDLINE ), SwUndRng( rRange ), - pRedlData( 0 ), pRedlSaveData( 0 ), nUserId( nUsrId ), - bHiddenRedlines( sal_False ) + mpRedlData( 0 ), mpRedlSaveData( 0 ), mnUserId( nUsrId ), + mbHiddenRedlines( sal_False ) { // Redline beachten SwDoc& rDoc = *rRange.GetDoc(); if( rDoc.IsRedlineOn() ) { - switch( nUserId ) + switch( mnUserId ) { case UNDO_DELETE: case UNDO_REPLACE: - pRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_DELETE, rDoc.GetRedlineAuthor() ); + mpRedlData = new SwRedlineData( nsRedlineType_t::REDLINE_DELETE, rDoc.GetRedlineAuthor() ); break; default: ; @@ -67,14 +67,14 @@ SwUndoRedline::SwUndoRedline( SwUndoId nUsrId, const SwPaM& rRange ) sal_uLong nEndExtra = rDoc.GetNodes().GetEndOfExtras().GetIndex(); - pRedlSaveData = new SwRedlineSaveDatas; - if( !FillSaveData( rRange, *pRedlSaveData, sal_False, - UNDO_REJECT_REDLINE != nUserId )) - delete pRedlSaveData, pRedlSaveData = 0; + mpRedlSaveData = new SwRedlineSaveDatas; + if( !FillSaveData( rRange, *mpRedlSaveData, sal_False, + UNDO_REJECT_REDLINE != mnUserId )) + delete mpRedlSaveData, mpRedlSaveData = 0; else { - bHiddenRedlines = HasHiddenRedlines( *pRedlSaveData ); - if( bHiddenRedlines ) // dann muessen die NodeIndizies + mbHiddenRedlines = HasHiddenRedlines( *mpRedlSaveData ); + if( mbHiddenRedlines ) // dann muessen die NodeIndizies { // vom SwUndRng korrigiert werden nEndExtra -= rDoc.GetNodes().GetEndOfExtras().GetIndex(); nSttNode -= nEndExtra; @@ -85,13 +85,13 @@ SwUndoRedline::SwUndoRedline( SwUndoId nUsrId, const SwPaM& rRange ) SwUndoRedline::~SwUndoRedline() { - delete pRedlData; - delete pRedlSaveData; + delete mpRedlData; + delete mpRedlSaveData; } sal_uInt16 SwUndoRedline::GetRedlSaveCount() const { - return pRedlSaveData ? pRedlSaveData->Count() : 0; + return mpRedlSaveData ? mpRedlSaveData->Count() : 0; } @@ -102,13 +102,13 @@ void SwUndoRedline::UndoImpl(::sw::UndoRedoContext & rContext) UndoRedlineImpl(*pDoc, rPam); - if( pRedlSaveData ) + if( mpRedlSaveData ) { sal_uLong nEndExtra = pDoc->GetNodes().GetEndOfExtras().GetIndex(); - SetSaveData( *pDoc, *pRedlSaveData ); - if( bHiddenRedlines ) + SetSaveData( *pDoc, *mpRedlSaveData ); + if( mbHiddenRedlines ) { - pRedlSaveData->DeleteAndDestroy( 0, pRedlSaveData->Count() ); + mpRedlSaveData->DeleteAndDestroy( 0, mpRedlSaveData->Count() ); nEndExtra = pDoc->GetNodes().GetEndOfExtras().GetIndex() - nEndExtra; nSttNode += nEndExtra; @@ -126,11 +126,11 @@ void SwUndoRedline::RedoImpl(::sw::UndoRedoContext & rContext) pDoc->SetRedlineMode_intern((RedlineMode_t)(( eOld & ~nsRedlineMode_t::REDLINE_IGNORE) | nsRedlineMode_t::REDLINE_ON )); SwPaM & rPam( AddUndoRedoPaM(rContext) ); - if( pRedlSaveData && bHiddenRedlines ) + if( mpRedlSaveData && mbHiddenRedlines ) { sal_uLong nEndExtra = pDoc->GetNodes().GetEndOfExtras().GetIndex(); - FillSaveData(rPam, *pRedlSaveData, sal_False, - UNDO_REJECT_REDLINE != nUserId ); + FillSaveData(rPam, *mpRedlSaveData, sal_False, + UNDO_REJECT_REDLINE != mnUserId ); nEndExtra -= pDoc->GetNodes().GetEndOfExtras().GetIndex(); nSttNode -= nEndExtra; @@ -161,7 +161,7 @@ SwUndoRedlineDelete::SwUndoRedlineDelete( const SwPaM& rRange, SwUndoId nUsrId ) bCanGroup( sal_False ), bIsDelim( sal_False ), bIsBackspace( sal_False ) { const SwTxtNode* pTNd; - if( UNDO_DELETE == nUserId && + if( UNDO_DELETE == mnUserId && nSttNode == nEndNode && nSttCntnt + 1 == nEndCntnt && 0 != (pTNd = rRange.GetNode()->GetTxtNode()) ) { @@ -187,14 +187,14 @@ void SwUndoRedlineDelete::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) { if (rPam.GetPoint() != rPam.GetMark()) { - rDoc.AppendRedline( new SwRedline(*pRedlData, rPam), sal_False ); + rDoc.AppendRedline( new SwRedline(*mpRedlData, rPam), sal_False ); } } sal_Bool SwUndoRedlineDelete::CanGrouping( const SwUndoRedlineDelete& rNext ) { sal_Bool bRet = sal_False; - if( UNDO_DELETE == nUserId && nUserId == rNext.nUserId && + if( UNDO_DELETE == mnUserId && mnUserId == rNext.mnUserId && bCanGroup == rNext.bCanGroup && bIsDelim == rNext.bIsDelim && bIsBackspace == rNext.bIsBackspace && @@ -209,10 +209,10 @@ sal_Bool SwUndoRedlineDelete::CanGrouping( const SwUndoRedlineDelete& rNext ) bIsEnd = -1; if( bIsEnd && - (( !pRedlSaveData && !rNext.pRedlSaveData ) || - ( pRedlSaveData && rNext.pRedlSaveData && - SwUndo::CanRedlineGroup( *pRedlSaveData, - *rNext.pRedlSaveData, 1 != bIsEnd ) + (( !mpRedlSaveData && !rNext.mpRedlSaveData ) || + ( mpRedlSaveData && rNext.mpRedlSaveData && + SwUndo::CanRedlineGroup( *mpRedlSaveData, + *rNext.mpRedlSaveData, 1 != bIsEnd ) ))) { if( 1 == bIsEnd ) |