1
28 package demo.view.isometry;
29
30 import y.base.Edge;
31 import y.base.EdgeCursor;
32 import y.base.Node;
33 import y.base.NodeCursor;
34 import y.layout.PreferredPlacementDescriptor;
35 import y.view.EdgeLabel;
36 import y.view.EdgeRealizer;
37 import y.view.GenericNodeRealizer;
38 import y.view.Graph2D;
39 import y.view.NodeLabel;
40 import y.view.NodeRealizer;
41 import y.view.ProxyShapeNodeRealizer;
42 import y.view.SimpleUserDataHandler;
43 import y.view.YLabel;
44 import y.view.hierarchy.GenericGroupNodeRealizer;
45 import y.view.hierarchy.GroupFeature;
46 import y.view.hierarchy.HierarchyManager;
47 import y.view.hierarchy.ProxyAutoBoundsNodeRealizer;
48
49 import java.awt.geom.Rectangle2D;
50 import java.util.Map;
51
52
55 class IsometryRealizerFactory {
56
57
58 private static final String CONFIGURATION_NODE = "com.yworks.isometry.node";
59
60
61 private static final String CONFIGURATION_GROUP = "com.yworks.isometry.group";
62
63
64 private static final String CONFIGURATION_EDGE_LABEL = "com.yworks.isometry.edge_label";
65
66
67 private static final String CONFIGURATION_GROUP_LABEL = "com.yworks.isometry.group_label";
68
69 public static void initializeConfigurations() {
70 final GenericNodeRealizer.Factory factory = GenericNodeRealizer.getFactory();
71
72 final Map nodeImplMap = factory.createDefaultConfigurationMap();
74 final IsometryNodePainter nodePainter = new IsometryNodePainter();
75 nodeImplMap.put(GenericNodeRealizer.Painter.class, nodePainter);
76 nodeImplMap.put(GenericNodeRealizer.ContainsTest.class, nodePainter);
77 nodeImplMap.put(
78 GenericNodeRealizer.UserDataHandler.class,
79 new SimpleUserDataHandler(SimpleUserDataHandler.EXCEPTION_ON_FAILURE));
80 factory.addConfiguration(CONFIGURATION_NODE, nodeImplMap);
81
82 final Map groupImplMap = factory.createDefaultConfigurationMap();
84 final IsometryGroupPainter groupPainter = new IsometryGroupPainter(nodePainter);
85 groupImplMap.put(GenericNodeRealizer.Painter.class, groupPainter);
86 groupImplMap.put(GenericNodeRealizer.ContainsTest.class, groupPainter);
87 groupImplMap.put(
88 GenericNodeRealizer.UserDataHandler.class,
89 new SimpleUserDataHandler(SimpleUserDataHandler.EXCEPTION_ON_FAILURE));
90 factory.addConfiguration(CONFIGURATION_GROUP, groupImplMap);
91
92 final YLabel.Factory edgeLabelFactory = EdgeLabel.getFactory();
94 final Map edgeLabelImplMap = edgeLabelFactory.createDefaultConfigurationMap();
95 final EdgeLabelConfiguration configuration = new EdgeLabelConfiguration();
96 edgeLabelImplMap.put(YLabel.Painter.class, configuration);
97 edgeLabelImplMap.put(YLabel.Layout.class, configuration);
98 edgeLabelImplMap.put(YLabel.BoundsProvider.class, configuration);
99 edgeLabelImplMap.put(
100 YLabel.UserDataHandler.class,
101 new SimpleUserDataHandler(SimpleUserDataHandler.EXCEPTION_ON_FAILURE));
102 edgeLabelFactory.addConfiguration(CONFIGURATION_EDGE_LABEL, edgeLabelImplMap);
103
104 final YLabel.Factory nodeLabelFactory = NodeLabel.getFactory();
106 final Map nodeLabelImplMap = nodeLabelFactory.createDefaultConfigurationMap();
107 final GroupLabelConfiguration configuration1 = new GroupLabelConfiguration();
108 nodeLabelImplMap.put(YLabel.Painter.class, configuration1);
109 nodeLabelImplMap.put(YLabel.Layout.class, configuration1);
110 nodeLabelImplMap.put(YLabel.BoundsProvider.class, configuration1);
111 nodeLabelImplMap.put(
112 YLabel.UserDataHandler.class,
113 new SimpleUserDataHandler(SimpleUserDataHandler.EXCEPTION_ON_FAILURE));
114 nodeLabelFactory.addConfiguration(CONFIGURATION_GROUP_LABEL, nodeLabelImplMap);
115 }
116
117 private IsometryRealizerFactory() {
118 }
119
120
124 public static void applyIsometryRealizerDefaults(final Graph2D graph) {
125 final HierarchyManager hierarchyManager = graph.getHierarchyManager();
126
127 for (NodeCursor nc = graph.nodes(); nc.ok(); nc.next()) {
129 final Node node = nc.node();
130 final NodeRealizer realizer = graph.getRealizer(node);
131 if (hierarchyManager == null || hierarchyManager.isNormalNode(node)) {
132 GenericNodeRealizer gnr;
133 if (realizer instanceof GenericNodeRealizer) {
134 gnr = (GenericNodeRealizer) realizer;
135 } else {
136 gnr = new GenericNodeRealizer(realizer);
137 graph.setRealizer(node, gnr);
138 }
139 if (gnr.getConfiguration() == null || !CONFIGURATION_NODE.equals(gnr.getConfiguration())) {
140 final IsometryData isometryData = new IsometryData(realizer.getWidth(), realizer.getHeight(), 30, true);
141 gnr.setUserData(isometryData);
142 final Rectangle2D.Double bounds = new Rectangle2D.Double(0, 0, -1, -1);
143 isometryData.calculateViewBounds(bounds);
144 gnr.setSize(bounds.getWidth(), bounds.getHeight());
145 gnr.setConfiguration(CONFIGURATION_NODE);
146 }
147 } else {
148 if (realizer instanceof ProxyShapeNodeRealizer) {
149 final ProxyShapeNodeRealizer proxy = (ProxyShapeNodeRealizer) realizer;
150 for (int i = 0; i < proxy.realizerCount(); i++) {
151 final NodeRealizer delegate = proxy.getRealizer(i);
152 GenericNodeRealizer gnr;
153 if (delegate instanceof GenericNodeRealizer) {
154 gnr = (GenericNodeRealizer) delegate;
155 } else {
156 gnr = new GenericGroupNodeRealizer(delegate);
157 proxy.setRealizer(i, gnr);
158 if (delegate.equals(proxy.getRealizerDelegate())) {
159 proxy.setRealizerDelegate(gnr);
160 }
161 }
162 if (gnr.getConfiguration() == null || !CONFIGURATION_GROUP.equals(gnr.getConfiguration())) {
163 final IsometryData isometryData = new IsometryData(gnr.getWidth(), gnr.getHeight(), 0, true);
164 gnr.setUserData(isometryData);
165 final Rectangle2D.Double bounds = new Rectangle2D.Double(0, 0, -1, -1);
166 isometryData.calculateViewBounds(bounds);
167 gnr.setSize(bounds.getWidth(), bounds.getHeight());
168 gnr.setConfiguration(CONFIGURATION_GROUP);
169 }
170
171 if (delegate instanceof GroupFeature) {
172 ((GenericGroupNodeRealizer) gnr).setGroupClosed(((GroupFeature) delegate).isGroupClosed());
173 }
174
175 setNodeLabelConfiguration(gnr);
176 }
177 } else {
178 GenericNodeRealizer gnr;
179 if (realizer instanceof GenericNodeRealizer) {
180 gnr = (GenericNodeRealizer) realizer;
181 } else {
182 gnr = new GenericGroupNodeRealizer(realizer);
183 if (realizer instanceof GroupFeature) {
184 ((GenericGroupNodeRealizer) gnr).setGroupClosed(((GroupFeature) realizer).isGroupClosed());
185 }
186 graph.setRealizer(node, gnr);
187 }
188 if (gnr.getConfiguration() == null || !CONFIGURATION_GROUP.equals(gnr.getConfiguration())) {
189 final IsometryData isometryData = new IsometryData(gnr.getWidth(), gnr.getHeight(), 0, true);
190 gnr.setUserData(isometryData);
191 final Rectangle2D.Double bounds = new Rectangle2D.Double(0, 0, -1, -1);
192 isometryData.calculateViewBounds(bounds);
193 gnr.setSize(bounds.getWidth(), bounds.getHeight());
194 gnr.setConfiguration(CONFIGURATION_GROUP);
195 }
196
197 setNodeLabelConfiguration(gnr);
198 }
199 if (hierarchyManager.isFolderNode(node)) {
200 applyIsometryRealizerDefaults((Graph2D) hierarchyManager.getInnerGraph(node));
201 }
202 }
203 }
204
205 for (EdgeCursor ec = graph.edges(); ec.ok(); ec.next()) {
207 final Edge edge = ec.edge();
208 final EdgeRealizer realizer = graph.getRealizer(edge);
209 for (int i = 0; i < realizer.labelCount(); i++) {
210 final EdgeLabel label = realizer.getLabel(i);
211 if (label.getConfiguration() == null
212 || !label.getConfiguration().equals(CONFIGURATION_EDGE_LABEL)) {
213 label.setRotationAngle(0);
214 label.setUserData(new IsometryData(label.getWidth(), label.getHeight(), label.getHeight(), isHorizontal(label)));
215 label.setConfiguration(CONFIGURATION_EDGE_LABEL);
216 final PreferredPlacementDescriptor descriptor = new PreferredPlacementDescriptor();
217 descriptor.setAngle(0);
218 descriptor.setAngleReference(PreferredPlacementDescriptor.ANGLE_IS_RELATIVE_TO_EDGE_FLOW);
219 descriptor.setSideReference(PreferredPlacementDescriptor.SIDE_IS_ABSOLUTE_WITH_RIGHT_IN_NORTH);
220 descriptor.setSideOfEdge(PreferredPlacementDescriptor.PLACE_LEFT_OF_EDGE);
221 label.setPreferredPlacementDescriptor(descriptor);
222 }
223 }
224 }
225 }
226
227
230 private static boolean isHorizontal(final EdgeLabel label) {
231 return label.getOrientedBox().getUpY() == -1 || label.getOrientedBox().getUpY() == 1;
232 }
233
234
237 private static void setNodeLabelConfiguration(final GenericNodeRealizer realizer) {
238 for (int j = 0; j < realizer.labelCount(); j++) {
239 final NodeLabel label = realizer.getLabel(j);
240 if (label.getConfiguration() == null
241 || !label.getConfiguration().equals(CONFIGURATION_GROUP_LABEL)) {
242 label.setUserData(new IsometryData(label.getWidth(), label.getHeight(), 0, true));
243 label.setConfiguration(CONFIGURATION_GROUP_LABEL);
244 }
245 }
246 }
247
248
252 public static IsometryData getIsometryData(final NodeRealizer realizer) {
253 NodeRealizer nr = realizer;
254 if (realizer instanceof ProxyAutoBoundsNodeRealizer) {
255 ProxyAutoBoundsNodeRealizer proxy = (ProxyAutoBoundsNodeRealizer) realizer;
256 nr = proxy.getRealizerDelegate();
257 }
258
259 if (nr instanceof GenericNodeRealizer) {
260 return (IsometryData) ((GenericNodeRealizer) nr).getUserData();
261 }
262
263 return null;
264 }
265 }
266