diff options
Diffstat (limited to 'source/com/c2kernel/gui/TreeBrowser.java')
| -rwxr-xr-x | source/com/c2kernel/gui/TreeBrowser.java | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/source/com/c2kernel/gui/TreeBrowser.java b/source/com/c2kernel/gui/TreeBrowser.java new file mode 100755 index 0000000..ccee681 --- /dev/null +++ b/source/com/c2kernel/gui/TreeBrowser.java @@ -0,0 +1,197 @@ +package com.c2kernel.gui;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.*;
+import javax.swing.event.TreeExpansionEvent;
+import javax.swing.event.TreeExpansionListener;
+import javax.swing.tree.*;
+
+import com.c2kernel.gui.data.Node;
+import com.c2kernel.gui.data.NodeEntity;
+import com.c2kernel.lookup.DomainPath;
+import com.c2kernel.utils.Logger;
+
+/**
+ * Container for the tree browser
+ * @version $Revision: 1.31 $ $Date: 2006/01/17 07:49:44 $
+ * @author $Author: abranson $
+ */
+
+ // must put in top level list of loaded items, so we don't have duplicates
+public class TreeBrowser extends JPanel implements DomainKeyConsumer
+{
+ private EntityTabManager desktop;
+ protected JTree tree;
+ private Node userRoot;
+
+ public TreeBrowser(EntityTabManager target, Node userRoot) {
+ setLayout(new java.awt.BorderLayout());
+ //record the desktop and node factory for our item frames
+ this.desktop = target;
+ this.userRoot = userRoot;
+ this.setPreferredSize(new Dimension(300, 500));
+ tree = new JTree(new DefaultTreeModel(userRoot.getTreeNode()));
+ tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+ tree.setToggleClickCount(3); // need three clicks to expand a branch
+ tree.addTreeExpansionListener(
+ new TreeExpansionListener() {
+ public void treeCollapsed(TreeExpansionEvent e) {
+ //REVISIT: possible reaping here if things are getting heavy
+ }
+ public void treeExpanded(TreeExpansionEvent e) {
+ TreePath p = e.getPath();
+ // find the clicked tree node
+ DefaultMutableTreeNode nodeClicked = (DefaultMutableTreeNode)p.getLastPathComponent();
+ // run the tree builder if it is there.
+ DefaultMutableTreeNode loadNode = (DefaultMutableTreeNode)nodeClicked.getFirstChild();
+ if (loadNode.getUserObject() instanceof DynamicTreeBuilder) {
+ DynamicTreeBuilder loading = (DynamicTreeBuilder)loadNode.getUserObject();
+ if (loading.state == DynamicTreeBuilder.IDLE) {
+ loading.buildInfo(tree);
+ loading.start();
+ }
+ }
+ }
+ }
+ );
+
+ //Enable tool tips.
+ ToolTipManager.sharedInstance().registerComponent(tree);
+ tree.setCellRenderer(new ItemRenderer());
+ tree.addMouseListener(new TreeMouseListener());
+ JScrollPane myScrollPane = new JScrollPane(tree);
+ this.add(myScrollPane);
+ DefaultMutableTreeNode loadNode = (DefaultMutableTreeNode)userRoot.getTreeNode().getFirstChild();
+ DynamicTreeBuilder loading = (DynamicTreeBuilder)loadNode.getUserObject();
+ loading.buildInfo(tree);
+ loading.start();
+ }
+
+ public void push(DomainPath target) {
+ Logger.debug("Opening tree node "+target);
+ String[] components = target.getPath();
+ Node currentNode = userRoot;
+ Object[] treePath = new Object[components.length+1];
+ treePath[0] = currentNode.getTreeNode();
+ for (int i=0; i<components.length; i++) {
+ // create sub-path
+ String[] newPath = new String[i+1];
+ for (int j=0; j<newPath.length; j++)
+ newPath[j] = components[j];
+ DomainPath nextNodePath = new DomainPath(newPath);
+ Node nextNode = currentNode.getChildNode(nextNodePath);
+ if (nextNode == null) {
+ Logger.msg(6, "TreeBrowser.push() - creating "+nextNodePath);
+ nextNode = currentNode.newNode(nextNodePath);
+ currentNode.add(nextNode);
+ DynamicTreeBuilder builder = currentNode.getTreeBuilder();
+ builder.buildInfo(tree);
+ builder.add(nextNode);
+ }
+ treePath[i+1] = nextNode.getTreeNode();
+ currentNode = nextNode;
+ }
+ // select it
+ TreePath targetNode = new TreePath(treePath);
+ if (Logger.doLog(5)) dumpPath(targetNode, 5);
+
+ tree.clearSelection();
+ tree.addSelectionPath(targetNode);
+ tree.makeVisible(targetNode);
+ // open it
+ if (currentNode instanceof NodeEntity) {
+ MainFrame.status.setText("Opening "+currentNode.getName());
+ desktop.add((NodeEntity)currentNode);
+ MainFrame.status.setText("Done");
+ }
+ }
+
+ public void push(String name) {
+ // only interested in real paths
+ JOptionPane.showMessageDialog(null, "'"+name+"' was not found.",
+ "No results", JOptionPane.INFORMATION_MESSAGE);
+
+ }
+
+ private void dumpPath(TreePath selPath, int logLevel) {
+ if (selPath == null) { Logger.msg(logLevel, "TreeBrowser.dumpPath() - selPath null"); return; }
+ for (int i =0; i<selPath.getPath().length; i++)
+ Logger.msg(logLevel, "TreeBrowser.dumpPath() - selPath "+i+" = "+selPath.getPath()[i]);
+ }
+
+ private class ItemRenderer extends DefaultTreeCellRenderer {
+ public ItemRenderer() {
+ }
+
+ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf,
+ int row, boolean hasFocus) {
+ super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
+ Object thisLeaf = ((DefaultMutableTreeNode)value).getUserObject();
+ if (thisLeaf instanceof Node) {
+ Node thisNode = (Node)thisLeaf;
+ if (thisNode.getIcon() !=null) setIcon(thisNode.getIcon());
+ setToolTipText(thisNode.getType());
+ }
+ else if (thisLeaf instanceof DynamicTreeBuilder) {
+ DynamicTreeBuilder thisLoader = (DynamicTreeBuilder)thisLeaf;
+ ImageIcon loadGif = thisLoader.getIcon();
+ setIcon(loadGif);
+ loadGif.setImageObserver(tree);
+ setToolTipText("Tree Content Loader");
+ }
+ return this;
+ }
+ }
+
+ private class TreeMouseListener extends MouseAdapter {
+ public void mousePressed(MouseEvent e) {
+ if (e.isPopupTrigger())
+ showPopup(e);
+ else {
+ Object source = getNodeAt(e);
+ if (source == null) return;
+ if (e.getClickCount() == 2) {
+ if (source instanceof NodeEntity) {
+ NodeEntity thisNode = (NodeEntity)source;
+ desktop.add(thisNode);
+ MainFrame.status.setText("Opened "+thisNode.getName());
+ }
+ if (source instanceof DynamicTreeBuilder) {
+ DynamicTreeBuilder thisLoader = (DynamicTreeBuilder)source;
+ if (thisLoader.state == DynamicTreeBuilder.PARTIAL)
+ thisLoader.start();
+ }
+ }
+ }
+ }
+ public void mouseReleased(MouseEvent e) {
+ if (e.isPopupTrigger()) {
+ showPopup(e);
+ }
+ }
+ private void showPopup(MouseEvent e) {
+ Object source = getNodeAt(e);
+ if (source == null) return;
+ if (source instanceof Node) {
+ Node thisNode = (Node)source;
+ thisNode.getPopupMenu().show(e.getComponent(), e.getX(), e.getY());
+ }
+ }
+ private Object getNodeAt(MouseEvent e) {
+ Object source = null;
+ TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
+ if (selPath != null)
+ try {
+ DefaultMutableTreeNode nodeClicked = (DefaultMutableTreeNode)selPath.getLastPathComponent();
+ source = nodeClicked.getUserObject(); // fetch its nodeItem
+ }
+ catch (Exception ex) { } // Not a node that was clicked on
+
+ return source;
+ }
+ }
+}
|
