]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.diagram/src/org/simantics/diagram/participant/TranslateMode2.java
Merge commit 'bd5bc6e45f700e755b61bd112631796631330ecb'
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / participant / TranslateMode2.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.diagram.participant;\r
13 \r
14 import java.awt.geom.AffineTransform;\r
15 import java.awt.geom.Point2D;\r
16 import java.awt.geom.Rectangle2D;\r
17 import java.util.ArrayList;\r
18 import java.util.Collection;\r
19 \r
20 import org.simantics.Simantics;\r
21 import org.simantics.db.Resource;\r
22 import org.simantics.db.WriteGraph;\r
23 import org.simantics.db.common.CommentMetadata;\r
24 import org.simantics.db.common.request.WriteRequest;\r
25 import org.simantics.db.exception.DatabaseException;\r
26 import org.simantics.diagram.content.ConnectionUtil;\r
27 import org.simantics.diagram.elements.ElementTransforms;\r
28 import org.simantics.diagram.elements.ElementTransforms.TransformedObject;\r
29 import org.simantics.diagram.flag.IOTableUtil;\r
30 import org.simantics.diagram.flag.IOTablesInfo;\r
31 import org.simantics.diagram.stubs.DiagramResource;\r
32 import org.simantics.diagram.ui.DiagramModelHints;\r
33 import org.simantics.g2d.canvas.Hints;\r
34 import org.simantics.g2d.diagram.participant.pointertool.TranslateMode;\r
35 import org.simantics.g2d.element.ElementHints;\r
36 import org.simantics.g2d.element.ElementUtils;\r
37 import org.simantics.g2d.element.IElement;\r
38 import org.simantics.g2d.element.handler.Move;\r
39 import org.simantics.scenegraph.g2d.IG2DNode;\r
40 import org.simantics.scenegraph.g2d.nodes.Decoration;\r
41 import org.simantics.scenegraph.utils.NodeUtil;\r
42 import org.simantics.utils.ui.ErrorLogger;\r
43 \r
44 /**\r
45  * This participant handles the diagram in translate elements mode with support\r
46  * for route graph connections.\r
47  * \r
48  * @author Tuukka Lehtonen\r
49  */\r
50 public class TranslateMode2 extends TranslateMode {\r
51 \r
52     public TranslateMode2(Point2D startingPoint, Point2D currentPoint, int mouseId, Collection<IElement> elements) {\r
53         super(startingPoint, currentPoint, mouseId, elements);\r
54     }\r
55 \r
56     @Override\r
57     protected boolean commit() {\r
58         for (IElement el : elementsToReallyTranslate) {\r
59             Move move = el.getElementClass().getAtMostOneItemOfClass(Move.class);\r
60             if (move != null) {\r
61                 Point2D oldPos = move.getPosition(el);\r
62                 move.moveTo(el, oldPos.getX() + dx, oldPos.getY() + dy);\r
63             }\r
64         }\r
65  \r
66         try {\r
67             Simantics.getSession().syncRequest(new WriteRequest() {\r
68                 @Override\r
69                 public void perform(WriteGraph graph) throws DatabaseException {\r
70                     DiagramResource DIA = DiagramResource.getInstance(graph);\r
71 \r
72                     Collection<TransformedObject> transformed = new ArrayList<TransformedObject>();\r
73                     for (IElement e : elementsToReallyTranslate) {\r
74                         Object obj = ElementUtils.getObject(e);\r
75                         if (obj instanceof Resource) {\r
76                             Resource r = (Resource) obj;\r
77                             if (graph.isInstanceOf(r, DIA.RouteGraphConnection))\r
78                                 continue;\r
79                             if (graph.isInstanceOf(r, DIA.Flag)) {\r
80                                 if(handleFlag(graph, DIA, e, r))\r
81                                     continue;\r
82                             }\r
83                             AffineTransform at = ElementUtils.getLocalTransform(e, new AffineTransform());\r
84                             transformed.add( new TransformedObject((Resource) obj, at) );\r
85                         }\r
86                     }\r
87 \r
88                     if (!transformed.isEmpty()) {\r
89                         CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
90                         graph.addMetadata(cm.add("Translated " + transformed.size() + " "\r
91                                 + (transformed.size() == 1 ? "element" : "elements")\r
92                                 + " by (" + dx + "," + dy + ") mm."));\r
93                         graph.markUndoPoint();\r
94                     }\r
95 \r
96                     // Normal transforms\r
97                     ElementTransforms.setTransformRequest(transformed).perform(graph);\r
98 \r
99                     // Custom handling for moving interior route nodes\r
100                     ConnectionUtil cu = new ConnectionUtil(graph);\r
101                     for (IElement c : translatedConnections) {\r
102                         Object obj = (Object) ElementUtils.getObject(c);\r
103                         if (obj instanceof Resource) {\r
104                             Resource connection = (Resource) obj;\r
105                             if (graph.isInstanceOf(connection, DIA.RouteGraphConnection)) {\r
106                                 cu.translateRouteNodes(connection, dx, dy);\r
107                             }\r
108                         }\r
109                     }\r
110                 }\r
111             });\r
112         } catch (DatabaseException err) {\r
113             ErrorLogger.defaultLogError(err);\r
114         }\r
115 \r
116         for (IElement dirty : elementsToDirty)\r
117             dirty.setHint(Hints.KEY_DIRTY, Hints.VALUE_SG_DIRTY);\r
118 \r
119         setDirty();\r
120         remove();\r
121         return false;\r
122     }\r
123     \r
124     IOTablesInfo ioTablesInfo = null;\r
125     \r
126     private boolean handleFlag(WriteGraph graph, DiagramResource DIA,\r
127             IElement flagElement, Resource flagResource) throws DatabaseException {\r
128         if(ioTablesInfo == null)\r
129             ioTablesInfo = IOTableUtil.getIOTablesInfo(graph, \r
130                     (Resource)diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RESOURCE));\r
131         \r
132         // Use the center of the flag for determining the table binding\r
133         Object sgNode = flagElement.getHint(ElementHints.KEY_SG_NODE);\r
134         if(!(sgNode instanceof IG2DNode))\r
135             return false;\r
136         Rectangle2D flagBounds = NodeUtil.getLocalBounds((IG2DNode)sgNode, Decoration.class);\r
137         Point2D translateVector = getTranslateVector();\r
138         double flagX = flagBounds.getCenterX()+translateVector.getX();\r
139         double flagY = flagBounds.getCenterY()+translateVector.getY();\r
140         return ioTablesInfo.updateBinding(graph, DIA, flagResource, flagX, flagY);\r
141     }\r
142 \r
143 }\r