View Javadoc
1   package edu.uci.ics.jung.visualization;
2   
3   import java.awt.Shape;
4   import java.awt.geom.AffineTransform;
5   import java.awt.geom.Point2D;
6   
7   import javax.swing.event.ChangeEvent;
8   import javax.swing.event.ChangeListener;
9   
10  import edu.uci.ics.jung.visualization.transform.MutableAffineTransformer;
11  import edu.uci.ics.jung.visualization.transform.MutableTransformer;
12  import edu.uci.ics.jung.visualization.transform.shape.ShapeTransformer;
13  import edu.uci.ics.jung.visualization.util.ChangeEventSupport;
14  import edu.uci.ics.jung.visualization.util.DefaultChangeEventSupport;
15  
16  /**
17   * A basic implementation of the MultiLayerTransformer interface that 
18   * provides two Layers: VIEW and LAYOUT. It also provides ChangeEventSupport
19   * @author Tom Nelson - tomnelson@dev.java.net
20   *
21   */
22  public class BasicTransformer implements MultiLayerTransformer, 
23  	ShapeTransformer, ChangeListener, ChangeEventSupport  {
24  
25      protected ChangeEventSupport changeSupport =
26          new DefaultChangeEventSupport(this);
27  
28      protected MutableTransformer viewTransformer = 
29          new MutableAffineTransformer(new AffineTransform());
30      
31      protected MutableTransformer layoutTransformer =
32          new MutableAffineTransformer(new AffineTransform());
33  
34      /**
35       * Creates an instance and notifies the view and layout Functions to listen to
36       * changes published by this instance.
37       */
38      public BasicTransformer() {
39  		super();
40  		viewTransformer.addChangeListener(this);
41  		layoutTransformer.addChangeListener(this);
42  	}
43  
44      protected void setViewTransformer(MutableTransformer Function) {
45          this.viewTransformer.removeChangeListener(this);
46          this.viewTransformer = Function;
47          this.viewTransformer.addChangeListener(this);
48      }
49  
50      protected void setLayoutTransformer(MutableTransformer Function) {
51          this.layoutTransformer.removeChangeListener(this);
52          this.layoutTransformer = Function;
53          this.layoutTransformer.addChangeListener(this);
54      }
55  
56  
57  	protected MutableTransformer getLayoutTransformer() {
58  		return layoutTransformer;
59  	}
60  
61  	protected MutableTransformer getViewTransformer() {
62  		return viewTransformer;
63  	}
64  
65  	public Point2D inverseTransform(Point2D p) {
66  	    return inverseLayoutTransform(inverseViewTransform(p));
67  	}
68  	
69  	protected Point2D inverseViewTransform(Point2D p) {
70  	    return viewTransformer.inverseTransform(p);
71  	}
72  
73      protected Point2D inverseLayoutTransform(Point2D p) {
74          return layoutTransformer.inverseTransform(p);
75      }
76  
77  	public Point2D transform(Point2D p) {
78  	    return viewTransform(layoutTransform(p));
79  	}
80      
81      protected Point2D viewTransform(Point2D p) {
82          return viewTransformer.transform(p);
83      }
84      
85      protected Point2D layoutTransform(Point2D p) {
86          return layoutTransformer.transform(p);
87      }
88      
89  	public Shape inverseTransform(Shape shape) {
90  	    return inverseLayoutTransform(inverseViewTransform(shape));
91  	}
92  	
93  	protected Shape inverseViewTransform(Shape shape) {
94  	    return viewTransformer.inverseTransform(shape);
95  	}
96  
97      protected Shape inverseLayoutTransform(Shape shape) {
98          return layoutTransformer.inverseTransform(shape);
99      }
100 
101 	public Shape transform(Shape shape) {
102 	    return viewTransform(layoutTransform(shape));
103 	}
104     
105     protected Shape viewTransform(Shape shape) {
106         return viewTransformer.transform(shape);
107     }
108     
109     protected Shape layoutTransform(Shape shape) {
110         return layoutTransformer.transform(shape);
111     }
112     
113     public void setToIdentity() {
114     	layoutTransformer.setToIdentity();
115     	viewTransformer.setToIdentity();
116     }
117     
118     public void addChangeListener(ChangeListener l) {
119         changeSupport.addChangeListener(l);
120     }
121     
122     public void removeChangeListener(ChangeListener l) {
123         changeSupport.removeChangeListener(l);
124     }
125     
126     public ChangeListener[] getChangeListeners() {
127         return changeSupport.getChangeListeners();
128     }
129 
130     public void fireStateChanged() {
131         changeSupport.fireStateChanged();
132     }   
133     
134 	public void stateChanged(ChangeEvent e) {
135 	    fireStateChanged();
136 	}
137 
138 	public MutableTransformer getTransformer(Layer layer) {
139 		if(layer == Layer.LAYOUT) return layoutTransformer;
140 		if(layer == Layer.VIEW) return viewTransformer;
141 		return null;
142 	}
143 
144 	public Point2D inverseTransform(Layer layer, Point2D p) {
145 		if(layer == Layer.LAYOUT) return inverseLayoutTransform(p);
146 		if(layer == Layer.VIEW) return inverseViewTransform(p);
147 		return null;
148 	}
149 
150 	public void setTransformer(Layer layer, MutableTransformer Function) {
151 		if(layer == Layer.LAYOUT) setLayoutTransformer(Function);
152 		if(layer == Layer.VIEW) setViewTransformer(Function);
153 		
154 	}
155 
156 	public Point2D transform(Layer layer, Point2D p) {
157 		if(layer == Layer.LAYOUT) return layoutTransform(p);
158 		if(layer == Layer.VIEW) return viewTransform(p);
159 		return null;
160 	}
161 
162 	public Shape transform(Layer layer, Shape shape) {
163 		if(layer == Layer.LAYOUT) return layoutTransform(shape);
164 		if(layer == Layer.VIEW) return viewTransform(shape);
165 		return null;
166 	}
167 	
168 	public Shape inverseTransform(Layer layer, Shape shape) {
169 		if(layer == Layer.LAYOUT) return inverseLayoutTransform(shape);
170 		if(layer == Layer.VIEW) return inverseViewTransform(shape);
171 		return null;
172 	}
173 }