initial quantum version
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / view / bookmark / BookmarkNode.java
diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/view/bookmark/BookmarkNode.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/view/bookmark/BookmarkNode.java
new file mode 100644 (file)
index 0000000..c74c555
--- /dev/null
@@ -0,0 +1,167 @@
+package com.quantum.view.bookmark;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import com.quantum.model.Bookmark;
+import com.quantum.model.ConnectionException;
+import com.quantum.model.NotConnectedException;
+import com.quantum.model.Schema;
+
+public class BookmarkNode extends TreeNode implements PropertyChangeListener {
+    private Bookmark bookmark;
+    
+    private QuickListNode quickListNode;
+    private QueryListNode queryListNode;
+
+    public BookmarkNode(TreeNode parent, Bookmark bookmark) {
+        super(parent);
+       this.bookmark = bookmark;
+        this.bookmark.addPropertyChangeListener(this);
+    }
+
+       public Object[] getChildren() {
+               if (bookmark.isConnected() && this.children.isEmpty()) {
+            initializeChildren();
+               }
+        if (this.bookmark.isConnected()) {
+            return (TreeNode[]) this.children.toArray(new TreeNode[this.children.size()]);
+        } else {
+            return BookmarkListNode.EMPTY_ARRAY;
+        }
+       }
+
+    protected void initializeChildren() {
+        boolean changed = false;
+        Map temp = new HashMap();
+        for (Iterator i = this.children.iterator(); i.hasNext(); ) {
+            TreeNode node = (TreeNode) i.next();
+            if (node instanceof SchemaNode) {
+                temp.put(node.getName(), node);
+            }
+        }
+        
+        this.children.clear();
+        if (this.quickListNode == null) {
+            this.quickListNode = new QuickListNode(this);
+        }
+        if (this.queryListNode == null) {
+            this.queryListNode = new QueryListNode(this);
+        }
+        this.children.add(this.quickListNode);
+        this.children.add(this.queryListNode);
+        Bookmark bookmark = getBookmark();
+        
+        Schema[] schemas = bookmark.getSchemas();
+        for (int i = 0, length = (schemas == null) ? 0 : schemas.length;
+            i < length;
+            i++) {
+            SchemaNode node = (SchemaNode) temp.remove(schemas[i].getDisplayName());
+            if (node == null) {
+                this.children.add(new SchemaNode(this, schemas[i]));
+            } else {
+                changed = true;
+                this.children.add(node);
+            }
+        }
+        
+        for (Iterator i = temp.values().iterator(); i.hasNext(); ) {
+            ((TreeNode) i.next()).dispose();
+            changed = true;
+        }
+        
+        if (changed) {
+            firePropertyChange("children", null, null);
+        }
+    }
+
+       public boolean hasChildren() {
+               // If the bookmark is connected but hasn't loaded the tables and views, we suppose it may have some
+               if (bookmark.isConnected() && this.children.isEmpty()) {
+            return true;
+        } else if (!bookmark.isConnected()) {
+            return false;
+        } else if (children != null && children.size() > 0) {
+                       return true;
+               }
+               return false;
+       }
+
+       protected void dispose() {
+        try {
+            this.bookmark.removePropertyChangeListener(this);
+            if (this.bookmark.isConnected()) {
+                this.bookmark.disconnect();
+            }
+        } catch (ConnectionException e) {
+        }
+       }
+
+    /**
+     * @see com.quantum.model.TreeNode#getName()
+     */
+    public String getName() {
+        return this.bookmark == null ? "<<new>>" : this.bookmark.getName();
+    }
+
+    /**
+     * @return
+     */
+    public Bookmark getBookmark() {
+        return this.bookmark;
+    }
+
+    protected String getImageName() {
+        return this.bookmark.isConnected() ? "connected.gif" : "bookmarks.gif";
+    }
+
+    /* (non-Javadoc)
+     * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
+     */
+    public void propertyChange(PropertyChangeEvent event) {
+        if ("connected".equals(event.getPropertyName())) {
+            if (Boolean.FALSE.equals(event.getNewValue())) {
+                removeAllChildren();
+            }
+            firePropertyChange("connected", event.getOldValue(), event.getNewValue());
+        } else if ("schemas".equals(event.getPropertyName())) {
+            initializeChildren();
+            firePropertyChange("children", event.getOldValue(), event.getNewValue());
+        } else if ("name".equals(event.getPropertyName())) {
+            firePropertyChange("name", event.getOldValue(), event.getNewValue());
+        }
+    }
+
+    protected void removeAllChildren() {
+        if (this.quickListNode != null) {
+            this.quickListNode.dispose();
+            this.quickListNode = null;
+        }
+        if (this.queryListNode != null) {
+            this.queryListNode.dispose();
+            this.queryListNode = null;
+        }
+        super.removeAllChildren();
+        
+    }
+    public String getLabelDecorations(LabelDecorationInstructions labelDecorationInstructions) {
+        if (!labelDecorationInstructions.isDatabaseDataVisible()) {
+            return null;
+        } else if (!this.bookmark.isConnected()) {
+            return null;
+        } else {
+            try {
+                String decoration = this.bookmark.getDatabase().getInformation();
+                return decoration == null ? null : "[" + decoration + "]";
+            } catch (NotConnectedException e) {
+                return null;
+            } catch (SQLException e) {
+                return null;
+            }
+        }
+    }
+}