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