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