diff options
author | Oliver-Rainer Wittmann <orw@apache.org> | 2014-02-27 14:00:06 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2014-02-28 11:38:30 +0000 |
commit | 22aea93d508d8051a5f5d1a472874ba4eca2f296 (patch) | |
tree | 80e36dd8631a7b87a884be7daeb4ddb1cd6e3c50 /sw | |
parent | 0e39eba09b87249431c0d105f4618337ae1895fe (diff) |
Related: #i123480# assure correct Undo/Redo with not shown tracked changes
(cherry picked from commit e8613c7e3b76a83d804d28199fdeacc6369569c6)
Conflicts:
sw/source/core/doc/docedt.cxx
sw/source/core/undo/undobj.cxx
sw/source/core/undo/unredln.cxx
Change-Id: I45c25aa957995109b202e2130e5344b1bbb09669
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/doc/docedt.cxx | 52 | ||||
-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 | 84 | ||||
-rw-r--r-- | sw/source/core/undo/unredln.cxx | 54 |
6 files changed, 115 insertions, 103 deletions
diff --git a/sw/source/core/doc/docedt.cxx b/sw/source/core/doc/docedt.cxx index 801593dd856a..aa10b740ff82 100644 --- a/sw/source/core/doc/docedt.cxx +++ b/sw/source/core/doc/docedt.cxx @@ -1480,52 +1480,50 @@ bool SwDoc::DeleteAndJoinWithRedlineImpl( SwPaM & rPam, const bool ) { SwUndoRedlineDelete* pUndo = 0; RedlineMode_t eOld = GetRedlineMode(); - checkRedlining(eOld); + checkRedlining( eOld ); if (GetIDocumentUndoRedo().DoesUndo()) { - /* please don't translate -- for cultural reasons this comment is protected - until the redline implementation is finally fixed some day */ -//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 )); + /* please don't translate -- for cultural reasons this comment is protected + until the redline implementation is finally fixed some day */ + //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 SwRangeRedline( nsRedlineType_t::REDLINE_DELETE, rPam ), true); + + if ( *rPam.GetPoint() != *rPam.GetMark() ) + AppendRedline( new SwRangeRedline( 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 3ea13c0cba7d..8b93c4f8a56a 100644 --- a/sw/source/core/doc/docredln.cxx +++ b/sw/source/core/doc/docredln.cxx @@ -3079,12 +3079,16 @@ SwRedlineData::SwRedlineData( RedlineType_t eT, sal_uInt16 nAut ) aStamp.SetNanoSec( 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 4fa0ceef53be..266828abf5ba 100644 --- a/sw/source/core/edit/edundo.cxx +++ b/sw/source/core/edit/edundo.cxx @@ -121,7 +121,7 @@ bool SwEditShell::Undo(sal_uInt16 const nCount) // Destroy stored TableBoxPtr. A dection is only permitted for the new "Box"! 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 946e41078e9f..0a943276d98f 100644 --- a/sw/source/core/inc/UndoRedline.hxx +++ b/sw/source/core/inc/UndoRedline.hxx @@ -30,10 +30,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); @@ -46,7 +46,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 d1fcd03f5ab0..9f45a4a2a989 100644 --- a/sw/source/core/undo/undobj.cxx +++ b/sw/source/core/undo/undobj.cxx @@ -39,17 +39,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, - SwRangeRedline& rRedl, sal_Bool bCopyNext ); + SwRedlineSaveData( + SwComparePosition eCmpPos, + const SwPosition& rSttPos, + const SwPosition& rEndPos, + SwRangeRedline& rRedl ); + ~SwRedlineSaveData(); + void RedlineToDoc( SwPaM& rPam ); + SwNodeIndex* GetMvSttIdx() const - { return SwUndoSaveSection::GetMvSttIdx(); } + { + return SwUndoSaveSection::GetMvSttIdx(); + } #if OSL_DEBUG_LEVEL > 0 sal_uInt16 nRedlineCount; @@ -226,7 +232,7 @@ void SwUndo::UndoWithContext(SfxUndoContext & rContext) dynamic_cast< ::sw::UndoRedoContext * >(& rContext)); assert(pContext); if (!pContext) { return; } - UndoRedoRedlineGuard const g(*pContext, *this); + const UndoRedoRedlineGuard aUndoRedoRedlineGuard(*pContext, *this); UndoImpl(*pContext); } @@ -236,7 +242,7 @@ void SwUndo::RedoWithContext(SfxUndoContext & rContext) dynamic_cast< ::sw::UndoRedoContext * >(& rContext)); assert(pContext); if (!pContext) { return; } - UndoRedoRedlineGuard const g(*pContext, *this); + const UndoRedoRedlineGuard aUndoRedoRedlineGuard(*pContext, *this); RedoImpl(*pContext); } @@ -903,18 +909,18 @@ void SwUndoSaveSection::RestoreSection( SwDoc* pDoc, const SwNodeIndex& rInsPos } // save and set the RedlineData -SwRedlineSaveData::SwRedlineSaveData( SwComparePosition eCmpPos, - const SwPosition& rSttPos, - const SwPosition& rEndPos, - SwRangeRedline& rRedl, - sal_Bool bCopyNext ) - : SwUndRng( rRedl ), - SwRedlineData( rRedl.GetRedlineData(), bCopyNext ) +SwRedlineSaveData::SwRedlineSaveData( + SwComparePosition eCmpPos, + const SwPosition& rSttPos, + const SwPosition& rEndPos, + SwRangeRedline& rRedl ) + : SwUndRng( rRedl ) + , SwRedlineData( rRedl.GetRedlineData(), true ) { assert( POS_OUTSIDE == eCmpPos || !rRedl.GetContentIdx() ); // "Redline with Content" - switch( eCmpPos ) + switch (eCmpPos) { case POS_OVERLAP_BEFORE: // Pos1 overlaps Pos2 at the beginning nEndNode = rEndPos.nNode.GetIndex(); @@ -933,7 +939,7 @@ SwRedlineSaveData::SwRedlineSaveData( SwComparePosition eCmpPos, break; case POS_OUTSIDE: // Pos2 lays completely in Pos1 - if( rRedl.GetContentIdx() ) + if ( rRedl.GetContentIdx() ) { // than move section into UndoArray and memorize it SaveSection( rRedl.GetDoc(), *rRedl.GetContentIdx() ); @@ -988,27 +994,31 @@ 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 ) { rSData.DeleteAndDestroyAll(); 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.size(); ++n ) + for ( ; n < rTbl.size(); ++n ) { - SwRangeRedline* 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 ) + SwRangeRedline* 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.push_back( pNewData ); } } @@ -1017,7 +1027,9 @@ sal_Bool SwUndo::FillSaveData( const SwPaM& rRange, SwRedlineSaveDatas& rSData, return !rSData.empty(); } -sal_Bool SwUndo::FillSaveDataForFmt( const SwPaM& rRange, SwRedlineSaveDatas& rSData ) +sal_Bool SwUndo::FillSaveDataForFmt( + const SwPaM& rRange, + SwRedlineSaveDatas& rSData ) { rSData.DeleteAndDestroyAll(); @@ -1026,19 +1038,17 @@ 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.size(); ++n ) + for ( ; n < rTbl.size(); ++n ) { - SwRangeRedline* pRedl = rTbl[ n ]; - if( nsRedlineType_t::REDLINE_FORMAT == pRedl->GetType() ) + SwRangeRedline* 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.push_back( pNewData ); } diff --git a/sw/source/core/undo/unredln.cxx b/sw/source/core/undo/unredln.cxx index 03e4e53fb52f..a7df6496e12e 100644 --- a/sw/source/core/undo/unredln.cxx +++ b/sw/source/core/undo/unredln.cxx @@ -36,18 +36,18 @@ extern void sw_GetJoinFlags( SwPaM& rPam, sal_Bool& rJoinTxt, sal_Bool& rJoinPre 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 ) { // consider Redline 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: ; @@ -57,14 +57,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 ) // then the NodeIndices of SwUndRng need to be corrected + mbHiddenRedlines = HasHiddenRedlines( *mpRedlSaveData ); + if( mbHiddenRedlines ) // then the NodeIndices of SwUndRng need to be corrected { nEndExtra -= rDoc.GetNodes().GetEndOfExtras().GetIndex(); nSttNode -= nEndExtra; @@ -75,13 +75,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->size() : 0; + return mpRedlSaveData ? mpRedlSaveData->size() : 0; } void SwUndoRedline::UndoImpl(::sw::UndoRedoContext & rContext) @@ -91,13 +91,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->DeleteAndDestroyAll(); + mpRedlSaveData->DeleteAndDestroyAll(); nEndExtra = pDoc->GetNodes().GetEndOfExtras().GetIndex() - nEndExtra; nSttNode += nEndExtra; @@ -114,11 +114,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; @@ -146,7 +146,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()) ) { @@ -172,14 +172,14 @@ void SwUndoRedlineDelete::RedoRedlineImpl(SwDoc & rDoc, SwPaM & rPam) { if (rPam.GetPoint() != rPam.GetMark()) { - rDoc.AppendRedline( new SwRangeRedline(*pRedlData, rPam), false ); + rDoc.AppendRedline( new SwRangeRedline(*mpRedlData, rPam), 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 && @@ -194,10 +194,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 ) |