1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
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
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.g2d.example;
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;
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;
99 * @author Toni Kalajainen
101 public class TestCanvas {
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);
109 public static CanvasContext createDefaultCanvas(IThreadWorkQueue thread)
111 // Create canvas context and a layer of interactors
112 CanvasContext canvasContext = new CanvasContext(thread);
113 IHintContext h = canvasContext.getDefaultHintContext();
115 canvasContext.add( new PanZoomRotateHandler() ); // Must be before TransformUtil
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() );
125 // Debug participant(s)
126 //canvasContext.add( new PointerPainter() );
127 // canvasContext.add( new HandPainter() );
128 h.setHint(PointerPainter.KEY_PAINT_POINTER, true);
130 // Pan & Zoom & Rotate
131 //canvasContext.add( new MousePanZoomInteractor() );
132 //canvasContext.add( new MultitouchPanZoomRotateInteractor() );
133 //canvasContext.add( new OrientationRestorer() );
135 // Grid & Ruler & Background
136 canvasContext.add( new GridPainter() );
137 canvasContext.add( new RulerPainter() );
138 canvasContext.add( new BackgroundPainter() );
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);
146 canvasContext.add( new KeyToCommand( CommandKeyBinding.DEFAULT_BINDINGS ) );
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());
161 canvasContext.add( new TooltipParticipant());
163 h.setHint(Hints.KEY_TOOL, Hints.POINTERTOOL);
166 return canvasContext;
169 public static IDiagram createMultilevelDiagram(ICanvasContext ctx)
171 IDiagram loading = LoadingMessageDiagram.createLoadingDiagram();
172 IDiagram d1 = createDiagram1();
173 IDiagram d2 = createDiagram2();
174 IDiagram d3 = createDiagram3();
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);
189 * Create diagram editor
193 * @param localSession
196 public static CanvasContext createTestCanvas(IThreadWorkQueue thread)
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);
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();
213 // validate(d1, canvasContext);
214 // validate(d2, canvasContext);
215 // validate(d3, canvasContext);
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) );
226 // IDiagram d = loading;
227 //h.setHint(DiagramHints.KEY_DIAGRAM, d);
228 h.setHint(DiagramHints.KEY_DIAGRAM, uid);
231 final IElement button = ElementUtils.getByData(wd, "button");
232 System.out.println(button.getDiagram());
233 ElementUtils.addClickListener(button, canvasContext, new ClickListener() {
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);
242 // Draw UI Layer on top of the diagram
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) );
255 // ElementDiagram ed = new ElementDiagram(canvasContext) {
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);
268 // ed.setDiagram(uid);
270 return canvasContext;
273 public static IDiagram createUIDiagram(IElement forElement)
275 String name = "User Interface Diagram";
276 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
277 d.setHint(DiagramHints.KEY_TEXT, name);
279 IElement film = Element.spawnNew(FilmClass.FILM_CLASS);
280 ElementUtils.fitToRectangle(film, new Rectangle2D.Double(0, 10, 200, 160));
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);
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");
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);
300 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
305 public static IDiagram createUIDiagram()
307 String name = "User Interface Diagram";
308 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
309 d.setHint(DiagramHints.KEY_TEXT, name);
311 IElement film = Element.spawnNew(FilmClass.FILM_CLASS);
312 ElementUtils.fitToRectangle(film, new Rectangle2D.Double(0, 10, 200, 160));
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);
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");
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() {
334 public String getTooltipText(IElement element) {
335 return element.toString();
338 apply.setHint(TooltipParticipant.TOOLTIP_KEY, new EditableTextTooltipProvider2() {
341 public void setText(IElement element, String text) {
342 ElementUtils.setText(element, text);
346 public String getTooltipText(IElement element) {
347 return ElementUtils.getText(element);
351 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
356 public static IDiagram createConnectTestDiagram()
358 String name = "Diagram";
359 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
360 d.setHint(DiagramHints.KEY_TEXT, name);
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);
367 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
372 public static IDiagram createAnchorTestDiagram()
374 String name = "Diagram";
375 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
376 d.setHint(DiagramHints.KEY_TEXT, name);
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");
382 ElementParentTransform pt = (ElementParentTransform)box3.getElementClass().getSingleItem(ParentTransform.class);
383 pt.setParent(box3, box2);
385 connect(d, box1, 4, box2, 8);
386 createLabel(d, 50, 90, "label", name);
388 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
394 public static IDiagram createFlagTestDiagram()
396 String name = "Diagram";
397 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
398 d.setHint(DiagramHints.KEY_TEXT, name);
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");
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!"});
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);
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);
424 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
429 public static IDiagram createDiagram1()
431 String name = "Diagram Level 1";
432 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
433 d.setHint(DiagramHints.KEY_TEXT, name);
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);
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");
445 IElement image = createImage(d, 400, 400, DefaultImages.UNKNOWN.get());
447 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
453 public static IDiagram createDiagram2()
455 String name = "Diagram Level 2";
456 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
457 d.setHint(DiagramHints.KEY_TEXT, name);
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);
472 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
477 public static IDiagram createDiagram3()
479 String name = "Diagram Level 3";
480 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
481 d.setHint(DiagramHints.KEY_TEXT, name);
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);
508 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
513 public static IDiagram createWidgetsDiagram()
515 String name = "Test Diagram";
516 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
517 d.setHint(DiagramHints.KEY_TEXT, name);
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");
524 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
529 public static IDiagram createOperationSymbolsDiagram()
531 String name = "Operation Symbols Diagram";
532 IDiagram d = Diagram.spawnNew(DiagramClass.DEFAULT);
533 d.setHint(DiagramHints.KEY_TEXT, name);
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");
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");
555 createShape(d, new Ellipse2D.Double(-10, -10, 20, 20), -50, 0, Color.RED, "circle");
557 d.setHint(DiagramHints.KEY_MUTATOR, new DummyDiagramMutator(d));
562 public static IElement createSymbol(IDiagram d, ElementClass clazz, double x, double y, Object dada)
564 IElement box = Element.spawnNew( clazz );
566 Move m = box.getElementClass().getSingleItem(Move.class);
568 box.setHint(ElementHints.KEY_TEXT, dada.toString());
569 box.setHint(ElementHints.KEY_OBJECT, dada);
574 public static IElement createBox(IDiagram d, double x, double y, double width, double height, Color color, Object dada)
576 IElement box = Element.spawnNew( BoxClass.BOXCLASS.newClassWith(ElementParentTransform.INSTANCE) );
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);
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);
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);
597 public static IElement createShape(IDiagram d, Shape shape, double x, double y, Color color, Object dada)
599 IElement box = Element.spawnNew( ShapeClass.CIRCLE_CLASS );
601 Move m = box.getElementClass().getSingleItem(Move.class);
602 FillColor ch = box.getElementClass().getSingleItem(FillColor.class);
603 ch.setFillColor(box, color);
605 box.setHint(ElementHints.KEY_TEXT, dada.toString());
606 box.setHint(ElementHints.KEY_OBJECT, dada);
610 public static IElement createSlider(IDiagram d, double x, double y, double width, double height, Object dada)
612 IElement e = Element.spawnNew( SliderClass.SLIDER );
614 Move m = e.getElementClass().getSingleItem(Move.class);
615 Resize s = e.getElementClass().getSingleItem(Resize.class);
617 s.resize(e, new Rectangle2D.Double(0,0,width, height));
618 e.setHint(ElementHints.KEY_OBJECT, dada);
622 public static IElement createValve(IDiagram d, double x, double y, Object dada)
624 IElement e = Element.spawnNew( ValveClass.INSTANCE );
626 Move m = e.getElementClass().getSingleItem(Move.class);
628 e.setHint(ElementHints.KEY_OBJECT, dada);
632 public static IElement createWheel(IDiagram d, double x, double y, double width, double height, Object dada)
634 IElement e = Element.spawnNew( WheelClass.WHEEL );
637 ElementUtils.fitToRectangle(e, new Rectangle2D.Double(x, y, width, height));
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);
648 public static IElement createLabel(IDiagram d, double x, double y, Object dada, String label)
650 IElement e = Element.spawnNew( LabelClass.CLASS );
652 Move m = e.getElementClass().getSingleItem(Move.class);
655 ElementUtils.setText(e, label);
657 e.setHint(ElementHints.KEY_OBJECT, dada);
661 public static IElement createButton(IDiagram d, double x, double y, double width, double height, Object dada, String label)
663 IElement e = Element.spawnNew( ButtonClass.BUTTON_CLASS );
665 Move m = e.getElementClass().getSingleItem(Move.class);
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);
671 e.setHint(ElementHints.KEY_OBJECT, dada);
675 public static IElement createFlag(IDiagram d, double x, double y, double dir, FlagClass.Type type, Color color, Object dada, String label)
677 return createFlag(d, x, y, dir, type, color, dada, label, FlagClass.Mode.External);
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)
682 IElement f = Element.spawnNew( FlagClass.FLAGCLASS );
684 Move m = f.getElementClass().getSingleItem(Move.class);
685 FillColor ch = f.getElementClass().getSingleItem(FillColor.class);
686 ch.setFillColor(f, color);
688 Text t = f.getElementClass().getSingleItem(Text.class);
690 f.setHint(ElementHints.KEY_OBJECT, dada);
691 f.setHint(FlagClass.KEY_FLAG_TYPE, type);
692 f.setHint(FlagClass.KEY_FLAG_MODE, mode);
696 public static IElement createToggleButton(IDiagram d, double x, double y, double width, double height, Object dada, String label)
698 IElement e = Element.spawnNew( ToggleButtonClass.BUTTON_CLASS );
700 Move m = e.getElementClass().getSingleItem(Move.class);
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);
706 e.setHint(ElementHints.KEY_OBJECT, dada);
710 public static IElement connect(IDiagram d, IElement e1, int t1, IElement e2, int t2)
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);
717 boxTerminals.clear();
718 boxNodeHandler = e2.getElementClass().getSingleItem(TerminalTopology.class);
719 boxNodeHandler.getTerminals(e2, boxTerminals);
720 Terminal _t2 = boxTerminals.get(t2);
722 IElement edge = Element.spawnNew(EdgeClass.STRAIGHT);
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);
730 Topology topology = d.getDiagramClass().getSingleItem(Topology.class);
731 topology.connect(edge, EdgeEnd.Begin, e1, _t1);
732 topology.connect(edge, EdgeEnd.End, e2, _t2);
736 public static void validate(IDiagram d, ICanvasContext ctx)
739 ArrayList<Issue> issues = new ArrayList<Issue>();
740 for (Validator v : d.getDiagramClass().getItemsByClass(Validator.class))
742 v.validate(d, ctx, issues);
744 List<Suggestion> suggestions = new ArrayList<Suggestion>();
745 for (Issue i : issues)
748 i.addSuggestions(d, ctx, suggestions);
749 if (suggestions.size()==0) continue;
750 suggestions.get(0).fix(d, ctx);