/* Item.java Purpose: Description: History: 2001/10/21 15:54:59, Create, Tom M. Yeh. Copyright (C) 2001 Potix Corporation. All Rights Reserved. {{IS_RIGHT This program is distributed under LGPL Version 2.1 in the hope that it will be useful, but WITHOUT ANY WARRANTY. }}IS_RIGHT */ package org.zkoss.idom; import org.zkoss.xml.Locator; /** * Represents an item (a.k.a., node) of a iDOM tree. A iDOM tree is not necessary * also a W3C/DOM tree. However, in iDOM's implement, it is * because all Vertices also implement related interface, such as Node. * * <p>Some vertices, currently only Element, might support attributes * by implementing Attributable. * * <p>Due to the implementation of both Item and W3C/DOM's interfaces, * many methods seem redundant (e.g., parent vs. getParentNode, and * children vs. getChildNodes). * Caller could use them interchangeably . However, it is * suggested to use Item's API instead of Node's, because, like JDOM, * Item's API is based Java collection classes and more consistent * (from my point of view). The W3C/DOM API is used to work with utilities * that work only with W3C/DOM. * * <p>Be careful that some methods look similar, but behave different. * Refer to package.html. * * @author tomyeh * @see Attributable * @see Binable */ public interface Item extends Cloneable { /** Indicates the searching is based on regular expression * (upon the name argument). * If not specified, exact-match is required. */ public static final int FIND_BY_REGEX = 0x0001; /** Indicates the searching is case insensitive. * This flag is ignored if FIND_BY_REGEX is specified. */ public static final int FIND_IGNORE_CASE = 0x0002; /** Indicates the name argument is a tag name * rather than local name. */ public static final int FIND_BY_TAGNAME = 0x0004; /** Indicates the namespace argument is a prefix rather * than URI. */ public static final int FIND_BY_PREFIX = 0x0008; /** Indicates the searching looks for all descendants. * If not specified, only the children (not children of children) * is searched. */ public static final int FIND_RECURSIVE = 0x0100; /** * Gets the name of the item. * For vertices that support namespace (implements Namespaceable), * it is the same as getTagName. * * @see Namespaceable#getTagName */ public String getName(); /** * Sets the name of the item. * For vertices that support namespace (implements Namespaceable), * it is the same as setTagName. * * @exception DOMException with NOT_SUPPORTED_ERR if this item * doesn't allow to change the name, e.g., Document and DocType * * @see Namespaceable#setTagName */ public void setName(String name); /** * Gets the text of this item, or null if it is neither {@link Textual} * nor {@link Element}. * For Element, the text is the concatenation of all its textual * children, including Text, CDATA, and Binary. * * <p>Besides String-type value, some item, e.g., Binary, allows * any type of objects. Caller could test whether a item implements * the Binable interface, and use Binable.getValue instead. * For binable vertices, getText is actually getValue().toString(). * * <p>The returned value is neither trimmed nor normalized. */ public String getText(); /** * Sets the text of this item. * * @exception DOMException with NOT_SUPPORTED_ERR if this item * doesn't allow to change the value, e.g., Document and Element */ public void setText(String obj); /** * Gets the document that owns this item. * The owning document is the first document in its ancestor. * For DOM, the document can only be the root, so the owning documents * of vertices in a DOM tree are all the same. */ public Document getDocument(); /** * Detach this item from its parent. * * <p>Because each item can belong to at most one parent at a time, it * is important to detach it first, before added to another tree -- even * if it is the same tree/parent. * * <p>It has the similar effect as:<br> * getParent().getChildren().remove(this). * * <p>Naming reason: we don't call this method as getChildren() to be * compatible with the naming style of Attributable.attributes -- which * is limited to org.w3c.dom.Attr.getAttributes. * Also, it doesn't have the setter and it is "live", so it * 'seem' better to call it getChildren(). * * @return this item */ public Item detach(); /** * Gets the parent item. */ public Group getParent(); /** * Gets the locator of this item. * @return the locator; null if not available (default) */ public Locator getLocator(); /** * Sets the locator of this item. * * <p>Unlike other methods, it won't change the modification flag. * * @param loc the locator; null if not available */ public void setLocator(Locator loc); /** Clones this item. Unlike other objects, it does a deep cloning. * @since 5.0,8 */ public Object clone(); //-- Internal Methods --// /** * Sets the parent item. * * <p><b><i>DO NOT</i></b> call this method. It is used internally. * Instead, use detach or thru getChildren(). */ public void setParent(Group parent); }