/* * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package javax.swing.undo; import javax.swing.event.*; /** * An UndoableEdit represents an edit. The edit may * be undone, or if already undone the edit may be redone. *

* UndoableEdit is designed to be used with the * UndoManager. As UndoableEdits are generated * by an UndoableEditListener they are typically added to * the UndoManager. When an UndoableEdit * is added to an UndoManager the following occurs (assuming * end has not been called on the UndoManager): *

    *
  1. If the UndoManager contains edits it will call * addEdit on the current edit passing in the new edit * as the argument. If addEdit returns true the * new edit is assumed to have been incorporated into the current edit and * the new edit will not be added to the list of current edits. * Edits can use addEdit as a way for smaller edits to * be incorporated into a larger edit and treated as a single edit. *
  2. If addEdit returns false replaceEdit * is called on the new edit with the current edit passed in as the * argument. This is the inverse of addEdit — * if the new edit returns true from replaceEdit, the new * edit replaces the current edit. *
* The UndoManager makes use of * isSignificant to determine how many edits should be * undone or redone. The UndoManager will undo or redo * all insignificant edits (isSignificant returns false) * between the current edit and the last or * next significant edit. addEdit and * replaceEdit can be used to treat multiple edits as * a single edit, returning false from isSignificant * allows for treating can be used to * have many smaller edits undone or redone at once. Similar functionality * can also be done using the addEdit method. * * @author Ray Ryan */ public interface UndoableEdit { /** * Undo the edit. * * @throws CannotUndoException if this edit can not be undone */ public void undo() throws CannotUndoException; /** * Returns true if this edit may be undone. * * @return true if this edit may be undone */ public boolean canUndo(); /** * Re-applies the edit. * * @throws CannotRedoException if this edit can not be redone */ public void redo() throws CannotRedoException; /** * Returns true if this edit may be redone. * * @return true if this edit may be redone */ public boolean canRedo(); /** * Informs the edit that it should no longer be used. Once an * UndoableEdit has been marked as dead it can no longer * be undone or redone. *

* This is a useful hook for cleaning up state no longer * needed once undoing or redoing is impossible--for example, * deleting file resources used by objects that can no longer be * undeleted. UndoManager calls this before it dequeues edits. *

* Note that this is a one-way operation. There is no "un-die" * method. * * @see CompoundEdit#die */ public void die(); /** * Adds an UndoableEdit to this UndoableEdit. * This method can be used to coalesce smaller edits into a larger * compound edit. For example, text editors typically allow * undo operations to apply to words or sentences. The text * editor may choose to generate edits on each key event, but allow * those edits to be coalesced into a more user-friendly unit, such as * a word. In this case, the UndoableEdit would * override addEdit to return true when the edits may * be coalesced. *

* A return value of true indicates anEdit was incorporated * into this edit. A return value of false indicates anEdit * may not be incorporated into this edit. *

Typically the receiver is already in the queue of a * UndoManager (or other UndoableEditListener), * and is being given a chance to incorporate anEdit * rather than letting it be added to the queue in turn.

* *

If true is returned, from now on anEdit must return * false from canUndo and canRedo, * and must throw the appropriate exception on undo or * redo.

* * @param anEdit the edit to be added * @return true if anEdit may be incorporated into this * edit */ public boolean addEdit(UndoableEdit anEdit); /** * Returns true if this UndoableEdit should replace * anEdit. This method is used by CompoundEdit * and the UndoManager; it is called if * anEdit could not be added to the current edit * (addEdit returns false). *

* This method provides a way for an edit to replace an existing edit. *

This message is the opposite of addEdit--anEdit has typically * already been queued in an UndoManager (or other * UndoableEditListener), and the receiver is being given a chance * to take its place.

* *

If true is returned, from now on anEdit must return false from * canUndo() and canRedo(), and must throw the appropriate * exception on undo() or redo().

* * @param anEdit the edit that replaces the current edit * @return true if this edit should replace anEdit */ public boolean replaceEdit(UndoableEdit anEdit); /** * Returns true if this edit is considered significant. A significant * edit is typically an edit that should be presented to the user, perhaps * on a menu item or tooltip. The UndoManager will undo, * or redo, all insignificant edits to the next significant edit. * * @return true if this edit is significant */ public boolean isSignificant(); /** * Returns a localized, human-readable description of this edit, suitable * for use in a change log, for example. * * @return description of this edit */ public String getPresentationName(); /** * Returns a localized, human-readable description of the undoable form of * this edit, suitable for use as an Undo menu item, for example. * This is typically derived from getPresentationName. * * @return a description of the undoable form of this edit */ public String getUndoPresentationName(); /** * Returns a localized, human-readable description of the redoable form of * this edit, suitable for use as a Redo menu item, for example. This is * typically derived from getPresentationName. * * @return a description of the redoable form of this edit */ public String getRedoPresentationName(); }