add more methods
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Mon, 26 May 2008 18:27:05 +0000 (20:27 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Mon, 26 May 2008 18:27:05 +0000 (20:27 +0200)
src/net/pterodactylus/util/data/Node.java
src/net/pterodactylus/util/data/NodeImpl.java

index 7737d50..3ba6004 100644 (file)
@@ -54,6 +54,36 @@ public interface Node<E> extends Iterable<Node<E>> {
        public Node<E> getChild(int index);
 
        /**
+        * Returns whether the given node is a direct child of this node.
+        * 
+        * @param childNode
+        *            The child node
+        * @return <code>true</code> if the given node is a direct child of this
+        *         node, <code>false</code> otherwise
+        */
+       public boolean hasChildNode(Node<E> childNode);
+
+       /**
+        * Returns the index of the given child node.
+        * 
+        * @param childNode
+        *            The child node
+        * @return The index of the child node, or <code>-1</code> if the child
+        *         node is not a child node of this node
+        */
+       public int getIndexOfChild(Node<E> childNode);
+
+       /**
+        * Returns the index of the child node containing the given element.
+        * 
+        * @param element
+        *            The element
+        * @return The index of the child node, or <code>-1</code> if the child
+        *         node is not a child node of this node
+        */
+       public int getIndexOfChild(E element);
+
+       /**
         * Remove the given child node from this node. If the given node is not a
         * child of this node, nothing happens.
         * 
@@ -84,4 +114,15 @@ public interface Node<E> extends Iterable<Node<E>> {
         */
        public Iterator<Node<E>> iterator();
 
+       /**
+        * Searches this node’s children recursively for a node that contains the
+        * given element.
+        * 
+        * @param element
+        *            The element to search
+        * @return The node that contains the given element, or <code>null</code>
+        *         if no node could be found
+        */
+       public Node<E> findChild(E element);
+
 }
\ No newline at end of file
index a30f76e..2d57876 100644 (file)
@@ -87,6 +87,41 @@ class NodeImpl<E> implements Node<E> {
        /**
         * {@inheritDoc}
         */
+       public boolean hasChildNode(Node<E> childNode) {
+               return children.contains(childNode);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public int getIndexOfChild(Node<E> childNode) {
+               int childIndex = 0;
+               for (Node<E> node: children) {
+                       if (node.equals(childNode)) {
+                               return childIndex;
+                       }
+                       childIndex++;
+               }
+               return -1;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       public int getIndexOfChild(E element) {
+               int childIndex = 0;
+               for (Node<E> node: children) {
+                       if (node.getElement().equals(element)) {
+                               return childIndex;
+                       }
+                       childIndex++;
+               }
+               return -1;
+       }
+
+       /**
+        * {@inheritDoc}
+        */
        public void removeChild(Node<E> childNode) {
                children.remove(childNode);
        }
@@ -117,4 +152,20 @@ class NodeImpl<E> implements Node<E> {
                return children.iterator();
        }
 
+       /**
+        * {@inheritDoc}
+        */
+       public Node<E> findChild(E element) {
+               for (Node<E> childNode: children) {
+                       Node<E> wantedNode = childNode.findChild(element);
+                       if (wantedNode != null) {
+                               return wantedNode;
+                       }
+               }
+               if (this.element.equals(element)) {
+                       return this;
+               }
+               return null;
+       }
+
 }
\ No newline at end of file