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
19 import org.simantics.g3d.ontology.G3D;
\r
20 import org.simantics.g3d.property.annotations.GetPropertyValue;
\r
21 import org.simantics.g3d.property.annotations.SetPropertyValue;
\r
22 import org.simantics.g3d.scenegraph.base.Node;
\r
23 import org.simantics.layer0.Layer0;
\r
24 import org.simantics.objmap.graph.annotations.RelatedGetValue;
\r
25 import org.simantics.objmap.graph.annotations.RelatedSetValue;
\r
26 import org.simantics.objmap.structural.IStructuralObject;
\r
27 import org.simantics.utils.datastructures.MapList;
\r
29 public abstract class ComponentNode<T extends Connection, T2 extends IComponentNode> extends Node implements IComponentNode<T, T2>{
\r
32 private String name;
\r
35 @RelatedGetValue(Layer0.URIs.HasName)
\r
36 @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")
\r
37 public String getName() {
\r
41 @RelatedSetValue(Layer0.URIs.HasName)
\r
42 @SetPropertyValue(Layer0.URIs.HasName)
\r
43 public void setName(String name) {
\r
47 firePropertyChanged(Layer0.URIs.HasName);
\r
51 public String toString() {
\r
55 public boolean isPartOfInstantiatedModel() {
\r
56 return ctx.size() > 0;
\r
59 public boolean isExposed() {
\r
60 if (ctx.size() == 0)
\r
62 return getPublishedBy().contains(ctx.get(0));
\r
66 public boolean isInstantiatedModelRoot() {
\r
67 return ctx.size() == 1 && this.equals(ctx.get(0));
\r
71 public boolean isPublishable() {
\r
72 return !isPartOfInstantiatedModel();
\r
75 private List<IStructuralObject> ctx = new ArrayList<IStructuralObject>(1);
\r
77 public List<IStructuralObject> getContext() {
\r
82 public void setContext(List<IStructuralObject> object) {
\r
86 private List<IStructuralNode> publisher = new ArrayList<IStructuralNode>(1);
\r
90 protected abstract boolean isValidConnectionId(String id);
\r
93 public void connectionChanged(T c, T2 node, boolean add) {
\r
98 public void addPublishedBy(IStructuralNode node) {
\r
99 publisher.add(node);
\r
100 firePropertyChanged(G3D.URIs.publishes);
\r
104 public Collection<IStructuralNode> getPublishedBy() {
\r
109 public void removePublishedBy(IStructuralNode node) {
\r
110 if (publisher.remove(node))
\r
111 firePropertyChanged(G3D.URIs.publishes);
\r
116 public List<T> getConnections(String id) {
\r
117 List<T> list = new ArrayList<T>();
\r
118 list.addAll(connections.getValues(id));
\r
119 list.addAll(connections.getValues(id+"/str"));
\r
123 public List<T2> getAllConnectedNodes() {
\r
124 List<T2> list = new ArrayList<T2>();
\r
125 for (T c : getAllConnections()) {
\r
126 T2 node = (T2)c.getOther(this);
\r
135 public void addConnection(String id, T c) {
\r
136 assert(isValidConnectionId(id));
\r
137 if (!isPartOfInstantiatedModel())
\r
138 _addConnection(id, c);
\r
140 _addConnection(id+"/str", c);
\r
144 public void removeConnection(String id, T c) {
\r
145 assert(isValidConnectionId(id));
\r
146 if (!isPartOfInstantiatedModel())
\r
147 _removeConnection(id, c);
\r
149 _removeConnection(id+"/str", c);
\r
153 public void removeConnection(String id) {
\r
154 assert(isValidConnectionId(id));
\r
155 if (!isPartOfInstantiatedModel())
\r
156 _removeConnection(id);
\r
158 _removeConnection(id+"/str");
\r
161 private MapList<String, T> connections = new MapList<String, T>();
\r
164 protected void _addConnection(String id, T c) {
\r
165 connections.add(id, c);
\r
166 c.addConnect(this);
\r
167 firePropertyChanged(id);
\r
170 protected void _addStrConnection(String id, T c) {
\r
171 _addConnection(id+"/str", c);
\r
174 protected MapList<String, T> _getConnections() {
\r
175 return connections;
\r
178 protected List<T> _getConnections(String id) {
\r
179 return connections.getValues(id);
\r
182 protected List<T> _getStrConnections(String id) {
\r
183 return _getConnections(id+"/str");
\r
186 protected void _removeConnection(String id, T c) {
\r
187 if (connections.remove(id, c)) {
\r
189 firePropertyChanged(id);
\r
193 protected void _removeConnection(String id) {
\r
194 List<T> conns = new ArrayList<T>();
\r
195 conns.addAll(_getConnections(id));
\r
196 for (T c : conns) {
\r
197 _removeConnection(id, c);
\r
201 protected void _removeStrConnection(String id, T c) {
\r
202 _removeConnection(id+"/str", c);
\r
205 public List<T> getAllConnections() {
\r
206 List<T> list = new ArrayList<T>();
\r
207 List<String> keys = new ArrayList<String>();
\r
208 keys.addAll(connections.getKeys());
\r
209 Collections.sort(keys);
\r
210 for (String s : keys)
\r
211 list.addAll(connections.getValues(s));
\r
215 public void removeConnection(T c) {
\r
216 String keys[] = connections.getKeys(new String[connections.getKeySize()]);
\r
217 for (String s : keys) {
\r
218 if (connections.contains(s, c))
\r
219 _removeConnection(s, c);
\r
223 public List<T2> getConnectedNodes(String id) {
\r
224 List<T2> list = new ArrayList<T2>();
\r
225 for (T c : getConnections(id)) {
\r
226 T2 node = (T2)c.getOther(this);
\r
234 public String getConnectionId(T c) {
\r
235 for (String s : connections.getKeys()) {
\r
236 if (connections.contains(s, c)) {
\r
237 if (!s.endsWith("/str"))
\r
239 return s.substring(0, s.length()-4);
\r
246 public Collection<String> getConnectionIds(T2 node) {
\r
247 Collection<String> ids = new ArrayList<String>();
\r
248 for (String s : connections.getKeys()) {
\r
249 for (T c : connections.getValues(s)) {
\r
250 if (node.equals(c.getOther(this))) {
\r
251 if (!s.endsWith("/str"))
\r
254 ids.add(s.substring(0, s.length()-4));
\r
262 public void remove() {
\r
263 List<T> connections = getAllConnections();
\r
264 for (T c : connections) {
\r
265 removeConnection(c);
\r