--- /dev/null
+/*******************************************************************************\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