summaryrefslogtreecommitdiff
path: root/svtools
diff options
context:
space:
mode:
authorKurt Zenker <kz@openoffice.org>2009-06-04 16:21:29 +0000
committerKurt Zenker <kz@openoffice.org>2009-06-04 16:21:29 +0000
commitda569797eb7e089da90c917448b7990fac64b8d7 (patch)
treee617655e6df5eeddc75f2c4a6e8915ea174af556 /svtools
parentf9278148dc944e947fa8ed2b786098bcdba39004 (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.hxx11
-rw-r--r--svtools/source/undo/makefile.mk1
-rw-r--r--svtools/source/undo/undo.cxx152
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
}
+