/******************************************************************************* * Copyright (c) 2000, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.gef.commands; /** * An Abstract implementation of {@link Command}. * @author hudsonr * @since 2.0 */ public abstract class Command { private String label; private String debugLabel; /** * Constructs a Command with no label. */ public Command () { } /** * Constructs a Command with the specified label. * @param label the Command's label */ public Command (String label) { setLabel(label); } /** * @return <code>true</code> if the command can be executed */ public boolean canExecute() { return true; } /** * @return <code>true</code> if the command can be undone. This method should only be * called after <code>execute()</code> or <code>redo()</code> has been called. */ public boolean canUndo() { return true; } /** * Returns a Command that represents the chaining of a specified Command to this * Command. The Command being chained will <code>execute()</code> after this command has * executed, and it will <code>undo()</code> before this Command is undone. * @param command <code>null</code> or the Command being chained * @return a Command representing the union */ public Command chain(Command command) { if (command == null) return this; class ChainedCompoundCommand extends CompoundCommand { public Command chain(Command c) { add(c); return this; } } CompoundCommand result = new ChainedCompoundCommand(); result.setDebugLabel("Chained Commands"); //$NON-NLS-1$ result.add(this); result.add(command); return result; } /** * This is called to indicate that the <code>Command</code> will not be used again. The * Command may be in any state (executed, undone or redone) when dispose is called. The * Command should not be referenced in any way after it has been disposed. */ public void dispose() { } /** * executes the Command. This method should not be called if the Command is not * executable. */ public void execute() { } /** * @return an untranslated String used for debug purposes only */ public String getDebugLabel() { return debugLabel + ' ' + getLabel(); } /** * @return a String used to describe this command to the User */ public String getLabel() { return label; } /** * Re-executes the Command. This method should only be called after <code>undo()</code> * has been called. */ public void redo() { execute(); } /** * Sets the debug label for this command * @param label a description used for debugging only */ public void setDebugLabel(String label) { debugLabel = label; } /** * Sets the label used to describe this command to the User. * @param label the label */ public void setLabel(String label) { this.label = label; } /** * Undoes the changes performed during <code>execute()</code>. This method should only be * called after <code>execute</code> has been called, and only when <code>canUndo()</code> * returns <code>true</code>. * @see #canUndo() */ public void undo() { } }