View Javadoc

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  }