1
28 package demo.layout.hierarchic;
29
30 import java.awt.BorderLayout;
31 import java.awt.Cursor;
32 import java.awt.EventQueue;
33 import java.awt.Graphics2D;
34 import java.awt.Color;
35 import java.awt.geom.Ellipse2D;
36 import java.awt.event.ActionEvent;
37 import java.util.ArrayList;
38 import java.util.HashMap;
39 import java.util.List;
40 import java.util.Locale;
41 import java.util.Map;
42 import java.util.Iterator;
43
44 import javax.swing.AbstractAction;
45 import javax.swing.Action;
46 import javax.swing.JScrollPane;
47 import javax.swing.JToolBar;
48
49 import demo.view.DemoBase;
50 import demo.view.DemoDefaults;
51 import demo.view.application.DragAndDropDemo;
52
53 import y.base.Edge;
54 import y.base.Node;
55 import y.layout.PortCandidate;
56 import y.layout.PortCandidateSet;
57 import y.layout.PortConstraintKeys;
58 import y.layout.hierarchic.IncrementalHierarchicLayouter;
59 import y.layout.hierarchic.incremental.SimplexNodePlacer;
60 import y.util.DataProviderAdapter;
61 import y.view.BridgeCalculator;
62 import y.view.DefaultGraph2DRenderer;
63 import y.view.EditMode;
64 import y.view.GenericNodeRealizer;
65 import y.view.Graph2D;
66 import y.view.NodeRealizer;
67 import y.view.GenericNodeRealizer.ContainsTest;
68 import y.view.GenericNodeRealizer.Painter;
69
70
79 public class PortCandidateDemo extends DemoBase {
80
81 private IncrementalHierarchicLayouter layouter;
83
84 private Map portCandidateMap;
85
86 public PortCandidateDemo() {
87
88 final List nodeRealizerList = new ArrayList();
89 portCandidateMap = new HashMap();
90 addNodeRealizerTemplates(nodeRealizerList);
91
92 DragAndDropDemo.DragAndDropSupport dndSupport = new DragAndDropDemo.DragAndDropSupport(nodeRealizerList, view);
94
95 contentPane.add(new JScrollPane(dndSupport.getList()), BorderLayout.WEST);
97 layouter = createLayouter();
98
99 loadGraph("resource/PortCandidateDemo.graphml");
100 }
101
102
105 protected EditMode createEditMode() {
106 final EditMode editMode = super.createEditMode();
107 editMode.assignNodeLabel(false);
108 editMode.allowResizeNodes(false);
109 return editMode;
110 }
111
112
115 protected JToolBar createToolBar() {
116 final Action layoutAction = new AbstractAction(
117 "Layout", SHARED_LAYOUT_ICON) {
118 public void actionPerformed(ActionEvent e) {
119 runLayout();
120 }
121 };
122
123 final JToolBar toolBar = super.createToolBar();
124 toolBar.addSeparator();
125 toolBar.add(createActionControl(layoutAction));
126 return toolBar;
127 }
128
129
132 protected void configureDefaultRealizers() {
133 super.configureDefaultRealizers();
134 view.getGraph2D().getDefaultNodeRealizer().getLabel().setFontSize(16);
135 ((DefaultGraph2DRenderer) view.getGraph2DRenderer()).setBridgeCalculator(new BridgeCalculator());
136 }
137
138
141 private IncrementalHierarchicLayouter createLayouter() {
142 final IncrementalHierarchicLayouter ihl = new IncrementalHierarchicLayouter();
143 ((SimplexNodePlacer) ihl.getNodePlacer()).setBaryCenterModeEnabled(true);
144 ihl.setLayoutMode(IncrementalHierarchicLayouter.LAYOUT_MODE_FROM_SCRATCH);
145 ihl.setOrthogonallyRouted(true);
146 final Graph2D graph = view.getGraph2D();
147
148 graph.addDataProvider(PortCandidateSet.NODE_DP_KEY, new DataProviderAdapter() {
150 public Object get(Object dataHolder) {
151 final Node node = (Node) dataHolder;
152 final NodeRealizer realizer = graph.getRealizer(node);
153 if (realizer instanceof GenericNodeRealizer) {
154 return portCandidateMap.get(((GenericNodeRealizer) realizer).getConfiguration());
155 } else {
156 return null;
157 }
158 }
159 });
160
161 graph.addDataProvider(PortConstraintKeys.SOURCE_GROUPID_KEY, new DataProviderAdapter() {
163 public Object get(Object dataHolder) {
164 Edge edge = (Edge) dataHolder;
165 Node source = edge.source();
166 GenericNodeRealizer gnr = (GenericNodeRealizer) graph.getRealizer(source);
167 String sourceConfiguration = gnr.getConfiguration();
168 if ("start".equals(sourceConfiguration)) {
169 return source;
170 }
171 return null;
172 }
173 });
174
175 graph.addDataProvider(PortConstraintKeys.TARGET_GROUPID_KEY, new DataProviderAdapter() {
177 public Object get(Object dataHolder) {
178 Edge edge = (Edge) dataHolder;
179 Node target = edge.target();
180 GenericNodeRealizer gnr = (GenericNodeRealizer) graph.getRealizer(target);
181 String targetConfiguration = gnr.getConfiguration();
182 if ("switch".equals(targetConfiguration) || "branch".equals(targetConfiguration)) {
183 return target;
184 }
185 return null;
186 }
187 });
188
189 return ihl;
190 }
191
192
195 private void runLayout() {
196 Cursor oldCursor = view.getViewCursor();
197 try {
198 contentPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
199 view.applyLayoutAnimated(layouter);
200 } finally {
201 contentPane.setCursor(oldCursor);
202 }
203 }
204
205
208 private void addNodeRealizerTemplates(List nodeRealizerList) {
209 {
210 PortCandidateSet candidateSet = new PortCandidateSet();
213 candidateSet.add(PortCandidate.createCandidate(0.0d, 0.0d, PortCandidate.ANY, 0.0), Integer.MAX_VALUE);
214 addNodeRealizerTemplate("start", nodeRealizerList, candidateSet);
215 }
216 {
217 PortCandidateSet candidateSet = new PortCandidateSet();
220 candidateSet.add(PortCandidate.createCandidate(PortCandidate.NORTH, 0.0), Integer.MAX_VALUE);
221 candidateSet.add(PortCandidate.createCandidate(PortCandidate.SOUTH, 0.0), Integer.MAX_VALUE);
222 addNodeRealizerTemplate("state", nodeRealizerList, candidateSet);
223 }
224 {
225 PortCandidateSet candidateSet = new PortCandidateSet();
230 candidateSet.add(PortCandidate.createCandidate(0.0, -15.0, PortCandidate.NORTH, 0.0), 1);
231 candidateSet.add(PortCandidate.createCandidate(0.0, +15.0, PortCandidate.SOUTH, 0.0), 1);
232 candidateSet.add(PortCandidate.createCandidate(+30.0, 0.0, PortCandidate.EAST, 0.0), 1);
233 candidateSet.add(PortCandidate.createCandidate(-30.0, 0.0, PortCandidate.WEST, 0.0), 1);
234 candidateSet.add(PortCandidate.createCandidate(0.0, -15.0, PortCandidate.NORTH, 1.0), Integer.MAX_VALUE);
235 candidateSet.add(PortCandidate.createCandidate(0.0, +15.0, PortCandidate.SOUTH, 1.0), Integer.MAX_VALUE);
236 addNodeRealizerTemplate("switch", nodeRealizerList, candidateSet);
237 }
238 {
239 PortCandidateSet candidateSet = new PortCandidateSet();
244 candidateSet.add(PortCandidate.createCandidate(0.0, -15.0, PortCandidate.NORTH, 0.0), Integer.MAX_VALUE);
245 candidateSet.add(PortCandidate.createCandidate(0.0, +15.0, PortCandidate.SOUTH, 0.0), 1);
246 candidateSet.add(PortCandidate.createCandidate(+30.0, 0.0, PortCandidate.EAST, 1.0), Integer.MAX_VALUE);
247 candidateSet.add(PortCandidate.createCandidate(-30.0, 0.0, PortCandidate.WEST, 1.0), Integer.MAX_VALUE);
248 addNodeRealizerTemplate("branch", nodeRealizerList, candidateSet);
249 }
250 {
251 PortCandidateSet candidateSet = new PortCandidateSet();
257 candidateSet.add(PortCandidate.createCandidate(0.0, -15.0, PortCandidate.NORTH, 0.0), 1);
258 candidateSet.add(PortCandidate.createCandidate(+30.0, 0.0, PortCandidate.EAST, 1.0), 1);
259 candidateSet.add(PortCandidate.createCandidate(-30.0, 0.0, PortCandidate.WEST, 1.0), 1);
260 candidateSet.add(PortCandidate.createCandidate(+30.0, 0.0, PortCandidate.EAST, 2.0), Integer.MAX_VALUE);
261 candidateSet.add(PortCandidate.createCandidate(-30.0, 0.0, PortCandidate.WEST, 2.0), Integer.MAX_VALUE);
262 addNodeRealizerTemplate("end", nodeRealizerList, candidateSet);
263 }
264 }
265
266 void addNodeRealizerTemplate(String configuration, List nodeRealizerList, PortCandidateSet candidateSet) {
267 final GenericNodeRealizer.Factory factory = GenericNodeRealizer.getFactory();
268 final Map map = GenericNodeRealizer.getFactory().createDefaultConfigurationMap();
269 GenericNodeRealizer gnr = (GenericNodeRealizer) view.getGraph2D().getDefaultNodeRealizer();
270 map.put(Painter.class, new PortCandidatePainter(
271 (Painter)factory.getImplementation(DemoDefaults.NODE_CONFIGURATION, Painter.class), candidateSet));
272 map.put(ContainsTest.class, factory.getImplementation(DemoDefaults.NODE_CONFIGURATION, ContainsTest.class));
273
274 factory.addConfiguration(configuration, map);
276 gnr = (GenericNodeRealizer) gnr.createCopy();
277 gnr.setConfiguration(configuration);
278 gnr.setLabelText(configuration);
279 nodeRealizerList.add(gnr);
280 portCandidateMap.put(configuration, candidateSet);
281 }
282
283
286 static class PortCandidatePainter implements Painter {
287 private final Painter delegatePainter;
288 private final PortCandidateSet set;
289
290 PortCandidatePainter(Painter delegatePainter, PortCandidateSet set) {
291 this.delegatePainter = delegatePainter;
292 this.set = set;
293 }
294
295 public void paint(NodeRealizer context, Graphics2D graphics) {
296 delegatePainter.paint(context, graphics);
297 if (set != null) {
298 final Iterator entries = set.getEntries();
299 graphics.setColor(new Color(0,0,0,128));
300 while (entries.hasNext()) {
301 PortCandidateSet.Entry entry = (PortCandidateSet.Entry) entries.next();
302 final PortCandidate candidate = entry.getPortCandidate();
303 if (candidate.isFixed()) {
304 double x = candidate.getXOffset() + context.getCenterX();
305 double y = candidate.getYOffset() + context.getCenterY();
306 graphics.fill(new Ellipse2D.Double(x - 2.0, y - 2.0, 4.0, 4.0));
307 }
308 }
309 }
310 }
311
312 public void paintSloppy(NodeRealizer context, Graphics2D graphics) {
313 delegatePainter.paintSloppy(context, graphics);
314 }
315 }
316
317
318 public static void main(String[] args) {
319 EventQueue.invokeLater(new Runnable() {
320 public void run() {
321 Locale.setDefault(Locale.ENGLISH);
322 initLnF();
323 new PortCandidateDemo().start();
324 }
325 });
326 }
327 }
328