/*******************************************************************************
 * 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.gef.GraphicalViewer;
import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
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.DOMUtil;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.w3c.dom.Node;
import org.w3c.dom.Text;

/**
 * InsertEdit will perform action at a single location, the data souce could be
 * clipboard or keyboard.
 * 
 * @author mengbo
 */
public class InsertEdit extends DeleteEdit {
	private IInputSourceProvider _data;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
	 */
	public boolean operate() {
		DOMRange range = getRange();
		if (!EditModelQuery.isSame(range.getStartPosition(), range
				.getEndPosition())) {
			deleteRange();
			range = new DOMRange(getOperationPosition(), getOperationPosition());
			setRange(range);
		}
		if (insertNodes()) {
			return true;
		} else if (insertString()) {
			return true;
		} else {
			return insertChar();
		}
	}

	/**
	 * @param range
	 * @param viewer
	 */
	public InsertEdit(DOMRange range, GraphicalViewer viewer,
			IInputSourceProvider data) {
		super(range, viewer);
		_data = data;
	}

	public InsertEdit(IDOMPosition position, GraphicalViewer viewer,
			IInputSourceProvider data) {
		super(new DOMRange(position, position), viewer);
		setOperationPosition(position);
		_data = data;
	}

	public boolean insertChar() {
		if (_data.getStringData() == null) {
			return false;
		}
		IDOMPosition position = getOperationPosition();
		if (position.isText()) {
			Text text = EditModelQuery.getInstance().getText(position);
			text.insertData(getOperationPosition().getOffset(), _data
					.getCharacterData().toString());
			setOperationPosition(new DOMPosition(text, position.getOffset() + 1));
		} else {
			Node refNode = position.getNextSiblingNode();
			Text text = _document.createTextNode(_data.getCharacterData()
					.toString());
			position.getContainerNode().insertBefore(text, refNode);
			setOperationPosition(new DOMPosition(text, text.getLength()));
		}
		return true;
	}

	public boolean insertString() {
		String content = _data.getStringData();
		if (content != null) {
			IDOMPosition position = getOperationPosition();
			if (position.isText()) {
				Text text = EditModelQuery.getInstance().getText(position);
				text.insertData(getOperationPosition().getOffset(), content);
				setOperationPosition(new DOMPosition(text, position.getOffset()
						+ content.length()));
			} else {
				Node refNode = position.getNextSiblingNode();
				Text text = _document.createTextNode(content);
				position.getContainerNode().insertBefore(text, refNode);
				setOperationPosition(new DOMPosition(text, text.getLength()));
			}
			return true;
		}
		return false;
	}

	private boolean insertNodes() {
		Node[] nodes = _data.getNodes();
		if (nodes == null) {
			return false;
		}
		IDOMPosition position = getOperationPosition();
		if (position == null) {
			return false;
		}
		Node refNode = null;
		if (position.isText()) {
			position = DOMPositionHelper.splitText(position);
		}
		refNode = position.getNextSiblingNode();
		Node parent = position.getContainerNode();
		Node node = null;
		for (int i = 0; i < nodes.length; i++) {
			node = DOMUtil.cloneNodeDeep(_document, nodes[i]);
			String prefix = node.getPrefix();
			String name = node.getLocalName();
			if (name != null
					&& ITLDConstants.URI_JSP.equals(prefix)
					&& (node.getLocalName().startsWith(
							IJSPCoreConstants.TAG_LEADING_DIRECTIVE)
							|| IJSPCoreConstants.TAG_DECLARATION.equals(name)
							|| IJSPCoreConstants.TAG_EXPRESSION.equals(name) || IJSPCoreConstants.TAG_SCRIPTLET
							.equals(name))) {
				// it is a jsp tag
				((IDOMElement) node).setJSPTag(true);
			}
			node = parent.insertBefore(node, refNode);
		}

		if (node != null) {
			setOperationPosition(new DOMRefPosition(node, true));
		} else if (refNode != null) {
			setOperationPosition(new DOMRefPosition(refNode, false));
		} else {
			setOperationPosition(new DOMRefPosition(parent.getLastChild(), true));
		}
		return true;
	}

    // TODO: dead?
//	private boolean splitNode() {
//		if ((getViewer()).getSelection() instanceof DesignRange
//				&& _data.getCharacterData() != null
//				&& _data.getCharacterData().charValue() == '\r') {
//			DesignRange range = (DesignRange) (getViewer()).getSelection();
//			Node node = range.getStartPosition().getContainerNode();
//			if (EditModelQuery.isText(node)) {
//				node = node.getParentNode();
//			}
//			if (EditModelQuery.isListItem(node)) {
//				IDOMPosition position = DOMPositionHelper.toDOMPosition(range
//						.getStartPosition());
//				// split text and it's parent.
//				position = EditHelper.splitNode(position);
//				position = EditHelper.splitNode(position);
//				position = EditHelper.moveInto(position.getNextSiblingNode(),
//						new InlineEditingNavigationMediator(new ActionData(
//								ActionData.INLINE_EDIT, null)), true);
//				setOperationPosition(position);
//				return true;
//			}
//		}
//		return false;
//	}
}
