public class UndoManager extends CompoundEditimplements UndoableEditListener
UndoManager manages a list of
UndoableEdits, providing a way to undo or redo the appropriate edits. There are two ways to add edits to an
UndoManager. Add the edit directly using the
addEdit method, or add the
UndoManager to a bean that supports
UndoableEditListener. The following examples creates an
UndoManager and adds it as an
UndoableEditListener to a
JTextField:
UndoManager undoManager = new UndoManager(); JTextField tf = ...; tf.getDocument().addUndoableEditListener(undoManager);
UndoManager maintains an ordered list of edits and the index of the next edit in that list. The index of the next edit is either the size of the current list of edits, or if undo has been invoked it corresponds to the index of the last significant edit that was undone. When undo is invoked all edits from the index of the next edit to the last significant edit are undone, in reverse order. For example, consider an UndoManager consisting of the following edits: A b c D. Edits with a upper-case letter in bold are significant, those in lower-case and italicized are insignificant.
|
| Figure 1 |
As shown in figure 1, if D was just added, the index of the next edit will be 4. Invoking undo results in invoking undo on D and setting the index of the next edit to 3 (edit c), as shown in the following figure.
|
| Figure 2 |
The last significant edit is A, so that invoking undo again invokes undo on c, b, and A, in that order, setting the index of the next edit to 0, as shown in the following figure.
|
| Figure 3 |
Invoking redo results in invoking redo on all edits between the index of the next edit and the next significant edit (or the end of the list). Continuing with the previous example if redo were invoked, redo would in turn be invoked on A, b and c. In addition the index of the next edit is set to 3 (as shown in figure 2).
Adding an edit to an UndoManager results in removing all edits from the index of the next edit to the end of the list. Continuing with the previous example, if a new edit, e, is added the edit D is removed from the list (after having die invoked on it). If c is not incorporated by the next edit (c.addEdit(e) returns true), or replaced by it (e.replaceEdit(c) returns true), the new edit is added after c, as shown in the following figure.
|
| Figure 4 |
Once end has been invoked on an UndoManager the superclass behavior is used for all UndoableEdit methods. Refer to CompoundEdit for more details on its behavior.
Unlike the rest of Swing, this class is thread safe.
Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeans™ has been added to the java.beans package. Please see XMLEncoder.
editsRedoName, UndoName| Constructor and Description |
|---|
UndoManager()
Creates a new
UndoManager.
|
| Modifier and Type | Method and Description |
|---|---|
boolean |
addEdit(UndoableEdit
Adds an
UndoableEdit to this
UndoManager, if it's possible.
|
boolean |
canRedo()
Returns true if edits may be redone.
|
boolean |
canUndo()
Returns true if edits may be undone.
|
boolean |
canUndoOrRedo()
Returns true if it is possible to invoke
undo or
redo.
|
void |
discardAllEdits()
Empties the undo manager sending each edit a
die message in the process.
|
protected UndoableEdit |
editToBeRedone()
Returns the the next significant edit to be redone if
redo is invoked.
|
protected UndoableEdit |
editToBeUndone()
Returns the the next significant edit to be undone if
undo is invoked.
|
void |
end()
Turns this
UndoManager into a normal
CompoundEdit.
|
int |
getLimit()
Returns the maximum number of edits this
UndoManager holds.
|
String |
getRedoPresentationName()
Returns a description of the redoable form of this edit.
|
String |
getUndoOrRedoPresentationName()
Convenience method that returns either
getUndoPresentationName or
getRedoPresentationName.
|
String |
getUndoPresentationName()
Returns a description of the undoable form of this edit.
|
void |
redo()
Redoes the appropriate edits.
|
protected void |
redoTo(UndoableEdit
Redoes all changes from the index of the next edit to
edit, updating the index of the next edit appropriately.
|
void |
setLimit(int l)
Sets the maximum number of edits this
UndoManager holds.
|
String |
toString()
Returns a string that displays and identifies this object's properties.
|
protected void |
trimEdits(int from, int to)
Removes edits in the specified range.
|
protected void |
trimForLimit()
Reduces the number of queued edits to a range of size limit, centered on the index of the next edit.
|
void |
undo()
Undoes the appropriate edits.
|
void |
undoableEditHappened(UndoableEditEvent
An
UndoableEditListener method.
|
void |
undoOrRedo()
Convenience method that invokes one of
undo or
redo.
|
protected void |
undoTo(UndoableEdit
Undoes all changes from the index of the next edit to
edit, updating the index of the next edit appropriately.
|
die, getPresentationName, isInProgress, isSignificant, lastEditreplaceEditpublic int getLimit()
UndoManager holds. A value less than 0 indicates the number of edits is not limited.
UndoManager holds
addEdit(javax.swing.undo.UndoableEdit),
setLimit(int)
public void discardAllEdits()
die message in the process.
AbstractUndoableEdit.die()
protected void trimForLimit()
protected void trimEdits(int from,
int to)
die invoked on them and are removed from the list of edits. This has no effect if
from >
to.
from - the minimum index to remove
to - the maximum index to remove
public void setLimit(int l)
UndoManager holds. A value less than 0 indicates the number of edits is not limited. If edits need to be discarded to shrink the limit,
die will be invoked on them in the reverse order they were added. The default is 100.
l - the new limit
RuntimeException - if this
UndoManager is not in progress (
end has been invoked)
CompoundEdit.isInProgress() ,
end(),
addEdit(javax.swing.undo.UndoableEdit),
getLimit()
protected UndoableEditeditToBeUndone()
undo is invoked. This returns
null if there are no edits to be undone.
protected UndoableEditeditToBeRedone()
redo is invoked. This returns
null if there are no edits to be redone.
protected void undoTo(UndoableEditedit) throws CannotUndoException
edit, updating the index of the next edit appropriately.
CannotUndoException - if one of the edits throws
CannotUndoException
protected void redoTo(UndoableEditedit) throws CannotRedoException
edit, updating the index of the next edit appropriately.
CannotRedoException - if one of the edits throws
CannotRedoException
public void undoOrRedo()
throws CannotRedoException,
CannotUndoException
undo or
redo. If any edits have been undone (the index of the next edit is less than the length of the edits list) this invokes
redo, otherwise it invokes
undo.
CannotUndoException - if one of the edits throws
CannotUndoException
CannotRedoException - if one of the edits throws
CannotRedoException
canUndoOrRedo(),
getUndoOrRedoPresentationName()
public boolean canUndoOrRedo()
undo or
redo.
canUndoOrRedo is valid
undoOrRedo()
public void undo()
throws CannotUndoException
end has been invoked this calls through to the superclass, otherwise this invokes
undo on all edits between the index of the next edit and the last significant edit, updating the index of the next edit appropriately.
undo in interface
UndoableEdit
undo in class
CompoundEdit
CannotUndoException - if one of the edits throws
CannotUndoException or there are no edits to be undone
CompoundEdit.end() ,
canUndo(),
editToBeUndone()
public boolean canUndo()
end has been invoked, this returns the value from super. Otherwise this returns true if there are any edits to be undone (
editToBeUndone returns non-
null).
canUndo in interface
UndoableEdit
canUndo in class
CompoundEdit
CompoundEdit.canUndo() ,
editToBeUndone()
public void redo()
throws CannotRedoException
end has been invoked this calls through to the superclass. Otherwise this invokes
redo on all edits between the index of the next edit and the next significant edit, updating the index of the next edit appropriately.
redo in interface
UndoableEdit
redo in class
CompoundEdit
CannotRedoException - if one of the edits throws
CannotRedoException or there are no edits to be redone
CompoundEdit.end() ,
canRedo(),
editToBeRedone()
public boolean canRedo()
end has been invoked, this returns the value from super. Otherwise, this returns true if there are any edits to be redone (
editToBeRedone returns non-
null).
canRedo in interface
UndoableEdit
canRedo in class
CompoundEdit
CompoundEdit.canRedo() ,
editToBeRedone()
public boolean addEdit(UndoableEditanEdit)
UndoableEdit to this
UndoManager, if it's possible. This removes all edits from the index of the next edit to the end of the edits list. If
end has been invoked the edit is not added and
false is returned. If
end hasn't been invoked this returns
true.
addEdit in interface
UndoableEdit
addEdit in class
CompoundEdit
anEdit - the edit to be added
anEdit can be incorporated into this edit
CompoundEdit.end() ,
CompoundEdit.addEdit(javax.swing.undo.UndoableEdit)
public void end()
UndoManager into a normal
CompoundEdit. This removes all edits that have been undone.
end in class
CompoundEdit
CompoundEdit.end()
public StringgetUndoOrRedoPresentationName()
getUndoPresentationName or
getRedoPresentationName. If the index of the next edit equals the size of the edits list,
getUndoPresentationName is returned, otherwise
getRedoPresentationName is returned.
public StringgetUndoPresentationName()
end has been invoked this calls into super. Otherwise if there are edits to be undone, this returns the value from the next significant edit that will be undone. If there are no edits to be undone and
end has not been invoked this returns the value from the
UIManager property "AbstractUndoableEdit.undoText".
getUndoPresentationName in interface
UndoableEdit
getUndoPresentationName in class
CompoundEdit
undo(),
CompoundEdit.getUndoPresentationName()
public StringgetRedoPresentationName()
end has been invoked this calls into super. Otherwise if there are edits to be redone, this returns the value from the next significant edit that will be redone. If there are no edits to be redone and
end has not been invoked this returns the value from the
UIManager property "AbstractUndoableEdit.redoText".
getRedoPresentationName in interface
UndoableEdit
getRedoPresentationName in class
CompoundEdit
redo(),
CompoundEdit.getRedoPresentationName()
public void undoableEditHappened(UndoableEditEvente)
UndoableEditListener method. This invokes
addEdit with
e.getEdit().
undoableEditHappened in interface
UndoableEditListener
e - the
UndoableEditEvent the
UndoableEditEvent will be added from
addEdit(javax.swing.undo.UndoableEdit)
public StringtoString()
toString in class
CompoundEdit