/*******************************************************************************
 * 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.parts;

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.SharedCursors;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
import org.eclipse.jst.pagedesigner.editpolicies.LinkEditPolicy;
import org.eclipse.jst.pagedesigner.range.RangeUtil;
import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
import org.eclipse.jst.pagedesigner.viewer.DesignRange;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.w3c.dom.Node;
import org.w3c.dom.Text;

/**
 * @author mengbo
 */
public class TextEditPart extends SubNodeEditPart implements ICSSTextProvider {
	private String _cachedData;

	private Text _textNode;

	private Text _textNodeForFigure;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.EditPart#setModel(java.lang.Object)
	 */
	public void setModel(Object model) {
		super.setModel(model);
		_textNode = (Text) model;
		_cachedData = _textNode.getData();
		_textNodeForFigure = getDestDocumentForDesign().createTextNode(
				_cachedData);
	}

	protected IFigure createFigure() {
		// XXX: currently creating of CSSTextFigure is distributed both here
		// and FigureFactory. We may want to unify them later.
		return new CSSTextFigure(this);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
	 */
	protected void createEditPolicies() {
		super.createEditPolicies();
		this.installEditPolicy("link editpolicy", new LinkEditPolicy());
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.parts.SubNodeEditPart#getNodeForFigure()
	 */
	public Node getNodeForFigure() {
		return _textNodeForFigure;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
	 */
	public void notifyChanged(INodeNotifier notifier, int eventType,
			Object changedFeature, Object oldValue, Object newValue, int pos) {
		_cachedData = _textNode.getData();
		_textNodeForFigure.setData(_cachedData);
		if (eventType == INodeNotifier.CHANGE) {
			getFigure().revalidate();
		} else {
			// XXX: been removed? parent EditPart should have handled it.
		}
	}


	/**
	 * @return the associated css style for this text node
	 */
	public ICSSStyle getCSSStyle() {
		IFigure figure1 = this.getFigure();
		if (figure1 instanceof ICSSFigure) {
			ICSSStyle style = ((ICSSFigure) figure1).getCSSStyle();
			if (style != null) {
				return style;
			}
		}
		return DefaultStyle.getInstance();
	}

	/**
	 * As when text are displayed in HTML, they are "normalized". For example,
	 * leading whitespace may be removed dure to previous node as trailing
	 * whitespace. Entity reference may have be resolved. Sequence whitespace
	 * been merged.
	 * 
	 * It is also possible that the text node is in "PRE" mode, in that case the
	 * above things are not done.
	 * 
	 * This method return the really value that is going to be presented to
	 * user. EditPartPosition's offset is referencing this value.
	 * 
	 * @return the text data
	 * @see org.eclipse.jst.pagedesigner.viewer.DesignPosition
	 */
	public String getTextData() {
		ICSSStyle style = getCSSStyle();
		String data = _cachedData;
		if (style.getStyleProperty(ICSSPropertyID.ATTR_WHITESPACE) != ICSSPropertyID.VAL_PRE) {
			return HTMLUtil.compactWhitespaces(_textNode, data);
		}
        return data;
	}

	/**
	 * check what part of this text node is in the range selection.
	 * 
	 * @return text node ranges
	 */
	public int[] getSelectedRange() {
		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
		if (viewer == null || !viewer.isInRangeMode()) {
			return null;
		}
		DesignRange range = viewer.getRangeSelection();
		if (range == null || !range.isValid()) {
			return null;
		}
		if (!RangeUtil.intersect(range, this)) {
			return null;
		}
		// ok, we intersect with the range.
		range = RangeUtil.normalize(range);
		EditPart startContainer = range.getStartPosition().getContainerPart();
		EditPart endContainer = range.getEndPosition().getContainerPart();
		int[] ret = new int[2];
		if (startContainer != this) {
			ret[0] = 0;
		} else {
			ret[0] = range.getStartPosition().getOffset();
		}
		if (endContainer != this) {
			ret[1] = this.getTextData().length();
		} else {
			{
				ret[1] = range.getEndPosition().getOffset();
			}
		}
		return ret;
	}

	public boolean isSelectable() {
        // controls, amongst other things, whether or not a standard 
        // hit test in SelectionTool for mouse over will find this edit part 
		return true;
	}

    public Cursor getCursor(Point mouseLocation) {
        return SharedCursors.IBEAM;
    }
    
    
}
