/*******************************************************************************
 * Copyright (c) 2001, 2004 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
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.sse.core.internal.undo;



import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;



public class StructuredTextCompoundCommandImpl extends CompoundCommand implements CommandCursorPosition {
	protected int fRedoCursorPosition = -1;
	protected int fRedoSelectionLength = 0;

	protected int fUndoCursorPosition = -1;
	protected int fUndoSelectionLength = 0;

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 */
	public StructuredTextCompoundCommandImpl() {
		super();
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param resultIndex
	 *            int
	 */
	public StructuredTextCompoundCommandImpl(int resultIndex) {
		super(resultIndex);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param resultIndex
	 *            int
	 * @param commandList
	 *            java.util.List
	 */
	public StructuredTextCompoundCommandImpl(int resultIndex, java.util.List commandList) {
		super(resultIndex, commandList);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param resultIndex
	 *            int
	 * @param label
	 *            java.lang.String
	 */
	public StructuredTextCompoundCommandImpl(int resultIndex, String label) {
		super(resultIndex, label);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param resultIndex
	 *            int
	 * @param label
	 *            java.lang.String
	 * @param commandList
	 *            java.util.List
	 */
	public StructuredTextCompoundCommandImpl(int resultIndex, String label, java.util.List commandList) {
		super(resultIndex, label, commandList);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param resultIndex
	 *            int
	 * @param label
	 *            java.lang.String
	 * @param description
	 *            java.lang.String
	 */
	public StructuredTextCompoundCommandImpl(int resultIndex, String label, String description) {
		super(resultIndex, label, description);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param resultIndex
	 *            int
	 * @param label
	 *            java.lang.String
	 * @param description
	 *            java.lang.String
	 * @param commandList
	 *            java.util.List
	 */
	public StructuredTextCompoundCommandImpl(int resultIndex, String label, String description, java.util.List commandList) {
		super(resultIndex, label, description, commandList);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param commandList
	 *            java.util.List
	 */
	public StructuredTextCompoundCommandImpl(java.util.List commandList) {
		super(commandList);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param label
	 *            java.lang.String
	 */
	public StructuredTextCompoundCommandImpl(String label) {
		super(label);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param label
	 *            java.lang.String
	 * @param commandList
	 *            java.util.List
	 */
	public StructuredTextCompoundCommandImpl(String label, java.util.List commandList) {
		super(label, commandList);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param label
	 *            java.lang.String
	 * @param description
	 *            java.lang.String
	 */
	public StructuredTextCompoundCommandImpl(String label, String description) {
		super(label, description);
	}

	/**
	 * StructuredTextCompoundCommandImpl constructor comment.
	 * 
	 * @param label
	 *            java.lang.String
	 * @param description
	 *            java.lang.String
	 * @param commandList
	 *            java.util.List
	 */
	public StructuredTextCompoundCommandImpl(String label, String description, java.util.List commandList) {
		super(label, description, commandList);
	}

	/**
	 * Returns the cursor position to be set to after this command is redone.
	 * 
	 * @return int
	 */
	public int getRedoCursorPosition() {
		int cursorPosition = -1;

		if (fRedoCursorPosition != -1)
			cursorPosition = fRedoCursorPosition;
		else if (!commandList.isEmpty()) {
			int commandListSize = commandList.size();
			Command lastCommand = (Command) commandList.get(commandListSize - 1);

			if (lastCommand instanceof CommandCursorPosition)
				cursorPosition = ((CommandCursorPosition) lastCommand).getRedoCursorPosition();
		}

		return cursorPosition;
	}

	/**
	 * Returns the length of text to be selected after this command is redone.
	 * 
	 * @return int
	 */
	public int getRedoSelectionLength() {
		return fRedoSelectionLength;
	}

	/**
	 * Returns the cursor position to be set to after this command is undone.
	 * 
	 * @return int
	 */
	public int getUndoCursorPosition() {
		int cursorPosition = -1;

		if (fUndoCursorPosition != -1)
			cursorPosition = fUndoCursorPosition;
		else if (!commandList.isEmpty()) {
			// never used
			//int commandListSize = commandList.size();
			Command firstCommand = (Command) commandList.get(0);

			if (firstCommand instanceof CommandCursorPosition)
				cursorPosition = ((CommandCursorPosition) firstCommand).getUndoCursorPosition();
		}

		return cursorPosition;
	}

	/**
	 * Returns the length of text to be selected after this command is undone.
	 * 
	 * @return int
	 */
	public int getUndoSelectionLength() {
		return fUndoSelectionLength;
	}

	/**
	 * Sets the cursor position to be used after this command is redone.
	 */
	public void setRedoCursorPosition(int cursorPosition) {
		fRedoCursorPosition = cursorPosition;
	}

	/**
	 * Sets the length of text to be selected after this command is redone.
	 */
	public void setRedoSelectionLength(int selectionLength) {
		fRedoSelectionLength = selectionLength;
	}

	/**
	 * Sets the cursor position to be used after this command is undone.
	 */
	public void setUndoCursorPosition(int cursorPosition) {
		fUndoCursorPosition = cursorPosition;
	}

	/**
	 * Sets the length of text to be selected after this command is undone.
	 */
	public void setUndoSelectionLength(int selectionLength) {
		fUndoSelectionLength = selectionLength;
	}
}
