/*******************************************************************************
 * 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.document.ICSSAttr;
import org.eclipse.wst.css.core.document.ICSSDocument;
import org.eclipse.wst.css.core.document.ICSSNamedNodeMap;
import org.eclipse.wst.css.core.document.ICSSNode;

/**
 * 
 */
class CSSAttrImpl extends CSSRegionContainer implements ICSSAttr {

	private String fName = null;
	private String fValue = null;
	private CSSNodeImpl ownerCSSNode = null;

	/**
	 * CSSAttrImpl constructor comment.
	 * 
	 * @param that
	 *            com.ibm.sed.css.treemodel.CSSRegionContainer
	 */
	CSSAttrImpl(CSSAttrImpl that) {
		super(that);
		this.fName = that.fName;
		this.setValue(that.fValue);
	}

	/**
	 * CSSAttr constructor comment.
	 */
	CSSAttrImpl(String name) {
		super();
		this.fName = name;
	}

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

	/**
	 * @return org.eclipse.wst.css.core.model.interfaces.ICSSNamedNodeMap
	 */
	public ICSSNamedNodeMap getAttributes() {
		return null;
	}

	/**
	 * @return java.lang.String
	 */
	public java.lang.String getName() {
		return fName;
	}

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

	/**
	 * @return com.ibm.sed.css.treemodel.CSSNodeImpl
	 */
	public ICSSNode getOwnerCSSNode() {
		return ownerCSSNode;
	}

	/**
	 * @return java.lang.String
	 */
	public java.lang.String getValue() {
		return fValue;
	}

	/**
	 * @return boolean
	 * @param name
	 *            java.lang.String
	 */
	protected boolean matchName(String name) {
		if (name == null)
			return /* (this.name == null) */false;
		if (this.fName == null)
			return false;
		return this.fName.equals(name);
	}

	/**
	 * 
	 */
	protected void notifyValueChanged(String oldValue) {
		if (this.ownerCSSNode == null)
			return;

		// for model
		ICSSDocument doc = ownerCSSNode.getContainerDocument();
		if (doc == null)
			return;
		CSSModelImpl model = (CSSModelImpl) doc.getModel();
		if (model == null)
			return;
		model.valueChanged(this, oldValue);

		// for adapters
		String value = getValue();
		this.ownerCSSNode.notify(CHANGE, this, oldValue, value, this.ownerCSSNode.getStartOffset());
	}

	/**
	 * @param newName
	 *            java.lang.String
	 */
	protected void setName(java.lang.String newName) {
		fName = newName;
	}

	/**
	 * @param newOwnerCSSNode
	 *            com.ibm.sed.css.treemodel.CSSNodeImpl
	 */
	protected void setOwnerCSSNode(CSSNodeImpl newOwnerCSSNode) {
		ownerCSSNode = newOwnerCSSNode;
	}

	/**
	 * @param newValue
	 *            java.lang.String
	 */
	public void setValue(java.lang.String newValue) {
		String oldValue = fValue;
		fValue = newValue;

		notifyValueChanged(oldValue);
	}
}