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.ImageIcon; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.ToolTipManager; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import com.c2kernel.gui.tree.Node; import com.c2kernel.gui.tree.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() { @Override public void treeCollapsed(TreeExpansionEvent e) { //REVISIT: possible reaping here if things are getting heavy } @Override 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(); } @Override 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