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
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
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
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
}\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