]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/example/TestCanvas.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / example / TestCanvas.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g2d.example;\r
13 \r
14 import java.awt.Color;\r
15 import java.awt.Shape;\r
16 import java.awt.geom.Ellipse2D;\r
17 import java.awt.geom.Rectangle2D;\r
18 import java.util.ArrayList;\r
19 import java.util.List;\r
20 \r
21 import org.simantics.g2d.canvas.Hints;\r
22 import org.simantics.g2d.canvas.ICanvasContext;\r
23 import org.simantics.g2d.canvas.impl.CanvasContext;\r
24 import org.simantics.g2d.diagram.DiagramClass;\r
25 import org.simantics.g2d.diagram.DiagramHints;\r
26 import org.simantics.g2d.diagram.IDiagram;\r
27 import org.simantics.g2d.diagram.handler.Topology;\r
28 import org.simantics.g2d.diagram.handler.Validator;\r
29 import org.simantics.g2d.diagram.handler.Topology.Terminal;\r
30 import org.simantics.g2d.diagram.handler.Validator.Issue;\r
31 import org.simantics.g2d.diagram.handler.Validator.Suggestion;\r
32 import org.simantics.g2d.diagram.impl.Diagram;\r
33 import org.simantics.g2d.diagram.impl.DummyDiagramMutator;\r
34 import org.simantics.g2d.diagram.participant.DiagramParticipant;\r
35 import org.simantics.g2d.diagram.participant.ElementHeartbeater;\r
36 import org.simantics.g2d.diagram.participant.ElementInteractor;\r
37 import org.simantics.g2d.diagram.participant.ElementPainter;\r
38 import org.simantics.g2d.diagram.participant.Selection;\r
39 import org.simantics.g2d.diagram.participant.TerminalPainter;\r
40 import org.simantics.g2d.diagram.participant.ZOrderHandler;\r
41 import org.simantics.g2d.diagram.participant.pointertool.PointerInteractor;\r
42 import org.simantics.g2d.element.ElementClass;\r
43 import org.simantics.g2d.element.ElementClassProviders;\r
44 import org.simantics.g2d.element.ElementHints;\r
45 import org.simantics.g2d.element.ElementUtils;\r
46 import org.simantics.g2d.element.IElement;\r
47 import org.simantics.g2d.element.handler.FillColor;\r
48 import org.simantics.g2d.element.handler.Move;\r
49 import org.simantics.g2d.element.handler.ParentTransform;\r
50 import org.simantics.g2d.element.handler.Resize;\r
51 import org.simantics.g2d.element.handler.TerminalTopology;\r
52 import org.simantics.g2d.element.handler.Text;\r
53 import org.simantics.g2d.element.handler.EdgeVisuals.EdgeEnd;\r
54 import org.simantics.g2d.element.handler.impl.ElementParentTransform;\r
55 import org.simantics.g2d.element.impl.Element;\r
56 import org.simantics.g2d.elementclass.BoxClass;\r
57 import org.simantics.g2d.elementclass.FilmClass;\r
58 import org.simantics.g2d.elementclass.FlagClass;\r
59 import org.simantics.g2d.elementclass.ImageClass;\r
60 import org.simantics.g2d.elementclass.LabelClass;\r
61 import org.simantics.g2d.elementclass.ShapeClass;\r
62 import org.simantics.g2d.elementclass.button.ButtonClass;\r
63 import org.simantics.g2d.elementclass.button.ToggleButtonClass;\r
64 import org.simantics.g2d.elementclass.canvas.CanvasClass;\r
65 import org.simantics.g2d.elementclass.canvas.ElementViewport;\r
66 import org.simantics.g2d.elementclass.connection.EdgeClass;\r
67 import org.simantics.g2d.elementclass.slider.SliderClass;\r
68 import org.simantics.g2d.elementclass.valve.ValveClass;\r
69 import org.simantics.g2d.elementclass.wheel.WheelClass;\r
70 import org.simantics.g2d.image.DefaultImages;\r
71 import org.simantics.g2d.image.Image;\r
72 import org.simantics.g2d.multileveldiagram.LayerComposition;\r
73 import org.simantics.g2d.multileveldiagram.TransitionFunction;\r
74 import org.simantics.g2d.multileveldiagram.ZoomTransitionParticipant;\r
75 import org.simantics.g2d.multileveldiagram.LayerComposition.LayerInfo;\r
76 import org.simantics.g2d.participant.BackgroundPainter;\r
77 import org.simantics.g2d.participant.CanvasBoundsParticipant;\r
78 import org.simantics.g2d.participant.CanvasGrab;\r
79 import org.simantics.g2d.participant.GridPainter;\r
80 import org.simantics.g2d.participant.KeyToCommand;\r
81 import org.simantics.g2d.participant.KeyUtil;\r
82 import org.simantics.g2d.participant.MouseUtil;\r
83 import org.simantics.g2d.participant.PanZoomRotateHandler;\r
84 import org.simantics.g2d.participant.PointerPainter;\r
85 import org.simantics.g2d.participant.RulerPainter;\r
86 import org.simantics.g2d.participant.SymbolUtil;\r
87 import org.simantics.g2d.participant.TimeParticipant;\r
88 import org.simantics.g2d.participant.TransformUtil;\r
89 import org.simantics.g2d.tooltip.EditableTextTooltipProvider2;\r
90 import org.simantics.g2d.tooltip.TextTooltipProvider;\r
91 import org.simantics.g2d.tooltip.TooltipParticipant;\r
92 import org.simantics.scenegraph.g2d.events.command.CommandKeyBinding;\r
93 import org.simantics.utils.datastructures.hints.IHintContext;\r
94 import org.simantics.utils.threads.IThreadWorkQueue;\r
95 \r
96 \r
97 \r
98 /**\r
99  * @author Toni Kalajainen\r
100  */\r
101 public class TestCanvas {\r
102 \r
103     public static final Color C1 = new Color(0.7f, 0.7f, 0.7f);\r
104     public static final Color C2 = new Color(0.8f, 0.8f, 0.8f);\r
105     public static final Color C3 = new Color(0.9f, 0.9f, 0.9f);\r
106     public static final Color C4 = new Color(1.0f, 1.0f, 1.0f);\r
107 \r
108 \r
109     public static CanvasContext createDefaultCanvas(IThreadWorkQueue thread)\r
110     {\r
111         // Create canvas context and a layer of interactors\r
112         CanvasContext canvasContext = new CanvasContext(thread);\r
113         IHintContext h = canvasContext.getDefaultHintContext();\r
114 \r
115         canvasContext.add( new PanZoomRotateHandler() ); // Must be before TransformUtil\r
116 \r
117         // Support & Util Participants\r
118         canvasContext.add( new TransformUtil() );\r
119         canvasContext.add( new MouseUtil() );\r
120         canvasContext.add( new KeyUtil() );\r
121         canvasContext.add( new CanvasGrab() );\r
122         canvasContext.add( new SymbolUtil() );\r
123         canvasContext.add( new TimeParticipant() );\r
124 \r
125         // Debug participant(s)\r
126         //canvasContext.add( new PointerPainter() );\r
127 //        canvasContext.add( new HandPainter() );\r
128         h.setHint(PointerPainter.KEY_PAINT_POINTER, true);\r
129 \r
130         // Pan & Zoom & Rotate\r
131         //canvasContext.add( new MousePanZoomInteractor() );\r
132         //canvasContext.add( new MultitouchPanZoomRotateInteractor() );\r
133         //canvasContext.add( new OrientationRestorer() );\r
134 \r
135         // Grid & Ruler & Background\r
136         canvasContext.add( new GridPainter() );\r
137         canvasContext.add( new RulerPainter() );\r
138         canvasContext.add( new BackgroundPainter() );\r
139 \r
140         h.setHint(Hints.KEY_GRID_COLOR, new Color(0.95f, 0.95f, 0.95f));\r
141         h.setHint(Hints.KEY_BACKGROUND_COLOR, Color.WHITE);\r
142         h.setHint(RulerPainter.KEY_RULER_BACKGROUND_COLOR, new Color(0.9f, 0.9f, 0.9f, 0.75f));\r
143         h.setHint(RulerPainter.KEY_RULER_TEXT_COLOR, Color.BLACK);\r
144 \r
145         // Key bindings\r
146         canvasContext.add( new KeyToCommand( CommandKeyBinding.DEFAULT_BINDINGS ) );\r
147 \r
148         ////// Diagram Participants //////\r
149         // FIXME: PointerInteractor must be given a provider for all element classes defined in class ElementClasses !!\r
150         canvasContext.add( new PointerInteractor(true, true, true, false, true, ElementClassProviders.staticProvider(EdgeClass.STRAIGHT)) );\r
151         canvasContext.add( new ElementInteractor() );\r
152         canvasContext.add( new Selection() );\r
153         canvasContext.add( new DiagramParticipant() );\r
154         canvasContext.add( new ElementPainter() );\r
155         canvasContext.add( new TerminalPainter(true, true, false, true) );\r
156         canvasContext.add( new ElementHeartbeater() );\r
157         canvasContext.add( new ZOrderHandler() );\r
158         canvasContext.add( new ZoomTransitionParticipant(TransitionFunction.SIGMOID) );\r
159         canvasContext.add(new CanvasBoundsParticipant());\r
160 \r
161         canvasContext.add( new TooltipParticipant());\r
162 \r
163         h.setHint(Hints.KEY_TOOL, Hints.POINTERTOOL);\r
164 \r
165 \r
166         return canvasContext;\r
167     }\r
168 \r
169     public static IDiagram createMultilevelDiagram(ICanvasContext ctx)\r
170     {\r
171         IDiagram loading = LoadingMessageDiagram.createLoadingDiagram();\r
172         IDiagram d1 = createDiagram1();\r
173         IDiagram d2 = createDiagram2();\r
174         IDiagram d3 = createDiagram3();\r
175         validate(d1, ctx);\r
176         validate(d2, ctx);\r
177         validate(d3, ctx);\r
178 \r
179         LayerComposition composition = new LayerComposition();\r
180         composition.addLayer(d1, null, 2.0);\r
181         composition.addLayer(d2, 5.0, 7.0);\r
182         composition.addLayer(d3, 10.0, null);\r
183         List<LayerInfo> lis = composition.buildMorphLayers();\r
184         loading.setHint(DiagramHints.KEY_LAYER_COMPOSITION, lis);\r
185         return loading;\r
186     }\r
187 \r
188     /**\r
189      * Create diagram editor\r
190      * \r
191      * @param thread\r
192      * @param resource\r
193      * @param localSession\r
194      * @return\r
195      */\r
196     public static CanvasContext createTestCanvas(IThreadWorkQueue thread)\r
197     {\r
198         // Create canvas context and a layer of interactors\r
199         CanvasContext canvasContext = createDefaultCanvas(thread);\r
200         IHintContext h = canvasContext.getDefaultHintContext();\r
201         h.setHint(Hints.KEY_TOOL, Hints.POINTERTOOL);\r
202 \r
203         ////// CREATE DIAGRAM //////\r
204         IDiagram wd = createWidgetsDiagram();\r
205 //        IDiagram d1 = createDiagram1();\r
206 //        IDiagram d2 = createDiagram2();\r
207 //        IDiagram d3 = createDiagram3();\r
208 //        IDiagram od = createOperationSymbolsDiagram();\r
209 //        IDiagram uid = createUIDiagram(ElementUtils.getByData(od, "BoilerBtn"));\r
210         IDiagram uid = createUIDiagram();\r
211 //        IDiagram loading = LoadingMessageDiagram.createLoadingDiagram();\r
212 \r
213 //        validate(d1, canvasContext);\r
214 //        validate(d2, canvasContext);\r
215 //        validate(d3, canvasContext);\r
216 \r
217         /*\r
218         LayerComposition composition = new LayerComposition();\r
219         composition.addLayer(d1, null, 2.0);\r
220         composition.addLayer(d2, 5.0, 7.0);\r
221         composition.addLayer(d3, 10.0, null);\r
222         List<LayerInfo> lis = composition.buildMorphLayers();\r
223         canvasContext.add( new ZoomTransitionParticipant(lis, TransitionFunction.SIGMOID) );\r
224          */\r
225 \r
226 //        IDiagram d = loading;\r
227         //h.setHint(DiagramHints.KEY_DIAGRAM, d);\r
228         h.setHint(DiagramHints.KEY_DIAGRAM, uid);\r
229 \r
230         /*\r
231         final IElement button = ElementUtils.getByData(wd, "button");\r
232         System.out.println(button.getDiagram());\r
233                 ElementUtils.addClickListener(button, canvasContext, new ClickListener() {\r
234                         @Override\r
235                         public void onClick(IElement e, ICanvasContext ctx) {\r
236                                 Point2D pos = ElementUtils.getPos(button);\r
237                                 pos = new Point2D.Double(pos.getX()+10, pos.getY());\r
238                                 ElementUtils.setPos(e, pos);\r
239                         }});\r
240          */\r
241 \r
242         // Draw UI Layer on top of the diagram\r
243 \r
244         /*\r
245                 ICanvasContext subCanvas = createDefaultCanvas(canvasContext.getThreadAccess());\r
246                 subCanvas.remove( subCanvas.getSingleItem(RulerPainter.class) );\r
247                 subCanvas.remove( subCanvas.getSingleItem(BackgroundPainter.class) );\r
248                 subCanvas.remove( subCanvas.getSingleItem(GridPainter.class) );\r
249                 subCanvas.remove( subCanvas.getSingleItem(TimeParticipant.class) );\r
250                 subCanvas.add( new KeepZoomToFit() );\r
251                 subCanvas.getDefaultHintContext().setHint(DiagramHints.KEY_DIAGRAM, uid);\r
252                 subCanvas.getDefaultHintContext().setHint(PanZoomRotateHandler.KEY_ZOOM_TO_FIT_MARGINS, MarginUtils.MARINGS5);\r
253                 canvasContext.add( new SubCanvas(subCanvas, 10000, RulerPainter.PAINT_PRIORITY + 100, 10000) );\r
254          */\r
255 //        ElementDiagram ed = new ElementDiagram(canvasContext) {\r
256 //            @Override\r
257 //            public ICanvasContext createCanvas(IThreadWorkQueue thread) {\r
258 //                ICanvasContext subCanvas = createDefaultCanvas(thread);\r
259 //                subCanvas.remove( subCanvas.getSingleItem(RulerPainter.class) );\r
260 //                subCanvas.remove( subCanvas.getSingleItem(BackgroundPainter.class) );\r
261 //                subCanvas.remove( subCanvas.getSingleItem(GridPainter.class) );\r
262 //                subCanvas.remove( subCanvas.getSingleItem(TimeParticipant.class) );\r
263 //                subCanvas.add( new KeepZoomToFit() );\r
264 //                subCanvas.getDefaultHintContext().setHint(DiagramHints.KEY_MARGINS, MarginUtils.MARGINS5);\r
265 //                return subCanvas;\r
266 //            }\r
267 //        };\r
268 //        ed.setDiagram(uid);\r
269 \r
270         return canvasContext;\r
271     }\r
272 \r
273     public static IDiagram createUIDiagram(IElement forElement)\r
274     {\r
275         String name = "User Interface Diagram";\r
276         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
277         d.setHint(DiagramHints.KEY_TEXT, name);\r
278 \r
279         IElement film = Element.spawnNew(FilmClass.FILM_CLASS);\r
280         ElementUtils.fitToRectangle(film, new Rectangle2D.Double(0, 10, 200, 160));\r
281         d.addElement(film);\r
282 \r
283         IElement preview = Element.spawnNew(CanvasClass.ELEMENT_VIEWPORT_CLASS);\r
284         preview.setHint(ElementViewport.KEY_ELEMENT, forElement);\r
285         d.addElement(preview);\r
286         ElementUtils.fitToRectangle(preview, new Rectangle2D.Double(10, 20, 60, 60));\r
287         ElementUtils.setBorderColor(preview, Color.WHITE);\r
288 \r
289         IElement        cancel  = createButton(d, 10 , 140, 50, 20, "Cancel", "Cancel");\r
290         IElement        apply   = createButton(d, 74 , 140, 50, 20, "Apply", "Apply");\r
291         IElement        ok              = createButton(d, 134, 140, 50, 20, "OK", "OK");\r
292         IElement    toggle  = createToggleButton(d, 10, 110, 50, 20, "Toggle", "Toggle");\r
293 \r
294         String          eleName = "?";\r
295         Text            text    = forElement.getElementClass().getAtMostOneItemOfClass(Text.class);\r
296         if (text!=null) eleName = text.getText(forElement);\r
297         IElement        nameLbl = createLabel(d, 10, 90, "nameLbl", eleName);\r
298         ElementUtils.setTextColor(nameLbl, Color.WHITE);\r
299 \r
300         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
301 \r
302         return d;\r
303     }\r
304 \r
305     public static IDiagram createUIDiagram()\r
306     {\r
307         String name = "User Interface Diagram";\r
308         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
309         d.setHint(DiagramHints.KEY_TEXT, name);\r
310 \r
311         IElement film = Element.spawnNew(FilmClass.FILM_CLASS);\r
312         ElementUtils.fitToRectangle(film, new Rectangle2D.Double(0, 10, 200, 160));\r
313         d.addElement(film);\r
314 \r
315 //        IElement preview = Element.spawnNew(CanvasClass.ELEMENT_VIEWPORT_CLASS);\r
316 //        preview.setHint(ElementViewport.KEY_ELEMENT, forElement);\r
317 //        d.addElement(preview);\r
318 //        ElementUtils.fitToRectangle(preview, new Rectangle2D.Double(10, 20, 60, 60));\r
319 //        ElementUtils.setBorderColor(preview, Color.WHITE);\r
320 \r
321         IElement        cancel  = createButton(d, 10 , 140, 50, 20, "Cancel", "Cancel");\r
322         IElement        apply   = createButton(d, 74 , 140, 50, 20, "Apply", "Apply");\r
323         IElement        ok              = createButton(d, 134, 140, 50, 20, "OK", "OK");\r
324         IElement    toggle  = createToggleButton(d, 10, 110, 50, 20, "Toggle", "Toggle");\r
325 \r
326 //        String                eleName = "?";\r
327 //        Text          text    = forElement.getElementClass().getAtMostOneItemOfClass(Text.class);\r
328 //        if (text!=null) eleName = text.getText(forElement);\r
329 //        IElement      nameLbl = createLabel(d, 10, 90, "nameLbl", eleName);\r
330 //        ElementUtils.setTextColor(nameLbl, Color.WHITE);\r
331         toggle.setHint(TooltipParticipant.TOOLTIP_KEY, new TextTooltipProvider() {\r
332 \r
333             @Override\r
334             public String getTooltipText(IElement element) {\r
335                 return element.toString();\r
336             }\r
337         });\r
338         apply.setHint(TooltipParticipant.TOOLTIP_KEY, new EditableTextTooltipProvider2() {\r
339 \r
340             @Override\r
341             public void setText(IElement element, String text) {\r
342                 ElementUtils.setText(element, text);\r
343             }\r
344 \r
345             @Override\r
346             public String getTooltipText(IElement element) {\r
347                 return ElementUtils.getText(element);\r
348             }\r
349         });\r
350 \r
351         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
352 \r
353         return d;\r
354     }\r
355 \r
356     public static IDiagram createConnectTestDiagram()\r
357     {\r
358         String name = "Diagram";\r
359         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
360         d.setHint(DiagramHints.KEY_TEXT, name);\r
361 \r
362         IElement box1 = createBox(d, 0, 0, 70, 70, C4, "1");\r
363         IElement box2 = createBox(d, 120, 0, 80, 70, C4, "2");\r
364         connect(d, box1, 4, box2, 8);\r
365         createLabel(d, 50, 90, "label", name);\r
366 \r
367         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
368 \r
369         return d;\r
370     }\r
371 \r
372     public static IDiagram createAnchorTestDiagram()\r
373     {\r
374         String name = "Diagram";\r
375         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
376         d.setHint(DiagramHints.KEY_TEXT, name);\r
377 \r
378         IElement box1 = createBox(d, 0, 0, 70, 70, C4, "1");\r
379         IElement box2 = createBox(d, 120, 0, 80, 70, C4, "2");\r
380         IElement box3 = createBox(d, 30, 90, 40, 40, C3, "3");\r
381 \r
382         ElementParentTransform pt = (ElementParentTransform)box3.getElementClass().getSingleItem(ParentTransform.class);\r
383         pt.setParent(box3, box2);\r
384 \r
385         connect(d, box1, 4, box2, 8);\r
386         createLabel(d, 50, 90, "label", name);\r
387 \r
388         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
389 \r
390         return d;\r
391     }\r
392 \r
393 \r
394     public static IDiagram createFlagTestDiagram()\r
395     {\r
396         String name = "Diagram";\r
397         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
398         d.setHint(DiagramHints.KEY_TEXT, name);\r
399 \r
400         IElement e1 = createFlag(d, -100, 0, 0, FlagClass.Type.In, C4, "I3", "From Z");\r
401         IElement e2 = createFlag(d, -80, 20, 90, FlagClass.Type.In, C4, "I2", "From Y");\r
402         IElement e3 = createFlag(d, -100, 40, 180, FlagClass.Type.Out, C4, "I1", "To X");\r
403         IElement e4 = createFlag(d, -120, 20, 270, FlagClass.Type.Out, C4, "I4", "To W");\r
404         IElement e5 = createFlag(d, -120, 120, 270, FlagClass.Type.Out, C4, "I5", "To P");\r
405 \r
406         e1.setHint(FlagClass.KEY_FLAG_TEXT, new String[]{"THIS" });\r
407         e2.setHint(FlagClass.KEY_FLAG_TEXT, new String[]{"THIS", "is"});\r
408         e3.setHint(FlagClass.KEY_FLAG_TEXT, new String[]{"THIS", "is", "DEBUG"});\r
409         e4.setHint(FlagClass.KEY_FLAG_TEXT, new String[]{"THIS", "is", "DEBUG", "INFO"});\r
410         e5.setHint(FlagClass.KEY_FLAG_TEXT, new String[]{"THIS", "is", "DEBUG", "INFO", "FOO!"});\r
411 \r
412 //        createFlag(d, 300, 40, 0, FlagClass.Type.Out, C3, "O3", "To Z", FlagClass.Mode.Minimized);\r
413 //        createFlag(d, 280, 20, 90, FlagClass.Type.Out, C3, "O4", "To W", FlagClass.Mode.Minimized);\r
414 //        createFlag(d, 300, 00, 180, FlagClass.Type.Out, C3, "O1", "To X", FlagClass.Mode.Minimized);\r
415 //        createFlag(d, 320, 20, 270, FlagClass.Type.Out, C3, "O2", "To Y", FlagClass.Mode.Minimized);\r
416 \r
417         createFlag(d, 100, 50, 0, FlagClass.Type.Out, C2, "J1O", "O", FlagClass.Mode.Internal);\r
418         createFlag(d, 100, 100, 0, FlagClass.Type.Out, C2, "J2O", "Oy", FlagClass.Mode.Internal);\r
419         createFlag(d, 100, 150, 90, FlagClass.Type.Out, C2, "J3O", "OAAAA", FlagClass.Mode.Internal);\r
420         createFlag(d, 150, 50, 0, FlagClass.Type.In, C2, "J1I", "I", FlagClass.Mode.Internal);\r
421         createFlag(d, 150, 100, 0, FlagClass.Type.In, C2, "J2I", "Iy", FlagClass.Mode.Internal);\r
422         createFlag(d, 150, 150, 90, FlagClass.Type.In, C2, "J3I", "IAAAA", FlagClass.Mode.Internal);\r
423 \r
424         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
425 \r
426         return d;\r
427     }\r
428 \r
429     public static IDiagram createDiagram1()\r
430     {\r
431         String name = "Diagram Level 1";\r
432         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
433         d.setHint(DiagramHints.KEY_TEXT, name);\r
434 \r
435         IElement box1 = createBox(d, 0, 0, 70, 70, C4, "1");\r
436         IElement box2 = createBox(d, 120, 0, 80, 70, C4, "2");\r
437         connect(d, box1, 4, box2, 8);\r
438         createLabel(d, 50, 90, "label", name);\r
439 \r
440         IElement slider = createSlider(d, 600, 0, 100, 28, "slider");\r
441         IElement valve  = createValve (d, 800, 0, "valve");\r
442         //IElement wheel =  createWheel (d, 500, 100, 100, 100, "wheel");\r
443         IElement button = createButton(d, 800, 100, 100, 28, "button", "button");\r
444 \r
445         IElement image = createImage(d, 400, 400, DefaultImages.UNKNOWN.get());\r
446 \r
447         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
448 \r
449         return d;\r
450     }\r
451 \r
452 \r
453     public static IDiagram createDiagram2()\r
454     {\r
455         String name = "Diagram Level 2";\r
456         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
457         d.setHint(DiagramHints.KEY_TEXT, name);\r
458 \r
459         IElement box1   = createBox(d, 0, 30, 70, 10, C3, "1");\r
460         IElement box1_1 = createBox(d, 20, 0, 50, 20, C2, "1.1");\r
461         IElement box1_2 = createBox(d, 0, 50, 70, 20, C2, "1.2");\r
462         IElement box2   = createBox(d, 120, 0, 20, 70, C3, "2");\r
463         IElement box2_2 = createBox(d, 150, 0, 50, 20, C2, "2.2");\r
464         IElement box2_3 = createBox(d, 150, 30, 50, 40, C2, "2.3");\r
465         connect(d, box1, 4, box2, 8);\r
466         connect(d, box1, 2, box1_1, 6);\r
467         connect(d, box1, 6, box1_2, 2);\r
468         connect(d, box2, 4, box2_2, 8);\r
469         connect(d, box2, 4, box2_3, 8);\r
470         createLabel(d, 50, 90, "label", name);\r
471 \r
472         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
473 \r
474         return d;\r
475     }\r
476 \r
477     public static IDiagram createDiagram3()\r
478     {\r
479         String name = "Diagram Level 3";\r
480         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
481         d.setHint(DiagramHints.KEY_TEXT, name);\r
482 \r
483         IElement box1           = createBox(d, 0, 30, 70, 10, C3, "1");\r
484         IElement box1_1         = createBox(d, 30, 0, 40, 20, C2, "1.1");\r
485         IElement box1_1_1       = createBox(d, 00, 0, 20, 20, C2, "1.1.1");\r
486         IElement box1_2         = createBox(d, 30, 50, 40, 20, C2, "1.2");\r
487         IElement box1_2_1       = createBox(d, 0, 50, 20, 20, C1, "1.2.1");\r
488         IElement box2           = createBox(d, 120, 30, 20, 40, C3, "2");\r
489         IElement box2_1         = createBox(d, 120, 0, 20, 20, C2, "2.1");\r
490         IElement box2_2         = createBox(d, 150, 0, 20, 20, C2, "2.2");\r
491         IElement box2_2_1       = createBox(d, 180, 0, 20, 20, C1, "2.2.1");\r
492         IElement box2_3         = createBox(d, 150, 30, 20, 20, C2, "2.3");\r
493         IElement box2_3_1       = createBox(d, 180, 30, 20, 20, C1, "2.3.1");\r
494         IElement box2_3_2       = createBox(d, 180, 60, 20, 20, C1, "2.3.2");\r
495         connect(d, box1, 4, box2, 8);\r
496         connect(d, box1, 2, box1_1, 6);\r
497         connect(d, box1_1, 8, box1_1_1, 4);\r
498         connect(d, box1, 6, box1_2, 2);\r
499         connect(d, box1_2, 8, box1_2_1, 4);\r
500         connect(d, box2, 2, box2_1, 6);\r
501         connect(d, box2, 3, box2_2, 7);\r
502         connect(d, box2_2, 4, box2_2_1, 8);\r
503         connect(d, box2, 4, box2_3, 8);\r
504         connect(d, box2_3, 4, box2_3_1, 8);\r
505         connect(d, box2_3, 5, box2_3_2, 1);\r
506         createLabel(d, 50, 90, "label", name);\r
507 \r
508         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
509 \r
510         return d;\r
511     }\r
512 \r
513     public static IDiagram createWidgetsDiagram()\r
514     {\r
515         String name = "Test Diagram";\r
516         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
517         d.setHint(DiagramHints.KEY_TEXT, name);\r
518 \r
519         //IElement slider = createSlider(d, 0, 100, 100, 28, "slider");\r
520         IElement valve  = createValve (d, 0, 0, "valve");\r
521         //IElement wheel = createWheel(d, 0, 0, 100, 100, "wheel");\r
522         //IElement button = createButton(d, 0, 0, 100, 28, "button", "button");\r
523 \r
524         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
525 \r
526         return d;\r
527     }\r
528 \r
529     public static IDiagram createOperationSymbolsDiagram()\r
530     {\r
531         String name = "Operation Symbols Diagram";\r
532         IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);\r
533         d.setHint(DiagramHints.KEY_TEXT, name);\r
534         /*\r
535                 createSymbol(d, OperationClasses.BOILER_CLASS, 0, 0, "Boiler");\r
536                 createSymbol(d, OperationClasses.COMPRESSOR_CLASS, 50, 0, "Compressor");\r
537                 createSymbol(d, OperationClasses.CONTROLVALVE_CLASS, 100, 0, "Control Valve");\r
538                 createSymbol(d, OperationClasses.HEATEXCHANGER_CLASS, 0, 50, "HeatExchanger");\r
539                 createSymbol(d, OperationClasses.PUMP_CLASS, 50, 50, "Pump");\r
540                 createSymbol(d, OperationClasses.SHUTOFFVALVE_CLASS, 100, 50, "Shutoff Valve");\r
541                 createSymbol(d, OperationClasses.SWITCH_CLASS, 0, 100, "Switch");\r
542                 createSymbol(d, OperationClasses.TURBINE_CLASS, 50, 100, "Turbine");\r
543                 createSymbol(d, OperationClasses.VOLTAGETRANSFORMER_CLASS, 100, 100, "Voltage Transformer");\r
544 \r
545                 createSymbol(d, OperationClasses.BOILER_BUTTON_CLASS, 0, 200, "BoilerBtn");\r
546                 createSymbol(d, OperationClasses.COMPRESSOR_BUTTON_CLASS, 50, 200, "CompressorBtn");\r
547                 createSymbol(d, OperationClasses.CONTROLVALVE_BUTTON_CLASS, 100, 200, "Control ValveBtn");\r
548                 createSymbol(d, OperationClasses.HEATEXCHANGER_BUTTON_CLASS, 0, 250, "HeatExchangerBtn");\r
549                 createSymbol(d, OperationClasses.PUMP_BUTTON_CLASS, 50, 250, "Pump");\r
550                 createSymbol(d, OperationClasses.SHUTOFFVALVE_BUTTON_CLASS, 100, 250, "Shutoff ValveBtn");\r
551                 createSymbol(d, OperationClasses.SWITCH_BUTTON_CLASS, 0, 300, "SwitchBtn");\r
552                 createSymbol(d, OperationClasses.TURBINE_BUTTON_CLASS, 50, 300, "TurbineBtn");\r
553                 createSymbol(d, OperationClasses.VOLTAGETRANSFORMER_BUTTON_CLASS, 100, 300, "Voltage TransformerBtn");\r
554          */\r
555         createShape(d, new Ellipse2D.Double(-10, -10, 20, 20), -50, 0, Color.RED, "circle");\r
556 \r
557         d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));\r
558 \r
559         return d;\r
560     }\r
561 \r
562     public static IElement createSymbol(IDiagram d, ElementClass clazz, double x, double y, Object dada)\r
563     {\r
564         IElement box = Element.spawnNew( clazz );\r
565         d.addElement(box);\r
566         Move m = box.getElementClass().getSingleItem(Move.class);\r
567         m.moveTo(box, x, y);\r
568         box.setHint(ElementHints.KEY_TEXT, dada.toString());\r
569         box.setHint(ElementHints.KEY_OBJECT, dada);\r
570         return box;\r
571     }\r
572 \r
573 \r
574     public static IElement createBox(IDiagram d, double x, double y, double width, double height, Color color, Object dada)\r
575     {\r
576         IElement box = Element.spawnNew( BoxClass.BOXCLASS.newClassWith(ElementParentTransform.INSTANCE) );\r
577         d.addElement(box);\r
578         Move m = box.getElementClass().getSingleItem(Move.class);\r
579         Resize s = box.getElementClass().getSingleItem(Resize.class);\r
580         FillColor ch = box.getElementClass().getSingleItem(FillColor.class);\r
581         ch.setFillColor(box, color);\r
582         m.moveTo(box, x, y);\r
583         s.resize(box, new Rectangle2D.Double(0,0,width, height));\r
584         box.setHint(ElementHints.KEY_TEXT, dada.toString());\r
585         box.setHint(ElementHints.KEY_OBJECT, dada);\r
586         return box;\r
587     }\r
588 \r
589     private static IElement createImage(IDiagram d, int x, int y, Image image) {\r
590         IElement result = Element.spawnNew( ImageClass.INSTANCE );\r
591         d.addElement(result);\r
592         ElementUtils.setPos(result, x, y);\r
593         result.setHint(ElementHints.KEY_IMAGE, image);\r
594         return result;\r
595     }\r
596 \r
597     public static IElement createShape(IDiagram d, Shape shape, double x, double y, Color color, Object dada)\r
598     {\r
599         IElement box = Element.spawnNew( ShapeClass.CIRCLE_CLASS );\r
600         d.addElement(box);\r
601         Move m = box.getElementClass().getSingleItem(Move.class);\r
602         FillColor ch = box.getElementClass().getSingleItem(FillColor.class);\r
603         ch.setFillColor(box, color);\r
604         m.moveTo(box, x, y);\r
605         box.setHint(ElementHints.KEY_TEXT, dada.toString());\r
606         box.setHint(ElementHints.KEY_OBJECT, dada);\r
607         return box;\r
608     }\r
609 \r
610     public static IElement createSlider(IDiagram d, double x, double y, double width, double height, Object dada)\r
611     {\r
612         IElement e = Element.spawnNew( SliderClass.SLIDER );\r
613         d.addElement(e);\r
614         Move m = e.getElementClass().getSingleItem(Move.class);\r
615         Resize s = e.getElementClass().getSingleItem(Resize.class);\r
616         m.moveTo(e, x, y);\r
617         s.resize(e, new Rectangle2D.Double(0,0,width, height));\r
618         e.setHint(ElementHints.KEY_OBJECT, dada);\r
619         return e;\r
620     }\r
621 \r
622     public static IElement createValve(IDiagram d, double x, double y, Object dada)\r
623     {\r
624         IElement e = Element.spawnNew( ValveClass.INSTANCE );\r
625         d.addElement(e);\r
626         Move m = e.getElementClass().getSingleItem(Move.class);\r
627         m.moveTo(e, x, y);\r
628         e.setHint(ElementHints.KEY_OBJECT, dada);\r
629         return e;\r
630     }\r
631 \r
632     public static IElement createWheel(IDiagram d, double x, double y, double width, double height, Object dada)\r
633     {\r
634         IElement e = Element.spawnNew( WheelClass.WHEEL );\r
635         d.addElement(e);\r
636 \r
637         ElementUtils.fitToRectangle(e, new Rectangle2D.Double(x, y, width, height));\r
638 \r
639         //Move m = e.getElementClass().getSingleItem(Move.class);\r
640         //Scale s = e.getElementClass().getSingleItem(Scale.class);\r
641         //m.move(e, new Point2D.Double(x, y));\r
642         //Point2D s.getScale(e)\r
643         //s.setScale(e, newScale)\r
644         e.setHint(ElementHints.KEY_OBJECT, dada);\r
645         return e;\r
646     }\r
647 \r
648     public static IElement createLabel(IDiagram d, double x, double y, Object dada, String label)\r
649     {\r
650         IElement e = Element.spawnNew( LabelClass.CLASS );\r
651         d.addElement(e);\r
652         Move m = e.getElementClass().getSingleItem(Move.class);\r
653         m.moveTo(e, x, y);\r
654 \r
655         ElementUtils.setText(e, label);\r
656 \r
657         e.setHint(ElementHints.KEY_OBJECT, dada);\r
658         return e;\r
659     }\r
660 \r
661     public static IElement createButton(IDiagram d, double x, double y, double width, double height, Object dada, String label)\r
662     {\r
663         IElement e = Element.spawnNew( ButtonClass.BUTTON_CLASS );\r
664         d.addElement(e);\r
665         Move m = e.getElementClass().getSingleItem(Move.class);\r
666         m.moveTo(e, x, y);\r
667         Resize s = e.getElementClass().getSingleItem(Resize.class);\r
668         s.resize(e, new Rectangle2D.Double(0,0,width, height));\r
669         Text t = e.getElementClass().getSingleItem(Text.class);\r
670         t.setText(e, label);\r
671         e.setHint(ElementHints.KEY_OBJECT, dada);\r
672         return e;\r
673     }\r
674 \r
675     public static IElement createFlag(IDiagram d, double x, double y, double dir, FlagClass.Type type, Color color, Object dada, String label)\r
676     {\r
677         return createFlag(d, x, y, dir, type, color, dada, label, FlagClass.Mode.External);\r
678     }\r
679 \r
680     public static IElement createFlag(IDiagram d, double x, double y, double dir, FlagClass.Type type, Color color, Object dada, String label, FlagClass.Mode mode)\r
681     {\r
682         IElement f = Element.spawnNew( FlagClass.FLAGCLASS );\r
683         d.addElement(f);\r
684         Move m = f.getElementClass().getSingleItem(Move.class);\r
685         FillColor ch = f.getElementClass().getSingleItem(FillColor.class);\r
686         ch.setFillColor(f, color);\r
687         m.moveTo(f, x, y);\r
688         Text t = f.getElementClass().getSingleItem(Text.class);\r
689         t.setText(f, label);\r
690         f.setHint(ElementHints.KEY_OBJECT, dada);\r
691         f.setHint(FlagClass.KEY_FLAG_TYPE, type);\r
692         f.setHint(FlagClass.KEY_FLAG_MODE, mode);\r
693         return f;\r
694     }\r
695 \r
696     public static IElement createToggleButton(IDiagram d, double x, double y, double width, double height, Object dada, String label)\r
697     {\r
698         IElement e = Element.spawnNew( ToggleButtonClass.BUTTON_CLASS );\r
699         d.addElement(e);\r
700         Move m = e.getElementClass().getSingleItem(Move.class);\r
701         m.moveTo(e, x, y);\r
702         Resize s = e.getElementClass().getSingleItem(Resize.class);\r
703         s.resize(e, new Rectangle2D.Double(0,0,width, height));\r
704         Text t = e.getElementClass().getSingleItem(Text.class);\r
705         t.setText(e, label);\r
706         e.setHint(ElementHints.KEY_OBJECT, dada);\r
707         return e;\r
708     }\r
709 \r
710     public static IElement connect(IDiagram d, IElement e1, int t1, IElement e2, int t2)\r
711     {\r
712         List<Terminal> boxTerminals = new ArrayList<Terminal>();\r
713         TerminalTopology boxNodeHandler = e1.getElementClass().getSingleItem(TerminalTopology.class);\r
714         boxNodeHandler.getTerminals(e1, boxTerminals);\r
715         Terminal _t1 = boxTerminals.get(t1);\r
716 \r
717         boxTerminals.clear();\r
718         boxNodeHandler = e2.getElementClass().getSingleItem(TerminalTopology.class);\r
719         boxNodeHandler.getTerminals(e2, boxTerminals);\r
720         Terminal _t2 = boxTerminals.get(t2);\r
721 \r
722         IElement edge = Element.spawnNew(EdgeClass.STRAIGHT);\r
723         d.addElement(edge);\r
724 \r
725         Object e1dada = e1.getHint(ElementHints.KEY_OBJECT);\r
726         Object e2dada = e2.getHint(ElementHints.KEY_OBJECT);\r
727         if (e1dada!=null && e2dada!=null)\r
728             edge.setHint(ElementHints.KEY_OBJECT, e1dada +" to "+e2dada);\r
729 \r
730         Topology topology = d.getDiagramClass().getSingleItem(Topology.class);\r
731         topology.connect(edge, EdgeEnd.Begin, e1, _t1);\r
732         topology.connect(edge, EdgeEnd.End, e2, _t2);\r
733         return edge;\r
734     }\r
735 \r
736     public static void validate(IDiagram d, ICanvasContext ctx)\r
737     {\r
738         // Validate\r
739         ArrayList<Issue> issues = new ArrayList<Issue>();\r
740         for (Validator v : d.getDiagramClass().getItemsByClass(Validator.class))\r
741         {\r
742             v.validate(d, ctx, issues);\r
743         }\r
744         List<Suggestion> suggestions = new ArrayList<Suggestion>();\r
745         for (Issue i : issues)\r
746         {\r
747             suggestions.clear();\r
748             i.addSuggestions(d, ctx, suggestions);\r
749             if (suggestions.size()==0) continue;\r
750             suggestions.get(0).fix(d, ctx);\r
751         }\r
752 \r
753     }\r
754 \r
755 }\r