KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > killingar > forum > internal > TreeIterator


1 /* Copyright 2000-2005 Anders Hovmöller
2  *
3  * The person or persons who have associated their work with
4  * this document (the "Dedicator") hereby dedicate the entire
5  * copyright in the work of authorship identified below (the
6  * "Work") to the public domain.
7  *
8  * Dedicator makes this dedication for the benefit of the
9  * public at large and to the detriment of Dedicator's heirs
10  * and successors. Dedicator intends this dedication to be an
11  * overt act of relinquishment in perpetuity of all present
12  * and future rights under copyright law, whether vested or
13  * contingent, in the Work. Dedicator understands that such
14  * relinquishment of all rights includes the relinquishment of
15  * all rights to enforce (by lawsuit or otherwise) those
16  * copyrights in the Work.
17  *
18  * Dedicator recognizes that, once placed in the public
19  * domain, the Work may be freely reproduced, distributed,
20  * transmitted, used, modified, built upon, or otherwise
21  * exploited by anyone for any purpose, commercial or non-
22  * commercial, and in any way, including by methods that have
23  * not yet been invented or conceived.
24  */

25
26 package net.killingar.forum.internal;
27
28 import net.killingar.Stack;
29
30 import java.util.Iterator JavaDoc;
31
32 public class TreeIterator implements Iterator JavaDoc
33 {
34     Stack stack = new Stack();
35     int index = 0;
36
37     // iterates over the subnodes
38
class StackItem implements Iterator JavaDoc
39     {
40         int index = 0;
41         ParentIDItemTreeNode node;
42
43         StackItem(ParentIDItemTreeNode inNode)
44         {
45             node = inNode;
46         }
47
48         public boolean hasNext()
49         {
50             if (node.subnodes == null)
51                 return false;
52
53             if (index == node.subnodes.size())
54                 return false;
55
56             return true;
57         }
58
59         public Object JavaDoc next()
60         {
61             return node.subnodes.get(index++);
62         }
63
64         public void remove()
65         {
66             throw new UnsupportedOperationException JavaDoc();
67         }
68     }
69
70     ParentIDItemTreeNode nextNode;
71
72     public TreeIterator(ParentIDItemTreeNode inNode)
73     {
74         this(inNode, true);
75     }
76
77     public TreeIterator(ParentIDItemTreeNode inNode, boolean skipFirst)
78     {
79         nextNode = inNode;
80         stack.push(new StackItem(inNode));
81
82         if (skipFirst && hasNext())
83             next();
84     }
85
86     public boolean hasNext()
87     {
88         return nextNode != null;
89     }
90
91     public Object JavaDoc next()
92     {
93         if (nextNode == null)
94             throw new IllegalStateException JavaDoc();
95
96         ParentIDItemTreeNode ret = nextNode;
97
98         StackItem i = (StackItem)stack.peek();
99
100         index++;
101
102         while (!i.hasNext() && stack.size() != 1)
103         {
104             stack.pop();
105             i = (StackItem)stack.peek();
106         }
107
108         if (i.hasNext())
109         {
110             nextNode = (ParentIDItemTreeNode)i.next();
111
112             if (nextNode.subnodes != null)
113             {
114                 stack.push(new StackItem(nextNode));
115
116                 if (!((StackItem)stack.peek()).hasNext())
117                     throw new RuntimeException JavaDoc("shouldn't have pushed! "+nextNode.subnodes.size());
118             }
119         }
120         else
121         {
122             nextNode = null;
123         }
124
125         //System.err.println("boxed: TreeIterator "+ret.item);
126

127         return ret;
128     }
129
130     public void remove()
131     {
132         throw new UnsupportedOperationException JavaDoc();
133     }
134 }
135
Popular Tags