]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/content/DiagramContentChanges.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / content / DiagramContentChanges.java
diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/content/DiagramContentChanges.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/content/DiagramContentChanges.java
new file mode 100644 (file)
index 0000000..5c64881
--- /dev/null
@@ -0,0 +1,141 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.diagram.content;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+\r
+import java.util.Collections;\r
+import java.util.HashSet;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.simantics.db.Resource;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class DiagramContentChanges {\r
+\r
+    public final Map<Resource, Change>        elements;\r
+    public final Map<Resource, Change>        nodes;\r
+    public final Map<Resource, Change>        connections;\r
+    public final Map<EdgeResource, Change>    connectionSegments;\r
+    public final Map<Resource, Change>        branchPoints;\r
+\r
+    public final Map<Resource, Change>        routeGraphConnections;\r
+    public final Map<EdgeResource, Change>    routeLinks;\r
+    public final Map<Resource, Change>        routeLines;\r
+    public final Map<Resource, Change>        routePoints;\r
+\r
+    public boolean                            elementOrderChanged = false;\r
+\r
+    public static final DiagramContentChanges EMPTY;\r
+\r
+    static {\r
+        EMPTY = new DiagramContentChanges(true);\r
+    }\r
+\r
+    private DiagramContentChanges(boolean empty) {\r
+        this.elements = Collections.emptyMap();\r
+        this.nodes = Collections.emptyMap();\r
+        this.connections = Collections.emptyMap();\r
+        this.connectionSegments = Collections.emptyMap();\r
+        this.branchPoints = Collections.emptyMap();\r
+        this.routeGraphConnections = Collections.emptyMap();\r
+        this.routeLinks = Collections.emptyMap();\r
+        this.routeLines = Collections.emptyMap();\r
+        this.routePoints = Collections.emptyMap();\r
+    }\r
+\r
+    public DiagramContentChanges() {\r
+        this.elements = new THashMap<Resource, Change>();\r
+        this.nodes = new THashMap<Resource, Change>();\r
+        this.connections = new THashMap<Resource, Change>();\r
+        this.connectionSegments = new THashMap<EdgeResource, Change>();\r
+        this.branchPoints = new THashMap<Resource, Change>();\r
+        this.routeGraphConnections = new THashMap<Resource, Change>();\r
+        this.routeLinks = new THashMap<EdgeResource, Change>();\r
+        this.routeLines = new THashMap<Resource, Change>();\r
+        this.routePoints = new THashMap<Resource, Change>();\r
+    }\r
+\r
+    public void markElementOrderChanged() {\r
+        elementOrderChanged = true;\r
+    }\r
+\r
+    public boolean isEmpty() {\r
+        return elements.isEmpty()\r
+        && nodes.isEmpty()\r
+        && connections.isEmpty()\r
+        && connectionSegments.isEmpty()\r
+        && branchPoints.isEmpty()\r
+        && routeGraphConnections.isEmpty()\r
+        && routeLinks.isEmpty()\r
+        && routeLines.isEmpty()\r
+        && routePoints.isEmpty()\r
+        && !elementOrderChanged;\r
+    }\r
+\r
+    public <T> Set<T> pick(Map<T, Change> map, Change change) {\r
+        Set<T> result = new HashSet<T>();\r
+        for (Map.Entry<T, Change> entry : map.entrySet()) {\r
+            if (entry.getValue() == change)\r
+                result.add(entry.getKey());\r
+        }\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+        StringBuilder sb = new StringBuilder();\r
+        sb.append(getClass().getSimpleName());\r
+        sb.append("[elements=");\r
+        sb.append(toString(count(elements)));\r
+        sb.append(", nodes=");\r
+        sb.append(toString(count(nodes)));\r
+        sb.append(", connection=");\r
+        sb.append(toString(count(connections)));\r
+        sb.append(", connection segments=");\r
+        sb.append(toString(count(connectionSegments)));\r
+        sb.append(", branch points=");\r
+        sb.append(toString(count(branchPoints)));\r
+        sb.append(", routegraph connections=");\r
+        sb.append(toString(count(routeGraphConnections)));\r
+        sb.append(", route links=");\r
+        sb.append(toString(count(routeLinks)));\r
+        sb.append(", route lines=");\r
+        sb.append(toString(count(routeLines)));\r
+        sb.append(", route points=");\r
+        sb.append(toString(count(routePoints)));\r
+        sb.append(", element order changed=");\r
+        sb.append(elementOrderChanged);\r
+        sb.append("]");\r
+        return sb.toString();\r
+    }\r
+\r
+    private static String toString(int[] changes) {\r
+        return\r
+        "[" + Change.ADDED.toString() + "=" + changes[Change.ADDED.ordinal()] +\r
+        ", " + Change.REMOVED.toString() + "=" + changes[Change.REMOVED.ordinal()] +\r
+        //", " + Change.POSSIBLY_MODIFIED.toString() + "=" + changes[Change.POSSIBLY_MODIFIED.ordinal()] +\r
+        "]";\r
+    }\r
+\r
+    private static int[] count(Map<?, Change> map) {\r
+        int[] result = new int[Change.values().length];\r
+        for (Change change : map.values()) {\r
+            result[change.ordinal()]++;\r
+        }\r
+        return result;\r
+    }\r
+\r
+}
\ No newline at end of file