View Javadoc
1   /*
2    * Copyright (c) 2003, The JUNG Authors
3    * All rights reserved.
4    * 
5    * This software is open-source under the BSD license; see either "license.txt"
6    * or https://github.com/jrtom/jung/blob/master/LICENSE for a description.
7    */
8   package edu.uci.ics.jung.visualization;
9   
10  import java.awt.BasicStroke;
11  import java.awt.Color;
12  import java.awt.Font;
13  import java.awt.Paint;
14  import java.awt.Shape;
15  import java.awt.Stroke;
16  import java.awt.geom.Ellipse2D;
17  
18  import javax.swing.CellRendererPane;
19  import javax.swing.Icon;
20  import javax.swing.JComponent;
21  
22  import com.google.common.base.Function;
23  import com.google.common.base.Functions;
24  import com.google.common.base.Predicate;
25  import com.google.common.base.Predicates;
26  
27  import edu.uci.ics.jung.algorithms.layout.GraphElementAccessor;
28  import edu.uci.ics.jung.graph.Graph;
29  import edu.uci.ics.jung.graph.util.Context;
30  import edu.uci.ics.jung.graph.util.DefaultParallelEdgeIndexFunction;
31  import edu.uci.ics.jung.graph.util.EdgeIndexFunction;
32  import edu.uci.ics.jung.graph.util.IncidentEdgeIndexFunction;
33  import edu.uci.ics.jung.visualization.decorators.ConstantDirectionalEdgeValueTransformer;
34  import edu.uci.ics.jung.visualization.decorators.DirectionalEdgeArrowTransformer;
35  import edu.uci.ics.jung.visualization.decorators.EdgeShape;
36  import edu.uci.ics.jung.visualization.decorators.ParallelEdgeShapeTransformer;
37  import edu.uci.ics.jung.visualization.picking.PickedState;
38  import edu.uci.ics.jung.visualization.renderers.DefaultEdgeLabelRenderer;
39  import edu.uci.ics.jung.visualization.renderers.DefaultVertexLabelRenderer;
40  import edu.uci.ics.jung.visualization.renderers.EdgeLabelRenderer;
41  import edu.uci.ics.jung.visualization.renderers.VertexLabelRenderer;
42  import edu.uci.ics.jung.visualization.transform.shape.GraphicsDecorator;
43  
44  
45  public class PluggableRenderContext<V, E> implements RenderContext<V, E> {
46      
47  	protected float arrowPlacementTolerance = 1;
48      protected Predicate<Context<Graph<V,E>,V>> vertexIncludePredicate = Predicates.alwaysTrue();
49      protected Function<? super V,Stroke> vertexStrokeTransformer = 
50      	Functions.<Stroke>constant(new BasicStroke(1.0f));
51      
52      protected Function<? super V,Shape> vertexShapeTransformer = 
53          		Functions.<Shape>constant(
54          		new Ellipse2D.Float(-10,-10,20,20));
55  
56      protected Function<? super V,String> vertexLabelTransformer = Functions.constant(null);
57      protected Function<? super V,Icon> vertexIconTransformer;
58      protected Function<? super V,Font> vertexFontTransformer = 
59          Functions.constant(new Font("Helvetica", Font.PLAIN, 12));
60      
61      protected Function<? super V,Paint> vertexDrawPaintTransformer = 
62      	Functions.<Paint>constant(Color.BLACK);
63      protected Function<? super V,Paint> vertexFillPaintTransformer = 
64      	Functions.<Paint>constant(Color.RED);
65      
66      protected Function<? super E,String> edgeLabelTransformer = 
67      	Functions.constant(null);
68      protected Function<? super E,Stroke> edgeStrokeTransformer = 
69      	Functions.<Stroke>constant(new BasicStroke(1.0f));
70      protected Function<? super E,Stroke> edgeArrowStrokeTransformer = 
71      	Functions.<Stroke>constant(new BasicStroke(1.0f));
72      
73      protected Function<? super Context<Graph<V,E>,E>,Shape> edgeArrowTransformer = 
74          new DirectionalEdgeArrowTransformer<V,E>(10, 8, 4);
75      
76      protected Predicate<Context<Graph<V,E>,E>> edgeArrowPredicate = new DirectedEdgeArrowPredicate<V,E>();
77      protected Predicate<Context<Graph<V,E>,E>> edgeIncludePredicate = Predicates.alwaysTrue();
78      protected Function<? super E,Font> edgeFontTransformer =
79          Functions.constant(new Font("Helvetica", Font.PLAIN, 12));
80      protected Function<? super Context<Graph<V,E>,E>,Number> edgeLabelClosenessTransformer = 
81          new ConstantDirectionalEdgeValueTransformer<V,E>(0.5, 0.65);
82      protected Function<? super E, Shape> edgeShapeTransformer;
83      protected Function<? super E,Paint> edgeFillPaintTransformer =
84          Functions.constant(null);
85      protected Function<? super E,Paint> edgeDrawPaintTransformer =
86          Functions.<Paint>constant(Color.black);
87      protected Function<? super E,Paint> arrowFillPaintTransformer =
88          Functions.<Paint>constant(Color.black);
89      protected Function<? super E,Paint> arrowDrawPaintTransformer =
90          Functions.<Paint>constant(Color.black);
91      
92      protected EdgeIndexFunction<V,E> parallelEdgeIndexFunction = 
93          DefaultParallelEdgeIndexFunction.<V,E>getInstance();
94      
95      protected EdgeIndexFunction<V,E> incidentEdgeIndexFunction = 
96          IncidentEdgeIndexFunction.<V,E>getInstance();
97      
98      protected MultiLayerTransformer multiLayerTransformer = new BasicTransformer();
99      
100 	/**
101 	 * pluggable support for picking graph elements by
102 	 * finding them based on their coordinates.
103 	 */
104 	protected GraphElementAccessor<V, E> pickSupport;
105 
106     
107     protected int labelOffset = LABEL_OFFSET;
108     
109     /**
110      * the JComponent that this Renderer will display the graph on
111      */
112     protected JComponent screenDevice;
113     
114     protected PickedState<V> pickedVertexState;
115     protected PickedState<E> pickedEdgeState;
116     
117     /**
118      * The CellRendererPane is used here just as it is in JTree
119      * and JTable, to allow a pluggable JLabel-based renderer for
120      * Vertex and Edge label strings and icons.
121      */
122     protected CellRendererPane rendererPane = new CellRendererPane();
123     
124     /**
125      * A default GraphLabelRenderer - picked Vertex labels are
126      * blue, picked edge labels are cyan
127      */
128     protected VertexLabelRenderer vertexLabelRenderer = 
129         new DefaultVertexLabelRenderer(Color.blue);
130     
131     protected EdgeLabelRenderer edgeLabelRenderer = new DefaultEdgeLabelRenderer(Color.cyan);
132     
133     protected GraphicsDecorator graphicsContext;
134     
135     private EdgeShape<V, E> edgeShape;
136     
137     PluggableRenderContext(Graph<V, E> graph) {
138         this.edgeShape = new EdgeShape<V, E>(graph);
139     	this.edgeShapeTransformer = edgeShape.new QuadCurve();    	
140     }
141 
142 	/**
143 	 * @return the vertexShapeTransformer
144 	 */
145 	public Function<? super V, Shape> getVertexShapeTransformer() {
146 		return vertexShapeTransformer;
147 	}
148 
149 	/**
150 	 * @param vertexShapeTransformer the vertexShapeTransformer to set
151 	 */
152 	public void setVertexShapeTransformer(
153 			Function<? super V, Shape> vertexShapeTransformer) {
154 		this.vertexShapeTransformer = vertexShapeTransformer;
155 	}
156 
157 	/**
158 	 * @return the vertexStrokeTransformer
159 	 */
160 	public Function<? super V, Stroke> getVertexStrokeTransformer() {
161 		return vertexStrokeTransformer;
162 	}
163 
164 	/**
165 	 * @param vertexStrokeTransformer the vertexStrokeTransformer to set
166 	 */
167 	public void setVertexStrokeTransformer(
168 			Function<? super V, Stroke> vertexStrokeTransformer) {
169 		this.vertexStrokeTransformer = vertexStrokeTransformer;
170 	}
171 
172 	public static float[] getDashing() {
173         return dashing;
174     }
175 
176     public static float[] getDotting() {
177         return dotting;
178     }
179 
180     public float getArrowPlacementTolerance() {
181         return arrowPlacementTolerance;
182     }
183 
184     public void setArrowPlacementTolerance(float arrow_placement_tolerance) {
185         this.arrowPlacementTolerance = arrow_placement_tolerance;
186     }
187 
188     public Function<? super Context<Graph<V,E>,E>,Shape> getEdgeArrowTransformer() {
189         return edgeArrowTransformer;
190     }
191 
192     public void setEdgeArrowTransformer(Function<? super Context<Graph<V,E>,E>,Shape> edgeArrowTransformer) {
193         this.edgeArrowTransformer = edgeArrowTransformer;
194     }
195 
196     public Predicate<Context<Graph<V,E>,E>> getEdgeArrowPredicate() {
197         return edgeArrowPredicate;
198     }
199 
200     public void setEdgeArrowPredicate(Predicate<Context<Graph<V,E>,E>> edgeArrowPredicate) {
201         this.edgeArrowPredicate = edgeArrowPredicate;
202     }
203 
204     public Function<? super E,Font> getEdgeFontTransformer() {
205         return edgeFontTransformer;
206     }
207 
208     public void setEdgeFontTransformer(Function<? super E,Font> edgeFontTransformer) {
209         this.edgeFontTransformer = edgeFontTransformer;
210     }
211 
212     public Predicate<Context<Graph<V,E>,E>> getEdgeIncludePredicate() {
213         return edgeIncludePredicate;
214     }
215 
216     public void setEdgeIncludePredicate(Predicate<Context<Graph<V,E>,E>> edgeIncludePredicate) {
217         this.edgeIncludePredicate = edgeIncludePredicate;
218     }
219 
220     public Function<? super Context<Graph<V,E>,E>,Number> getEdgeLabelClosenessTransformer() {
221         return edgeLabelClosenessTransformer;
222     }
223 
224     public void setEdgeLabelClosenessTransformer(
225     		Function<? super Context<Graph<V,E>,E>,Number> edgeLabelClosenessTransformer) {
226         this.edgeLabelClosenessTransformer = edgeLabelClosenessTransformer;
227     }
228 
229     public EdgeLabelRenderer getEdgeLabelRenderer() {
230         return edgeLabelRenderer;
231     }
232 
233     public void setEdgeLabelRenderer(EdgeLabelRenderer edgeLabelRenderer) {
234         this.edgeLabelRenderer = edgeLabelRenderer;
235     }
236 
237     public Function<? super E,Paint> getEdgeFillPaintTransformer() {
238         return edgeFillPaintTransformer;
239     }
240 
241     public void setEdgeDrawPaintTransformer(Function<? super E,Paint> edgeDrawPaintTransformer) {
242         this.edgeDrawPaintTransformer = edgeDrawPaintTransformer;
243     }
244 
245     public Function<? super E,Paint> getEdgeDrawPaintTransformer() {
246         return edgeDrawPaintTransformer;
247     }
248 
249     public void setEdgeFillPaintTransformer(Function<? super E,Paint> edgeFillPaintTransformer) {
250         this.edgeFillPaintTransformer = edgeFillPaintTransformer;
251     }
252 
253     public Function<? super E, Shape> getEdgeShapeTransformer() {
254         return edgeShapeTransformer;
255     }
256 
257     public void setEdgeShapeTransformer(Function<? super E, Shape> edgeShapeTransformer) {
258         this.edgeShapeTransformer = edgeShapeTransformer;
259         if (edgeShapeTransformer instanceof ParallelEdgeShapeTransformer) {
260         	@SuppressWarnings("unchecked")
261 			ParallelEdgeShapeTransformer<V, E> transformer =
262         			(ParallelEdgeShapeTransformer<V, E>)edgeShapeTransformer;
263         	if (transformer instanceof EdgeShape.Orthogonal) {
264         		transformer.setEdgeIndexFunction(this.incidentEdgeIndexFunction);
265         	} else {
266         		transformer.setEdgeIndexFunction(this.parallelEdgeIndexFunction);
267         	}
268         }
269     }
270 
271     public Function<? super E,String> getEdgeLabelTransformer() {
272         return edgeLabelTransformer;
273     }
274 
275     public void setEdgeLabelTransformer(Function<? super E,String> edgeLabelTransformer) {
276         this.edgeLabelTransformer = edgeLabelTransformer;
277     }
278 
279     public Function<? super E,Stroke> getEdgeStrokeTransformer() {
280         return edgeStrokeTransformer;
281     }
282 
283     public void setEdgeStrokeTransformer(Function<? super E,Stroke> edgeStrokeTransformer) {
284         this.edgeStrokeTransformer = edgeStrokeTransformer;
285     }
286 
287     public Function<? super E,Stroke> getEdgeArrowStrokeTransformer() {
288         return edgeArrowStrokeTransformer;
289     }
290 
291     public void setEdgeArrowStrokeTransformer(Function<? super E,Stroke> edgeArrowStrokeTransformer) {
292         this.edgeArrowStrokeTransformer = edgeArrowStrokeTransformer;
293     }
294 
295     public GraphicsDecorator getGraphicsContext() {
296         return graphicsContext;
297     }
298 
299     public void setGraphicsContext(GraphicsDecorator graphicsContext) {
300         this.graphicsContext = graphicsContext;
301     }
302 
303     public int getLabelOffset() {
304         return labelOffset;
305     }
306 
307     public void setLabelOffset(int labelOffset) {
308         this.labelOffset = labelOffset;
309     }
310 
311     public EdgeIndexFunction<V, E> getParallelEdgeIndexFunction() {
312         return parallelEdgeIndexFunction;
313     }
314 
315     public void setParallelEdgeIndexFunction(
316             EdgeIndexFunction<V, E> parallelEdgeIndexFunction) {
317         this.parallelEdgeIndexFunction = parallelEdgeIndexFunction;
318         // reset the edge shape Function, as the parallel edge index function
319         // is used by it
320         this.setEdgeShapeTransformer(getEdgeShapeTransformer());
321     }
322 
323     public PickedState<E> getPickedEdgeState() {
324         return pickedEdgeState;
325     }
326 
327     public void setPickedEdgeState(PickedState<E> pickedEdgeState) {
328         this.pickedEdgeState = pickedEdgeState;
329     }
330 
331     public PickedState<V> getPickedVertexState() {
332         return pickedVertexState;
333     }
334 
335     public void setPickedVertexState(PickedState<V> pickedVertexState) {
336         this.pickedVertexState = pickedVertexState;
337     }
338 
339     public CellRendererPane getRendererPane() {
340         return rendererPane;
341     }
342 
343     public void setRendererPane(CellRendererPane rendererPane) {
344         this.rendererPane = rendererPane;
345     }
346 
347     public JComponent getScreenDevice() {
348         return screenDevice;
349     }
350 
351     public void setScreenDevice(JComponent screenDevice) {
352         this.screenDevice = screenDevice;
353         screenDevice.add(rendererPane);
354     }
355 
356     public Function<? super V,Font> getVertexFontTransformer() {
357         return vertexFontTransformer;
358     }
359 
360     public void setVertexFontTransformer(Function<? super V,Font> vertexFontTransformer) {
361         this.vertexFontTransformer = vertexFontTransformer;
362     }
363 
364     public Function<? super V,Icon> getVertexIconTransformer() {
365         return vertexIconTransformer;
366     }
367 
368     public void setVertexIconTransformer(Function<? super V,Icon> vertexIconTransformer) {
369         this.vertexIconTransformer = vertexIconTransformer;
370     }
371 
372     public Predicate<Context<Graph<V,E>,V>> getVertexIncludePredicate() {
373         return vertexIncludePredicate;
374     }
375 
376     public void setVertexIncludePredicate(Predicate<Context<Graph<V,E>,V>> vertexIncludePredicate) {
377         this.vertexIncludePredicate = vertexIncludePredicate;
378     }
379 
380     public VertexLabelRenderer getVertexLabelRenderer() {
381         return vertexLabelRenderer;
382     }
383 
384     public void setVertexLabelRenderer(VertexLabelRenderer vertexLabelRenderer) {
385         this.vertexLabelRenderer = vertexLabelRenderer;
386     }
387 
388     public Function<? super V,Paint> getVertexFillPaintTransformer() {
389         return vertexFillPaintTransformer;
390     }
391 
392     public void setVertexFillPaintTransformer(Function<? super V,Paint> vertexFillPaintTransformer) {
393         this.vertexFillPaintTransformer = vertexFillPaintTransformer;
394     }
395 
396     public Function<? super V,Paint> getVertexDrawPaintTransformer() {
397         return vertexDrawPaintTransformer;
398     }
399 
400     public void setVertexDrawPaintTransformer(Function<? super V,Paint> vertexDrawPaintTransformer) {
401         this.vertexDrawPaintTransformer = vertexDrawPaintTransformer;
402     }
403 
404     public Function<? super V,String> getVertexLabelTransformer() {
405         return vertexLabelTransformer;
406     }
407 
408     public void setVertexLabelTransformer(Function<? super V,String> vertexLabelTransformer) {
409         this.vertexLabelTransformer = vertexLabelTransformer;
410     }
411 
412 	public GraphElementAccessor<V, E> getPickSupport() {
413 		return pickSupport;
414 	}
415 
416 	public void setPickSupport(GraphElementAccessor<V, E> pickSupport) {
417 		this.pickSupport = pickSupport;
418 	}
419 	
420 	public MultiLayerTransformer getMultiLayerTransformer() {
421 		return multiLayerTransformer;
422 	}
423 
424 	public void setMultiLayerTransformer(MultiLayerTransformer basicTransformer) {
425 		this.multiLayerTransformer = basicTransformer;
426 	}
427 
428 	public Function<? super E, Paint> getArrowDrawPaintTransformer() {
429 		return arrowDrawPaintTransformer;
430 	}
431 
432 	public Function<? super E, Paint> getArrowFillPaintTransformer() {
433 		return arrowFillPaintTransformer;
434 	}
435 
436 	public void setArrowDrawPaintTransformer(Function<? super E, Paint> arrowDrawPaintTransformer) {
437 		this.arrowDrawPaintTransformer = arrowDrawPaintTransformer;
438 		
439 	}
440 
441 	public void setArrowFillPaintTransformer(Function<? super E, Paint> arrowFillPaintTransformer) {
442 		this.arrowFillPaintTransformer = arrowFillPaintTransformer;
443 		
444 	}
445 }
446 
447