htmlcollectionimpl.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 573 行 · 第 1/2 页

JAVA
573
字号
                    if ( collectionMatch( (Element) node, null ) )                        ++ length;                    else if ( recurse() )                        length += getLength( (Element) node );                }                node = node.getNextSibling();             }        }        return length;    }                /**     * Recursive function returns the numbered element of a particular type     * that exist under the top level element. This is a recursive function     * and the top level element is passed along.     * <p>     * Note that this function must call itself with an index and get back both     * the element (if one was found) and the new index which is decremeneted     * for any like element found. Since integers are only passed by value,     * this function makes use of a separate class ({@link CollectionIndex})     * to hold that index.     *      * @param topLevel Top level element from which to scan     * @param index The index of the item to retreive     * @return Number of elements     * @see CollectionIndex     */    private Node item( Element topLevel, CollectionIndex index )    {        Node    node;        Node    result;        synchronized ( topLevel )        {            // Traverse all the childs of the current element in the order	    // they appear. Count from the index backwards until you reach	    // matching element with an index of zero. Return that element.            node = topLevel.getFirstChild();            while ( node != null )            {                // If a particular node is an element (could be HTML or XML),		// do two things: if it's the one we're looking for, decrease		// the index and if zero, return this node; at any rate,		// traverse it's children as well.                if ( node instanceof Element )                {                    if ( collectionMatch( (Element) node, null ) )                    {                        if ( index.isZero() )                            return node;                        index.decrement();                    } else if ( recurse() )                    {                        result = item( (Element) node, index );                        if ( result != null )                            return result;                    }                }                node = node.getNextSibling();             }        }        return null;    }            /**     * Recursive function returns an element of a particular type with the     * specified name (<TT>id</TT> attribute).     *      * @param topLevel Top level element from which to scan     * @param name The named element to look for     * @return The first named element found     */    private  Node namedItem( Element topLevel, String name )    {        Node    node;        Node    result;        synchronized ( topLevel )        {            // Traverse all the childs of the current element in the order	    // they appear.            node = topLevel.getFirstChild();            while ( node != null )            {                // If a particular node is an element (could be HTML or XML),                // do two things: if it's the one we're looking for, and the		// name (id attribute) attribute is the one we're looking for,		// return this element; otherwise, traverse it's children.                if ( node instanceof Element )                {                    if ( collectionMatch( (Element) node, name ) )                        return node;                    else if ( recurse() )                    {                        result = namedItem( (Element) node, name );                        if ( result != null )                            return result;                    }                }                node = node.getNextSibling();             }            return node;        }    }            /**     * Returns true if scanning methods should iterate through the collection.     * When looking for elements in the document, recursing is needed to traverse     * the full document tree. When looking inside a specific element (e.g. for a     * cell inside a row), recursing can lead to erroneous results.     *      * @return True if methods should recurse to traverse entire tree     */    protected boolean recurse()    {        return _lookingFor > 0;    }        /**     * Determines if current element matches based on what we're looking for.     * The element is passed along with an optional identifier name. If the     * element is the one we're looking for, return true. If the name is also     * specified, the name must match the <code>id</code> attribute     * (match <code>name</code> first for anchors).     *      * @param elem The current element     * @param name The identifier name or null     * @return The element matches what we're looking for     */    protected boolean collectionMatch( Element elem, String name )    {        boolean    match;                synchronized ( elem )        {            // Begin with no matching. Depending on what we're looking for,            // attempt to match based on the element type. This is the quickest            // way to match involving only a cast. Do the expensive string            // comparison later on.            match = false;            switch ( _lookingFor )            {            case ANCHOR:                // Anchor is an <A> element with a 'name' attribute. Otherwise, it's                // just a link.                match = ( elem instanceof HTMLAnchorElement ) &&                        elem.getAttribute( "name" ).length() > 0;                break;            case FORM:                // Any <FORM> element.                match = ( elem instanceof HTMLFormElement );                break;            case IMAGE:                // Any <IMG> element. <OBJECT> elements with images are not returned.                match = ( elem instanceof HTMLImageElement );                break;            case APPLET:                // Any <APPLET> element, and any <OBJECT> element which represents an                // Applet. This is determined by 'codetype' attribute being                // 'application/java' or 'classid' attribute starting with 'java:'.                match = ( elem instanceof HTMLAppletElement ) ||                        ( elem instanceof HTMLObjectElement &&                          ( "application/java".equals( elem.getAttribute( "codetype" ) ) ||                            elem.getAttribute( "classid" ).startsWith( "java:" ) ) );                break;            case ELEMENT:                // All form elements implement HTMLFormControl for easy identification.                match = ( elem instanceof HTMLFormControl );                break;            case LINK:                // Any <A> element, and any <AREA> elements with an 'href' attribute.                match = ( ( elem instanceof HTMLAnchorElement ||                            elem instanceof HTMLAreaElement ) &&                          elem.getAttribute( "href" ).length() > 0 );                break;            case AREA:                // Any <AREA> element.                match = ( elem instanceof HTMLAreaElement );                break;            case OPTION:                // Any <OPTION> element.                match = ( elem instanceof HTMLOptionElement );                break;            case ROW:                // Any <TR> element.                match = ( elem instanceof HTMLTableRowElement );                break;            case TBODY:                // Any <TBODY> element (one of three table section types).                match = ( elem instanceof HTMLTableSectionElement &&                          elem.getTagName().equals( "tbody" ) );                break;            case CELL:                // Any <TD> element.                match = ( elem instanceof HTMLTableCellElement );                break;            }                    // If element type was matched and a name was specified, must also match            // the name against either the 'id' or the 'name' attribute. The 'name'            // attribute is relevant only for <A> elements for backward compatibility.            if ( match && name != null )            {                // If an anchor and 'name' attribute matches, return true. Otherwise,                // try 'id' attribute.                if ( elem instanceof HTMLAnchorElement &&                     name.equals( elem.getAttribute( "name" ) ) )                    return true;                match = name.equals( elem.getAttribute( "id" ) );            }        }        return match;    }    }/** * {@link CollectionImpl#item} must traverse down the tree and decrement the * index until it matches an element who's index is zero. Since integers are * passed by value, this class servers to pass the index into each recursion * by reference. It encompasses all the operations that need be performed on * the index, although direct access is possible. *  * @see CollectionImpl#item */class CollectionIndex{            /**     * Returns the current index.     *      * @return Current index     */    int getIndex()    {        return _index;    }            /**     * Decrements the index by one.     */    void decrement()    {        -- _index;    }            /**     * Returns true if index is zero (or negative).     *      * @return True if index is zero     */    boolean isZero()    {        return _index <= 0;    }            /**     * Constructs a new index with the specified initial value. The index will     * then be decremeneted until it reaches zero.     *      * @param index The initial value     */    CollectionIndex( int index )    {        _index = index;    }            /**     * Holds the actual value that is passed by reference using this class.     */    private int        _index;    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?