diff options
author | Michael Stahl <mst@openoffice.org> | 2010-12-15 09:14:09 +0100 |
---|---|---|
committer | Michael Stahl <mst@openoffice.org> | 2010-12-15 09:14:09 +0100 |
commit | a5d3540922dd3171837bf2a5f82be3765a5910b5 (patch) | |
tree | 43aeb97c1a6999946a2bf1b035fa8a9f964742f6 /svl | |
parent | 9bcb3c20a6cc150f9f589a11dd6f243d883e6285 (diff) |
undoapi: #i115383#: SfxUndoManager: fix stack marks, add empty stack marks
Diffstat (limited to 'svl')
-rw-r--r-- | svl/source/undo/undo.cxx | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/svl/source/undo/undo.cxx b/svl/source/undo/undo.cxx index 96bf2b921cf9..33cc63035fad 100644 --- a/svl/source/undo/undo.cxx +++ b/svl/source/undo/undo.cxx @@ -188,6 +188,7 @@ struct SVL_DLLPRIVATE SfxUndoManager_Data sal_Int32 mnLockCount; sal_Int32 mnMarks; + sal_Int32 mnEmptyMark; bool mbDoing; UndoListeners aListeners; @@ -198,6 +199,7 @@ struct SVL_DLLPRIVATE SfxUndoManager_Data ,pFatherUndoArray( NULL ) ,mnLockCount( 0 ) ,mnMarks( 0 ) + ,mnEmptyMark(MARK_INVALID) ,mbDoing( false ) { @@ -512,6 +514,7 @@ void SfxUndoManager::ImplClear( UndoManagerGuard& i_guard ) m_pData->pActUndoArray->nCurUndoAction = 0; m_pData->mnMarks = 0; + m_pData->mnEmptyMark = MARK_INVALID; // notify listeners i_guard.scheduleNotification( &SfxUndoListener::cleared ); @@ -1146,12 +1149,20 @@ UndoStackMark SfxUndoManager::MarkTopUndoAction() { UndoManagerGuard aGuard( *m_pData ); - USHORT nActionPos = m_pData->pUndoArray->nCurUndoAction; - ENSURE_OR_RETURN( nActionPos > 0, "SfxUndoManager::MarkTopUndoAction: undo stack is empty!", MARK_INVALID ); + OSL_ENSURE( !IsInListAction(), + "SfxUndoManager::MarkTopUndoAction(): suspicious call!" ); + OSL_ENSURE((m_pData->mnMarks + 1) < (m_pData->mnEmptyMark - 1), + "SfxUndoManager::MarkTopUndoAction(): mark overflow!"); - OSL_ENSURE( !IsInListAction(), "SfxUndoManager::MarkTopUndoAction: suspicious call!" ); + USHORT const nActionPos = m_pData->pUndoArray->nCurUndoAction; + if (0 == nActionPos) + { + --m_pData->mnEmptyMark; + return m_pData->mnEmptyMark; + } - m_pData->pUndoArray->aUndoActions[ nActionPos ].aMarks.push_back( ++m_pData->mnMarks ); + m_pData->pUndoArray->aUndoActions[ nActionPos-1 ].aMarks.push_back( + ++m_pData->mnMarks ); return m_pData->mnMarks; } @@ -1160,6 +1171,16 @@ void SfxUndoManager::RemoveMark( UndoStackMark const i_mark ) { UndoManagerGuard aGuard( *m_pData ); + if ((m_pData->mnEmptyMark < i_mark) || (MARK_INVALID == i_mark)) + { + return; // nothing to remove + } + else if (i_mark == m_pData->mnEmptyMark) + { + --m_pData->mnEmptyMark; // never returned from MarkTop => invalid + return; + } + for ( size_t i=0; i<m_pData->pUndoArray->aUndoActions.size(); ++i ) { MarkedUndoAction& rAction = m_pData->pUndoArray->aUndoActions[i]; @@ -1188,9 +1209,12 @@ bool SfxUndoManager::HasTopUndoActionMark( UndoStackMark const i_mark ) USHORT nActionPos = m_pData->pUndoArray->nCurUndoAction; if ( nActionPos == 0 ) - return false; + { + return (i_mark == m_pData->mnEmptyMark); + } - const MarkedUndoAction& rAction = m_pData->pUndoArray->aUndoActions[ nActionPos ]; + const MarkedUndoAction& rAction = + m_pData->pUndoArray->aUndoActions[ nActionPos-1 ]; for ( ::std::vector< UndoStackMark >::const_iterator markPos = rAction.aMarks.begin(); markPos != rAction.aMarks.end(); ++markPos |