/*******************************************************************************
 * 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.AbstractCommand;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.wst.sse.core.internal.Logger;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;


public class StructuredTextCommandImpl extends AbstractCommand implements StructuredTextCommand {

	protected IDocument fDocument = null; // needed for updating the text
	protected String fTextDeleted = null;
	protected int fTextEnd = -1;
	protected String fTextInserted = null;
	protected int fTextStart = -1;

	/**
	 * We have no-arg constructor non-public to force document to be specfied.
	 *  
	 */
	protected StructuredTextCommandImpl() {
		super();
	}

	public StructuredTextCommandImpl(IDocument document) {
		this();
		fDocument = document; // needed for updating the text
	}

	public void execute() {
	}

	/**
	 * getTextDeleted method comment.
	 */
	public java.lang.String getTextDeleted() {
		return fTextDeleted;
	}

	/**
	 * textEnd is the same as (textStart + textInserted.length())
	 */
	public int getTextEnd() {
		return fTextEnd;
	}

	/**
	 * getTextInserted method comment.
	 */
	public java.lang.String getTextInserted() {
		return fTextInserted;
	}

	/**
	 * getTextStart method comment.
	 */
	public int getTextStart() {
		return fTextStart;
	}

	protected boolean prepare() {
		return true;
	}

	public void redo() {
		if (fDocument instanceof IStructuredDocument) {
			// note: one of the few places we programatically ignore read-only
			// settings
			((IStructuredDocument) fDocument).replaceText(this, fTextStart, fTextDeleted.length(), fTextInserted, true);
		} else {
			try {
				fDocument.replace(fTextStart, fTextDeleted.length(), fTextInserted);
			} catch (BadLocationException e) {
				// assumed impossible, for now
				Logger.logException(e);
			}
		}
	}

	/**
	 * setTextDeleted method comment.
	 */
	public void setTextDeleted(java.lang.String textDeleted) {
		fTextDeleted = textDeleted;
	}

	/**
	 * setTextEnd method comment.
	 */
	public void setTextEnd(int textEnd) {
		fTextEnd = textEnd;
	}

	/**
	 * setTextInserted method comment.
	 */
	public void setTextInserted(java.lang.String textInserted) {
		fTextInserted = textInserted;
	}

	/**
	 * setTextStart method comment.
	 */
	public void setTextStart(int textStart) {
		fTextStart = textStart;
	}

	public void undo() {
		if (fDocument instanceof IStructuredDocument) {
			// note: one of the few places we programatically ignore read-only
			// settings
			((IStructuredDocument) fDocument).replaceText(this, fTextStart, fTextInserted.length(), fTextDeleted, true);
		} else {
			try {
				fDocument.replace(fTextStart, fTextInserted.length(), fTextDeleted);
			} catch (BadLocationException e) {
				// assumed impossible, for now
				Logger.logException(e);
			}
		}
	}
}
