1
28 package demo.layout.hierarchic;
29
30 import demo.view.DemoBase;
31 import y.base.DataMap;
32 import y.base.NodeCursor;
33 import y.base.NodeList;
34 import y.layout.Layouter;
35 import y.layout.hierarchic.IncrementalHierarchicLayouter;
36 import y.layout.hierarchic.incremental.IncrementalHintsFactory;
37 import y.layout.hierarchic.incremental.NodeLayoutDescriptor;
38 import y.layout.hierarchic.incremental.RoutingStyle;
39 import y.layout.hierarchic.incremental.SimplexNodePlacer;
40 import y.util.Maps;
41 import y.view.Arrow;
42 import y.view.EdgeRealizer;
43 import y.view.Graph2D;
44 import y.view.hierarchy.HierarchyManager;
45
46 import javax.swing.AbstractAction;
47 import javax.swing.JToolBar;
48 import java.awt.Cursor;
49 import java.awt.EventQueue;
50 import java.awt.event.ActionEvent;
51 import java.util.Locale;
52
53
72 public class SimpleIncrementalHierarchicLayouterDemo extends DemoBase
73 {
74 private DataMap hintMap;
75
76 private IncrementalHierarchicLayouter hierarchicLayouter;
77 private IncrementalHintsFactory hintsFactory;
78
79 public SimpleIncrementalHierarchicLayouterDemo()
80 {
81 final Graph2D graph = view.getGraph2D();
82 EdgeRealizer defaultER = graph.getDefaultEdgeRealizer();
83 defaultER.setArrow(Arrow.STANDARD);
84
85 hintMap = Maps.createHashedDataMap();
87 graph.addDataProvider(IncrementalHierarchicLayouter.INCREMENTAL_HINTS_DPKEY, hintMap);
88
89 hierarchicLayouter = new IncrementalHierarchicLayouter();
91
92 hierarchicLayouter.getEdgeLayoutDescriptor().setMinimumFirstSegmentLength(15);
94 hierarchicLayouter.getEdgeLayoutDescriptor().setMinimumLastSegmentLength(20);
95 hierarchicLayouter.getEdgeLayoutDescriptor().setRoutingStyle(new RoutingStyle(RoutingStyle.EDGE_STYLE_OCTILINEAR));
96 hierarchicLayouter.getEdgeLayoutDescriptor().setMinimumDistance(10.0d);
97
98 hierarchicLayouter.getNodeLayoutDescriptor().setLayerAlignment(0.5d);
99 hierarchicLayouter.setMinimumLayerDistance(30.0d);
100 hierarchicLayouter.getNodeLayoutDescriptor().setNodeLabelMode(NodeLayoutDescriptor.NODE_LABEL_MODE_CONSIDER_FOR_DRAWING);
101
102 hierarchicLayouter.setConsiderNodeLabelsEnabled(true);
103
104 ((SimplexNodePlacer) hierarchicLayouter.getNodePlacer()).setBaryCenterModeEnabled(true);
105
106 hintsFactory = hierarchicLayouter.createIncrementalHintsFactory();
108
109 hierarchicLayouter.setComponentLayouterEnabled(false);
111
112 loadGraph("resource/simple.graphml");
113 }
114
115 protected void initialize() {
116 new HierarchyManager(view.getGraph2D());
119 }
120
121 class LayoutFromSketchAction extends AbstractAction
122 {
123 LayoutFromSketchAction()
124 {
125 super("Layout From Sketch", SHARED_LAYOUT_ICON);
126 }
127
128 public void actionPerformed(ActionEvent ev)
129 {
130 calcIncrementalLayout(new NodeList().nodes());
131 }
132 }
133
134 class LayoutIncrementallyAction extends AbstractAction
135 {
136 LayoutIncrementallyAction()
137 {
138 super("Layout Incrementally", SHARED_LAYOUT_ICON);
139 }
140
141 public void actionPerformed(ActionEvent ev)
142 {
143 calcIncrementalLayout(view.getGraph2D().selectedNodes());
144 }
145 }
146
147 class LayoutAction extends AbstractAction
148 {
149 LayoutAction()
150 {
151 super("Layout", SHARED_LAYOUT_ICON);
152 }
153
154 public void actionPerformed(ActionEvent ev)
155 {
156 calcFreshLayout();
157 }
158 }
159
160 protected JToolBar createToolBar()
161 {
162 JToolBar tb = super.createToolBar();
163 tb.addSeparator();
164 tb.add(createActionControl(new LayoutAction()));
165 tb.add(createActionControl(new LayoutFromSketchAction()));
166 tb.add(createActionControl(new LayoutIncrementallyAction()));
167 return tb;
168 }
169
170 public void calcFreshLayout()
171 {
172 hierarchicLayouter.setLayoutMode(IncrementalHierarchicLayouter.LAYOUT_MODE_FROM_SCRATCH);
173 calcLayout(hierarchicLayouter);
174 }
175
176 public void calcIncrementalLayout(NodeCursor incrementalNodes)
177 {
178 try
179 {
180 for (incrementalNodes.toFirst(); incrementalNodes.ok(); incrementalNodes.next())
182 {
183 hintMap.set(incrementalNodes.node(), hintsFactory.createLayerIncrementallyHint(incrementalNodes.node()));
184 }
185 hierarchicLayouter.setLayoutMode(IncrementalHierarchicLayouter.LAYOUT_MODE_INCREMENTAL);
187 calcLayout(hierarchicLayouter);
189 }
190 finally
191 {
192 for (incrementalNodes.toFirst(); incrementalNodes.ok(); incrementalNodes.next())
194 {
195 hintMap.set(incrementalNodes.node(), null);
196 }
197 }
198 }
199
200 protected void calcLayout(Layouter layouter)
201 {
202 Graph2D graph = view.getGraph2D();
203 if (!graph.isEmpty())
204 {
205 Cursor oldCursor = view.getViewCursor();
206 try
207 {
208 view.applyLayoutAnimated(layouter);
209 }
210 finally
211 {
212 view.setViewCursor(oldCursor);
213 }
214 }
215 view.fitContent();
216 view.updateView();
217 }
218
219
222 public static void main(String[] args) {
223 EventQueue.invokeLater(new Runnable() {
224 public void run() {
225 Locale.setDefault(Locale.ENGLISH);
226 initLnF();
227 (new SimpleIncrementalHierarchicLayouterDemo()).start("Simple IncrementalHierarchicLayouter Demo");
228 }
229 });
230 }
231 }
232