/*******************************************************************************
 * 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.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
import org.eclipse.jst.pagedesigner.common.logging.Logger;
import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
import org.eclipse.jst.pagedesigner.dom.DOMRange;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
import org.eclipse.jst.pagedesigner.viewer.DesignRange;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
import org.w3c.dom.Node;

/**
 * @author mengbo
 */
public abstract class RangeModeCommand extends DesignerCommand {
	private static final Logger _log = PDPlugin
			.getLogger(RangeModeCommand.class);

	DOMRange _resultRange = null;

	public RangeModeCommand(String label, IHTMLGraphicalViewer viewer) {
		super(label, viewer);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#prePreExecute()
	 */
	protected boolean prePreExecute() {
		int position = -1;
		int length = -1;
		ISelection selection = getViewer().getSelection();
		if (selection != null) {
			if (getViewer().isInRangeMode()) {
				DesignRange range = (DesignRange) selection;
				if (range.isValid()) {
					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
							.getStartPosition());
					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
							.getEndPosition());
					if (!EditValidateUtil.validPosition(domPos)
							|| !EditValidateUtil.validPosition(domEnd)) {
						return false;
					}
					position = EditModelQuery.getIndexedRegionLocation(domPos);
					int end = EditModelQuery.getIndexedRegionLocation(domEnd);
					if (end < position) {
						length = position - end;
						position = end;
					} else {
						length = end - position;
					}
				}
			} else {
				Object object = ((IStructuredSelection) selection)
						.getFirstElement();
				if (object instanceof ElementEditPart) {
					Node node = ((ElementEditPart) object).getIDOMNode();
					position = EditModelQuery.getNodeStartIndex(node);
					length = EditModelQuery.getNodeLenth(node);
				} else {
					return false;
				}
			}
			if (position >= 0 && length >= 0) {
				getModel().beginRecording(this, getLabel(), position, length);
			} else {
				getModel().beginRecording(this, getLabel());
			}
			getViewer().startSelectionChange();
			getModel().aboutToChangeModel();
			return true;
		} else {
			return false;
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
	 */
	protected final void doExecute() {
		DesignRange range = getViewer().getRangeSelection();
		if (range != null && range.isValid()) {
			DOMRange domrange = (range == null || !range.isValid()) ? null
					: toDOMRange(range);
			_resultRange = doRangeExecute(domrange);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
	 */
	protected final ISelection getAfterCommandDesignerSelection() {
		try {
			if (_resultRange == null) {
				return null;
			}
			IDOMPosition startPos = _resultRange.getStartPosition();
			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
			if (_resultRange.isEmpty()) {
				return new DesignRange(start, start);
			} else {
				IDOMPosition endPos = _resultRange.getEndPosition();
				return new DesignRange(start, DOMPositionHelper
						.toDesignPosition(endPos));
			}
		} catch (Exception e) {
			// "Selection error"
			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
			return null;
		}
	}

	/**
	 * @param range
	 * @return
	 */
	private DOMRange toDOMRange(DesignRange range) {
		return new DOMRange(DOMPositionHelper.toDOMPosition(range
				.getStartPosition()), DOMPositionHelper.toDOMPosition(range
				.getEndPosition()));
	}

	/**
	 * In the implementation of this method, should not do anything relating to
	 * EditPart. (maybe even not ICSSStyle, since not style information not
	 * refreshed yet)
	 * 
	 * @return null means no change have been done to the model. In this case,
	 *         system may choose to cancel undo recorrding, etc.
	 */
	protected abstract DOMRange doRangeExecute(DOMRange selection);

	protected static void appendChild(Node parent, Node ref, Node child) {
		Node next = ref.getNextSibling();
		if (next == null)
			parent.appendChild(child);
		else
			parent.insertBefore(child, next);
	}
}
