/*******************************************************************************
 * Copyright (c) 2008, 2013 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.ant.internal.ui.model;

import java.util.List;

/**
 * Interface to tag all Ant elements for adapter factory - currently empty.
 */
public interface IAntElement {

	/**
	 * Returns whether this element has been generated as part of an element hierarchy that has error(s) associated with it
	 */
	public boolean isErrorNode();

	/**
	 * Returns whether this element has been generated as part of an element hierarchy that has warning(s) associated with it
	 */
	public boolean isWarningNode();

	/**
	 * Sets whether this element has been generated as part of an element hierarchy that has problems. The severity of the problem is provided.
	 * 
	 * @param severity
	 *            the new severity to set
	 * 
	 * @see AntModelProblem
	 */
	public void setProblemSeverity(int severity);

	/**
	 * Sets the problem associated with this element
	 * 
	 * @param problem
	 *            The problem associated with this element.
	 */
	public void setProblem(IProblem problem);

	/**
	 * Returns the name of the element. May return <code>null</code>
	 * 
	 * @return the name or <code>null</code>
	 */
	public String getName();

	/**
	 * Returns the display label for the element. This should not return <code>null</code> and should be formatted for user consumption
	 * 
	 * @return the label to display for the element, not <code>null</code>
	 */
	public String getLabel();

	/**
	 * Returns whether this XML element is defined in an external entity.
	 * 
	 * @return boolean
	 */
	public boolean isExternal();

	/**
	 * Returns the 0-based index of the first character of the source code for this element, relative to the source buffer in which this element is
	 * contained.
	 * 
	 * @return the 0-based index of the first character of the source code for this element, relative to the source buffer in which this element is
	 *         contained
	 */
	public int getOffset();

	/**
	 * Sets the offset.
	 * 
	 * @see #getOffset()
	 */
	public void setOffset(int anOffset);

	/**
	 * Returns the complete live list of offsets for the given identifier
	 * 
	 * @param identifier
	 * @return the list of offsets for the given identifier
	 */
	public List<Integer> computeIdentifierOffsets(String identifier);

	/**
	 * Returns the number of characters of the source code for this element, relative to the source buffer in which this element is contained.
	 * 
	 * @return the number of characters of the source code for this element, relative to the source buffer in which this element is contained
	 */
	public int getLength();

	/**
	 * Sets the length.
	 * 
	 * @see #getLength()
	 */
	public void setLength(int aLength);

	/**
	 * Returns the length of source to select for this node.
	 * 
	 * @return the length of source to select
	 */
	public int getSelectionLength();

	/**
	 * Returns whether this node contains a reference to the supplied identifier
	 * 
	 * @param identifier
	 * @return whether this node contains a reference to the supplied identifier
	 */
	public boolean containsOccurrence(String identifier);

	/**
	 * Return the complete live collection of {@link IAntElement} child nodes of the this node. If the node has no children an empty list must be
	 * returned, never <code>null</code>
	 * 
	 * @return the live list f child nodes or an empty list
	 */
	public List<IAntElement> getChildNodes();

	/**
	 * Returns if this element has child elements.
	 * 
	 * @return <code>true</code> is this node has child elements, <code>false</code> otherwise
	 */
	public boolean hasChildren();

	/**
	 * Returns the node with the narrowest source range that contains the offset. It may be this node or one of its children or <code>null</code> if
	 * the offset is not in the source range of this node.
	 * 
	 * @param sourceOffset
	 *            The source offset
	 * @return the node that includes the offset in its source range or <code>null</code>
	 */
	public AntElementNode getNode(int sourceOffset);

	/**
	 * Returns a unique string representation of this element. The format of the string is not specified.
	 * 
	 * @return the string representation
	 */
	public String getElementPath();

	/**
	 * Returns the parent <code>AntElementNode</code>.
	 * 
	 * @return the parent or <code>null</code> if this element has no parent.
	 */
	public IAntElement getParentNode();

	/**
	 * Returns the {@link AntProjectNode} this node belongs to
	 * 
	 * @return the {@link AntProjectNode} or <code>null</code>
	 */
	public AntProjectNode getProjectNode();

	/**
	 * Returns the node set as the import node
	 * 
	 * @return the import node or <code>null</code>
	 */
	public IAntElement getImportNode();

	/**
	 * Returns the problem message for this node or <code>null</code> if one has not been set
	 * 
	 * @return the problem message or <code>null</code>
	 */
	public String getProblemMessage();

	/**
	 * Allows the problem message to be set for this node. Specifying <code>null</code> as a problem message will remove any existing message.
	 * 
	 * @param problemMessage
	 *            the new message or <code>null</code>
	 */
	public void setProblemMessage(String problemMessage);

	/**
	 * Returns whether to collapse the code folding projection (region) represented by this node.
	 * 
	 * @return whether the user preference is set to collapse the code folding projection (region) represented by this node
	 */
	public boolean collapseProjection();
}
