/*
 * Copyright (c) 2001 World Wide Web Consortium,
 * (Massachusetts Institute of Technology, Institut National de
 * Recherche en Informatique et en Automatique, Keio University). All
 * Rights Reserved. This program is distributed under the W3C's Software
 * Intellectual Property License. This program is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
 * PURPOSE.
 * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
 */

package org.apache.xerces.dom3.as;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Attr;

/**
 * @deprecated
 * This interface extends the <code>Element</code> interface with additional 
 * methods for guided document editing. An object implementing this 
 * interface must also implement NodeEditAS interface.
 * <p>See also the <a href='http://www.w3.org/TR/2001/WD-DOM-Level-3-ASLS-20011025'>Document Object Model (DOM) Level 3 Abstract Schemas and Load
and Save Specification</a>.
 */
public interface ElementEditAS extends NodeEditAS {
    /**
     * The list of qualified element names defined in the abstract schema. 
     */
    public NodeList getDefinedElementTypes();

    /**
     * Determines element content type.
     * @return Constant for one of EMPTY_CONTENTTYPE, ANY_CONTENTTYPE, 
     *   MIXED_CONTENTTYPE, ELEMENTS_CONTENTTYPE.
     */
    public short contentType();

    /**
     * Determines if the value for specified attribute can be set.
     * @param attrname Name of attribute.
     * @param attrval Value to be assigned to the attribute.
     * @return <code>true</code> if no reason it can't be done; 
     *   <code>false</code> if it can't be done.
     */
    public boolean canSetAttribute(String attrname, 
                                   String attrval);

    /**
     * Determines if an attribute node can be added with respect to the 
     * validity check level.This is an attribute node, there is no need for 
     * canSetAttributreNodeNS!
     * @param attrNode <code>Node</code> in which the attribute can possibly 
     *   be set.
     * @return <code>true</code> if no reason it can't be done; 
     *   <code>false</code> if it can't be done.
     */
    public boolean canSetAttributeNode(Attr attrNode);

    /**
     * Determines if the attribute with given namespace and qualified name can 
     * be created if not already present in the attribute list of the 
     * element. If the attribute with same qualified name and namespaceURI 
     * is already present in the elements attribute list it tests for the 
     * value of the attribute and its prefix to the new value. See DOM core 
     * <code>setAttributeNS</code>.
     * @param name Qualified name of attribute.
     * @param attrval Value to be assigned to the attribute.
     * @param namespaceURI <code>namespaceURI</code> of namespace.
     * @return <code>true</code> if no reason it can't be done; 
     *   <code>false</code> if it can't be done.
     */
    public boolean canSetAttributeNS(String name, 
                                     String attrval, 
                                     String namespaceURI);

    /**
     * Verifies if an attribute by the given name can be removed.
     * @param attrname Name of attribute.
     * @return <code>true</code> if no reason it can't be done; 
     *   <code>false</code> if it can't be done.
     */
    public boolean canRemoveAttribute(String attrname);

    /**
     * Verifies if an attribute by the given local name and namespace can be 
     * removed.
     * @param attrname Local name of the attribute to be removed.
     * @param namespaceURI The namespace URI of the attribute to remove.
     * @return <code>true</code> if no reason it can't be done; 
     *   <code>false</code> if it can't be done.
     */
    public boolean canRemoveAttributeNS(String attrname, 
                                        String namespaceURI);

    /**
     * Determines if an attribute node can be removed.
     * @param attrNode The <code>Attr</code> node to remove from the 
     *   attribute list.
     * @return <code>true</code> if no reason it can't be done; 
     *   <code>false</code> if it can't be done.
     */
    public boolean canRemoveAttributeNode(Node attrNode);

    /**
     * Returns an <code>NodeList</code> containing the possible 
     * <code>Element</code> names that can appear as children of this type 
     * of element.
     * @return List of possible children element types of this element.
     */
    public NodeList getChildElements();

    /**
     * Returns an <code>NodeList</code> containing the possible 
     * <code>Element</code> names that can appear as a parent of this type 
     * of element.
     * @return List of possible parent element types of this element.
     */
    public NodeList getParentElements();

    /**
     * Returns an <code>NodeList</code> containing all the possible 
     * <code>Attr</code>s that can appear with this type of element.
     * @return List of possible attributes of this element.
     */
    public NodeList getAttributeList();

    /**
     * Determines if this element is defined in the currently active AS.
     * @param elemTypeName Name of element.
     * @return A boolean that is <code>true</code> if the element is defined, 
     *   <code>false</code> otherwise.
     */
    public boolean isElementDefined(String elemTypeName);

    /**
     * Determines if this element in this namespace is defined in the 
     * currently active AS.
     * @param elemTypeName Name of element.
     * @param namespaceURI <code>namespaceURI</code> of namespace.
     * @param name Qualified name of namespace. This is for sub-elements.
     * @return A boolean that is <code>true</code> if the element is defined, 
     *   <code>false</code> otherwise.
     */
    public boolean isElementDefinedNS(String elemTypeName, 
                                      String namespaceURI, 
                                      String name);

}
