You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by tk...@apache.org on 2001/05/03 16:41:34 UTC

cvs commit: xml-batik/sources/org/apache/batik/gvt GVTTreeWalker.java GraphicsNodeTreeIterator.java

tkormann    01/05/03 07:41:33

  Added:       sources/org/apache/batik/gvt GVTTreeWalker.java
  Removed:     sources/org/apache/batik/gvt GraphicsNodeTreeIterator.java
  Log:
  A simple and functional version of a tree walker for GVT (similar to the DOM Tree walker)
  
  Revision  Changes    Path
  1.1                  xml-batik/sources/org/apache/batik/gvt/GVTTreeWalker.java
  
  Index: GVTTreeWalker.java
  ===================================================================
  /*****************************************************************************
   * Copyright (C) The Apache Software Foundation. All rights reserved.        *
   * ------------------------------------------------------------------------- *
   * This software is published under the terms of the Apache Software License *
   * version 1.1, a copy of which has been included with this distribution in  *
   * the LICENSE file.                                                         *
   *****************************************************************************/
  
  package org.apache.batik.gvt;
  
  import java.util.List;
  
  /**
   * <tt>GVTTreeWalker</tt> objects are used to navigate a GVT tree or subtree.
   *
   * @author <a href="mailto:tkormann@apache.org">Thierry Kormann</a>
   * @version $Id: GVTTreeWalker.java,v 1.1 2001/05/03 14:41:28 tkormann Exp $
   */
  public class GVTTreeWalker {
  
      /** The GVT root into which text is searched. */
      protected GraphicsNode gvtRoot;
  
      /** The current GraphicsNode. */
      protected GraphicsNode currentNode;
  
      /**
       * Constructs a new <tt>GVTTreeWalker</tt>.
       *
       * @param gvtRoot the graphics node root
       */
      public GVTTreeWalker(GraphicsNode gvtRoot) {
          this.gvtRoot = gvtRoot;
          currentNode = gvtRoot;
      }
  
      /**
       * Returns the root graphics node.
       */
      public GraphicsNode getRoot() {
          return gvtRoot;
      }
  
      /**
       * Sets the current GraphicsNode to the specified node.
       *
       * @param node the new current graphics node
       * @exception IllegalArgumentException if the node is not part of the GVT Tree
       *                                     this walker is dedicated to
       */
      public void setCurrentGraphicsNode(GraphicsNode node) {
          if (node.getRoot() != gvtRoot) {
              throw new IllegalArgumentException
                  ("The node "+node+" is not part of the document "+gvtRoot);
          }
          currentNode = node;
      }
  
      /**
       * Returns the current <tt>GraphicsNode</tt>.
       */
      public GraphicsNode getCurrentGraphicsNode() {
          return currentNode;
      }
  
      /**
       * Returns the previous <tt>GraphicsNode</tt>. If the current graphics node
       * does not have a previous node, returns null and retains the current node.
       */
      public GraphicsNode previousGraphicsNode() {
          GraphicsNode result = getPreviousGraphicsNode(currentNode);
          if (result != null) {
              currentNode = result;
          }
          return result;
      }
  
      /**
       * Returns the next <tt>GraphicsNode</tt>. If the current graphics node does
       * not have a next node, returns null and retains the current node.
       */
      public GraphicsNode nextGraphicsNode() {
          GraphicsNode result = getNextGraphicsNode(currentNode);
          if (result != null) {
              currentNode = result;
          }
          return result;
      }
  
      /**
       * Returns the parent of the current <tt>GraphicsNode</tt>. If the current
       * graphics node has no parent, returns null and retains the current node.
       */
      public GraphicsNode parentGraphicsNode() {
          GraphicsNode result = currentNode.getParent();
          if (result != null) {
              currentNode = result;
          }
          return result;
      }
  
      /**
       * Returns the next sibling of the current <tt>GraphicsNode</tt>. If the
       * current graphics node does not have a next sibling, returns null and
       * retains the current node.
       */
      public GraphicsNode getNextSibling() {
          GraphicsNode result = getNextSibling(currentNode);
          if (result != null) {
              currentNode = result;
          }
          return result;
      }
  
      /**
       * Returns the next previous of the current <tt>GraphicsNode</tt>. If the
       * current graphics node does not have a previous sibling, returns null and
       * retains the current node.
       */
      public GraphicsNode getPreviousSibling() {
          GraphicsNode result = getPreviousSibling(currentNode);
          if (result != null) {
              currentNode = result;
          }
          return result;
      }
  
      /**
       * Returns the first child of the current <tt>GraphicsNode</tt>. If the
       * current graphics node does not have a first child, returns null and
       * retains the current node.
       */
      public GraphicsNode firstChild() {
          GraphicsNode result = getFirstChild(currentNode);
          if (result != null) {
              currentNode = result;
          }
          return result;
      }
  
      /**
       * Returns the last child of the current <tt>GraphicsNode</tt>. If the
       * current graphics node does not have a last child, returns null and
       * retains the current node.
       */
      public GraphicsNode lastChild() {
          GraphicsNode result = getLastChild(currentNode);
          if (result != null) {
              currentNode = result;
          }
          return result;
      }
  
      ////////////////////////////////////////////////////////////////////////////
      ////////////////////////////////////////////////////////////////////////////
  
      private GraphicsNode getNextGraphicsNode(GraphicsNode node) {
          if (node == null) {
              return null;
          }
          // Go to the first child
          GraphicsNode n = getFirstChild(node);
          if (n != null) {
              return n;
          }
  
          // Go to the next sibling
          n = getNextSibling(node);
          if (n != null) {
              return n;
          }
  
          // Go to the first sibling of one of the ancestors
          n = node;
          while ((n = n.getParent()) != null && n != gvtRoot) {
              GraphicsNode t = getNextSibling(n);
              if (t != null) {
                  return t;
              }
          }
          return null;
      }
  
      private GraphicsNode getPreviousGraphicsNode(GraphicsNode node) {
          if (node == null) {
              return null;
          }
  
          // The previous of root is null
          if (node == gvtRoot) {
              return null;
          }
  
          GraphicsNode n = getPreviousSibling(node);
  
          // Go to the parent of a first child
          if (n == null) {
              return node.getParent();
          }
  
          // Go to the last child of child...
          GraphicsNode t;
          while ((t = getLastChild(n)) != null) {
              n = t;
          }
          return n;
      }
  
      private static GraphicsNode getLastChild(GraphicsNode node) {
          if (!(node instanceof CompositeGraphicsNode)) {
              return null;
          }
          CompositeGraphicsNode parent = (CompositeGraphicsNode)node;
          List children = parent.getChildren();
          if (children == null) {
              return null;
          }
          if (children.size() >= 1) {
              return (GraphicsNode)children.get(children.size()-1);
          } else {
              return null;
          }
      }
  
      private static GraphicsNode getPreviousSibling(GraphicsNode node) {
          CompositeGraphicsNode parent = node.getParent();
          if (parent == null) {
              return null;
          }
          List children = parent.getChildren();
          if (children == null) {
              return null;
          }
          int index = children.indexOf(node);
          if (index-1 >= 0) {
              return (GraphicsNode)children.get(index-1);
          } else {
              return null;
          }
      }
  
      private static GraphicsNode getFirstChild(GraphicsNode node) {
          if (!(node instanceof CompositeGraphicsNode)) {
              return null;
          }
          CompositeGraphicsNode parent = (CompositeGraphicsNode)node;
          List children = parent.getChildren();
          if (children == null) {
              return null;
          }
          if (children.size() >= 1) {
              return (GraphicsNode)children.get(0);
          } else {
              return null;
          }
      }
  
      private static GraphicsNode getNextSibling(GraphicsNode node) {
          CompositeGraphicsNode parent = node.getParent();
          if (parent == null) {
              return null;
          }
          List children = parent.getChildren();
          if (children == null) {
              return null;
          }
          int index = children.indexOf(node);
          if (index+1 < children.size()) {
              return (GraphicsNode)children.get(index+1);
          } else {
              return null;
          }
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: batik-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-dev-help@xml.apache.org