--- /dev/null
+package org.simantics.g3d.scenegraph.structural;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.List;\r
+\r
+import org.simantics.g3d.ontology.G3D;\r
+import org.simantics.g3d.property.annotations.GetPropertyValue;\r
+import org.simantics.g3d.property.annotations.SetPropertyValue;\r
+import org.simantics.g3d.scenegraph.base.ParentNode;\r
+import org.simantics.layer0.Layer0;\r
+import org.simantics.objmap.graph.annotations.RelatedGetValue;\r
+import org.simantics.objmap.graph.annotations.RelatedSetValue;\r
+import org.simantics.objmap.structural.IStructuralObject;\r
+\r
+public abstract class StructuralParentNode<T extends IStructuralNode> extends ParentNode<T> implements IStructuralNode{\r
+\r
+ private String name;\r
+ \r
+\r
+ @RelatedGetValue(Layer0.URIs.HasName)\r
+ @GetPropertyValue(value = Layer0.URIs.HasName, tabId = "Default", name = "Name")\r
+ public String getName() {\r
+ return name;\r
+ }\r
+ \r
+ @RelatedSetValue(Layer0.URIs.HasName)\r
+ @SetPropertyValue(Layer0.URIs.HasName)\r
+ public void setName(String name) {\r
+ if (name == null)\r
+ return;\r
+ this.name = name;\r
+ firePropertyChanged(Layer0.URIs.HasName);\r
+ }\r
+ \r
+ @Override\r
+ public String toString() {\r
+ return getName();\r
+ }\r
+ \r
+ public boolean isPartOfInstantiatedModel() {\r
+ return ctx.size() > 0;\r
+ }\r
+ \r
+ public boolean isExposed() {\r
+ if (ctx.size() == 0)\r
+ return true;\r
+ return getPublishedBy().contains(ctx.get(0));\r
+ }\r
+ \r
+ @Override\r
+ public boolean isInstantiatedModelRoot() {\r
+ return ctx.size() == 1 && this.equals(ctx.get(0));\r
+ }\r
+ \r
+ @Override\r
+ public boolean isPublishable() {\r
+ return !isPartOfInstantiatedModel();\r
+ }\r
+ \r
+ private List<IStructuralObject> ctx = new ArrayList<IStructuralObject>(1);\r
+ @Override\r
+ public List<IStructuralObject> getContext() {\r
+ return ctx;\r
+ }\r
+ \r
+ @Override\r
+ public void setContext(List<IStructuralObject> object) {\r
+ ctx = object;\r
+ }\r
+ \r
+ private List<IStructuralNode> publisher = new ArrayList<IStructuralNode>(1);\r
+ \r
+ @Override\r
+ public void addPublishedBy(IStructuralNode node) {\r
+ publisher.add(node);\r
+ firePropertyChanged(G3D.URIs.publishes);\r
+ }\r
+ \r
+ @Override\r
+ public Collection<IStructuralNode> getPublishedBy() {\r
+ return publisher;\r
+ }\r
+ \r
+ @Override\r
+ public void removePublishedBy(IStructuralNode node) {\r
+ if (publisher.remove(node))\r
+ firePropertyChanged(G3D.URIs.publishes);\r
+ }\r
+ \r
+ @Override\r
+ public void remove() {\r
+ IStructuralRootNode root = (IStructuralRootNode)getRootNode();\r
+ if (root.getPublished().contains(this))\r
+ root.removePublished(this);\r
+ \r
+ super.remove();\r
+ }\r
+}\r