public class UndoManager extends CompoundEdit implements 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
.
edits
RedoName, UndoName
public UndoManager()
Creates a new UndoManager
.
public int getLimit()
Returns the maximum number of edits this UndoManager
holds. A value less than 0 indicates the number of edits is not limited.
UndoManager
holdsaddEdit(javax.swing.undo.UndoableEdit)
, setLimit(int)
public void discardAllEdits()
Empties the undo manager sending each edit a die
message in the process.
AbstractUndoableEdit.die()
protected void trimForLimit()
Reduces the number of queued edits to a range of size limit, centered on the index of the next edit.
protected void trimEdits(int from, int to)
Removes edits in the specified range. All edits in the given range (inclusive, and in reverse order) will have die
invoked on them and are removed from the list of edits. This has no effect if from
> to
.
from
- the minimum index to removeto
- the maximum index to removepublic void setLimit(int l)
Sets the maximum number of edits this 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 limitRuntimeException
- if this UndoManager
is not in progress (end
has been invoked)CompoundEdit.isInProgress()
, end()
, addEdit(javax.swing.undo.UndoableEdit)
, getLimit()
protected UndoableEdit editToBeUndone()
Returns the the next significant edit to be undone if undo
is invoked. This returns null
if there are no edits to be undone.
protected UndoableEdit editToBeRedone()
Returns the the next significant edit to be redone if redo
is invoked. This returns null
if there are no edits to be redone.
protected void undoTo(UndoableEdit edit) throws CannotUndoException
Undoes all changes from the index of the next edit to edit
, updating the index of the next edit appropriately.
CannotUndoException
- if one of the edits throws CannotUndoException
protected void redoTo(UndoableEdit edit) throws CannotRedoException
Redoes all changes from the index of the next edit to edit
, updating the index of the next edit appropriately.
CannotRedoException
- if one of the edits throws CannotRedoException
public void undoOrRedo() throws CannotRedoException, CannotUndoException
Convenience method that invokes one of 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()
Returns true if it is possible to invoke undo
or redo
.
canUndoOrRedo
is validundoOrRedo()
public void undo() throws CannotUndoException
Undoes the appropriate edits. If 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 undoneCompoundEdit.end()
, canUndo()
, editToBeUndone()
public boolean canUndo()
Returns true if edits may be undone. If 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
Redoes the appropriate edits. If 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 redoneCompoundEdit.end()
, canRedo()
, editToBeRedone()
public boolean canRedo()
Returns true if edits may be redone. If 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(UndoableEdit anEdit)
Adds an 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 addedanEdit
can be incorporated into this editCompoundEdit.end()
, CompoundEdit.addEdit(javax.swing.undo.UndoableEdit)
public void end()
Turns this UndoManager
into a normal CompoundEdit
. This removes all edits that have been undone.
end
in class CompoundEdit
CompoundEdit.end()
public String getUndoOrRedoPresentationName()
Convenience method that returns either 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 String getUndoPresentationName()
Returns a description of the undoable form of this edit. If 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 String getRedoPresentationName()
Returns a description of the redoable form of this edit. If 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(UndoableEditEvent e)
An UndoableEditListener
method. This invokes addEdit
with e.getEdit()
.
undoableEditHappened
in interface UndoableEditListener
e
- the UndoableEditEvent
the UndoableEditEvent
will be added fromaddEdit(javax.swing.undo.UndoableEdit)
public String toString()
Returns a string that displays and identifies this object's properties.
toString
in class CompoundEdit
© 1993–2017, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.