--- /dev/null
+package com.quantum.view.bookmark;
+
+import java.beans.PropertyChangeEvent;
+import java.util.Iterator;
+import java.util.Vector;
+
+import com.quantum.QuantumPlugin;
+import com.quantum.model.Bookmark;
+import com.quantum.model.BookmarkHolder;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Base class for all nodes of the internal tree of data. Basically allows navigation.
+ * @author root
+ */
+public abstract class TreeNode
+ implements BookmarkHolder, Comparable, IAdaptable {
+
+ private TreeNode parent = null;
+ protected Vector children = new Vector();
+ private boolean disposed = false;
+
+ public TreeNode(TreeNode parent) {
+ this.parent = parent;
+ }
+
+ public abstract Object[] getChildren();
+ public TreeNode getParent() {
+ return this.parent;
+ }
+ public abstract boolean hasChildren();
+ public abstract String getName();
+
+ public Bookmark getBookmark() {
+ return getParent().getBookmark();
+ }
+
+ public String getLabelName() {
+ return getName();
+ }
+
+ /**
+ * @return an Image object to appear in the view, null if not found
+ */
+ public Image getImage() {
+ return QuantumPlugin.getImage(getImageName());
+ }
+
+ /**
+ * @return
+ */
+ protected abstract String getImageName();
+
+
+ /**
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(Object object) {
+ TreeNode that = (TreeNode) object;
+ return this.getLabelName().compareTo(that.getLabelName());
+ }
+
+ public String toString() {
+ return getLabelName();
+ }
+
+ public String getLabelDecorations(LabelDecorationInstructions labelDecorationInstructions) {
+ return null;
+ }
+ /**
+ * @param propertyName
+ * @param oldValue
+ * @param newValue
+ */
+ protected void firePropertyChange(
+ String propertyName,
+ Object oldValue,
+ Object newValue) {
+
+ firePropertyChange(new PropertyChangeEvent(this, propertyName, oldValue, newValue));
+ }
+
+ /**
+ * @param propertyName
+ * @param oldValue
+ * @param newValue
+ */
+ protected void firePropertyChange(PropertyChangeEvent event) {
+ TreeNode parent = getParent();
+ if (parent != null && !this.disposed) {
+ parent.firePropertyChange(event);
+ }
+ }
+
+ protected void dispose() {
+ this.disposed = true;
+ removeAllChildren();
+ }
+ protected void removeAllChildren() {
+ for (Iterator i = this.children.iterator(); i.hasNext();) {
+ TreeNode element = (TreeNode) i.next();
+ element.dispose();
+ }
+ }
+
+ protected boolean isInitialized() {
+ return !this.children.isEmpty();
+ }
+
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+ protected abstract void initializeChildren();
+ public void reload() {
+ if (isInitialized()) {
+ initializeChildren();
+ for (Iterator i = this.children.iterator(); i.hasNext(); ) {
+ ((TreeNode) i.next()).reload();
+ }
+ }
+ }
+}