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