1
28 package demo.view.realizer;
29
30 import demo.view.DemoBase;
31 import demo.view.DemoDefaults;
32
33 import y.base.EdgeCursor;
34 import y.view.Arrow;
35 import y.view.BendList;
36 import y.view.BridgeCalculator;
37 import y.view.DefaultGraph2DRenderer;
38 import y.view.EdgeRealizer;
39 import y.view.GenericEdgePainter;
40 import y.view.GenericEdgeRealizer;
41 import y.view.Graph2D;
42
43 import javax.swing.AbstractAction;
44 import javax.swing.Action;
45 import javax.swing.JButton;
46 import javax.swing.JToolBar;
47
48 import java.awt.Graphics2D;
49 import java.awt.EventQueue;
50 import java.awt.event.ActionEvent;
51 import java.awt.geom.GeneralPath;
52 import java.awt.geom.PathIterator;
53 import java.util.Locale;
54 import java.util.Map;
55
56
66 public class BridgeEdgeRealizerDemo extends DemoBase {
67 BridgeCalculator bridgeCalculator;
68
69 public BridgeEdgeRealizerDemo() {
70 super();
71
72 loadGraph("resource/bridgeEdgeRealizer.graphml");
73 DemoDefaults.applyRealizerDefaults(view.getGraph2D(), true, true);
74 }
75
76 protected void configureDefaultRealizers() {
77 super.configureDefaultRealizers();
78 GenericEdgeRealizer.Factory factory = GenericEdgeRealizer.getFactory();
80
81 Map implementationsMap = factory.createDefaultConfigurationMap();
85
86 final BridgedEdgePainter painter = new BridgedEdgePainter(
91 new GenericEdgePainter(), BridgeCalculator.CROSSING_STYLE_GAP);
92 implementationsMap.put(GenericEdgeRealizer.Painter.class, painter);
93 implementationsMap.put(GenericEdgeRealizer.BridgeCalculatorHandler.class, painter);
95
96 factory.addConfiguration("bridgetype1", implementationsMap);
98
99 final BridgedEdgePainter painter2 = new BridgedEdgePainter(
101 new GenericEdgePainter(), BridgeCalculator.CROSSING_STYLE_ARC);
102 implementationsMap.put(GenericEdgeRealizer.Painter.class, painter2);
103 implementationsMap.put(GenericEdgeRealizer.BridgeCalculatorHandler.class, painter2);
105
106 factory.addConfiguration("bridgetype2", implementationsMap);
108
109 GenericEdgeRealizer ger = new GenericEdgeRealizer();
111
112 ger.setConfiguration("bridgetype1");
114 ger.setTargetArrow(Arrow.STANDARD);
115
116 final Graph2D graph = view.getGraph2D();
118 graph.setDefaultEdgeRealizer(ger);
119
120 bridgeCalculator = new BridgeCalculator();
122 ((DefaultGraph2DRenderer) view.getGraph2DRenderer()).setBridgeCalculator(bridgeCalculator);
126 }
127
128 protected JToolBar createToolBar() {
129 final AbstractAction assignGapStyleAction = new AbstractAction("Gap Style") {
130 public void actionPerformed(ActionEvent e) {
131 setBridgeType("bridgetype1");
132 }
133 };
134 assignGapStyleAction.putValue(Action.SHORT_DESCRIPTION, "Draw 'Gap' style bridges on the selected edges");
135 assignGapStyleAction.putValue(Action.SMALL_ICON, getIconResource("resource/bridge_gap.png"));
136
137 final AbstractAction assignArcStyleAction = new AbstractAction("Arc Style") {
138 public void actionPerformed(ActionEvent e) {
139 setBridgeType("bridgetype2");
140 }
141 };
142 assignArcStyleAction.putValue(Action.SHORT_DESCRIPTION, "Draw 'Arc' style bridges on the selected edges");
143 assignArcStyleAction.putValue(Action.SMALL_ICON, getIconResource("resource/bridge_arc.png"));
144
145 final JToolBar toolBar = super.createToolBar();
146 toolBar.addSeparator();
147 toolBar.add(new JButton(assignGapStyleAction));
148 toolBar.addSeparator(TOOLBAR_SMALL_SEPARATOR);
149 toolBar.add(new JButton(assignArcStyleAction));
150 return toolBar;
151 }
152
153 private void setBridgeType(String bridgeType) {
154 final Graph2D graph = view.getGraph2D();
155 graph.firePreEvent();
157 graph.backupRealizers();
159 try {
160 EdgeCursor ec = graph.selectedEdges();
161 if (ec.size() == 0) {
162 ec = graph.edges();
163 }
164 for (; ec.ok(); ec.next()) {
165 if (graph.getRealizer(ec.edge()) instanceof GenericEdgeRealizer) {
166 ((GenericEdgeRealizer) graph.getRealizer(ec.edge())).setConfiguration(bridgeType);
167 }
168 }
169
170 graph.setDefaultEdgeRealizer(new GenericEdgeRealizer(bridgeType));
171 graph.updateViews();
172 } finally {
173 graph.firePostEvent();
175 }
176 }
177
178
183 static final class BridgedEdgePainter implements GenericEdgeRealizer.Painter, GenericEdgeRealizer.BridgeCalculatorHandler {
184 private final GenericEdgeRealizer.Painter painter;
185 private final short bridgeStyle;
186
187 BridgedEdgePainter(GenericEdgeRealizer.Painter painter, short bridgeStyle) {
188 this.painter = painter;
189 this.bridgeStyle = bridgeStyle;
190 }
191
192 public void paint(EdgeRealizer context, BendList bends, GeneralPath path, Graphics2D gfx, boolean selected) {
193 BridgeCalculator bridgeCalculator = DefaultGraph2DRenderer.getBridgeCalculator(context, gfx);
195 if (bridgeCalculator != null) {
196 GeneralPath p = new GeneralPath();
197 final short crossingStyle = bridgeCalculator.getCrossingStyle();
199 try {
200 bridgeCalculator.setCrossingStyle(bridgeStyle);
201 PathIterator pathIterator = bridgeCalculator.insertBridges(path.getPathIterator(null, 1.0d));
202 p.append(pathIterator, true);
203 painter.paint(context, bends, p, gfx, selected);
205 } finally {
206 bridgeCalculator.setCrossingStyle(crossingStyle);
207 }
208 } else {
209 painter.paint(context, bends, path, gfx, selected);
210 }
211 }
212
213 public void paintSloppy(EdgeRealizer context, BendList bends, GeneralPath path, Graphics2D gfx, boolean selected) {
214 painter.paintSloppy(context, bends, path, gfx, selected);
215 }
216
217 public void registerObstacles(EdgeRealizer context, BendList bends, GeneralPath path, BridgeCalculator calculator) {
220 calculator.registerObstacles(path.getPathIterator(null));
221 }
222 }
223
224
225 public static void main(String[] args) {
226 EventQueue.invokeLater(new Runnable() {
227 public void run() {
228 Locale.setDefault(Locale.ENGLISH);
229 initLnF();
230 new BridgeEdgeRealizerDemo().start("Bridge EdgeRealizer Demo");
231 }
232 });
233 }
234 }
235