parentnode.java

来自「JAVA 所有包」· Java 代码 · 共 1,032 行 · 第 1/3 页

JAVA
1,032
字号
        if (errorChecking) {            if (isReadOnly()) {                throw new DOMException(                              DOMException.NO_MODIFICATION_ALLOWED_ERR,                               DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null));            }            if (newChild.getOwnerDocument() != ownerDocument && newChild != ownerDocument) {                throw new DOMException(DOMException.WRONG_DOCUMENT_ERR,                             DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "WRONG_DOCUMENT_ERR", null));            }            if (!ownerDocument.isKidOK(this, newChild)) {                throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,                             DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "HIERARCHY_REQUEST_ERR", null));            }            // refChild must be a child of this node (or null)            if (refChild != null && refChild.getParentNode() != this) {                throw new DOMException(DOMException.NOT_FOUND_ERR,                            DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null));            }            // Prevent cycles in the tree            // newChild cannot be ancestor of this Node,            // and actually cannot be this            boolean treeSafe = true;            for (NodeImpl a = this; treeSafe && a != null; a = a.parentNode())            {                treeSafe = newChild != a;            }            if(!treeSafe) {                throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,                             DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "HIERARCHY_REQUEST_ERR", null));            }        }        // notify document        ownerDocument.insertingNode(this, replace);        // Convert to internal type, to avoid repeated casting        ChildNode newInternal = (ChildNode)newChild;        Node oldparent = newInternal.parentNode();        if (oldparent != null) {            oldparent.removeChild(newInternal);        }        // Convert to internal type, to avoid repeated casting        ChildNode refInternal = (ChildNode)refChild;        // Attach up        newInternal.ownerNode = this;        newInternal.isOwned(true);        // Attach before and after        // Note: firstChild.previousSibling == lastChild!!        if (firstChild == null) {            // this our first and only child            firstChild = newInternal;            newInternal.isFirstChild(true);            newInternal.previousSibling = newInternal;        }        else {            if (refInternal == null) {                // this is an append                ChildNode lastChild = firstChild.previousSibling;                lastChild.nextSibling = newInternal;                newInternal.previousSibling = lastChild;                firstChild.previousSibling = newInternal;            }            else {                // this is an insert                if (refChild == firstChild) {                    // at the head of the list                    firstChild.isFirstChild(false);                    newInternal.nextSibling = firstChild;                    newInternal.previousSibling = firstChild.previousSibling;                    firstChild.previousSibling = newInternal;                    firstChild = newInternal;                    newInternal.isFirstChild(true);                }                else {                    // somewhere in the middle                    ChildNode prev = refInternal.previousSibling;                    newInternal.nextSibling = refInternal;                    prev.nextSibling = newInternal;                    refInternal.previousSibling = newInternal;                    newInternal.previousSibling = prev;                }            }        }        changed();        // update cached length if we have any        if (fNodeListCache != null) {            if (fNodeListCache.fLength != -1) {                fNodeListCache.fLength++;            }            if (fNodeListCache.fChildIndex != -1) {                // if we happen to insert just before the cached node, update                // the cache to the new node to match the cached index                if (fNodeListCache.fChild == refInternal) {                    fNodeListCache.fChild = newInternal;                } else {                    // otherwise just invalidate the cache                    fNodeListCache.fChildIndex = -1;                }            }        }        // notify document        ownerDocument.insertedNode(this, newInternal, replace);        checkNormalizationAfterInsert(newInternal);        return newChild;    } // internalInsertBefore(Node,Node,boolean):Node    /**     * Remove a child from this Node. The removed child's subtree     * remains intact so it may be re-inserted elsewhere.     *     * @return oldChild, in its new state (removed).     *     * @throws DOMException(NOT_FOUND_ERR) if oldChild is not a child of     * this node.     *     * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) if this node is     * read-only.     */    public Node removeChild(Node oldChild)         throws DOMException {        // Tail-call, should be optimizable        return internalRemoveChild(oldChild, false);    } // removeChild(Node) :Node         /** NON-DOM INTERNAL: Within DOM actions,we sometimes need to be able     * to control which mutation events are spawned. This version of the     * removeChild operation allows us to do so. It is not intended     * for use by application programs.     */    Node internalRemoveChild(Node oldChild, boolean replace)        throws DOMException {        CoreDocumentImpl ownerDocument = ownerDocument();        if (ownerDocument.errorChecking) {            if (isReadOnly()) {                throw new DOMException(                            DOMException.NO_MODIFICATION_ALLOWED_ERR,                             DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null));            }            if (oldChild != null && oldChild.getParentNode() != this) {                throw new DOMException(DOMException.NOT_FOUND_ERR,                             DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_FOUND_ERR", null));            }        }        ChildNode oldInternal = (ChildNode) oldChild;        // notify document        ownerDocument.removingNode(this, oldInternal, replace);        // update cached length if we have any        if (fNodeListCache != null) {            if (fNodeListCache.fLength != -1) {                fNodeListCache.fLength--;            }            if (fNodeListCache.fChildIndex != -1) {                // if the removed node is the cached node                // move the cache to its (soon former) previous sibling                if (fNodeListCache.fChild == oldInternal) {                    fNodeListCache.fChildIndex--;                    fNodeListCache.fChild = oldInternal.previousSibling();                } else {                    // otherwise just invalidate the cache                    fNodeListCache.fChildIndex = -1;                }            }        }        // Patch linked list around oldChild        // Note: lastChild == firstChild.previousSibling        if (oldInternal == firstChild) {            // removing first child            oldInternal.isFirstChild(false);            firstChild = oldInternal.nextSibling;            if (firstChild != null) {                firstChild.isFirstChild(true);                firstChild.previousSibling = oldInternal.previousSibling;            }        } else {            ChildNode prev = oldInternal.previousSibling;            ChildNode next = oldInternal.nextSibling;            prev.nextSibling = next;            if (next == null) {                // removing last child                firstChild.previousSibling = prev;            } else {                // removing some other child in the middle                next.previousSibling = prev;            }        }        // Save previous sibling for normalization checking.        ChildNode oldPreviousSibling = oldInternal.previousSibling();        // Remove oldInternal's references to tree        oldInternal.ownerNode       = ownerDocument;        oldInternal.isOwned(false);        oldInternal.nextSibling     = null;        oldInternal.previousSibling = null;        changed();        // notify document        ownerDocument.removedNode(this, replace);        checkNormalizationAfterRemove(oldPreviousSibling);        return oldInternal;    } // internalRemoveChild(Node,boolean):Node    /**     * Make newChild occupy the location that oldChild used to     * have. Note that newChild will first be removed from its previous     * parent, if any. Equivalent to inserting newChild before oldChild,     * then removing oldChild.     *     * @return oldChild, in its new state (removed).     *     * @throws DOMException(HIERARCHY_REQUEST_ERR) if newChild is of a     * type that shouldn't be a child of this node, or if newChild is     * one of our ancestors.     *     * @throws DOMException(WRONG_DOCUMENT_ERR) if newChild has a     * different owner document than we do.     *     * @throws DOMException(NOT_FOUND_ERR) if oldChild is not a child of     * this node.     *     * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) if this node is     * read-only.     */    public Node replaceChild(Node newChild, Node oldChild)        throws DOMException {        // If Mutation Events are being generated, this operation might        // throw aggregate events twice when modifying an Attr -- once         // on insertion and once on removal. DOM Level 2 does not specify         // this as either desirable or undesirable, but hints that        // aggregations should be issued only once per user request.        // notify document        ownerDocument.replacingNode(this);        internalInsertBefore(newChild, oldChild, true);        if (newChild != oldChild) {            internalRemoveChild(oldChild, true);        }        // notify document        ownerDocument.replacedNode(this);        return oldChild;    }    /*     * Get Node text content     * @since DOM Level 3     */    public String getTextContent() throws DOMException {        Node child = getFirstChild();        if (child != null) {            Node next = child.getNextSibling();            if (next == null) {                return hasTextContent(child) ? ((NodeImpl) child).getTextContent() : "";            }            if (fBufferStr == null){                fBufferStr = new StringBuffer();            }            else {                fBufferStr.setLength(0);            }            getTextContent(fBufferStr);            return fBufferStr.toString();        }        return "";    }    // internal method taking a StringBuffer in parameter    void getTextContent(StringBuffer buf) throws DOMException {        Node child = getFirstChild();        while (child != null) {            if (hasTextContent(child)) {                ((NodeImpl) child).getTextContent(buf);            }            child = child.getNextSibling();        }    }    // internal method returning whether to take the given node's text content    final boolean hasTextContent(Node child) {        return child.getNodeType() != Node.COMMENT_NODE &&            child.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE &&            (child.getNodeType() != Node.TEXT_NODE ||             ((TextImpl) child).isIgnorableWhitespace() == false);    }    /*     * Set Node text content     * @since DOM Level 3     */    public void setTextContent(String textContent)        throws DOMException {        // get rid of any existing children        Node child;        while ((child = getFirstChild()) != null) {            removeChild(child);        }        // create a Text node to hold the given content        if (textContent != null && textContent.length() != 0){            appendChild(ownerDocument().createTextNode(textContent));        }    }    //    // NodeList methods    //    /**     * Count the immediate children of this node.  Use to implement     * NodeList.getLength().     * @return int     */    private int nodeListGetLength() {        if (fNodeListCache == null) {            // get rid of trivial cases            if (firstChild == null) {                return 0;            }            if (firstChild == lastChild()) {                return 1;            }

⌨️ 快捷键说明

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