package org.eclipse.core.runtime.model;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */

/**
 * An object which represents the user-defined contents of an extension
 * in a plug-in manifest.
 * <p>
 * This class may be instantiated, or further subclassed.
 * </p>
 */

public class ConfigurationElementModel extends PluginModelObject {

	// DTD properties (included in plug-in manifest)
	private String value = null;
	private ConfigurationPropertyModel[] properties = null;
	private ConfigurationElementModel[] children = null;

	// transient properties (not included in plug-in manifest)
	private Object parent = null; // parent element or declaring extension
/**
 * Creates a new configuration element model in which all fields
 * are <code>null</code>.
 */
public ConfigurationElementModel() {}
/**
 * Returns the element which contains this element.  If this element
 * is an immediate child of an extension, the
 * returned value can be downcast to <code>ExtensionModel</code>.
 * Otherwise the returned value can be downcast to 
 * <code>ConfigurationElementModel</code>.
 *
 * @return the parent of this configuration element
 *  or <code>null</code>
 */
public Object getParent() {
	return parent;
}
/**
 * Returns the extension in which this configuration element is declared.
 * If this element is a top-level child of an extension, the returned value
 * is equivalent to <code>getParent</code>.
 *
 * @return the extension in which this configuration element is declared
 *  or <code>null</code>
 */
public ExtensionModel getParentExtension() {
	Object p = getParent();
	while (p != null && p instanceof ConfigurationElementModel)
		p = ((ConfigurationElementModel) p).getParent();
	return (ExtensionModel) p;
}
/**
 * Returns the properties associated with this element.
 *
 * @return the properties associated with this element
 *  or <code>null</code>
 */
public ConfigurationPropertyModel[] getProperties() {
	return properties;
}
/**
 * Returns this element's sub-elements.
 *
 * @return the sub-elements of this element or <code>null</code>
 */
public ConfigurationElementModel[] getSubElements() {
	return children;
}
/**
 * Returns the value of this element.
 * 
 * @return the value of this element or <code>null</code>
 */
public String getValue() {
	return value;
}
/**
 * Sets this model object and all of its descendents to be read-only.
 * Subclasses may extend this implementation.
 *
 * @see #isReadOnly
 */
public void markReadOnly() {
	super.markReadOnly();
	if (children != null)
		for (int i = 0; i < children.length; i++)
			children[i].markReadOnly();
	if (properties != null)
		for (int i = 0; i < properties.length; i++)
			properties[i].markReadOnly();
}
/**
 * Sets the parent of this element.  The supplied parent is either
 * an <code>ExtensionModel</code>, if this element is to be a 
 * direct child of an extension, or another <code>ConfigurationElement</code>.
 * This object must not be read-only.
 *
 * @param value the new parent of this element.  May be <code>null</code>.
 */
public void setParent(Object value) {
	assertIsWriteable();
	parent = value;
}
/**
 * Sets the properties associated with this element.  This object must not be read-only.
 *
 * @param value the properties to associate with this element.  May be <code>null</code>.
 */
public void setProperties(ConfigurationPropertyModel[] value) {
	assertIsWriteable();
	properties = value;
}
/**
 * Sets configuration elements contained by this element
 * This object must not be read-only.
 *
 * @param value the configuration elements to be associated with this element.  
 *		May be <code>null</code>.
 */
public void setSubElements(ConfigurationElementModel[] value) {
	assertIsWriteable();
	children = value;
}
/**
 * Sets the value of this element.  This object must not be read-only.
 * 
 * @param value the new value of this element.  May be <code>null</code>.
 */
public void setValue(String value) {
	assertIsWriteable();
	this.value = value;
}
}
