/*******************************************************************************
 * Copyright (c) 2001, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
package org.eclipse.wst.xml.core.internal.provisional.document;



import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;

/**
 * This interface provides extensions to corresponding DOM interface to enable
 * functions for source editing and incremental parsing.
 * 
 * @plannedfor 1.0
 * 
 */
public interface IDOMElement extends IDOMNode, Element {

	/**
	 * Retuns the start offset of the end tag.
	 * 
	 * ISSUE: need to sort out need for this
	 * 
	 * @return int - the start offset of the end tag.
	 */
	int getEndStartOffset();

	/**
	 * Returns the end offset of the
	 * 
	 * ISSUE: need to sort out need for this
	 * 
	 * @return int - the end offset of the start tag.
	 */
	int getStartEndOffset();

	/**
	 * Returns true if has an end tag.
	 * 
	 * In our source-oriented DOM, sometimes Elements are "ended", even
	 * without an explicit end tag in the source.
	 * 
	 * @return true if has an end tag.
	 */
	boolean hasEndTag();

	/**
	 * returns true if has a start tag.
	 * 
	 * In our source-oriented DOM, a lone end tag will cause a node to be
	 * created in the tree, unlike well-formed-only DOMs.
	 * 
	 * @return true if has a start tag.
	 */
	boolean hasStartTag();

	/**
	 * returns true if this element is a comment element
	 * 
	 * @return true if this element is a comment element
	 */
	boolean isCommentTag();

	/**
	 * isEmptyTag method
	 * 
	 * @return boolean - true if is empty tag, false otherwise
	 */
	boolean isEmptyTag();

	/**
	 * Returns true if floating end tag.
	 * 
	 * @return true if floating end tag.
	 */
	boolean isEndTag();

	/**
	 * Returns true for "global tag" (basically, without prefix)
	 * 
	 * @return true for "global tag" (basically, without prefix)
	 */
	boolean isGlobalTag();

	/**
	 * Returns true for no start and the end tags in source.
	 * 
	 * Provided for some very special cases when, for example, and HTML tag is
	 * assumed in an HTML document that does not have a literal HTML tag.
	 * 
	 * ISSUE: check with clients to see if still needed
	 * 
	 * @return true or no start and the end tags in source.
	 */
	boolean isImplicitTag();

	/**
	 * isJSPTag method
	 * 
	 * @return boolean
	 * 
	 * ISSUE: change to isContainerLanguageTag(String type);
	 */
	boolean isJSPTag();

	/**
	 * Returns true if start tag is closed.
	 * 
	 * @return true if start tag is closed.
	 */
	boolean isStartTagClosed();

	/**
	 * returns true if is xml tag
	 * 
	 * ISSUE: need to spec this better.
	 * 
	 * @return true if is xml tag
	 */
	boolean isXMLTag();

	/**
	 * NOT CLIENT API
	 * 
	 * notifyEndTagChanged
	 * 
	 */
	void notifyEndTagChanged();

	/**
	 * NOT CLIENT API
	 * 
	 * notifyStartTagChanged
	 * 
	 */
	void notifyStartTagChanged();

	/**
	 * NOT CLIENT API
	 * 
	 * Signify that this tag is a comment
	 * 
	 * For use only by parsers.
	 * 
	 */
	void setCommentTag(boolean isCommentTag);

	/**
	 * NOT CLIENT API
	 * 
	 * Signify that this tag is an empty tag
	 * 
	 * For use only by parsers
	 */
	void setEmptyTag(boolean isEmptyTag);

	/**
	 * NOT CLIENT API
	 * 
	 * Signify that this tag is a JSP tag
	 * 
	 * For use only by parsers
	 * 
	 * ISSUE: I have had one non-parsing client who has had to use this ...
	 * need to check
	 * 
	 */
	void setJSPTag(boolean isJSPTag);

	/**
	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
	 */
	public void setIdAttribute(String name, boolean isId);

	/**
	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
	 */
	public void setIdAttributeNS(String namespaceURI, String localName, boolean isId);

	/**
	 * NOT IMPLEMENTED. Is defined here in preparation for DOM 3.
	 */
	public void setIdAttributeNode(Attr idAttr, boolean isId) throws DOMException;

}
