/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.console.navtree; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.HashMap; import javax.swing.JComponent; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.ToolTipManager; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import org.jboss.console.manager.interfaces.SimpleTreeNodeMenuEntry; import org.jboss.console.manager.interfaces.TreeAction; import org.jboss.console.manager.interfaces.TreeNodeMenuEntry; import org.jboss.console.manager.interfaces.impl.SeparatorTreeNodeMenuEntry; /** * Holder of the browser tree and associated handlers. Can then be embedded * in any code such as applet code. Specific actions are handled * through a TreeContext callback object used to communicate between this object * and its container. * * @see org.jboss.console.navtree.TreeContext * @see AppletBrowser * * @author <a href="mailto:sacha.labourey@cogito-info.ch">Sacha Labourey</a>. * @version $Revision: 81010 $ * */ public class AdminTreeBrowser { TreeContext ctx = null; ConsoleTreeModel tm = null; TreeCellRenderer cellRenderer = null; TreeSelectionListener selectionListener = null; OpenNodeAccounter openNodeAccounter = null; String webHost = null; public static final String RIGHT_FRAME_NAME = "right"; /** Creates new form AppletTreeBrowser */ public AdminTreeBrowser (TreeContext ctx) throws Exception { this.ctx = ctx; tm = new ConsoleTreeModel (ctx); cellRenderer = new TreeCellRenderer (ctx); //selectionListener = new SelectionListener (); initComponents (); openNodeAccounter = new OpenNodeAccounter(getTree()); //getTree().addTreeSelectionListener (selectionListener); getTree().addMouseListener (new PopupMenuMgr()); //getTree().addTreeExpansionListener (openNodeAccounter); getTree().getSelectionModel().setSelectionMode (TreeSelectionModel.SINGLE_TREE_SELECTION); ToolTipManager.sharedInstance().registerComponent(getTree()); } public void refreshTree (boolean force) { try { this.tm.refreshTree (force); } catch (Exception displayed) { displayed.printStackTrace(); } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents()//GEN-BEGIN:initComponents { tree = new javax.swing.JTree(); tree.setCellRenderer(getCellRenderer()); tree.setModel(getTreeModel()); tree.setAutoscrolls(true); }//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTree tree; // End of variables declaration//GEN-END:variables public TreeCellRenderer getCellRenderer () { return this.cellRenderer; } public TreeModel getTreeModel () { return this.tm; } public TreeSelectionListener getSelectionListener () { return this.selectionListener; } public JTree getTree () { return this.tree; } /* * Don't use SelectionListener as I am not able to detect clicks on an * already selected tree node i.e. no refresh is possible by clicking! * => Instead I use the PopupMenuMgr below to do the work * public class SelectionListener implements TreeSelectionListener { public SelectionListener () {} public void valueChanged (TreeSelectionEvent e) { System.out.println ("in valueChanged"); Object node = getTree ().getLastSelectedPathComponent (); if (node == null) return; if (node instanceof NodeWrapper) { NodeWrapper who = (NodeWrapper)node; TreeAction act = who.getAssociatedAction (); ctx.doAdminTreeAction (act); } } } */ // ----------------------------------- public class OpenNodeAccounter implements javax.swing.event.TreeExpansionListener, javax.swing.event.TreeModelListener { protected java.util.TreeSet openNodes = new java.util.TreeSet (); public OpenNodeAccounter (JTree tree) { tree.getModel ().addTreeModelListener (this); } public void treeExpanded(javax.swing.event.TreeExpansionEvent event) { openNodes.add (((NodeWrapper)(event.getSource ())).getPath ()); //System.out.println (event.getPath().getClass ().toString ()); //openNodes.add (event.getPath ()); } public void treeCollapsed(javax.swing.event.TreeExpansionEvent event) { openNodes.remove (((NodeWrapper)(event.getSource ())).getPath ()); //openNodes.remove (event.getPath ()); } public void treeNodesChanged (javax.swing.event.TreeModelEvent e) { /* java.util.Iterator iter = openNodes.iterator (); while (iter.hasNext ()) { javax.swing.tree.TreePath path = (javax.swing.tree.TreePath)iter.next (); tree.expandPath (path); } */ /* RootWrapper root = (RootWrapper)tm.getRoot (); int max = root.getChildCount (); for (int i=0; i<max ; i++) { StdNodeWrapper son = (StdNodeWrapper)root.getChild (i); if (openNodes.contains (son.getPath ())) recursivelyOpen (son); } */ } public void recursivelyOpen (NodeWrapper son) { } public void treeNodesInserted (javax.swing.event.TreeModelEvent e){} public void treeNodesRemoved (javax.swing.event.TreeModelEvent e){} public void treeStructureChanged (javax.swing.event.TreeModelEvent e) { } } // ----------------------------------- public class PopupMenuMgr extends MouseAdapter { HashMap menus = new HashMap (); public PopupMenuMgr (){} public void mousePressed( MouseEvent e ) { mouseReleased(e); } public void mouseReleased( MouseEvent e ) { TreePath loc = getTree().getPathForLocation(e.getX(), e.getY()); if (loc == null)//Path not found because return;//right click does not occur on a node or a leaf getTree().setSelectionPath (loc); if ( e.isPopupTrigger()) { Object node = getTree ().getLastSelectedPathComponent (); if (node == null) return; JPopupMenu popup = null; if (menus.containsKey (node)) { popup = (JPopupMenu)menus.get (node); } else if (node instanceof NodeWrapper) { NodeWrapper who = (NodeWrapper)node; TreeNodeMenuEntry[] entries = who.getMenuEntries (); if (entries != null && entries.length > 0) { popup = new JPopupMenu(); popup.setOpaque(true); popup.setLightWeightPopupEnabled(true); menus.put (node, popup); // we must lazy-create the menu // for (int i=0; i<entries.length; i++) { if (entries[i] instanceof SeparatorTreeNodeMenuEntry) { popup.addSeparator (); } else if (entries[i] instanceof SimpleTreeNodeMenuEntry) { final SimpleTreeNodeMenuEntry txt = (SimpleTreeNodeMenuEntry)entries[i]; JMenuItem mi = new JMenuItem(txt.getText ()); mi.addActionListener ( new ActionListener () { public void actionPerformed(ActionEvent e) { ctx.doPopupMenuAction (txt); } } ); popup.add(mi); } } } } if (popup != null) popup.show( (JComponent)e.getSource(), e.getX(), e.getY() ); } else { Object node = getTree ().getLastSelectedPathComponent (); if (node != null && node instanceof NodeWrapper) { NodeWrapper who = (NodeWrapper)node; TreeAction act = who.getAssociatedAction (); ctx.doAdminTreeAction (act); } } } } }