1 /*******************************************************************************
\r
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g3d.scenegraph.structural;
\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
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
30 public abstract class ComponentNode<T extends Connection<T,T2>, T2 extends IComponentNode<T,T2>> extends Node implements IComponentNode<T, T2>{
\r
33 private String name;
\r
36 @RelatedGetValue(Layer0.URIs.HasName)
\r
37 @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")
\r
38 public String getName() {
\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
48 firePropertyChanged(Layer0.URIs.HasName);
\r
52 public String toString() {
\r
56 public boolean isPartOfInstantiatedModel() {
\r
57 return ctx.size() > 0;
\r
60 public boolean isExposed() {
\r
61 if (ctx.size() == 0)
\r
63 return getPublishedBy().contains(ctx.get(0));
\r
67 public boolean isInstantiatedModelRoot() {
\r
68 return ctx.size() == 1 && this.equals(ctx.get(0));
\r
72 public boolean isPublishable() {
\r
73 return !isPartOfInstantiatedModel();
\r
76 private List<IStructuralObject> ctx = new ArrayList<IStructuralObject>(1);
\r
78 public List<IStructuralObject> getContext() {
\r
83 public void setContext(List<IStructuralObject> object) {
\r
87 private List<IStructuralNode> publisher = new ArrayList<IStructuralNode>(1);
\r
91 protected abstract boolean isValidConnectionId(String id);
\r
94 public void connectionChanged(T c, T2 node, boolean add) {
\r
99 public void addPublishedBy(IStructuralNode node) {
\r
100 if (publisher.add(node))
\r
101 firePropertyChanged(G3D.URIs.publishes);
\r
105 public Collection<IStructuralNode> getPublishedBy() {
\r
110 public void removePublishedBy(IStructuralNode node) {
\r
111 if (publisher.remove(node))
\r
112 firePropertyChanged(G3D.URIs.publishes);
\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
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
136 public void addConnection(String id, T c) {
\r
137 assert(isValidConnectionId(id));
\r
138 if (!isPartOfInstantiatedModel())
\r
139 _addConnection(id, c);
\r
141 _addConnection(id+"/str", c);
\r
145 public void removeConnection(String id, T c) {
\r
146 assert(isValidConnectionId(id));
\r
147 if (!isPartOfInstantiatedModel())
\r
148 _removeConnection(id, c);
\r
150 _removeConnection(id+"/str", c);
\r
154 public void removeConnection(String id) {
\r
155 assert(isValidConnectionId(id));
\r
156 if (!isPartOfInstantiatedModel())
\r
157 _removeConnection(id);
\r
159 _removeConnection(id+"/str");
\r
162 private MapList<String, T> connections = new MapList<String, T>();
\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
172 protected void _addStrConnection(String id, T c) {
\r
173 _addConnection(id+"/str", c);
\r
176 protected MapList<String, T> _getConnections() {
\r
177 return connections;
\r
180 protected List<T> _getConnections(String id) {
\r
181 return connections.getValues(id);
\r
184 protected List<T> _getStrConnections(String id) {
\r
185 return _getConnections(id+"/str");
\r
188 protected void _removeConnection(String id, T c) {
\r
189 if (connections.remove(id, c)) {
\r
191 firePropertyChanged(id);
\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
203 protected void _removeStrConnection(String id, T c) {
\r
204 _removeConnection(id+"/str", c);
\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
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
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
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
241 return s.substring(0, s.length()-4);
\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
256 ids.add(s.substring(0, s.length()-4));
\r
264 public void remove() {
\r
265 List<T> connections = getAllConnections();
\r
266 for (T c : connections) {
\r
267 removeConnection(c);
\r