]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.diagram.content;\r
13 \r
14 import gnu.trove.map.hash.THashMap;\r
15 \r
16 import java.util.Collections;\r
17 import java.util.HashSet;\r
18 import java.util.Map;\r
19 import java.util.Set;\r
20 \r
21 import org.simantics.db.Resource;\r
22 \r
23 /**\r
24  * @author Tuukka Lehtonen\r
25  */\r
26 public class DiagramContentChanges {\r
27 \r
28     public final Map<Resource, Change>        elements;\r
29     public final Map<Resource, Change>        nodes;\r
30     public final Map<Resource, Change>        connections;\r
31     public final Map<EdgeResource, Change>    connectionSegments;\r
32     public final Map<Resource, Change>        branchPoints;\r
33 \r
34     public final Map<Resource, Change>        routeGraphConnections;\r
35     public final Map<EdgeResource, Change>    routeLinks;\r
36     public final Map<Resource, Change>        routeLines;\r
37     public final Map<Resource, Change>        routePoints;\r
38 \r
39     public boolean                            elementOrderChanged = false;\r
40 \r
41     public static final DiagramContentChanges EMPTY;\r
42 \r
43     static {\r
44         EMPTY = new DiagramContentChanges(true);\r
45     }\r
46 \r
47     private DiagramContentChanges(boolean empty) {\r
48         this.elements = Collections.emptyMap();\r
49         this.nodes = Collections.emptyMap();\r
50         this.connections = Collections.emptyMap();\r
51         this.connectionSegments = Collections.emptyMap();\r
52         this.branchPoints = Collections.emptyMap();\r
53         this.routeGraphConnections = Collections.emptyMap();\r
54         this.routeLinks = Collections.emptyMap();\r
55         this.routeLines = Collections.emptyMap();\r
56         this.routePoints = Collections.emptyMap();\r
57     }\r
58 \r
59     public DiagramContentChanges() {\r
60         this.elements = new THashMap<Resource, Change>();\r
61         this.nodes = new THashMap<Resource, Change>();\r
62         this.connections = new THashMap<Resource, Change>();\r
63         this.connectionSegments = new THashMap<EdgeResource, Change>();\r
64         this.branchPoints = new THashMap<Resource, Change>();\r
65         this.routeGraphConnections = new THashMap<Resource, Change>();\r
66         this.routeLinks = new THashMap<EdgeResource, Change>();\r
67         this.routeLines = new THashMap<Resource, Change>();\r
68         this.routePoints = new THashMap<Resource, Change>();\r
69     }\r
70 \r
71     public void markElementOrderChanged() {\r
72         elementOrderChanged = true;\r
73     }\r
74 \r
75     public boolean isEmpty() {\r
76         return elements.isEmpty()\r
77         && nodes.isEmpty()\r
78         && connections.isEmpty()\r
79         && connectionSegments.isEmpty()\r
80         && branchPoints.isEmpty()\r
81         && routeGraphConnections.isEmpty()\r
82         && routeLinks.isEmpty()\r
83         && routeLines.isEmpty()\r
84         && routePoints.isEmpty()\r
85         && !elementOrderChanged;\r
86     }\r
87 \r
88     public <T> Set<T> pick(Map<T, Change> map, Change change) {\r
89         Set<T> result = new HashSet<T>();\r
90         for (Map.Entry<T, Change> entry : map.entrySet()) {\r
91             if (entry.getValue() == change)\r
92                 result.add(entry.getKey());\r
93         }\r
94         return result;\r
95     }\r
96 \r
97     @Override\r
98     public String toString() {\r
99         StringBuilder sb = new StringBuilder();\r
100         sb.append(getClass().getSimpleName());\r
101         sb.append("[elements=");\r
102         sb.append(toString(count(elements)));\r
103         sb.append(", nodes=");\r
104         sb.append(toString(count(nodes)));\r
105         sb.append(", connection=");\r
106         sb.append(toString(count(connections)));\r
107         sb.append(", connection segments=");\r
108         sb.append(toString(count(connectionSegments)));\r
109         sb.append(", branch points=");\r
110         sb.append(toString(count(branchPoints)));\r
111         sb.append(", routegraph connections=");\r
112         sb.append(toString(count(routeGraphConnections)));\r
113         sb.append(", route links=");\r
114         sb.append(toString(count(routeLinks)));\r
115         sb.append(", route lines=");\r
116         sb.append(toString(count(routeLines)));\r
117         sb.append(", route points=");\r
118         sb.append(toString(count(routePoints)));\r
119         sb.append(", element order changed=");\r
120         sb.append(elementOrderChanged);\r
121         sb.append("]");\r
122         return sb.toString();\r
123     }\r
124 \r
125     private static String toString(int[] changes) {\r
126         return\r
127         "[" + Change.ADDED.toString() + "=" + changes[Change.ADDED.ordinal()] +\r
128         ", " + Change.REMOVED.toString() + "=" + changes[Change.REMOVED.ordinal()] +\r
129         //", " + Change.POSSIBLY_MODIFIED.toString() + "=" + changes[Change.POSSIBLY_MODIFIED.ordinal()] +\r
130         "]";\r
131     }\r
132 \r
133     private static int[] count(Map<?, Change> map) {\r
134         int[] result = new int[Change.values().length];\r
135         for (Change change : map.values()) {\r
136             result[change.ordinal()]++;\r
137         }\r
138         return result;\r
139     }\r
140 \r
141 }