diff options
author | Kurt Zenker <kz@openoffice.org> | 2009-06-04 16:21:29 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2009-06-04 16:21:29 +0000 |
commit | da569797eb7e089da90c917448b7990fac64b8d7 (patch) | |
tree | e617655e6df5eeddc75f2c4a6e8915ea174af556 /svtools | |
parent | f9278148dc944e947fa8ed2b786098bcdba39004 (diff) |
CWS-TOOLING: integrate CWS clnoundo
2009-05-18 09:40:22 +0200 wg r271998 : i102011
2009-04-28 12:20:24 +0200 cl r271318 : CWS-TOOLING: rebase CWS clnoundo to trunk@270723 (milestone: DEV300:m46)
2009-04-02 11:37:14 +0200 cl r270388 : #i100371# check valid positions all the time to avoid crashes during model lock
2009-03-30 13:02:27 +0200 cl r270219 : #i100371# do not create undo actions in drawing layer during load
2009-03-30 12:59:41 +0200 cl r270218 : #i100371# do not create undo actions in drawing layer during load
2009-03-30 12:55:06 +0200 cl r270217 : #i100371# do not create undo actions in drawing layer during load
2009-03-30 12:53:27 +0200 cl r270216 : #i100371# do not create undo actions in drawing layer during load
2009-03-30 12:49:28 +0200 cl r270215 : #i100371# added EnableUndo() and IsUndoEnabled()
Diffstat (limited to 'svtools')
-rw-r--r-- | svtools/inc/svtools/undo.hxx | 11 | ||||
-rw-r--r-- | svtools/source/undo/makefile.mk | 1 | ||||
-rw-r--r-- | svtools/source/undo/undo.cxx | 152 |
3 files changed, 124 insertions, 40 deletions
diff --git a/svtools/inc/svtools/undo.hxx b/svtools/inc/svtools/undo.hxx index 986a72093af2..38cbfb227f1b 100644 --- a/svtools/inc/svtools/undo.hxx +++ b/svtools/inc/svtools/undo.hxx @@ -143,6 +143,7 @@ class SVT_DLLPUBLIC SfxUndoManager SfxUndoArray *pActUndoArray; SfxUndoArray *pFatherUndoArray; + bool mbUndoEnabled; public: SfxUndoManager( USHORT nMaxUndoActionCount = 20 ); virtual ~SfxUndoManager(); @@ -182,6 +183,16 @@ public: /** clears the redo stack and removes the top undo action */ void RemoveLastUndoAction(); + + // enables (true) or disables (false) recording of undo actions + // If undo actions are added while undo is disabled, they are deleted. + // Disabling undo does not clear the current undo buffer! + void EnableUndo( bool bEnable ); + + // returns true if undo is currently enabled + // This returns false if undo was disabled using EnableUndo( false ) and + // also during the runtime of the Undo() and Redo() methods. + bool IsUndoEnabled() const { return mbUndoEnabled; } }; //========================================================================= diff --git a/svtools/source/undo/makefile.mk b/svtools/source/undo/makefile.mk index 92a406971de3..b277fa3c906f 100644 --- a/svtools/source/undo/makefile.mk +++ b/svtools/source/undo/makefile.mk @@ -33,6 +33,7 @@ PRJ=..$/.. PRJNAME=svtools TARGET=undo +ENABLE_EXCEPTIONS=TRUE # --- Settings ----------------------------------------------------- diff --git a/svtools/source/undo/undo.cxx b/svtools/source/undo/undo.cxx index 76ed0a0a8e09..2f733d4f03b3 100644 --- a/svtools/source/undo/undo.cxx +++ b/svtools/source/undo/undo.cxx @@ -31,11 +31,14 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" +#include <com/sun/star/uno/Exception.hpp> #include <tools/debug.hxx> #include <svtools/undo.hxx> +using ::com::sun::star::uno::Exception; + // STATIC DATA ----------------------------------------------------------- DBG_NAME(SfxUndoAction) @@ -153,6 +156,7 @@ BOOL SfxUndoAction::CanRepeat(SfxRepeatTarget&) const SfxUndoManager::SfxUndoManager( USHORT nMaxUndoActionCount ) : pFatherUndoArray(0) + , mbUndoEnabled( true ) { pUndoArray=new SfxUndoArray(nMaxUndoActionCount); pActUndoArray=pUndoArray; @@ -167,6 +171,12 @@ SfxUndoManager::~SfxUndoManager() delete pUndoArray; } +//------------------------------------------------------------------------ + +void SfxUndoManager::EnableUndo( bool bEnable ) +{ + mbUndoEnabled = bEnable; +} //------------------------------------------------------------------------ @@ -252,41 +262,43 @@ void SfxUndoManager::ClearRedo() void SfxUndoManager::AddUndoAction( SfxUndoAction *pAction, BOOL bTryMerge ) { - // Redo-Actions loeschen - for ( USHORT nPos = pActUndoArray->aUndoActions.Count(); - nPos > pActUndoArray->nCurUndoAction; --nPos ) - delete pActUndoArray->aUndoActions[nPos-1]; - - pActUndoArray->aUndoActions.Remove( - pActUndoArray->nCurUndoAction, - pActUndoArray->aUndoActions.Count() - pActUndoArray->nCurUndoAction ); - - if ( pActUndoArray->nMaxUndoActions ) + if( mbUndoEnabled ) { - SfxUndoAction *pTmpAction = pActUndoArray->nCurUndoAction ? - pActUndoArray->aUndoActions[pActUndoArray->nCurUndoAction-1] : 0; + // Redo-Actions loeschen + for ( USHORT nPos = pActUndoArray->aUndoActions.Count(); + nPos > pActUndoArray->nCurUndoAction; --nPos ) + delete pActUndoArray->aUndoActions[nPos-1]; + + pActUndoArray->aUndoActions.Remove( + pActUndoArray->nCurUndoAction, + pActUndoArray->aUndoActions.Count() - pActUndoArray->nCurUndoAction ); - if ( !bTryMerge || !(pTmpAction && pTmpAction->Merge(pAction)) ) + if ( pActUndoArray->nMaxUndoActions ) { - // auf Max-Anzahl anpassen - if( pActUndoArray == pUndoArray ) - while( pActUndoArray->aUndoActions.Count() >= - pActUndoArray->nMaxUndoActions && - !pActUndoArray->aUndoActions[0]->IsLinked() ) - { - delete pActUndoArray->aUndoActions[0]; - pActUndoArray->aUndoActions.Remove(0); - --pActUndoArray->nCurUndoAction; - } + SfxUndoAction *pTmpAction = pActUndoArray->nCurUndoAction ? + pActUndoArray->aUndoActions[pActUndoArray->nCurUndoAction-1] : 0; - // neue Action anh"angen - const SfxUndoAction* pTemp = pAction; - pActUndoArray->aUndoActions.Insert( - pTemp, pActUndoArray->nCurUndoAction++ ); - return; + if ( !bTryMerge || !(pTmpAction && pTmpAction->Merge(pAction)) ) + { + // auf Max-Anzahl anpassen + if( pActUndoArray == pUndoArray ) + while( pActUndoArray->aUndoActions.Count() >= + pActUndoArray->nMaxUndoActions && + !pActUndoArray->aUndoActions[0]->IsLinked() ) + { + delete pActUndoArray->aUndoActions[0]; + pActUndoArray->aUndoActions.Remove(0); + --pActUndoArray->nCurUndoAction; + } + + // neue Action anh"angen + const SfxUndoAction* pTemp = pAction; + pActUndoArray->aUndoActions.Insert( + pTemp, pActUndoArray->nCurUndoAction++ ); + return; + } } } - delete pAction; } @@ -368,20 +380,46 @@ void SfxUndoManager::RemoveLastUndoAction() BOOL SfxUndoManager::Undo( USHORT ) { - DBG_ASSERT( pActUndoArray == pUndoArray, "svtools::SfxUndoManager::Undo(), LeaveListAction() not yet called!" ); - if ( pActUndoArray->nCurUndoAction ) + bool bUndoWasEnabled = mbUndoEnabled; + mbUndoEnabled = false; + + BOOL bRet = FALSE; + + try { - Undo( *pActUndoArray->aUndoActions[ --pActUndoArray->nCurUndoAction ] ); - return TRUE; + DBG_ASSERT( pActUndoArray == pUndoArray, "svtools::SfxUndoManager::Undo(), LeaveListAction() not yet called!" ); + if ( pActUndoArray->nCurUndoAction ) + { + Undo( *pActUndoArray->aUndoActions[ --pActUndoArray->nCurUndoAction ] ); + bRet = TRUE; + } } - return FALSE; + catch( Exception& e ) + { + mbUndoEnabled = bUndoWasEnabled; + throw e; + } + mbUndoEnabled = bUndoWasEnabled; + return bRet; } //------------------------------------------------------------------------ void SfxUndoManager::Undo( SfxUndoAction &rAction ) { - rAction.Undo(); + bool bUndoWasEnabled = mbUndoEnabled; + mbUndoEnabled = false; + try + { + rAction.Undo(); + } + catch( Exception& e ) + { + mbUndoEnabled = bUndoWasEnabled; + throw e; + } + + mbUndoEnabled = bUndoWasEnabled; } //------------------------------------------------------------------------ @@ -409,20 +447,47 @@ USHORT SfxUndoManager::GetRedoActionId( USHORT nNo ) const BOOL SfxUndoManager::Redo( USHORT ) { - if ( pActUndoArray->aUndoActions.Count() > pActUndoArray->nCurUndoAction ) + bool bUndoWasEnabled = mbUndoEnabled; + mbUndoEnabled = false; + + BOOL bRet = FALSE; + + try { - Redo( *pActUndoArray->aUndoActions[pActUndoArray->nCurUndoAction++] ); - return TRUE; + if ( pActUndoArray->aUndoActions.Count() > pActUndoArray->nCurUndoAction ) + { + Redo( *pActUndoArray->aUndoActions[pActUndoArray->nCurUndoAction++] ); + bRet = TRUE; + } + } + catch( Exception& e ) + { + mbUndoEnabled = bUndoWasEnabled; + throw e; } - return FALSE; + mbUndoEnabled = bUndoWasEnabled; + return bRet; } //------------------------------------------------------------------------ void SfxUndoManager::Redo( SfxUndoAction &rAction ) { - rAction.Redo(); + bool bUndoWasEnabled = mbUndoEnabled; + mbUndoEnabled = false; + + try + { + rAction.Redo(); + } + catch( Exception& e ) + { + mbUndoEnabled = bUndoWasEnabled; + throw e; + } + + mbUndoEnabled = bUndoWasEnabled; } //------------------------------------------------------------------------ @@ -492,6 +557,9 @@ void SfxUndoManager::EnterListAction( */ { + if( !mbUndoEnabled ) + return; + if ( !pUndoArray->nMaxUndoActions ) return; @@ -511,6 +579,9 @@ void SfxUndoManager::LeaveListAction() Verlaesst die aktuelle ListAction und geht eine Ebene nach oben. */ { + if ( !mbUndoEnabled ) + return; + if ( !pUndoArray->nMaxUndoActions ) return; @@ -745,3 +816,4 @@ USHORT SfxLinkUndoAction::GetId() const } + |