/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.core.refactor;
import java.util.Collection;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
/**
* A ModelRefactorCommand is the interface that all refactoring commands have to implement
*
* @since 8.0
*/
public interface ModelRefactorCommand {
/**
* Returns whether the comamad is valid to <code>execute</code>.
* This <b>must</b> be called before calling <code>execute</code>.
* @return an <code>IStatus</code> indicating whether the comamad is valid to <code>execute</code>.
*/
IStatus canExecute();
/**
* Performs the command activity required for the effect.
* The effect of calling <code>execute</code> when <code>canExecute</code> returns <code>false</code>,
* or when <code>canExecute</code> hasn't been called, is undefined.
*/
IStatus execute(final IProgressMonitor monitor);
/**
* Returns whether the command can be undone.
* The result of calling this before <code>execute</code> is well defined,
* but the result of calling this before calling <code>canExecute</code> is undefined, i.e.,
* a command that returns <code>false</code> for <code>canExecute</code> may return <code>true</code> for canUndo,
* even though that is a contradiction.
* @return whether the command can be undone.
*/
boolean canUndo();
/**
* Returns whether the command can be redone.
* The result of calling this before <code>execute</code> is well defined,
* but the result of calling this before calling <code>canExecute</code> is undefined, i.e.,
* a command that returns <code>false</code> for <code>canExecute</code> may return <code>true</code> for canRedo,
* even though that is a contradiction.
* @return whether the command can be redone.
*/
boolean canRedo();
/**
* Performs the command activity required to <code>undo</code> the effects of a preceding <code>execute</code> (or <code>redo</code>).
* The effect, if any, of calling <code>undo</code> before <code>execute</code> or <code>redo</code> have been called,
* or when canUndo returns <code>false</code>, is undefined.
*/
void undo();
/**
* Performs the command activity required to <code>redo</code> the effect after undoing the effect.
* The effect, if any, of calling <code>redo</code> before <code>undo</code> is called is undefined.
* Note that if you implement <code>redo</code> to call <code>execute</code>
* then any derived class will be restricted by that decision also.
*/
void redo();
/**
* Returns a collection of things which this command wishes to present as it's result.
* The result of calling this before an <code>execute</code> or <code>redo</code>, or after an <code>undo</code>, is undefined.
* @return a collection of things which this command wishes to present as it's result.
*/
Collection getResult();
/**
* Returns the collection of things which this command wishes to present as the objects affected by the command.
* Typically should could be used as the selection that should be highlighted to best illustrate the effect of the command.
* The result of calling this before an <code>execute</code>, <code>redo</code>, or <code>undo</code> is undefined.
* The result may be different after an <code>undo</code> than it is after an <code>execute</code> or <code>redo</code>,
* but the result should be the same (equivalent) after either an <code>execute</code> or <code>redo</code>.
* @return the collection of things which this command wishes to present as the objects affected by the command.
*/
Collection getAffectedObjects();
/**
* Returns a string suitable to represent the label that identifies this command.
* @return a string suitable to represent the label that identifies this command.
*/
String getLabel();
/**
* Returns a string suitable to help describe the effect of this command.
* @return a string suitable to help describe the effect of this command.
*/
String getDescription();
/**
* Returns a <code>Collection</code> of <code>IStatus</code> errors and warnings that caused this
* command to return <code>IStatus.ERROR</code> or <code>IStatus.WARNING</code> after <code>execute</code>.
* @return
*/
Collection getPostExecuteMessages();
}