/*
 * Copyright (c) 1997, 2006, 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 java.io.Serializable;
import javax.swing.UIManager;

/**
 * An abstract implementation of <code>UndoableEdit</code>,
 * implementing simple responses to all boolean methods in
 * that interface.
 *
 * @author Ray Ryan
 */
public class AbstractUndoableEdit implements UndoableEdit, Serializable {

    /**
     * String returned by <code>getUndoPresentationName</code>;
     * 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
     * <code>AbstractUndoableEdit.undoText</code>.
     *
     * @see javax.swing.UIDefaults
     */
    protected static final String UndoName = "Undo";

    /**
     * String returned by <code>getRedoPresentationName</code>;
     * 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
     * <code>AbstractUndoableEdit.redoText</code>.
     *
     * @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 <code>die</code>; defaults
     * to <code>true</code>.
     */
    boolean alive;

    /**
     * Creates an <code>AbstractUndoableEdit</code> which defaults
     * <code>hasBeenDone</code> and <code>alive</code> to <code>true</code>.
     */
    public AbstractUndoableEdit() {
        super();

        hasBeenDone = true;
        alive = true;
    }

    /**
     * Sets <code>alive</code> to false. Note that this
     * is a one way operation; dead edits cannot be resurrected.
     * Sending <code>undo</code> or <code>redo</code> to
     * a dead edit results in an exception being thrown.
     *
     * <p>Typically an edit is killed when it is consolidated by
     * another edit's <code>addEdit</code> or <code>replaceEdit</code>
     * method, or when it is dequeued from an <code>UndoManager</code>.
     */
    public void die() {
        alive = false;
    }

    /**
     * Throws <code>CannotUndoException</code> if <code>canUndo</code>
     * returns <code>false</code>. Sets <code>hasBeenDone</code>
     * to <code>false</code>. Subclasses should override to undo the
     * operation represented by this edit. Override should begin with
     * a call to super.
     *
     * @exception CannotUndoException if <code>canUndo</code>
     *    returns <code>false</code>
     * @see     #canUndo
     */
    public void undo() throws CannotUndoException {
        if (!canUndo()) {
            throw new CannotUndoException();
        }
        hasBeenDone = false;
    }

    /**
     * Returns true if this edit is <code>alive</code>
     * and <code>hasBeenDone</code> is <code>true</code>.
     *
     * @return true if this edit is <code>alive</code>
     *    and <code>hasBeenDone</code> is <code>true</code>
     *
     * @see     #die
     * @see     #undo
     * @see     #redo
     */
    public boolean canUndo() {
        return alive && hasBeenDone;
    }

    /**
     * Throws <code>CannotRedoException</code> if <code>canRedo</code>
     * returns false. Sets <code>hasBeenDone</code> to <code>true</code>.
     * Subclasses should override to redo the operation represented by
     * this edit. Override should begin with a call to super.
     *
     * @exception CannotRedoException if <code>canRedo</code>
     *     returns <code>false</code>
     * @see     #canRedo
     */
    public void redo() throws CannotRedoException {
        if (!canRedo()) {
            throw new CannotRedoException();
        }
        hasBeenDone = true;
    }

    /**
     * Returns <code>true</code> if this edit is <code>alive</code>
     * and <code>hasBeenDone</code> is <code>false</code>.
     *
     * @return <code>true</code> if this edit is <code>alive</code>
     *   and <code>hasBeenDone</code> is <code>false</code>
     * @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
     * <code>getUndoPresentationName</code> and
     * <code>getRedoPresentationName</code> 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
     * <code>AbstractUndoableEdit.undoText</code> and returns
     * that value followed by a space, followed by
     * <code>getPresentationName</code>.
     * If <code>getPresentationName</code> returns "",
     * then the defaults value is returned alone.
     *
     * @return the value from the defaults table with key
     *    <code>AbstractUndoableEdit.undoText</code>, followed
     *    by a space, followed by <code>getPresentationName</code>
     *    unless <code>getPresentationName</code> 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
     * <code>AbstractUndoableEdit.redoText</code> and returns
     * that value followed by a space, followed by
     * <code>getPresentationName</code>.
     * If <code>getPresentationName</code> returns "",
     * then the defaults value is returned alone.
     *
     * @return the value from the defaults table with key
     *    <code>AbstractUndoableEdit.redoText</code>, followed
     *    by a space, followed by <code>getPresentationName</code>
     *    unless <code>getPresentationName</code> 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;
    }
}
