]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/flag/FlagUtil.java
Merge commit 'bd5bc6e45f700e755b61bd112631796631330ecb'
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / flag / FlagUtil.java
index 6f884e06afbf8651906977be9ac17df04802eb90..2a0e14b933aa7fad2c5c2364fd07b3c6f898796e 100644 (file)
@@ -28,6 +28,7 @@ import org.simantics.db.common.utils.NameUtils;
 import org.simantics.db.common.utils.OrderedSetUtils;\r
 import org.simantics.db.exception.DatabaseException;\r
 import org.simantics.db.exception.ServiceException;\r
+import org.simantics.db.function.DbBiFunction;\r
 import org.simantics.db.function.DbConsumer;\r
 import org.simantics.db.layer0.util.RemoverUtil;\r
 import org.simantics.db.layer0.variable.Variable;\r
@@ -130,6 +131,21 @@ public final class FlagUtil {
         return count;\r
     }\r
 \r
+    public static int forCounterparts(ReadGraph graph, Resource flag, DbBiFunction<Resource, Resource, Boolean> procedure) throws DatabaseException {\r
+        DiagramResource DIA = DiagramResource.getInstance(graph);\r
+        int count = 0;\r
+        for (Resource connectionJoin : graph.getObjects(flag, DIA.FlagIsJoinedBy)) {\r
+            for (Resource otherFlag : graph.getObjects(connectionJoin, DIA.JoinsFlag)) {\r
+                if (!flag.equals(otherFlag)) {\r
+                    if (!procedure.apply(connectionJoin, otherFlag))\r
+                        return ++count;\r
+                    ++count;\r
+                }\r
+            }\r
+        }\r
+        return count;\r
+    }\r
+\r
     /**\r
      * Returns all flags that are joined with the given flag including the flag given as parameter.\r
      */\r
@@ -247,14 +263,25 @@ public final class FlagUtil {
         RemoverUtil.remove(graph, flag);\r
     }\r
 \r
+    /**\r
+     * @param graph\r
+     * @param flag\r
+     * @return <code>true</code> only if the specified flag is joined only\r
+     *         within the single diagram it resides in\r
+     * @throws DatabaseException\r
+     */\r
     public static boolean isJoinedInSingleDiagram(ReadGraph graph, Resource flag) throws DatabaseException {\r
-        DiagramResource DIA = DiagramResource.getInstance(graph);\r
-        Resource counterpart = getPossibleCounterpart(graph, flag);\r
-        if (counterpart == null)\r
+        Collection<Resource> counterparts = getCounterparts(graph, flag);\r
+        if (counterparts.isEmpty())\r
             return false;\r
-        return !Collections.disjoint(\r
-                OrderedSetUtils.getOwnerLists(graph, flag, DIA.Diagram),\r
-                OrderedSetUtils.getOwnerLists(graph, counterpart, DIA.Diagram));\r
+        DiagramResource DIA = DiagramResource.getInstance(graph);\r
+        Collection<Resource> flagDiagrams = OrderedSetUtils.getOwnerLists(graph, flag, DIA.Diagram);\r
+        for (Resource counterpart : counterparts) {\r
+            if (Collections.disjoint(flagDiagrams,\r
+                    OrderedSetUtils.getOwnerLists(graph, counterpart, DIA.Diagram)))\r
+                return false;\r
+        }\r
+        return true;\r
     }\r
 \r
     public static boolean isJoinedBetweenDiagrams(ReadGraph graph, Resource flag) throws DatabaseException {\r