/*******************************************************************************
 * Copyright (c) 2004 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.css.core.internal.document;



import org.eclipse.wst.css.core.internal.encoding.CSSDocumentLoader;
import org.eclipse.wst.css.core.internal.formatter.CSSSourceFormatterFactory;
import org.eclipse.wst.css.core.internal.formatter.CSSSourceGenerator;
import org.eclipse.wst.css.core.internal.formatter.StyleDeclItemFormatter;
import org.eclipse.wst.css.core.internal.parser.CSSSourceParser;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclItem;
import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;
import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.w3c.dom.DOMException;
import org.w3c.dom.css.CSSValue;


/**
 * 
 */
class CSSStyleDeclItemImpl extends CSSStructuredDocumentRegionContainer implements ICSSStyleDeclItem {

	private java.lang.String fPropertyName;

	/**
	 * CSSStyleDeclItemImpl constructor comment.
	 * 
	 * @param that
	 *            com.ibm.sed.css.treemodel.CSSNodeImpl
	 */
	CSSStyleDeclItemImpl(CSSStyleDeclItemImpl that) {
		super(that);
		this.fPropertyName = that.fPropertyName;
	}

	/**
	 * CSSStyleDeclItemImpl constructor comment.
	 */
	CSSStyleDeclItemImpl(String propertyName) {
		super();
		this.fPropertyName = propertyName;
	}

	/**
	 * @return org.w3c.dom.css.CSSPrimitiveValue
	 * @param value
	 *            org.w3c.dom.css.CSSPrimitiveValue
	 */
	public ICSSPrimitiveValue appendValue(ICSSPrimitiveValue value) throws DOMException {
		return insertValueBefore(value, null);
	}

	/**
	 * @return com.ibm.sed.treemodel.css.CSSNode
	 * @param deep
	 *            boolean
	 */
	public ICSSNode cloneNode(boolean deep) {
		CSSStyleDeclItemImpl cloned = new CSSStyleDeclItemImpl(this);

		if (deep)
			cloneChildNodes(cloned, deep);

		return cloned;
	}

	/**
	 * @return java.lang.String
	 */
	String generateValueSource() {
		CSSSourceGenerator formatter = CSSSourceFormatterFactory.getInstance().getSourceFormatter(this);
		if (formatter != null && formatter instanceof StyleDeclItemFormatter)
			return ((StyleDeclItemFormatter) formatter).formatValue(this).toString();
		else
			return "";//$NON-NLS-1$
	}

	/**
	 * @return org.w3c.dom.css.CSSValue
	 */
	public CSSValue getCSSValue() {
		int nValue = getLength();
		if (nValue <= 0)
			return null;
		else if (nValue == 1)
			return item(0);
		else
			return this;
	}

	/**
	 * @return java.lang.String
	 */
	public java.lang.String getCSSValueText() {
		if (getFirstChild() == null)
			return "";//$NON-NLS-1$
		// check whether children has flatnodes
		ICSSNode child = getFirstChild();
		while (child != null) {
			if (((IndexedRegion) child).getEndOffset() <= 0)
				return generateValueSource();
			child = child.getNextSibling();
		}

		IStructuredDocumentRegion node = getFirstStructuredDocumentRegion();
		int start = ((IndexedRegion) getFirstChild()).getStartOffset() - node.getStartOffset();
		int end = ((IndexedRegion) getLastChild()).getEndOffset() - node.getStartOffset();
		return node.getText().substring(start, end);
	}

	/**
	 * @return short
	 */
	public short getCssValueType() {
		return CSS_VALUE_LIST;
	}

	/**
	 * @return int
	 */
	public int getLength() {
		int i = 0;
		for (ICSSNode node = getFirstChild(); node != null; node = node.getNextSibling()) {
			if (node instanceof CSSPrimitiveValueImpl)
				i++;
		}
		return i;
	}

	/**
	 * @return short
	 */
	public short getNodeType() {
		return STYLEDECLITEM_NODE;
	}

	/**
	 * @return java.lang.String
	 */
	public java.lang.String getPriority() {
		return getAttribute(IMPORTANT);
	}

	/**
	 * @return java.lang.String
	 */
	public String getPropertyName() {
		return fPropertyName.trim().toLowerCase();
	}

	/**
	 * @return org.w3c.dom.css.CSSPrimitiveValue
	 * @param newValue
	 *            org.w3c.dom.css.CSSPrimitiveValue
	 * @param refValue
	 *            org.w3c.dom.css.CSSPrimitiveValue
	 */
	ICSSPrimitiveValue insertValueBefore(ICSSPrimitiveValue newValue, ICSSPrimitiveValue refValue) {
		ICSSNode node = insertBefore((CSSNodeImpl) newValue, (CSSNodeImpl) refValue);
		return (ICSSPrimitiveValue) node;
	}

	/**
	 * @return org.w3c.dom.css.CSSValue
	 * @param index
	 *            int
	 */
	public CSSValue item(int index) {
		int i = 0;
		for (ICSSNode node = getFirstChild(); node != null; node = node.getNextSibling()) {
			if (node instanceof CSSPrimitiveValueImpl) {
				if (i++ == index)
					return (CSSValue) node;
			}
		}
		return null;
	}

	/**
	 * @return org.w3c.dom.css.CSSPrimitiveValue
	 * @param value
	 *            org.w3c.dom.css.CSSPrimitiveValue
	 */
	public ICSSPrimitiveValue removeValue(ICSSPrimitiveValue value) throws DOMException {
		ICSSNode node = removeChild((CSSNodeImpl) value);
		return (ICSSPrimitiveValue) node;
	}

	/**
	 * @return org.w3c.dom.css.CSSPrimitiveValue
	 * @param newValue
	 *            org.w3c.dom.css.CSSPrimitiveValue
	 * @param oldValue
	 *            org.w3c.dom.css.CSSPrimitiveValue
	 */
	public ICSSPrimitiveValue replaceValue(ICSSPrimitiveValue newValue, ICSSPrimitiveValue oldValue) throws DOMException {
		if (oldValue == null)
			return newValue;
		if (newValue != null)
			insertValueBefore(newValue, oldValue);
		return removeValue(oldValue);
	}

	/**
	 * @param value
	 *            java.lang.String
	 * @exception org.w3c.dom.DOMException
	 *                The exception description.
	 */
	public void setCssValueText(String value) throws DOMException {
		ICSSNode child = getFirstChild();
		while (child != null) {
			ICSSNode next = child.getNextSibling();
			if (child instanceof ICSSPrimitiveValue) {
				removeChild((CSSNodeImpl) child);
			}
			child = next;
		}

		// use temporary document
		IDocumentLoader loader = new CSSDocumentLoader();
		IStructuredDocument structuredDocument = (IStructuredDocument) loader.createNewStructuredDocument();
		((CSSSourceParser) structuredDocument.getParser()).setParserMode(CSSSourceParser.MODE_DECLARATION_VALUE);
		structuredDocument.set(value);
		IStructuredDocumentRegion node = structuredDocument.getFirstStructuredDocumentRegion();
		if (node == null) {
			return;
		}
		if (node.getNext() != null) {
			throw new DOMException(DOMException.INVALID_MODIFICATION_ERR, "");//$NON-NLS-1$
		}

		CSSDeclarationItemParser itemParser = new CSSDeclarationItemParser(getOwnerDocument());
		itemParser.setStructuredDocumentTemporary(true);
		itemParser.setupValues(this, node, node.getRegions());
	}

	/**
	 * @param newPriority
	 *            java.lang.String
	 */
	public void setPriority(java.lang.String newPriority) throws DOMException {
		setAttribute(IMPORTANT, newPriority);
	}
}