/*******************************************************************************
 * 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.html.core.contentmodel;

import org.eclipse.wst.common.contentmodel.CMNode;



/**
 */
class HTMLCMDataTypeImpl extends CMNodeImpl implements HTMLCMDataType {

	private int impliedValueKind = IMPLIED_VALUE_NONE;
	private String impliedValue = null;
	private final static String[] emptyArray = new String[0];
	private String[] enumValues = emptyArray;
	private String instanceValue = null;

	/**
	 * HTMLCMDataTypeImpl constructor comment.
	 * @param nm java.lang.String
	 */
	public HTMLCMDataTypeImpl(String typeName) {
		super(typeName);
	}

	/**
	 * HTMLCMDataTypeImpl constructor comment.
	 * @param nm java.lang.String
	 */
	public HTMLCMDataTypeImpl(String typeName, String instanceValue) {
		super(typeName);
		this.instanceValue = instanceValue;
	}

	/**
	 * getTypeName method
	 * @return java.lang.String
	 *
	 * This method returns a suitable default value that can be used when an instance of the data type is created.
	 * This returns null of a suitable default is not available.
	 */
	public String generateInstanceValue() {
		return instanceValue;
	}

	/**
	 * @see org.eclipse.wst.common.contentmodel.CMDataType
	 */
	public String getDataTypeName() {
		return getNodeName();
	}

	/**
	 * getTypeName method
	 * @return java.lang.String[]
	 *
	 */
	public String[] getEnumeratedValues() {
		return enumValues;
	}

	/**
	 * getTypeName method
	 * @return java.lang.String  
	 *
	 * Returns the implied value or null if none exists.
	 */
	public String getImpliedValue() {
		return impliedValue;
	}

	/**
	 * getImpliedValueKind method
	 * @return int
	 *
	 * Returns one of :
	 * IMPLIED_VALUE_NONE, IMPLIED_VALUE_FIXED, IMPLIED_VALUE_DEFAULT.
	 */
	public int getImpliedValueKind() {
		return impliedValueKind;
	}

	/**
	 * @see org.eclipse.wst.common.contentmodel.CMNode
	 */
	public int getNodeType() {
		return CMNode.DATA_TYPE;
	}

	/**
	 */
	void setEnumValues(String[] values) {
		enumValues = new String[values.length];
		for (int i = 0; i < values.length; i++) {
			enumValues[i] = values[i];
		}
	}

	/**
	 * package scope.
	 */
	void setImpliedValue(int kind, String value) {
		switch (kind) {
			case IMPLIED_VALUE_FIXED :
			case IMPLIED_VALUE_DEFAULT :
				impliedValueKind = kind;
				impliedValue = value;
				break;
			case IMPLIED_VALUE_NONE :
			default :
				impliedValueKind = IMPLIED_VALUE_NONE;
				impliedValue = null; // maybe a null string?
				break;
		}
	}
}