package com.limegroup.gnutella.gui.options; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.util.Enumeration; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import com.limegroup.gnutella.gui.trees.LimeTreeCellRenderer; /** * Manages the <code>JTree</code> instance of the the options window. This * class constructs the <tt>TreeModel</tt> and forwards many method calls * the the contained <tt>TreeModel</tt>.<p> * * In addition, this class controls the <tt>Component</tt> that contains * the <tt>JTree</tt> instance and provides access to that * <tt>Component</tt>. */ //2345678|012345678|012345678|012345678|012345678|012345678|012345678|012345678| final class OptionsTreeManager { /** * Handle to the main <tt>JScrollPane</tt> instance for the main window * that contains the <tt>JTree</tt>. */ private final JScrollPane SCROLL_PANE; /** * Handle to the main <tt>JTree</tt> instance that displays the options. */ private final JTree TREE; /** * Constant handle to the tree model. */ private final OptionsTreeModel TREE_MODEL = new OptionsTreeModel(); /** * The constructor constructs the <tt>JTree</tt>, the <tt>TreeModel</tt>, * and the <tt>JScrollPane</tt>. */ OptionsTreeManager() { TREE = new JTree(); TREE.setEditable(false); TREE.setShowsRootHandles(true); TREE.setRootVisible(false); TREE.putClientProperty("JTree.lineStyle", "None"); TREE.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); TREE.addTreeSelectionListener(new OptionsTreeSelectionListener(TREE)); TREE.setCellRenderer(new LimeTreeCellRenderer()); TREE.setModel(TREE_MODEL); SCROLL_PANE = new JScrollPane(TREE); SCROLL_PANE.getViewport().setBackground(Color.white); SCROLL_PANE.setPreferredSize(new Dimension(125, 2000)); SCROLL_PANE.setMinimumSize(new Dimension(125, 300)); } /** * Adds a new child node to one of the top-level parent nodes. * children. Neither key can denote the root.<p> * * This should only be called during tree construction. * * @param parentKey the unique identifying key of the node to add as * well as the key for the locale-specific name for * the node as it appears to the user * * @param childKey the unique identifying key of the child node to add * as well as the key for the locale-specific name for * the node as it appears to the user * * @param displayName the name of the new node as it is displayed to * the user */ final void addNode(final String parentKey, final String childKey, final String displayName) { TREE_MODEL.addNode(parentKey, childKey, displayName); } /** * Returns the main <code>Component</code> for this class. * * @return a <code>Component</code> instance that is the main component * for this class */ final Component getComponent() { return SCROLL_PANE; } /** * Sets the selection of the tree to the node with the given key. */ void setSelection(final String key) { if (key == null) return; OptionsTreeNode root = (OptionsTreeNode)TREE_MODEL.getRoot(); OptionsTreeNode node = null; for (Enumeration en = root.breadthFirstEnumeration(); en.hasMoreElements(); ) { node = (OptionsTreeNode)en.nextElement(); if (key.equals(node.getTitleKey())) { // set selection and return TreePath tp = new TreePath(node.getPath()); TREE.expandPath(tp); TREE.scrollPathToVisible(tp); TREE.setSelectionPath(tp); return; } } } void setDefaultSelection() { OptionsTreeNode root = (OptionsTreeNode)TREE_MODEL.getRoot(); if (root == null) return; OptionsTreeNode node = null; Enumeration en = root.children(); if (!en.hasMoreElements()) return; node = (OptionsTreeNode)en.nextElement(); if (node == null) return; TreePath tp = new TreePath(node.getPath()); TREE.scrollPathToVisible(tp); TREE.setSelectionPath(tp); return; } }