blob: 2b8f13771bacda7b10bf33284bc653b2e541449d [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2002-2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*
* </copyright>
*
* $Id: CommandWrapper.java,v 1.3 2005/06/06 05:36:11 david_williams Exp $
*/
package org.eclipse.emf.common.command;
import java.util.Collection;
import java.util.Collections;
/**
* A command that wraps another command. All the {@link Command} methods are
* delegated to the wrapped command.
*
* <p>
* There are two typical usage patterns. One typical use for this command is
* to modify the behaviour of a command that you can't subclass, i.e., a
* decorator pattern:
*
* <pre>
* Command decoratedCommand = new CommandWrapper(someOtherCommand) {
* public void execute() {
* doSomethingBeforeExecution();
* super.execute();
* doSomethingAfterExecution();
* }
*
* public Collection getResult() {
* return someOtherResult();
* }
* };
* </pre>
*
* The other typical use is to act as a proxy for a command who's creation is
* delayed:
*
* <pre>
* Command proxyCommand = new CommandWrapper() {
* public Command createCommand() {
* return createACommandSomehow();
* }
* };
* </pre>
*/
public class CommandWrapper extends AbstractCommand {
/**
* The command for which this is a proxy or decorator.
*/
protected Command command;
/**
* Creates a decorator instance for the given command.
*
* @param command
* the command to wrap.
*/
public CommandWrapper(Command command) {
super(command.getLabel(), command.getDescription());
this.command = command;
}
/**
* Creates a decorator instance with the given label for the given
* command.
*
* @param label
* the label of the wrapper
* @param command
* the command to wrap.
*/
protected CommandWrapper(String label, Command command) {
super(label, command.getDescription());
this.command = command;
}
/**
* Creates a decorator instance with the given label and description for
* the given command.
*
* @param label
* the label of the wrapper
* @param description
* the description of the wrapper
* @param command
* the command to wrap.
*/
public CommandWrapper(String label, String description, Command command) {
super(label, description);
this.command = command;
}
/**
* Creates a commandless proxy instance. The wrapped command will be
* created by a {@link #createCommand} callback. Since a proxy command
* like this is pointless unless you override some method, this
* constructor is protected.
*/
protected CommandWrapper() {
super();
}
/**
* Creates a commandless proxy instance, with the given label. The command
* will be created by a {@link #createCommand} callback. Since a proxy
* command like this is pointless unless you override some method, this
* constructor is protected.
*
* @param label
* the label of the wrapper
*/
protected CommandWrapper(String label) {
super(label);
}
/**
* Creates a commandless proxy instance, with the given label and
* description. The command will be created by a {@link #createCommand}
* callback. Since a proxy command like this is pointless unless you
* override some method, this constructor is protected.
*
* @param label
* the label of the wrapper
* @param description
* the description of the wrapper
*/
protected CommandWrapper(String label, String description) {
super(label, description);
}
/**
* Returns the command for which this is a proxy or decorator. This may be
* <code>null</code> before {@link #createCommand} is called.
*
* @return the command for which this is a proxy or decorator.
*/
public Command getCommand() {
return command;
}
/**
* Create the command being proxied. This implementation just return
* <code>null</code>. It is called by {@link #prepare}.
*
* @return the command being proxied.
*/
protected Command createCommand() {
return null;
}
/**
* Returns whether the command can execute. This implementation creates
* the command being proxied using {@link #createCommand}, if the command
* wasn't given in the constructor.
*
* @return whether the command can execute.
*/
protected boolean prepare() {
if (command == null) {
command = createCommand();
}
boolean result = command.canExecute();
return result;
}
/**
* Delegates to the execute method of the command.
*/
public void execute() {
if (command != null) {
command.execute();
}
}
/**
* Delegates to the canUndo method of the command.
*/
public boolean canUndo() {
return command == null || command.canUndo();
}
/**
* Delegates to the undo method of the command.
*/
public void undo() {
if (command != null) {
command.undo();
}
}
/**
* Delegates to the redo method of the command.
*/
public void redo() {
if (command != null) {
command.redo();
}
}
/**
* Delegates to the getResult method of the command.
*
* @return the result.
*/
public Collection getResult() {
return command == null ? Collections.EMPTY_LIST : command.getResult();
}
/**
* Delegates to the getAffectedObjects method of the command.
*
* @return the result.
*/
public Collection getAffectedObjects() {
return command == null ? Collections.EMPTY_LIST : command.getAffectedObjects();
}
/**
* Delegates to the getLabel method of the command.
*
* @return the label.
*/
public String getLabel() {
return label == null ? command == null ? UnDoCommonMessages._UI_CommandWrapper_label : command.getLabel() : label;
}
/**
* Delegates to the getDescription method of the command.
*
* @return the description.
*/
public String getDescription() {
return description == null ? command == null ? UnDoCommonMessages._UI_CommandWrapper_description : command.getDescription() : description;
}
/**
* Delegates to the dispose method of the command.
*/
public void dispose() {
if (command != null) {
command.dispose();
}
}
/*
* Javadoc copied from base class.
*/
public String toString() {
StringBuffer result = new StringBuffer(super.toString());
result.append(" (command: " + command + ")"); //$NON-NLS-1$ //$NON-NLS-2$
return result.toString();
}
}