1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.custom.focus2;
20
21 import java.util.Iterator;
22
23 import javax.faces.component.UIComponent;
24 import javax.faces.context.FacesContext;
25
26 public class TreeVisitor
27 {
28
29 public static interface TreeTraversalListener
30 {
31
32
33
34
35
36
37
38 boolean traverse(FacesContext context, int level, UIComponent component);
39 }
40
41 public static void traverseTree(FacesContext context,
42 TreeTraversalListener listener, UIComponent startingFrom)
43 {
44
45 int level = 0;
46
47 if (!listener.traverse(context, level, startingFrom))
48 return;
49
50 if (!recurseDown(context, listener, startingFrom, level + 1))
51 return;
52
53 recurseUp(context, listener, startingFrom, level - 1);
54 }
55
56 private static boolean recurseDown(FacesContext context,
57 TreeTraversalListener listener, UIComponent comp, int level)
58 {
59 Iterator it = comp.getFacetsAndChildren();
60
61 while (it.hasNext())
62 {
63 UIComponent child = (UIComponent) it.next();
64 if (!listener.traverse(context, level, child))
65 return false;
66 if (!recurseDown(context, listener, child, level + 1))
67 return false;
68 }
69
70 return true;
71 }
72
73 private static boolean recurseUp(FacesContext context,
74 TreeTraversalListener listener, UIComponent comp, int level)
75 {
76 UIComponent parent = comp.getParent();
77 if (parent != null)
78 {
79 Iterator siblingIt = parent.getFacetsAndChildren();
80
81 boolean traverseNow = false;
82
83 while (siblingIt.hasNext())
84 {
85 if (traverseNow)
86 {
87 UIComponent nextSibling = (UIComponent) siblingIt.next();
88
89 if (!listener.traverse(context, level, nextSibling))
90 return false;
91
92 if (!recurseDown(context, listener, nextSibling, level + 1))
93 return false;
94 }
95 else
96 {
97 UIComponent potSibling = (UIComponent) siblingIt.next();
98
99 if (potSibling == comp)
100 {
101 traverseNow = true;
102 }
103 }
104 }
105
106 return recurseUp(context, listener, parent, level - 1);
107 }
108 return false;
109 }
110 }