]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.g3d/src/org/simantics/g3d/scenegraph/structural/ComponentNode.java
Remove listener calls when property values not updated.
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / g3d / scenegraph / structural / ComponentNode.java
1 /*******************************************************************************\r
2  * Copyright (c) 2012, 2013 Association for Decentralized Information Management in\r
3  * 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.g3d.scenegraph.structural;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.Collection;\r
16 import java.util.Collections;\r
17 import java.util.List;\r
18 import java.util.Objects;\r
19 \r
20 import org.simantics.g3d.ontology.G3D;\r
21 import org.simantics.g3d.property.annotations.GetPropertyValue;\r
22 import org.simantics.g3d.property.annotations.SetPropertyValue;\r
23 import org.simantics.g3d.scenegraph.base.Node;\r
24 import org.simantics.layer0.Layer0;\r
25 import org.simantics.objmap.graph.annotations.RelatedGetValue;\r
26 import org.simantics.objmap.graph.annotations.RelatedSetValue;\r
27 import org.simantics.objmap.structural.IStructuralObject;\r
28 import org.simantics.utils.datastructures.MapList;\r
29 \r
30 public abstract class ComponentNode<T extends Connection<T,T2>, T2 extends IComponentNode<T,T2>> extends Node implements IComponentNode<T, T2>{\r
31 \r
32         \r
33         private String name;\r
34         \r
35 \r
36         @RelatedGetValue(Layer0.URIs.HasName)\r
37         @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")\r
38         public String getName() {\r
39                 return name;\r
40         }\r
41         \r
42         @RelatedSetValue(Layer0.URIs.HasName)\r
43         @SetPropertyValue(Layer0.URIs.HasName)\r
44         public void setName(String name) {\r
45                 if (name == null || Objects.equals(this.name, name))\r
46                         return;\r
47                 this.name = name;\r
48                 firePropertyChanged(Layer0.URIs.HasName);\r
49         }\r
50         \r
51         @Override\r
52         public String toString() {\r
53                 return getName();\r
54         }\r
55         \r
56         public boolean isPartOfInstantiatedModel() {\r
57                 return ctx.size() > 0;\r
58         }\r
59         \r
60         public boolean isExposed() {\r
61                 if (ctx.size() == 0)\r
62                         return true;\r
63                 return getPublishedBy().contains(ctx.get(0));\r
64         }\r
65         \r
66         @Override\r
67         public boolean isInstantiatedModelRoot() {\r
68                 return ctx.size() == 1 && this.equals(ctx.get(0));\r
69         }\r
70         \r
71         @Override\r
72         public boolean isPublishable() {\r
73                 return !isPartOfInstantiatedModel();\r
74         }\r
75         \r
76         private List<IStructuralObject> ctx = new ArrayList<IStructuralObject>(1);\r
77         @Override\r
78         public List<IStructuralObject> getContext() {\r
79                 return ctx;\r
80         }\r
81         \r
82         @Override\r
83         public void setContext(List<IStructuralObject> object) {\r
84                 ctx = object;\r
85         }\r
86         \r
87         private List<IStructuralNode> publisher = new ArrayList<IStructuralNode>(1);\r
88         \r
89         \r
90         \r
91         protected abstract boolean isValidConnectionId(String id);\r
92         \r
93         @Override\r
94         public void connectionChanged(T c, T2 node, boolean add) {\r
95                 \r
96         }\r
97         \r
98         @Override\r
99         public void addPublishedBy(IStructuralNode node) {\r
100                 if (publisher.add(node))\r
101                         firePropertyChanged(G3D.URIs.publishes);\r
102         }\r
103         \r
104         @Override\r
105         public Collection<IStructuralNode> getPublishedBy() {\r
106                 return publisher;\r
107         }\r
108         \r
109         @Override\r
110         public void removePublishedBy(IStructuralNode node) {\r
111                 if (publisher.remove(node))\r
112                         firePropertyChanged(G3D.URIs.publishes);\r
113         }\r
114         \r
115         \r
116         @Override\r
117         public List<T> getConnections(String id) {\r
118                 List<T> list = new ArrayList<T>();\r
119                 list.addAll(connections.getValues(id));\r
120                 list.addAll(connections.getValues(id+"/str"));\r
121                 return list;\r
122         }       \r
123         \r
124         public List<T2> getAllConnectedNodes() {\r
125                 List<T2> list = new ArrayList<T2>();\r
126                 for (T c : getAllConnections()) {\r
127                         T2 node = c.getOther(this);\r
128                         if (node != null)\r
129                                 list.add(node);\r
130                 }\r
131                 return list;\r
132         }\r
133         \r
134         \r
135         @Override\r
136         public void addConnection(String id, T c) {\r
137                 assert(isValidConnectionId(id));\r
138                 if (!isPartOfInstantiatedModel())\r
139                         _addConnection(id, c);\r
140                 else\r
141                         _addConnection(id+"/str", c);\r
142         }\r
143         \r
144         @Override\r
145         public void removeConnection(String id, T c) {\r
146                 assert(isValidConnectionId(id));\r
147                 if (!isPartOfInstantiatedModel())\r
148                         _removeConnection(id, c);\r
149                 else\r
150                         _removeConnection(id+"/str", c);\r
151         }\r
152         \r
153         @Override\r
154         public void removeConnection(String id) {\r
155                 assert(isValidConnectionId(id));\r
156                 if (!isPartOfInstantiatedModel())\r
157                         _removeConnection(id);\r
158                 else\r
159                         _removeConnection(id+"/str");\r
160         }\r
161         \r
162         private MapList<String, T> connections = new MapList<String, T>();\r
163         \r
164         \r
165         @SuppressWarnings("unchecked")\r
166         protected void _addConnection(String id, T c) {\r
167                 connections.add(id, c);\r
168                 c.addConnect((T2) this);\r
169                 firePropertyChanged(id);\r
170         }\r
171         \r
172         protected void _addStrConnection(String id, T c) {\r
173                 _addConnection(id+"/str", c);\r
174         }\r
175         \r
176         protected  MapList<String, T> _getConnections() {\r
177                 return connections;\r
178         }\r
179         \r
180         protected  List<T> _getConnections(String id) {\r
181                 return connections.getValues(id);\r
182         }\r
183         \r
184         protected  List<T> _getStrConnections(String id) {\r
185                 return _getConnections(id+"/str");\r
186         }\r
187         \r
188         protected void _removeConnection(String id, T c) {\r
189                 if (connections.remove(id, c)) {\r
190                         c.remove();\r
191                         firePropertyChanged(id);\r
192                 }\r
193         }\r
194         \r
195         protected void _removeConnection(String id) {\r
196                 List<T> conns = new ArrayList<T>();\r
197                 conns.addAll(_getConnections(id));\r
198                 for (T c : conns) {\r
199                         _removeConnection(id, c);\r
200                 }\r
201         }\r
202         \r
203         protected void _removeStrConnection(String id, T c) {\r
204                 _removeConnection(id+"/str", c);\r
205         }\r
206         \r
207         public List<T> getAllConnections() {\r
208                 List<T> list = new ArrayList<T>();\r
209                 List<String> keys = new ArrayList<String>();\r
210                 keys.addAll(connections.getKeys());\r
211                 Collections.sort(keys);\r
212                 for (String s : keys)\r
213                         list.addAll(connections.getValues(s));\r
214                 return list;\r
215         }\r
216         \r
217         public void removeConnection(T c) {\r
218                 String keys[] = connections.getKeys(new String[connections.getKeySize()]);\r
219                 for (String s : keys) {\r
220                         if (connections.contains(s, c))\r
221                                 _removeConnection(s, c);\r
222                 }\r
223         }\r
224         \r
225         public List<T2> getConnectedNodes(String id) {\r
226                 List<T2> list = new ArrayList<T2>();\r
227                 for (T c : getConnections(id)) {\r
228                         T2 node = c.getOther(this);\r
229                         if (node != null)\r
230                                 list.add(node);\r
231                 }\r
232                 return list;\r
233         }\r
234         \r
235         @Override\r
236         public String getConnectionId(T c) {\r
237                 for (String s : connections.getKeys()) {\r
238                         if (connections.contains(s, c)) {\r
239                                 if (!s.endsWith("/str"))\r
240                                         return s;\r
241                                 return s.substring(0, s.length()-4);\r
242                         }\r
243                 }\r
244                 return null;\r
245         }\r
246         \r
247         @Override\r
248         public Collection<String> getConnectionIds(T2 node) {\r
249                 Collection<String> ids = new ArrayList<String>();\r
250                 for (String s : connections.getKeys()) {\r
251                         for (T c : connections.getValues(s)) {\r
252                                 if (node.equals(c.getOther(this))) {\r
253                                         if (!s.endsWith("/str"))\r
254                                                 ids.add(s);\r
255                                         else\r
256                                                 ids.add(s.substring(0, s.length()-4));\r
257                                 }\r
258                         }\r
259                 }\r
260                 return ids;\r
261         }\r
262         \r
263         @Override\r
264         public void remove() {\r
265                 List<T> connections = getAllConnections();\r
266                 for (T c : connections) {\r
267                         removeConnection(c);\r
268                 }\r
269                 super.remove();\r
270         \r
271         }\r
272 }\r