]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/participant/ConnectionBuilder.java
Sync git svn branch with SVN repository r33324.
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / participant / ConnectionBuilder.java
index 6b78af1b8b9730d11aba55591a8b3834f6c91442..b36961f87a589595d939d3045c0482bd3e71939c 100644 (file)
@@ -70,6 +70,7 @@ import org.simantics.g2d.element.handler.EdgeVisuals.EdgeEnd;
 import org.simantics.g2d.element.impl.Element;\r
 import org.simantics.g2d.elementclass.BranchPoint;\r
 import org.simantics.g2d.elementclass.FlagClass;\r
+import org.simantics.g2d.elementclass.FlagClass.Type;\r
 import org.simantics.layer0.Layer0;\r
 import org.simantics.modeling.ModelingResources;\r
 import org.simantics.scl.runtime.tuple.Tuple2;\r
@@ -474,7 +475,8 @@ public class ConnectionBuilder {
             Resource attachToConnection,\r
             Resource attachToLine,\r
             Deque<ControlPoint> controlPoints,\r
-            TerminalInfo endTerminal)\r
+            TerminalInfo endTerminal,\r
+            FlagClass.Type flagType)\r
                     throws DatabaseException\r
     {\r
         initializeResources(graph);\r
@@ -501,9 +503,10 @@ public class ConnectionBuilder {
             if (endTerminal != null) {\r
                 endConnector = createConnectorForNode(graph, attachToConnection, endTerminal, EdgeEnd.End, judgment);\r
             } else if (createFlags) {\r
-                IElement endFlag = createFlag(graph, attachToConnection, EdgeEnd.End, controlPoints.getLast(), FlagClass.Type.Out, null);\r
+                EdgeEnd end = flagType == FlagClass.Type.In ? EdgeEnd.Begin : EdgeEnd.End;\r
+                IElement endFlag = createFlag(graph, attachToConnection, end, controlPoints.getLast(), flagType, null);\r
                 endConnector = createConnectorForNode(graph, attachToConnection, (Resource) ElementUtils.getObject(endFlag),\r
-                        ElementUtils.getSingleTerminal(endFlag), EdgeEnd.End, judgment);\r
+                        ElementUtils.getSingleTerminal(endFlag), end, judgment);\r
             }\r
 \r
             cu.connect(attachToLine, endConnector.getConnector());\r
@@ -548,6 +551,22 @@ public class ConnectionBuilder {
         Resource flagConnection = ConnectionUtil.getConnection(graph, flagConnector);\r
         Collection<Resource> flagRouteNodes = graph.getObjects(flagConnector, DIA.AreConnected);\r
 \r
+        Resource connectionToKeep = attachToConnection;\r
+        Resource connectionToRemove = flagConnection;\r
+        if (!connectionToKeep.equals(connectionToRemove)) {\r
+            Resource hasElementToComponent1 = graph.getPossibleObject(attachToConnection, MOD.ElementToComponent);\r
+            Resource hasElementToComponent2 = graph.getPossibleObject(flagConnection, MOD.ElementToComponent);\r
+            Type flagType = FlagUtil.getFlagType(graph, flagToRemove);\r
+            if (hasElementToComponent1 != null && hasElementToComponent2 != null)\r
+                throw new UnsupportedOperationException(\r
+                        "Both attached connection " + attachToConnection + " and flag connection " + flagConnection\r
+                        + " have mapped components, can't decide which connection to remove in join operation");\r
+            if (hasElementToComponent2 != null || flagType == Type.Out) {\r
+                connectionToKeep = flagConnection;\r
+                connectionToRemove = attachToConnection;\r
+            }\r
+        }\r
+\r
         // Remove flag and its connector.\r
         graph.deny(flagToConnector);\r
         new RemoveElement((Resource)diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RESOURCE), flagToRemove).perform(graph);\r
@@ -564,19 +583,26 @@ public class ConnectionBuilder {
             }\r
         }\r
 \r
-        for (Statement routeNode : graph.getStatements(flagConnection, DIA.HasInteriorRouteNode)) {\r
-            graph.deny(routeNode);\r
-            graph.claim(attachToConnection, routeNode.getPredicate(), routeNode.getObject());\r
-        }\r
-        for (Statement connector : graph.getStatements(flagConnection, DIA.HasConnector)) {\r
-            graph.deny(connector);\r
-            graph.claim(attachToConnection, connector.getPredicate(), connector.getObject());\r
-        }\r
+        moveStatements(graph, connectionToRemove, connectionToKeep, DIA.HasInteriorRouteNode);\r
+        moveStatements(graph, connectionToRemove, connectionToKeep, DIA.HasConnector);\r
+\r
+        // Remove obsolete connection\r
+        if (!connectionToKeep.equals(connectionToRemove))\r
+            cu.removeConnection(connectionToRemove);\r
 \r
         CommentMetadata cm = graph.getMetadata(CommentMetadata.class);\r
         graph.addMetadata(cm.add("Joined connection to disconnected flag"));\r
     }\r
 \r
+    private void moveStatements(WriteGraph graph, Resource source, Resource target, Resource movedRelation) throws DatabaseException {\r
+        if (!source.equals(target)) {\r
+            for (Statement s : graph.getStatements(source, movedRelation)) {\r
+                graph.deny(s);\r
+                graph.claim(target, s.getPredicate(), s.getObject());\r
+            }\r
+        }\r
+    }\r
+\r
     private Collection<Resource> removeUntilOrientedRouteline(WriteGraph graph, boolean expectedOrientation, Resource routeNode) throws DatabaseException {\r
         List<Resource> result = new ArrayList<>(2);\r
         Deque<Resource> work = new ArrayDeque<>(2);\r