summaryrefslogtreecommitdiff
path: root/svl/source/undo/undo.cxx
diff options
context:
space:
mode:
authorMichael Stahl <mst@openoffice.org>2010-12-15 09:14:09 +0100
committerMichael Stahl <mst@openoffice.org>2010-12-15 09:14:09 +0100
commita5d3540922dd3171837bf2a5f82be3765a5910b5 (patch)
tree43aeb97c1a6999946a2bf1b035fa8a9f964742f6 /svl/source/undo/undo.cxx
parent9bcb3c20a6cc150f9f589a11dd6f243d883e6285 (diff)
undoapi: #i115383#: SfxUndoManager: fix stack marks, add empty stack marks
Diffstat (limited to 'svl/source/undo/undo.cxx')
-rw-r--r--svl/source/undo/undo.cxx36
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