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

import org.eclipse.wst.xml.core.internal.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.xml.core.internal.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.xml.core.internal.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;
		}
	}
}