void NodeIteratorImpl::removeNode (DOM_Node node) { if (fDetached) throw DOM_DOMException(DOM_DOMException::INVALID_STATE_ERR, null); // Implementation note: Fix-up means setting the current node properly // after a remove. if (node.isNull()) return; DOM_Node deleted = matchNodeOrParent(node); if (deleted.isNull()) return; if (fForward) { fCurrentNode = previousNode(deleted); } else // if (!fForward) { DOM_Node next = nextNode(deleted, false); if (! next.isNull()) { // normal case: there _are_ nodes following this in the iterator. fCurrentNode = next; } else { // the last node in the iterator is to be removed, // so we set the current node to be the previous one. fCurrentNode = previousNode(deleted); fForward = true; } } }
DOM_Node TreeWalkerImpl::nextNode () { DOM_Node result; if (fCurrentNode.isNull()) return result; result = getFirstChild(fCurrentNode); if (! result.isNull()) { fCurrentNode = result; return result; } result = getNextSibling(fCurrentNode); if (! result.isNull()) { fCurrentNode = result; return result; } // return parent's 1st sibling. DOM_Node parent = getParentNode(fCurrentNode); while (! parent.isNull()) { result = getNextSibling(parent); if (! result.isNull()) { fCurrentNode = result; return result; } else { parent = getParentNode(parent); } } // end , return null return result; }
DOM_Node TreeWalkerImpl::previousNode () { DOM_Node result; if (fCurrentNode.isNull()) return result; // get sibling result = getPreviousSibling(fCurrentNode); if (result.isNull()) { result = getParentNode(fCurrentNode); if (! result.isNull()) { fCurrentNode = result; return fCurrentNode; } return result; } // get the lastChild of result. DOM_Node lastChild = getLastChild(result); // if there is a lastChild which passes filters return it. if (! lastChild.isNull()) { fCurrentNode = lastChild; return fCurrentNode; } // otherwise return the previous sibling. if (! result.isNull()) { fCurrentNode = result; return fCurrentNode; } // otherwise return null. return result; }
DOM_Node NodeIteratorImpl::previousNode (DOM_Node node) { if (fDetached) throw DOM_DOMException(DOM_DOMException::INVALID_STATE_ERR, null); DOM_Node result; // if we're at the root, return null. if (node == fRoot) return result; // get sibling result = node.getPreviousSibling(); if (result.isNull()) { //if 1st sibling, return parent result = node.getParentNode(); return result; } // if sibling has children, keep getting last child of child. if (result.hasChildNodes()) { while (result.hasChildNodes()) { result = result.getLastChild(); } } return result; }
DOM_Node TreeWalkerImpl::getParentNode (DOM_Node node) { DOM_Node result; if (node.isNull() || node == fRoot) return result; DOM_Node newNode = node.getParentNode(); if (newNode.isNull()) return result; short accept = acceptNode(newNode); if (accept == DOM_NodeFilter::FILTER_ACCEPT) return newNode; return getParentNode(newNode); }
DOM_Node NodeIteratorImpl::previousNode () { if (fDetached) throw DOM_DOMException(DOM_DOMException::INVALID_STATE_ERR, null); DOM_Node result; // if the root is null, or the current node is null, return null. if (fRoot.isNull() || fCurrentNode.isNull()) return result; DOM_Node aPreviousNode = fCurrentNode; bool accepted = false; while (!accepted) { if (fForward && ! aPreviousNode.isNull()) { //repeat last node. aPreviousNode = fCurrentNode; } else { // get previous node in backwards depth first order. aPreviousNode = previousNode(aPreviousNode); } // we are going backwards fForward = false; // if the new previous node is null, we're at head or past the root, // so return null. if (aPreviousNode.isNull()) return result; // check if node passes filters and whatToShow. accepted = acceptNode(aPreviousNode); if (accepted) { // if accepted, update the current node, and return it. fCurrentNode = aPreviousNode; return fCurrentNode; } } // there are no nodes? return result; }
DOM_Node NodeIteratorImpl::nextNode () { if (fDetached) throw DOM_DOMException(DOM_DOMException::INVALID_STATE_ERR, null); DOM_Node result; // if root is null there is no next node. if (fRoot.isNull()) return result; DOM_Node aNextNode = fCurrentNode; bool accepted = false; // the next node has not been accepted. while (!accepted) { // if last direction is not forward, repeat node. if (!fForward && !aNextNode.isNull()) { //System.out.println("nextNode():!fForward:"+fCurrentNode.getNodeName()); aNextNode = fCurrentNode; } else { // else get the next node via depth-first aNextNode = nextNode(aNextNode, true); } fForward = true; //REVIST: should direction be set forward before null check? // nothing in the list. return null. if (aNextNode.isNull()) return result; // does node pass the filters and whatToShow? accepted = acceptNode(aNextNode); if (accepted) { // if so, then the node is the current node. fCurrentNode = aNextNode; return fCurrentNode; } } // no nodes, or no accepted nodes. return result; }
DOM_Node TreeWalkerImpl::getFirstChild (DOM_Node node) { DOM_Node result; if (node.isNull()) return result; DOM_Node newNode = node.getFirstChild(); if (newNode.isNull()) return result; short accept = acceptNode(newNode); if (accept == DOM_NodeFilter::FILTER_ACCEPT) return newNode; else if (accept == DOM_NodeFilter::FILTER_SKIP && newNode.hasChildNodes()) { return getFirstChild(newNode); } return getNextSibling(newNode); }
DOM_Node TreeWalkerImpl::nextSibling () { DOM_Node result; if (fCurrentNode.isNull()) return result; DOM_Node node = getNextSibling(fCurrentNode); if (! node.isNull()) { fCurrentNode = node; } return node; }
/** Return the last child Node from the current node, * after applying filter, whatToshow. * If result is not null, set the current Node. */ DOM_Node TreeWalkerImpl::lastChild () { DOM_Node result; if (fCurrentNode.isNull()) return result; DOM_Node node = getLastChild(fCurrentNode); if (! node.isNull()) { fCurrentNode = node; } return node; }
DOM_Node NodeIteratorImpl::nextNode (DOM_Node node, bool visitChildren) { if (fDetached) throw DOM_DOMException(DOM_DOMException::INVALID_STATE_ERR, null); if (node.isNull()) return fRoot; DOM_Node result; // only check children if we visit children. if (visitChildren) { //if hasChildren, return 1st child. if (node.hasChildNodes()) { result = node.getFirstChild(); return result; } } // if hasSibling, return sibling if (node != fRoot) { result = node.getNextSibling(); if (! result.isNull()) return result; // return parent's 1st sibling. DOM_Node parent = node.getParentNode(); while (!parent.isNull() && parent != fRoot) { result = parent.getNextSibling(); if (!result.isNull()) { return result; } else { parent = parent.getParentNode(); } } // while (parent != null && parent != fRoot) { } // end of list, return null DOM_Node aNull; return aNull; }
DOM_Node TreeWalkerImpl::getNextSibling (DOM_Node node) { DOM_Node result; if (node.isNull() || node == fRoot) return result; DOM_Node newNode = node.getNextSibling(); if (newNode.isNull()) { newNode = node.getParentNode(); if (newNode.isNull() || node == fRoot) return result; short parentAccept = acceptNode(newNode); if (parentAccept == DOM_NodeFilter::FILTER_SKIP) { return getNextSibling(newNode); } return result; } short accept = acceptNode(newNode); if (accept == DOM_NodeFilter::FILTER_ACCEPT) return newNode; else if (accept == DOM_NodeFilter::FILTER_SKIP) { DOM_Node fChild = getFirstChild(newNode); if (fChild.isNull()) { return getNextSibling(newNode); } return fChild; } return getNextSibling(newNode); }