1
28 package demo.view.uml;
29
30 import demo.view.DemoBase;
31 import y.base.DataProvider;
32 import y.base.Edge;
33 import y.io.GraphMLIOHandler;
34 import y.io.graphml.graph2d.Graph2DGraphMLHandler;
35 import y.layout.LayoutOrientation;
36 import y.layout.Layouter;
37 import y.layout.PortConstraint;
38 import y.layout.PortConstraintKeys;
39 import y.layout.orthogonal.DirectedOrthogonalLayouter;
40 import y.layout.router.polyline.EdgeRouter;
41 import y.util.DataProviderAdapter;
42 import y.view.EdgeRealizer;
43 import y.view.EditMode;
44 import y.view.Graph2D;
45 import y.view.Graph2DLayoutExecutor;
46 import y.view.TooltipMode;
47 import y.view.YLabel;
48
49 import javax.swing.AbstractAction;
50 import javax.swing.Action;
51 import javax.swing.JToolBar;
52 import java.awt.EventQueue;
53 import java.awt.RenderingHints;
54 import java.awt.event.ActionEvent;
55 import java.beans.PropertyChangeEvent;
56 import java.beans.PropertyChangeListener;
57 import java.util.Locale;
58
59
72 public class UmlDemo extends DemoBase {
73 private static final double PAINT_DETAIL_THRESHOLD = 0.4;
74 private static final double MAX_ZOOM = 4.0;
75 private static final double MIN_ZOOM = 0.05;
76
77 private Layouter layouter;
78 private boolean fractionMetricsEnabled;
79
80 public UmlDemo() {
81 this(null);
82 }
83
84 public UmlDemo(String helpFilePath) {
85 addHelpPane(helpFilePath);
86
87 configureLabelRendering();
88 configureZoomThreshold();
89 layouter = createLayouter();
90
91 loadGraph("resource/shopping.graphml");
92 addPortConstraints(view.getGraph2D());
93 }
94
95
100 private void addPortConstraints(final Graph2D graph) {
101 final DataProvider sourcePorts = new DataProviderAdapter() {
103 public Object get(Object dataHolder) {
104 final Edge edge = (Edge) dataHolder;
105 final EdgeRealizer er = graph.getRealizer(edge);
106 return UmlRealizerFactory.isInheritance(er) ? PortConstraint.create(PortConstraint.NORTH) : null;
107 }
108 };
109 graph.addDataProvider(PortConstraintKeys.SOURCE_PORT_CONSTRAINT_KEY, sourcePorts);
110
111 final DataProvider targetPorts = new DataProviderAdapter() {
113 public Object get(Object dataHolder) {
114 final Edge edge = (Edge) dataHolder;
115 final EdgeRealizer er = graph.getRealizer(edge);
116 return UmlRealizerFactory.isInheritance(er) ? PortConstraint.create(PortConstraint.SOUTH) : null;
117 }
118 };
119 graph.addDataProvider(PortConstraintKeys.TARGET_PORT_CONSTRAINT_KEY, targetPorts);
120 }
121
122
126 private void configureLabelRendering() {
127 fractionMetricsEnabled = YLabel.isFractionMetricsForSizeCalculationEnabled();
128 YLabel.setFractionMetricsForSizeCalculationEnabled(true);
129 view.getRenderingHints().put(
130 RenderingHints.KEY_FRACTIONALMETRICS,
131 RenderingHints.VALUE_FRACTIONALMETRICS_ON);
132 }
133
134
138 public void dispose() {
139 YLabel.setFractionMetricsForSizeCalculationEnabled(fractionMetricsEnabled);
140 }
141
142 private void configureZoomThreshold() {
143 view.setPaintDetailThreshold(PAINT_DETAIL_THRESHOLD);
145 view.getCanvasComponent().addPropertyChangeListener(
147 new PropertyChangeListener() {
148 public void propertyChange(PropertyChangeEvent evt) {
149 if ("Zoom".equals(evt.getPropertyName())) {
150 final double zoom = ((Double) evt.getNewValue()).doubleValue();
151 if (zoom > MAX_ZOOM) {
152 view.setZoom(MAX_ZOOM);
153 } else if (zoom < MIN_ZOOM) {
154 view.setZoom(MIN_ZOOM);
155 }
156 }
157 }
158 });
159 }
160
161
164 private Layouter createLayouter() {
165 final DirectedOrthogonalLayouter dol = new DirectedOrthogonalLayouter();
168 dol.setLayoutOrientation(LayoutOrientation.BOTTOM_TO_TOP);
169
170 final Graph2D graph = view.getGraph2D();
174 final DataProvider directedEdges = new DataProviderAdapter() {
175 public boolean getBool(Object dataHolder) {
176 final Edge edge = (Edge) dataHolder;
177 return UmlRealizerFactory.isInheritance(graph.getRealizer(edge));
178 }
179 };
180 graph.addDataProvider(DirectedOrthogonalLayouter.DIRECTED_EDGE_DPKEY, directedEdges);
181
182 final DataProvider targetGroups = new DataProviderAdapter() {
186 public Object get(Object dataHolder) {
187 final Edge edge = (Edge) dataHolder;
188 final EdgeRealizer er = graph.getRealizer(edge);
189 return UmlRealizerFactory.isRealization(er) ? er.getLineType() : null;
190 }
191 };
192 graph.addDataProvider(PortConstraintKeys.TARGET_GROUPID_KEY, targetGroups);
193
194 return dol;
195 }
196
197
200 protected void configureDefaultRealizers() {
201 final Graph2D graph = view.getGraph2D();
202 graph.setDefaultNodeRealizer(UmlRealizerFactory.createClassRealizer());
203 graph.setDefaultEdgeRealizer(UmlRealizerFactory.createAssociationRealizer());
204 }
205
206
209 protected EditMode createEditMode() {
210 final UmlEditMode editMode = new UmlEditMode(view, new EdgeRouter());
211 editMode.getMouseInputMode().setNodeSearchingEnabled(true);
212 editMode.setSnappingEnabled(true);
213 return editMode;
214 }
215
216
219 protected void registerViewModes() {
220 super.registerViewModes();
221 view.addViewMode(new UmlClassLabelEditMode());
222 }
223
224
227 protected JToolBar createToolBar() {
228 final JToolBar toolBar = super.createToolBar();
229 toolBar.addSeparator();
230
231 final AbstractAction layoutAction = new AbstractAction("Layout") {
232 public void actionPerformed(ActionEvent e) {
233 runLayout();
234 }
235 };
236 layoutAction.putValue(Action.SHORT_DESCRIPTION, "Layout");
237 layoutAction.putValue(Action.SMALL_ICON, SHARED_LAYOUT_ICON);
238 toolBar.add(createActionControl(layoutAction, true));
239
240 return toolBar;
241 }
242
243
246 protected GraphMLIOHandler createGraphMLIOHandler() {
247 final GraphMLIOHandler graphMLIOHandler = super.createGraphMLIOHandler();
248 final Graph2DGraphMLHandler graphMLHandler = graphMLIOHandler.getGraphMLHandler();
249 final UmlClassModelIOHandler modelHandler = new UmlClassModelIOHandler();
250 graphMLHandler.addSerializationHandler(modelHandler);
251 graphMLHandler.addDeserializationHandler(modelHandler);
252 return graphMLIOHandler;
253 }
254
255
258 private void runLayout() {
259 new Graph2DLayoutExecutor().doLayout(view, layouter);
260 }
261
262
265 protected TooltipMode createTooltipMode() {
266 return null;
267 }
268
269
272 public static void main(String[] args) {
273 EventQueue.invokeLater(
274 new Runnable() {
275 public void run() {
276 Locale.setDefault(Locale.ENGLISH);
277 initLnF();
278 final UmlDemo demo = new UmlDemo("resource/umlhelp.html");
279 demo.start("UML Diagram Demo");
280 }
281 });
282 }
283 }
284