/* * @(#)AbstractUndoableEdit.java 1.29 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package javax.swing.undo; import java.io.Serializable; import javax.swing.UIManager; /** * An abstract implementation of UndoableEdit, * implementing simple responses to all boolean methods in * that interface. * * @version 1.29 12/19/03 * @author Ray Ryan */ public class AbstractUndoableEdit implements UndoableEdit, Serializable { /** * String returned by getUndoPresentationName; * as of Java 2 platform v1.3.1 this field is no longer used. This value * is now localized and comes from the defaults table with key * AbstractUndoableEdit.undoText. * * @see javax.swing.UIDefaults */ protected static final String UndoName = "Undo"; /** * String returned by getRedoPresentationName; * as of Java 2 platform v1.3.1 this field is no longer used. This value * is now localized and comes from the defaults table with key * AbstractUndoableEdit.redoText. * * @see javax.swing.UIDefaults */ protected static final String RedoName = "Redo"; /** * Defaults to true; becomes false if this edit is undone, true * again if it is redone. */ boolean hasBeenDone; /** * True if this edit has not received die; defaults * to true. */ boolean alive; /** * Creates an AbstractUndoableEdit which defaults * and alive to true. */ public AbstractUndoableEdit() { super(); hasBeenDone = true; alive = true; } /** * Sets alive to false. Note that this * is a one way operation; dead edits cannot be resurrected. * Sending undo or redo to * a dead edit results in an exception being thrown. * *

Typically an edit is killed when it is consolidated by * another edit's addEdit or replaceEdit * method, or when it is dequeued from an UndoManager. */ public void die() { alive = false; } /** * Throws CannotUndoException if canUndo * returns false. Sets hasBeenDone * to false. Subclasses should override to undo the * operation represented by this edit. Override should begin with * a call to super. * * @exception CannotUndoException if canUndo * returns false * @see #canUndo */ public void undo() throws CannotUndoException { if (!canUndo()) { throw new CannotUndoException(); } hasBeenDone = false; } /** * Returns true if this edit is alive * and hasBeenDone is true. * * @return true if this edit is alive * and hasBeenDone is true * * @see #die * @see #undo * @see #redo */ public boolean canUndo() { return alive && hasBeenDone; } /** * Throws CannotRedoException if canRedo * returns false. Sets hasBeenDone to true. * Subclasses should override to redo the operation represented by * this edit. Override should begin with a call to super. * * @exception CannotRedoException if canRedo * returns false * @see #canRedo */ public void redo() throws CannotRedoException { if (!canRedo()) { throw new CannotRedoException(); } hasBeenDone = true; } /** * Returns true if this edit is alive * and hasBeenDone is false. * * @return true if this edit is alive * and hasBeenDone is false * @see #die * @see #undo * @see #redo */ public boolean canRedo() { return alive && !hasBeenDone; } /** * This default implementation returns false. * * @param anEdit the edit to be added * @return false * * @see UndoableEdit#addEdit */ public boolean addEdit(UndoableEdit anEdit) { return false; } /** * This default implementation returns false. * * @param anEdit the edit to replace * @return false * * @see UndoableEdit#replaceEdit */ public boolean replaceEdit(UndoableEdit anEdit) { return false; } /** * This default implementation returns true. * * @return true * @see UndoableEdit#isSignificant */ public boolean isSignificant() { return true; } /** * This default implementation returns "". Used by * getUndoPresentationName and * getRedoPresentationName to * construct the strings they return. Subclasses should override to * return an appropriate description of the operation this edit * represents. * * @return the empty string "" * * @see #getUndoPresentationName * @see #getRedoPresentationName */ public String getPresentationName() { return ""; } /** * Retreives the value from the defaults table with key * AbstractUndoableEdit.undoText and returns * that value followed by a space, followed by * getPresentationName. * If getPresentationName returns "", * then the defaults value is returned alone. * * @return the value from the defaults table with key * AbstractUndoableEdit.undoText, followed * by a space, followed by getPresentationName * unless getPresentationName is "" in which * case, the defaults value is returned alone. * @see #getPresentationName */ public String getUndoPresentationName() { String name = getPresentationName(); if (!"".equals(name)) { name = UIManager.getString("AbstractUndoableEdit.undoText") + " " + name; } else { name = UIManager.getString("AbstractUndoableEdit.undoText"); } return name; } /** * Retreives the value from the defaults table with key * AbstractUndoableEdit.redoText and returns * that value followed by a space, followed by * getPresentationName. * If getPresentationName returns "", * then the defaults value is returned alone. * * @return the value from the defaults table with key * AbstractUndoableEdit.redoText, followed * by a space, followed by getPresentationName * unless getPresentationName is "" in which * case, the defaults value is returned alone. * @see #getPresentationName */ public String getRedoPresentationName() { String name = getPresentationName(); if (!"".equals(name)) { name = UIManager.getString("AbstractUndoableEdit.redoText") + " " + name; } else { name = UIManager.getString("AbstractUndoableEdit.redoText"); } return name; } /** * Returns a string that displays and identifies this * object's properties. * * @return a String representation of this object */ public String toString() { return super.toString() + " hasBeenDone: " + hasBeenDone + " alive: " + alive; } }