package org.simantics.g3d.scenegraph.base; import java.util.ArrayList; import java.util.List; public abstract class Node implements INode { public transient static long IDCOUNTER = 1; protected transient ParentNode parent = null; protected transient String parentName = null; protected Long id = IDCOUNTER++; public Long getId() { return id; } public ParentNode getParent() { return parent; } @Override public String getParentRel() { return parentName; } public void setParent(ParentNode parent, String name) { this.parent = parent; this.parentName = name; } public ParentNode getRootNode() { return parent != null ? parent.getRootNode() : null; } public void remove() { if (parent != null) { parent.removeNode(parentName, this); } } public void deattach() { if (parent != null) { parent.deattachNode(parentName, this); } } public void init() { } public void cleanup() { if (parent != null) { parent.removeNode(parentName, this); } } @Override public String toString() { return getClass().getSimpleName(); } protected List listeners = new ArrayList(); @Override public void addListener(NodeListener listener) { if (!listeners.contains(listener)) listeners.add(listener); } @Override public void removeListener(NodeListener listener) { listeners.remove(listener); } @Override public List getListeners() { return listeners; } protected void firePropertyChanged(String id) { for (NodeListener listener : listeners) { listener.propertyChanged(this, id); } } }