1
28 package demo.layout.module;
29
30 import y.module.LayoutModule;
31 import y.module.YModule;
32
33 import y.base.DataProvider;
34 import y.layout.BendConverter;
35 import y.layout.CompositeLayoutStage;
36 import y.layout.LayoutStage;
37 import y.layout.SequentialLayouter;
38 import y.layout.grouping.GroupNodeHider;
39 import y.layout.organic.RemoveOverlapsLayoutStage;
40 import y.layout.router.OrganicEdgeRouter;
41 import y.option.OptionGroup;
42 import y.option.OptionHandler;
43 import y.view.Graph2D;
44 import y.view.Selections;
45
46
50 public class OrganicEdgeRouterModule extends LayoutModule {
51 protected static final String MODULE_ORGANIC_EDGE_ROUTER = "ORGANIC_EDGE_ROUTER";
53
54 protected static final String TITLE_LAYOUT_OPTIONS = "LAYOUT_OPTIONS";
56 protected static final String ITEM_SELECTION_ONLY = "SELECTION_ONLY";
57 protected static final String ITEM_MINIMAL_NODE_DISTANCE = "MINIMAL_NODE_DISTANCE";
58 protected static final String ITEM_USE_BENDS = "USE_BENDS";
59 protected static final String ITEM_ROUTE_ONLY_NECESSARY = "ROUTE_ONLY_NECESSARY";
60 protected static final String ITEM_ALLOW_MOVING_NODES = "ALLOW_MOVING_NODES";
61
62
65 public OrganicEdgeRouterModule() {
66 super(MODULE_ORGANIC_EDGE_ROUTER);
67 }
68
69
73 protected OptionHandler createOptionHandler() {
74 final OptionHandler options = new OptionHandler(getModuleName());
75 final OrganicEdgeRouter defaults = new OrganicEdgeRouter();
77
78 final OptionGroup layoutGroup = new OptionGroup();
80 layoutGroup.setAttribute(OptionGroup.ATTRIBUTE_TITLE, TITLE_LAYOUT_OPTIONS);
81 layoutGroup.addItem(options.addBool(ITEM_SELECTION_ONLY, false));
83 layoutGroup.addItem(options.addInt(ITEM_MINIMAL_NODE_DISTANCE, (int) defaults.getMinimalDistance(), 10, 300));
84 layoutGroup.addItem(options.addBool(ITEM_USE_BENDS, defaults.isUsingBends()));
85 layoutGroup.addItem(options.addBool(ITEM_ROUTE_ONLY_NECESSARY, !defaults.isRoutingAll()));
86 layoutGroup.addItem(options.addBool(ITEM_ALLOW_MOVING_NODES, false));
87
88 return options;
89 }
90
91
95 protected void mainrun() {
96 final OrganicEdgeRouter organic = new OrganicEdgeRouter();
97
98 final OptionHandler options = getOptionHandler();
99 configure(organic, options);
100
101 final SequentialLayouter sequential = new SequentialLayouter();
102 if (options.getBool(ITEM_ALLOW_MOVING_NODES)) {
103 final CompositeLayoutStage cls = new CompositeLayoutStage();
106 cls.appendStage(organic.createNodeEnlargementStage());
107 cls.appendStage(new RemoveOverlapsLayoutStage(0));
108 sequential.appendLayouter(cls);
109
110 }
111 if (organic.isUsingBends()) {
112 final BendConverter bendConverter = new BendConverter();
114 bendConverter.setSelectedEdgesDpKey(OrganicEdgeRouter.ROUTE_EDGE_DPKEY);
115 bendConverter.setAdoptSelectionEnabled(options.getBool(ITEM_SELECTION_ONLY));
116 bendConverter.setCoreLayouter(organic);
117 sequential.appendLayouter(bendConverter);
118 } else {
119 sequential.appendLayouter(organic);
120 }
121
122 final Graph2D graph = getGraph2D();
123 prepareGraph(graph, options);
124 try {
125 launchLayouter(new GroupNodeHider(sequential));
126 } finally {
127 restoreGraph(graph, options);
128 }
129 }
130
131
141 protected void prepareGraph(final Graph2D graph, final OptionHandler options) {
142 if (options.getBool(ITEM_SELECTION_ONLY)) {
144 final DataProvider selectedEdgesDP = Selections.createSelectionEdgeMap(graph);
146 backupDataProvider(graph, BendConverter.SCOPE_DPKEY);
147 graph.addDataProvider(BendConverter.SCOPE_DPKEY, selectedEdgesDP);
148 backupDataProvider(graph, OrganicEdgeRouter.ROUTE_EDGE_DPKEY);
149 graph.addDataProvider(OrganicEdgeRouter.ROUTE_EDGE_DPKEY, selectedEdgesDP);
150 }
151 }
152
153
159 protected void restoreGraph(final Graph2D graph, final OptionHandler options) {
160 if (options.getBool(ITEM_SELECTION_ONLY)) {
162 restoreDataProvider(graph, OrganicEdgeRouter.ROUTE_EDGE_DPKEY);
164 restoreDataProvider(graph, BendConverter.SCOPE_DPKEY);
165 }
166 }
167
168
173 protected void configure(final OrganicEdgeRouter organic, final OptionHandler options) {
174 organic.setMinimalDistance(options.getInt(ITEM_MINIMAL_NODE_DISTANCE));
175 organic.setUsingBends(options.getBool(ITEM_USE_BENDS));
176 organic.setRoutingAll(!options.getBool(ITEM_ROUTE_ONLY_NECESSARY));
177 }
178 }
179