/**
 * <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: CommandStack.java,v 1.1 2005/04/15 23:31:25 david_williams Exp $
 */
package org.eclipse.emf.common.command;



/**
 * A simple and obvious interface for an undoable stack of commands with a listener.
 * See {@link Command} for more details about the command methods that this implementation uses
 * and {@link CommandStackListener} for details about the listener.
 */
public interface CommandStack 
{
  /**
   * Clears any redoable commands not yet redone, adds the command, and then executes the command.
   * @param command the command to execute.
   */
  void execute(Command command); 

  /**
   * Returns whether the top command on the stack can be undone.
   * @return whether the top command on the stack can be undone.
   */
  boolean canUndo();

  /**
   * Moves the top of the stack down, undoing what was formerly the top command.
   */
  void undo();

  /**
   * Returns whether there are commands past the top of the stack that can be redone.
   * @return whether there are commands past the top of the stack that can be redone.
   */
  boolean canRedo(); 

  /**
   * Returns the command that will be undone if {@link #undo} is called.
   * @return the command that will be undone if {@link #undo} is called.
   */
  public Command getUndoCommand();
  
  /**
   * Returns the command that will be redone if {@link #redo} is called.
   * @return the command that will be redone if {@link #redo} is called.
   */
  public Command getRedoCommand();
  
  /**
   * Returns the command most recently executed, undone, or redone.
   * @return the command most recently executed, undone, or redone.
   */
  public Command getMostRecentCommand();

  /**
   * Moves the top of the stack up, redoing the new top command.
   */
  void redo();

  /**
   * Disposes all the commands in the stack.
   */
  void flush();

  /**
   * Adds a listener to the command stack, which will be notified whenever a command has been processed on the stack.
   * @param listener the listener to add.
   */
  void addCommandStackListener(CommandStackListener listener);

  /**
   * Removes a listener from the command stack.
   * @param listener the listener to remove.
   */
  void removeCommandStackListener(CommandStackListener listener);
}
