1
2
3
4
5
6
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
102
103
104 protected GraphElementAccessor<V, E> pickSupport;
105
106
107 protected int labelOffset = LABEL_OFFSET;
108
109
110
111
112 protected JComponent screenDevice;
113
114 protected PickedState<V> pickedVertexState;
115 protected PickedState<E> pickedEdgeState;
116
117
118
119
120
121
122 protected CellRendererPane rendererPane = new CellRendererPane();
123
124
125
126
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
144
145 public Function<? super V, Shape> getVertexShapeTransformer() {
146 return vertexShapeTransformer;
147 }
148
149
150
151
152 public void setVertexShapeTransformer(
153 Function<? super V, Shape> vertexShapeTransformer) {
154 this.vertexShapeTransformer = vertexShapeTransformer;
155 }
156
157
158
159
160 public Function<? super V, Stroke> getVertexStrokeTransformer() {
161 return vertexStrokeTransformer;
162 }
163
164
165
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
319
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