/*******************************************************************************
 * 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.EditModelQuery;
import org.w3c.dom.Node;

/**
 * @author mengbo
 */
public class WorkNode {
	private WorkNode parent;

	private WorkNode previous;

	private WorkNode next;

	private Node node;

	private int pos[];

	private boolean isRoot;

	public WorkNode(Node node, final int pos1, final int pos2) {
		this.pos = resoveOffsets(node, pos1, pos2);
		this.node = node;
	}

	/**
	 * @return Returns the node.
	 */
	public Node getNode() {
		return node;
	}

	/**
	 * @param node
	 *            The node to set.
	 */
	public void setNode(Node node) {
		this.node = node;
	}

	public int[] getQualifiedOffsets() {
		int result[] = new int[] { getPosOffsets()[0], getPosOffsets()[1] };
		result[0] = result[0] < 0 ? 0 : result[0];
		int length = EditModelQuery.getNodeLenth(node);
		result[0] = result[0] > length ? length : result[0];
		result[1] = result[1] < 0 ? 0 : result[1];
		result[1] = result[1] > length ? length : result[1];
		return result;
	}

	/**
	 * @return Returns the pos.
	 */
	public int[] getPosOffsets() {
		return pos;
	}

	/**
	 * @return Returns the isRoot.
	 */
	public boolean isRoot() {
		return isRoot;
	}

	/**
	 * @param isRoot
	 *            The isRoot to set.
	 */
	public void setRoot(boolean isRoot) {
		this.isRoot = isRoot;
	}

	/**
	 * @return Returns the next.
	 */
	public WorkNode getNext() {
		return next;
	}

	/**
	 * @param next
	 *            The next to set.
	 */
	public void setNext(WorkNode next) {
		this.next = next;
	}

	/**
	 * @return Returns the parent.
	 */
	public WorkNode getParent() {
		return parent;
	}

	/**
	 * @param parent
	 *            The parent to set.
	 */
	public void setParent(WorkNode parent) {
		this.parent = parent;
	}

	/**
	 * @return Returns the previous.
	 */
	public WorkNode getPrevious() {
		return previous;
	}

	/**
	 * @param previous
	 *            The previous to set.
	 */
	public void setPrevious(WorkNode previous) {
		this.previous = previous;
	}

	private int[] resoveOffsets(Node node1, int pos1, int pos2) {
		int left = EditModelQuery.getNodeStartIndex(node1);
		return new int[] { pos1 - left, pos2 - left };
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append("Node:").append(node).append(" pos[]:").append(pos);
		return sb.toString();
	}

	public boolean isWholeSelected() {
		int start = EditModelQuery.getNodeStartIndex(node);
		int end = EditModelQuery.getNodeEndIndex(node);
		return getQualifiedOffsets()[0] <= 0
				&& getQualifiedOffsets()[1] >= end - start;
	}
}
