/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.commands.range;

import org.eclipse.jst.pagedesigner.dom.DOMPosition;
import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
import org.eclipse.jst.pagedesigner.dom.DOMRange;
import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
import org.w3c.dom.Text;

/**
 * This command can used to handle things like "paste". Or keyboard printable
 * ascii key. Note: ENTER key is not handled here.
 * 
 * @author mengbo
 */
// FIXME: \r \n in the content string is not handled.
public class ContentCommand extends RangeModeCommand {

	private String _content;

	/**
	 * @param viewer
	 * @param content 
	 */
	public ContentCommand(IHTMLGraphicalViewer viewer, String content) {
		super("", viewer);
		_content = content;
	}

	/**
	 * @param viewer
	 * @param c
	 */
	public ContentCommand(IHTMLGraphicalViewer viewer, char c) {
		super("", viewer);
		_content = String.valueOf(c);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
	 */
	protected DOMRange doRangeExecute(DOMRange range) {
		if (range == null)
			return null;

		IDOMPosition position = DOMPositionHelper.removeRange(range);
		position = doContent(position);
		return new DOMRange(position, position);

	}

	/**
	 * @param position
	 * @return ??
	 */
	protected IDOMPosition doContent(IDOMPosition position) {
		position = DOMPositionHelper.mergeIntoText(position);

		if (position.getContainerNode() instanceof Text) {
			Text text = (Text) position.getContainerNode();
			String data = text.getData();
			int offset = position.getOffset();
			String newData = data.substring(0, offset) + _content
					+ data.substring(offset);
			text.setData(newData);
			return new DOMPosition(text, offset + _content.length());
		}
        // we need to create a text node.
        Text text = getDocument().createTextNode(_content);
        position.getContainerNode().insertBefore(text,
        		position.getNextSiblingNode());
        return new DOMRefPosition(text, true);
	}

	// protected DesignPosition doContent()
	// {
	// // DesignPosition position = removeRange();
	// DesignPosition position = this.getSelectionRange().getEndPosition();
	// if ('\r' == _content || '\n' == _content)
	// {
	// Element br = getModel().getDocument().createElement("BR");
	// Node node = RangeUtil.insertElement(position, br);
	//
	// // we need set the new range to the node.
	// // FIXME: temp code, need to reconsider how to do refresh, when those
	// editpart
	// // are recreated.
	// IDOMNode parent = (IDOMNode) node.getParentNode();
	// EditPart parentPart = (EditPart) parent.getAdapterFor(EditPart.class);
	// List childParts = parentPart.getChildren();
	// for (int i=0; i<childParts.size(); i++)
	// {
	// if (node == ((EditPart)childParts.get(i)).getModel())
	// {
	// return new DesignPosition(parentPart, i+1);
	// }
	// }
	// return new DesignPosition(parentPart, childParts.size());
	// }
	// else
	// {
	// TextPosition textPosition = RangeUtil.insertText(position,
	// String.valueOf(_content));
	// IDOMText text = textPosition.getTextNode();
	// EditPart part = (EditPart) text.getAdapterFor(EditPart.class);
	// return new DesignPosition(part, textPosition.getOffset());
	// }
	// }
	//
}
