Package editor.undo
Class AtomicUndoManager
java.lang.Object
javax.swing.undo.AbstractUndoableEdit
javax.swing.undo.CompoundEdit
javax.swing.undo.UndoManager
editor.undo.AtomicUndoManager
- All Implemented Interfaces:
Serializable,EventListener,UndoableEditListener,UndoableEdit
This class extends
UndoManager providing nested atomic (or scoped) undo/redo
operations. Note undo/redo operations are captured in StateEditable implementations.
A generic application of this class follows:
...
_undoMgr = new AtomicUndoManager( 1000 );
...
//
// This method decorates a typical change operation with undo/redo capability.
// Notice the XXXOperationUndoItem class. You'll need to create one of these
// for each undo operation. Basically these UndoItem classes are extensions
// of StateEditable. They are responsible for capturing the state
// before and after an operation and also for restoring the state as directed
// by this undo manager.
//
void performUndoableXXXOperation( ... )
{
XXXOperationUndoItem undoItem = new XXXOperationUndoItem( ... );
StateEdit transaction = new StateEdit( undoItem, "XXX Operation" );
performXXXOperation( ... );
transaction.end();
_undoMgr.addEdit( transaction );
}
// Your typical change operation.
void performXXXOperation( ... )
{
// do whatever it is you do...
}
//
// This method exercises the atomic and nested features of AtomicUndoManager.
// The atomic boundaries should be enforced with the try/finally idiom so
// a failed atomic operation can be safely (and optionally) "rolled back".
//
void performUndoableZZZOperation
{
try
{
_undoMgr.beginUndoAtom( "ZZZ Operation" );
performUndoableXXXOperation( ... );
performUndoableYYYOperation( ... );
...
}
finally
{
_undoMgr.endUndoAtom();
}
}
//
// Create ui components using Actions such as these:
//
class UndoAction extends AbstractAction
{
UndoAction( String strName, Icon icon )
{
super( strName, icon );
}
public void actionPerformed( ActionEvent e )
{
_undoMgr.undo();
}
public boolean isEnabled()
{
return _undoMgr.canUndo();
}
}
class RedoAction extends AbstractAction
{
RedoAction( String strName, Icon icon )
{
super( strName, icon );
}
public void actionPerformed( ActionEvent e )
{
_undoMgr.redo();
}
public boolean isEnabled()
{
return _undoMgr.canRedo();
}
}- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static class -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate booleanprivate List<ChangeListener>private longA stack used for managing nested undo atoms.Fields inherited from class javax.swing.undo.CompoundEdit
editsFields inherited from class javax.swing.undo.AbstractUndoableEdit
RedoName, UndoName -
Constructor Summary
ConstructorsConstructorDescriptionAnAtomicUndoManagerwith a default limit of 1000 edits.AtomicUndoManager(int iUndoLimit) -
Method Summary
Modifier and TypeMethodDescriptionvoidaddChangeListener(ChangeListener listener) booleanaddEdit(UndoableEdit edit) voidBegin an atomic undo boundary.beginUndoAtom(String strDisplayName) Begin an atomic undo boundary.voidvoidEnds the active atomic undo boundary.voidendUndoAtom(CompoundEdit undoAtom) private voidfireChangeEvent(UndoChangeEvent.ChangeType type, UndoableEdit edit) longbooleanisPaused()voidrecordChange(StateEditable change) Utility method that records a change that can be undone/redone.voidredo()protected voidredoTo(UndoableEdit edit) voidremoveChangeListener(ChangeListener listener) voidremoveEdit(UndoableEdit edit) private voidvoidsetPaused(boolean bPaused) Sets the paused state of the undo manager.voidundo()voidprotected voidundoTo(UndoableEdit edit) Methods inherited from class javax.swing.undo.UndoManager
canRedo, canUndo, canUndoOrRedo, editToBeRedone, editToBeUndone, end, getLimit, getRedoPresentationName, getUndoOrRedoPresentationName, getUndoPresentationName, setLimit, toString, trimEdits, trimForLimit, undoableEditHappenedMethods inherited from class javax.swing.undo.CompoundEdit
die, getPresentationName, isInProgress, isSignificant, lastEditMethods inherited from class javax.swing.undo.AbstractUndoableEdit
replaceEdit
-
Field Details
-
_undoAtomNest
A stack used for managing nested undo atoms. Whenever an atomic undo atom begins a newDisplayableCompoundEditis constructed on it's behalf and pushed onto the stack. When an undo atom ends itsDisplayableCompoundEditis popped off the stack and added to the next atom's edit list in the stack or, if the stack is empty, it is directly added to this undo manager's edit list. -
_bPaused
private boolean _bPaused -
_changeListeners
-
_lLastUndoTime
private long _lLastUndoTime
-
-
Constructor Details
-
AtomicUndoManager
public AtomicUndoManager()AnAtomicUndoManagerwith a default limit of 1000 edits. -
AtomicUndoManager
public AtomicUndoManager(int iUndoLimit) - Parameters:
iUndoLimit- The maximum number of edits this undo manager will hold.
-
-
Method Details
-
isPaused
public boolean isPaused()- Returns:
- Is this undo manager in a Paused state? i.e., are edits being ignored?
-
setPaused
public void setPaused(boolean bPaused) Sets the paused state of the undo manager. If paused, undo operations are ignored- Parameters:
bPaused- The paused state.
-
addEdit
- Specified by:
addEditin interfaceUndoableEdit- Overrides:
addEditin classUndoManager- Parameters:
edit- The edit to be added. Note nested edits are supported.
-
removeEdit
- Parameters:
edit- The edit to be removed.
-
discardAllEdits
public void discardAllEdits()- Overrides:
discardAllEditsin classUndoManager
-
beginUndoAtom
public void beginUndoAtom()Begin an atomic undo boundary. Edits added to this undo mananger after this call are considered "subatomic" -- they become part of the atom defined by the boundary. The atom's boundary ends with a call toendUndoAtom(). Note undo atoms can contain other undo atoms allowing for unlimited nesting of atomic undo operations. -
beginUndoAtom
Begin an atomic undo boundary. Edits added to this undo mananger after this call are considered "subatomic" -- they become part of the atom defined by the boundary. The atom's boundary ends with a call toendUndoAtom(). Note undo atoms can contain other undo atoms allowing for unlimited nesting of atomic undo operations.- Parameters:
strDisplayName- The name associated with the undo atom. A user interface typically displays this name in Undo/Redo menu items or toolbar button text.- See Also:
-
endUndoAtom
public void endUndoAtom()Ends the active atomic undo boundary.- See Also:
-
endUndoAtom
-
getUndoAtom
- Returns:
- The undo atom currently in progress.
-
redo
- Specified by:
redoin interfaceUndoableEdit- Overrides:
redoin classUndoManager- Throws:
CannotRedoException
-
undo
- Specified by:
undoin interfaceUndoableEdit- Overrides:
undoin classUndoManager- Throws:
CannotUndoException
-
getLastUndoTime
public long getLastUndoTime() -
setLastUndoTime
private void setLastUndoTime() -
undoOrRedo
- Overrides:
undoOrRedoin classUndoManager- Throws:
CannotRedoExceptionCannotUndoException
-
undoTo
- Overrides:
undoToin classUndoManager- Throws:
CannotUndoException
-
redoTo
- Overrides:
redoToin classUndoManager- Throws:
CannotRedoException
-
addChangeListener
-
removeChangeListener
-
recordChange
Utility method that records a change that can be undone/redone. -
fireChangeEvent
-