pbwest      2004/01/28 18:53:37

  Modified:    src/java/org/apache/fop/datastructs Tag:
                        FOP_0-20-0_Alt-Design Node.java
  Log:
  Added:
  getPrecedingSibling
  getFollowingSibling
  precedingLeaf
  followingLeaf
  to support resolution of keeps and space-specifiers.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.1.2.5   +153 -12   xml-fop/src/java/org/apache/fop/datastructs/Attic/Node.java
  
  Index: Node.java
  ===================================================================
  RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/datastructs/Attic/Node.java,v
  retrieving revision 1.1.2.4
  retrieving revision 1.1.2.5
  diff -u -r1.1.2.4 -r1.1.2.5
  --- Node.java 28 Jan 2004 06:19:56 -0000      1.1.2.4
  +++ Node.java 29 Jan 2004 02:53:37 -0000      1.1.2.5
  @@ -181,7 +181,7 @@
       }
   
       /**
  -     * Insert a subtree at a specified index position in the child list.
  +     * Inserts a subtree at a specified index position in the child list.
        * @param index position of subtree within children
        * @param subtree to insert
        * @throws IndexOutOfBoundsException
  @@ -194,7 +194,7 @@
       }
   
       /**
  -     * Add a subtree to the child list.
  +     * Adds a subtree to the child list.
        * @param subtree to insert
        * @throws IndexOutOfBoundsException
        */
  @@ -382,7 +382,7 @@
       }
   
       /**
  -     * Delete <code>this</code> subtree and return a count of the deleted
  +     * Deletes <code>this</code> subtree and returns a count of the deleted
        * nodes.  The deletion is effected by cutting the references between
        * <code>this</code> and its parent (if any).  All other relationships
        * within the subtree are maintained.
  @@ -430,7 +430,7 @@
       }
   
       /**
  -     * Get the parent of this <tt>Node</tt>.
  +     * Gets the parent of this <tt>Node</tt>.
        * @return the parent <tt>Node</tt>.
        */
       public Node getParent() {
  @@ -443,7 +443,7 @@
       }
   
       /**
  -     * Set the <i>parent</i> field of this node.
  +     * Sets the <i>parent</i> field of this node.
        * @param parent the reference to set
        */
       public void setParent(Node parent) {
  @@ -457,7 +457,7 @@
       }
   
       /**
  -     * Nullify the parent <tt>Node</tt> of this node.
  +     * Nullifies the parent <tt>Node</tt> of this node.
        */
       public void unsetParent() {
           if (synchronize) {
  @@ -469,7 +469,7 @@
       }
   
       /**
  -     * Get the n'th child of this node.
  +     * Gets the n'th child of this node.
        * @param n - the <tt>int</tt> index of the child to return.
        * @return the <tt>Node</tt> reference to the n'th child.
        */
  @@ -485,7 +485,7 @@
       }
   
       /**
  -     * Get an <tt>Iterator</tt> over the children of this node.
  +     * Gets an <tt>Iterator</tt> over the children of this node.
        * @return the <tt>Iterator</tt>.
        */
       public Iterator nodeChildren() {
  @@ -500,7 +500,7 @@
       }
   
       /**
  -     * Get the number of children of this node.
  +     * Gets the number of children of this node.
        * @return the <tt>int</tt> number of children.
        */
       public int numChildren() {
  @@ -513,7 +513,148 @@
           if (children == null) return 0;
           return children.size();
       }
  -
  +    
  +    /**
  +     * Gets the preceding sibling of this <code>Node</code>,
  +     * or <code>null</code> if none.
  +     * @return the sibling node
  +     */
  +    public Node getPrecedingSibling() {
  +        if (synchronize) {
  +            synchronized (this) {
  +                if (this.parent == null) return null;
  +                int thisChild = parent.children.indexOf(this);
  +                if (thisChild == 0) return null;
  +                return parent.getChild(--thisChild);
  +            }
  +        }
  +        if (this.parent == null) return null;
  +        int thisChild = parent.children.indexOf(this);
  +        if (thisChild == 0) return null;
  +        return parent.getChild(--thisChild);
  +    }
  +    
  +    /**
  +     * Gets the following sibling of this <code>Node</code>,
  +     * or <code>null</code> if none.
  +     * @return the sibling node
  +     */
  +    public Node getFollowingSibling() {
  +        if (synchronize) {
  +            synchronized (this) {
  +                if (this.parent == null) return null;
  +                int thisChild = parent.children.indexOf(this);
  +                if (++thisChild >= parent.numChildren()) return null;
  +                return parent.getChild(thisChild);
  +            }
  +        }
  +        if (this.parent == null) return null;
  +        int thisChild = parent.children.indexOf(this);
  +        if (++thisChild >= parent.numChildren()) return null;
  +        return parent.getChild(thisChild);
  +    }
  +    
  +    /**
  +     * Gets the leaf <code>Node</code> immediately preceding this node in the
  +     * pre-order tree rooted on the <code>nominalRoot</code>, or, if the
  +     * nominal root is not encountered, the actual root.
  +     * In a pre-order tree, all children follow their parent.
  +     * @param nominalRoot the root node for the purposes of this operation
  +     * @return the preceding leaf node or <code>null</code>
  +     */
  +    public Node precedingLeaf(Node nominalRoot) {
  +        if (synchronize) {
  +            synchronized (this) {
  +                return getPrecedingLeaf(nominalRoot);
  +            }
  +        }
  +        return getPrecedingLeaf(nominalRoot);
  +    }
  +    
  +    /**
  +     * Realizes <code>precedingLeaf()</code>.   Climbs the tree rooted at
  +     * <code>nominalRoot</code> from <code>this</code>, searching for an
  +     * ancestor with a branch preceding this.
  +     * If none is found, there is no preceding leaf node.
  +     * If one is found, it is descended to the last pre-order node,
  +     * i.e. the leaf most closely preceding <code>this</code>.
  +     * @param nominalRoot the root node for the purposes of this operation
  +     * @return the preceding leaf node or <code>null</code>
  +     */
  +    private Node getPrecedingLeaf(Node nominalRoot) {
  +        if (this == nominalRoot || this.parent == null) {
  +            return null;
  +        }
  +        Node sibling = null;
  +        Node pivot = this.parent;
  +        while (pivot != nominalRoot) {
  +            if ((sibling = pivot.getPrecedingSibling()) != null) {
  +                break;
  +            }
  +            pivot = pivot.parent;
  +        }
  +        if (pivot == nominalRoot) { // No preceding leaf node
  +            return null;
  +        }
  +        // We have the pivot preceding sibling - now descend the
  +        // preceding subtree to the last leaf
  +        int numChildren;
  +        while ((numChildren = sibling.numChildren()) > 0) {
  +            sibling = sibling.getChild(--numChildren);
  +        }
  +        return sibling;
  +    }
  +    
  +    /**
  +     * Gets the leaf <code>Node</code> immediately following this node in the
  +     * post-order tree rooted on the <code>nominalRoot</code>, or, if the
  +     * nominal root is not encountered, the actual root.
  +     * In a post-order tree, all children precede their parent.
  +     * @param nominalRoot the root node for the purposes of this operation
  +     * @return the following leaf node or <code>null</code>
  +     */
  +    public Node followingLeaf(Node nominalRoot) {
  +        if (synchronize) {
  +            synchronized (this) {
  +                return getFollowingLeaf(nominalRoot);
  +            }
  +        }
  +        return getFollowingLeaf(nominalRoot);
  +    }
  +    
  +    /**
  +     * Realizes <code>followingLeaf()</code>.   Climbs the tree rooted at
  +     * <code>nominalRoot</code> from <code>this</code>, searching for an
  +     * ancestor with a branch following this.
  +     * If none is found, there is no following leaf node.
  +     * If one is found, it is descended to the first post-order node,
  +     * i.e. the leaf most closely following <code>this</code>.
  +     * @param nominalRoot the root node for the purposes of this operation
  +     * @return the following leaf node or <code>null</code>
  +     */
  +    private Node getFollowingLeaf(Node nominalRoot) {
  +        if (this == nominalRoot || this.parent == null) {
  +            return null;
  +        }
  +        Node sibling = null;
  +        Node pivot = this.parent;
  +        while (pivot != nominalRoot) {
  +            if ((sibling = pivot.getFollowingSibling()) != null) {
  +                break;
  +            }
  +            pivot = pivot.parent;
  +        }
  +        if (pivot == nominalRoot) { // No preceding leaf node
  +            return null;
  +        }
  +        // We have the pivot following sibling - now descend the
  +        // following subtree to the first leaf
  +        while (sibling.numChildren() > 0) {
  +            sibling = sibling.getChild(0);
  +        }
  +        return sibling;
  +    }
  +    
       /**
        * Class <tt>PreOrder</tt> is a member class of <tt>Node</tt>.
        *
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to