1 package org.simantics.g3d.scenegraph.structural;
\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
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
18 public abstract class G3DComponentNode<T extends Connection, T2 extends IComponentNode> extends G3DNode implements IComponentNode<T, T2>{
\r
21 private String name;
\r
24 @RelatedGetValue(Layer0.URIs.HasName)
\r
25 @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")
\r
26 public String getName() {
\r
30 @RelatedSetValue(Layer0.URIs.HasName)
\r
31 @SetPropertyValue(Layer0.URIs.HasName)
\r
32 public void setName(String name) {
\r
36 firePropertyChanged(Layer0.URIs.HasName);
\r
40 public String toString() {
\r
44 public boolean isPartOfInstantiatedModel() {
\r
45 return ctx.size() > 0;
\r
48 public boolean isExposed() {
\r
49 if (ctx.size() == 0)
\r
51 return getPublishedBy().contains(ctx.get(0));
\r
55 public boolean isInstantiatedModelRoot() {
\r
56 return ctx.size() == 1 && this.equals(ctx.get(0));
\r
60 public boolean isPublishable() {
\r
61 return !isPartOfInstantiatedModel();
\r
64 private List<IStructuralObject> ctx = new ArrayList<IStructuralObject>(1);
\r
66 public List<IStructuralObject> getContext() {
\r
71 public void setContext(List<IStructuralObject> object) {
\r
75 private List<IStructuralNode> publisher = new ArrayList<IStructuralNode>(1);
\r
79 protected abstract boolean isValidConnectionId(String id);
\r
82 public void connectionChanged(T c, T2 node, boolean add) {
\r
87 public void addPublishedBy(IStructuralNode node) {
\r
88 publisher.add(node);
\r
89 firePropertyChanged(G3D.URIs.publishes);
\r
93 public Collection<IStructuralNode> getPublishedBy() {
\r
98 public void removePublishedBy(IStructuralNode node) {
\r
99 if (publisher.remove(node))
\r
100 firePropertyChanged(G3D.URIs.publishes);
\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
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
124 public void addConnection(String id, T c) {
\r
125 assert(isValidConnectionId(id));
\r
126 if (!isPartOfInstantiatedModel())
\r
127 _addConnection(id, c);
\r
129 _addConnection(id+"/str", c);
\r
133 public void removeConnection(String id, T c) {
\r
134 assert(isValidConnectionId(id));
\r
135 if (!isPartOfInstantiatedModel())
\r
136 _removeConnection(id, c);
\r
138 _removeConnection(id+"/str", c);
\r
142 public void removeConnection(String id) {
\r
143 assert(isValidConnectionId(id));
\r
144 if (!isPartOfInstantiatedModel())
\r
145 _removeConnection(id);
\r
147 _removeConnection(id+"/str");
\r
150 private MapList<String, T> connections = new MapList<String, T>();
\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
159 protected void _addStrConnection(String id, T c) {
\r
160 _addConnection(id+"/str", c);
\r
163 protected MapList<String, T> _getConnections() {
\r
164 return connections;
\r
167 protected List<T> _getConnections(String id) {
\r
168 return connections.getValues(id);
\r
171 protected List<T> _getStrConnections(String id) {
\r
172 return _getConnections(id+"/str");
\r
175 protected void _removeConnection(String id, T c) {
\r
176 if (connections.remove(id, c)) {
\r
178 firePropertyChanged(id);
\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
190 protected void _removeStrConnection(String id, T c) {
\r
191 _removeConnection(id+"/str", c);
\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
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
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
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
228 return s.substring(0, s.length()-4);
\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
243 ids.add(s.substring(0, s.length()-4));
\r
251 public void remove() {
\r
252 List<T> connections = getAllConnections();
\r
253 for (T c : connections) {
\r
254 removeConnection(c);
\r