1 package org.kite9.diagram.visitors;
2
3 import java.util.Collection;
4 import java.util.HashSet;
5 import java.util.Set;
6
7 import org.kite9.diagram.primitives.Connected;
8 import org.kite9.diagram.primitives.Connection;
9 import org.kite9.diagram.primitives.Contained;
10 import org.kite9.diagram.primitives.Container;
11 import org.kite9.diagram.primitives.DiagramElement;
12
13
14 /***
15 * Walks the diagram element containment hierarchy.
16 *
17 * @author robmoffat
18 *
19 */
20 public class DiagramElementVisitor {
21
22 Set<DiagramElement> visited = new HashSet<DiagramElement>();
23
24
25 /***
26 * Start here by calling this method on the top-level diagram element container.
27 */
28 public void visit(Container d, VisitorAction va) {
29 push(d, visited, va);
30 }
31
32 public void visit(Collection<? extends DiagramElement> toVisit, VisitorAction va) {
33 for (DiagramElement element : toVisit) {
34 push(element, visited, va);
35 }
36 }
37
38 protected void push(DiagramElement d, Set<DiagramElement> visited, VisitorAction va) {
39 if (visited.contains(d))
40 return;
41 visited.add(d);
42 va.visit(d);
43 visitChildren(d,visited,va);
44 }
45
46 protected void visit(Container c, Set<DiagramElement> visited, VisitorAction va) {
47 if (c==null)
48 return;
49
50 for (Contained d : c.getContents()) {
51 push(d, visited, va);
52 }
53
54 if (c.getLabel()!=null) {
55 push(c.getLabel(), visited, va);
56 }
57
58 if (c instanceof Connected) {
59 for (Connection con : ((Connected)c).getLinks()) {
60 push(con, visited, va);
61 }
62 }
63
64
65 }
66
67 protected void visitChildren(DiagramElement de, Set<DiagramElement> visited, VisitorAction va) {
68 if (de instanceof Container) {
69 visit((Container) de, visited, va);
70 } else if (de instanceof Connected) {
71 visit((Connected) de, visited, va);
72 } else if (de instanceof Connection) {
73 visit((Connection) de, visited, va);
74 }
75 }
76
77 protected void visit(Connected v, Set<DiagramElement> visited, VisitorAction va) {
78 for (Connection element : v.getLinks()) {
79 push(element, visited, va);
80 }
81 }
82
83 protected void visit(Connection element, Set<DiagramElement> visited, VisitorAction va) {
84 push(element.getFrom(), visited, va);
85 push(element.getTo(), visited, va);
86
87 if (element.getFromLabel()!=null) {
88 push(element.getFromLabel(), visited, va);
89 }
90
91 if (element.getToLabel()!=null) {
92 push(element.getToLabel(), visited, va);
93 }
94
95 }
96
97 }