javax.swing.undo

Class StateEdit

Implemented Interfaces:
Serializable, UndoableEdit

public class StateEdit
extends AbstractUndoableEdit

A helper class, making it easy to support undo and redo.

The following example shows how to use this class.

 Foo foo; // class Foo implements StateEditable
 StateEdit edit;

 edit = new StateEdit(foo, "Name Change");
 foo.setName("Jane Doe");
 edit.end();
 undoManager.addEdit(edit);
 

If Foo’s implementation of StateEditable considers the name as part of the editable state, the user can now choose “Undo Name Change” or “Redo Name Change” from the respective menu. No further undo support is needed from the application.

The following explains what happens in the example.

  1. When a StateEdit is created, the associated StateEditable gets asked to store its state into a hash table, StateEdit.
  2. The application will now perform some changes to the edited object. This typically happens by invoking methods on the edited object.
  3. The editing phase is terminated by invoking the end() method of the StateEdit. The end() method does two things.
    • The edited object receives a second request for storing its state. This time, it will use a different hash table, StateEdit.
    • To increase efficiency, the StateEdit now removes any entries from StateEdit and StateEdit that have the same key, and whose values are equal. Equality is determined by invoking the equals method inherited from Object.
    • When the user later chooses to undo the StateEdit, the edited object is asked to restore its state from the StateEdit table. Similarly, when the user chooses to redo the StateEdit, the edited object gets asked to restore its state from the StateEdit.
    See Also:
    Serialized Form

    Field Summary

    protected Hashtable
    Object>postState
    The state of object at the time when end() was called.
    protected Hashtable
    Object>preState
    The state of object at the time of constructing this StateEdit.
    protected static String
    RCSID
    The ID of the Java source file in Sun’s Revision Control System (RCS).
    protected StateEditable
    object
    The object which is being edited by this StateEdit.
    protected String
    undoRedoName
    A human-readable name for this edit action.

    Fields inherited from class javax.swing.undo.AbstractUndoableEdit

    RedoName, UndoName

    Constructor Summary

    StateEdit(StateEditable obj)
    Constructs a StateEdit, specifying the object whose state is being edited.
    StateEdit(StateEditable obj, String name)
    Constructs a StateEdit, specifying the object whose state is being edited.

    Method Summary

    void
    end()
    Informs this StateEdit that all edits are finished.
    String
    getPresentationName()
    Returns a human-readable, localized name that describes this editing action and can be displayed to the user.
    protected void
    init(StateEditable obj, String name)
    Initializes this StateEdit.
    void
    redo()
    Redoes this edit operation.
    protected void
    removeRedundantState()
    Removes all redundant entries from the pre- and post-edit state hash tables.
    void
    undo()
    Undoes this edit operation.

    Methods inherited from class javax.swing.undo.AbstractUndoableEdit

    addEdit, canRedo, canUndo, die, getPresentationName, getRedoPresentationName, getUndoPresentationName, isSignificant, redo, replaceEdit, toString, undo

    Methods inherited from class java.lang.Object

    clone, equals, extends Object> getClass, finalize, hashCode, notify, notifyAll, toString, wait, wait, wait

    Field Details

    Object>postState

    protected HashtableObject>postState
    The state of object at the time when end() was called.

    Object>preState

    protected HashtableObject>preState
    The state of object at the time of constructing this StateEdit.

    RCSID

    protected static final String RCSID
    The ID of the Java source file in Sun’s Revision Control System (RCS). This certainly should not be part of the API specification. But in order to be API-compatible with Sun’s reference implementation, GNU Classpath also has to provide this field and match its value. The value used here has been in every JDK release at least from 1.2 to 1.5.
    Field Value:
    "$Id: StateEdit.java,v 1.6 1997/10/01 20:05:51 sandipc Exp $"

    object

    protected StateEditable object
    The object which is being edited by this StateEdit.

    undoRedoName

    protected String undoRedoName
    A human-readable name for this edit action.

    Constructor Details

    StateEdit

    public StateEdit(StateEditable obj)
    Constructs a StateEdit, specifying the object whose state is being edited.
    Parameters:
    obj - the object whose state is being edited by this StateEdit.

    StateEdit

    public StateEdit(StateEditable obj,
                     String name)
    Constructs a StateEdit, specifying the object whose state is being edited.
    Parameters:
    obj - the object whose state is being edited by this StateEdit.
    name - the human-readable name of the editing action.

    Method Details

    end

    public void end()
    Informs this StateEdit that all edits are finished. The edited object will be asked to store its state into StateEdit, and any redundant entries will get removed from StateEdit and StateEdit.

    getPresentationName

    public String getPresentationName()
    Returns a human-readable, localized name that describes this editing action and can be displayed to the user.
    Specified by:
    getPresentationName in interface UndoableEdit
    Overrides:
    getPresentationName in interface AbstractUndoableEdit
    Returns:
    the name, or null if no presentation name is available.

    init

    protected void init(StateEditable obj,
                        String name)
    Initializes this StateEdit. The edited object will be asked to store its current state into StateEdit.
    Parameters:
    obj - the object being edited.
    name - the human-readable name of the editing action.

    redo

    public void redo()
    Redoes this edit operation. The edited object will be asked to restore its state from StateEdit.
    Specified by:
    redo in interface UndoableEdit
    Overrides:
    redo in interface AbstractUndoableEdit
    Throws:
    CannotRedoException - if canRedo() returns false, for example because this action has not yet been undone.

    removeRedundantState

    protected void removeRedundantState()
    Removes all redundant entries from the pre- and post-edit state hash tables. An entry is considered redundant if it is present both before and after the edit, and if the two values are equal.

    undo

    public void undo()
    Undoes this edit operation. The edited object will be asked to restore its state from StateEdit.
    Specified by:
    undo in interface UndoableEdit
    Overrides:
    undo in interface AbstractUndoableEdit
    Throws:
    CannotUndoException - if canUndo() returns false, for example because this action has already been undone.

    StateEdit.java -- UndoableEdit for StateEditable implementations. Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.