psmith 2003/09/01 20:38:38 Modified: src/java/org/apache/log4j/chainsaw LoggerNameTreePanel.java Log: Changed the minitoolbar for this component to be a JToolbar just like the Receiver panel does. This gives us nicer L&F on some l&f's. more consistent anyway. Exposed an Edit button, plus added a Close button with associated action functionality to hide the Logger Name tree. Revision Changes Path 1.3 +155 -9 jakarta-log4j/src/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java Index: LoggerNameTreePanel.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- LoggerNameTreePanel.java 1 Sep 2003 22:33:32 -0000 1.2 +++ LoggerNameTreePanel.java 2 Sep 2003 03:38:38 -0000 1.3 @@ -55,6 +55,9 @@ import org.apache.log4j.helpers.LogLog; import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; @@ -68,16 +71,23 @@ import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; +import javax.swing.Box; import javax.swing.BoxLayout; +import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.JToolBar; import javax.swing.JTree; import javax.swing.ToolTipManager; +import javax.swing.UIManager; +import javax.swing.event.TreeModelEvent; +import javax.swing.event.TreeModelListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; @@ -93,9 +103,13 @@ private static final int WARN_DEPTH = 4; private final JTree logTree; private final JScrollPane scrollTree; - private final JPanel toolbarPanel = new JPanel(); + private final JToolBar toolbar = new JToolBar(); private final JButton expandButton = new SmallButton(); + private final JButton closeButton = new SmallButton(); + private final JButton editLoggerButton = new SmallButton(); private final Action expandAction; + private final Action closeAction; + private final Action editLoggerAction; /** * @param logTreeModel @@ -105,7 +119,7 @@ setBorder(BorderFactory.createEtchedBorder()); logTree = - new LoggerNameTree(logTreeModel) { + new JTree(logTreeModel) { public String getToolTipText(MouseEvent ev) { if (ev == null) { return null; @@ -134,6 +148,34 @@ }; ToolTipManager.sharedInstance().registerComponent(logTree); + logTree.setPreferredSize(new Dimension(400, 400)); + logTree.setCellRenderer(new LoggerNameTreeCellRenderer()); + + // ============================================ + logTreeModel.addTreeModelListener( + new TreeModelListener() { + public void treeNodesChanged(TreeModelEvent e) { + ensureRootExpanded(); + } + + public void treeNodesInserted(TreeModelEvent e) { + ensureRootExpanded(); + } + + public void treeNodesRemoved(TreeModelEvent e) { + ensureRootExpanded(); + } + + private void ensureRootExpanded() { + logTree.expandRow(0); + } + + public void treeStructureChanged(TreeModelEvent e) { + ensureRootExpanded(); + } + }); + + logTree.setEditable(false); // TODO decide if Multi-selection is useful, and how it would work TreeSelectionModel selectionModel = new DefaultTreeSelectionModel(); @@ -143,21 +185,42 @@ logTree.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); scrollTree = new JScrollPane(logTree); - toolbarPanel.setLayout(new BoxLayout(toolbarPanel, BoxLayout.X_AXIS)); + toolbar.setLayout(new BoxLayout(toolbar, BoxLayout.X_AXIS)); expandAction = createExpandAction(); + editLoggerAction = createEditLoggerAction(); + closeAction = createCloseAction(); setupListeners(); configureToolbarPanel(); - add(toolbarPanel, BorderLayout.NORTH); + add(toolbar, BorderLayout.NORTH); add(scrollTree, BorderLayout.CENTER); } /** - * Configures varoius listeners etc for the components within - * this Class. + * An action that closes (hides) this panel + * @return */ + private Action createCloseAction() { + Action action = + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + LoggerNameTreePanel.this.setVisible(false); + } + }; + + action.putValue(Action.NAME, "Close"); + action.putValue(Action.SHORT_DESCRIPTION, "Closes the Logger panel"); + action.putValue(Action.SMALL_ICON, new CloseIcon(8, 1, 1)); + + return action; + } + + /** + * Configures varoius listeners etc for the components within + * this Class. + */ private void setupListeners() { /** * Enable the actions depending on state of the tree selection @@ -167,6 +230,7 @@ public void valueChanged(TreeSelectionEvent e) { TreePath path = e.getNewLeadSelectionPath(); expandAction.setEnabled(path != null); + editLoggerAction.setEnabled(path != null); } }); @@ -184,11 +248,32 @@ && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0) && ((e.getModifiers() & InputEvent.BUTTON1_MASK) > 0)) { expandCurrentlySelectedNode(); + } else if (e.getClickCount() > 1) { + LogLog.debug("Ignoring dbl click event " + e); } } }); } + private Action createEditLoggerAction() { + Action action = + new AbstractAction() { + public void actionPerformed(ActionEvent e) { + // TODO Auto-generated method stub + } + }; + + action.putValue(Action.NAME, "Edit filters/colors"); + action.putValue( + Action.SHORT_DESCRIPTION, + "Allows you to specify filters and coloring for this Logger"); + action.putValue( + Action.SMALL_ICON, new ImageIcon(ChainsawIcons.ICON_EDIT_RECEIVER)); + action.setEnabled(false); + + return action; + } + /** * Creates an action that is used to expand the selected node * and all children @@ -204,7 +289,8 @@ action.putValue(Action.NAME, "Expand branch"); action.putValue( - Action.SHORT_DESCRIPTION, "Expands all the child nodes recursively"); + Action.SHORT_DESCRIPTION, + "Expands all the child nodes of the currently selected node, recursively"); action.putValue( Action.SMALL_ICON, new ImageIcon(ChainsawIcons.UNDOCKED_ICON)); action.setEnabled(false); @@ -220,6 +306,12 @@ private void expandCurrentlySelectedNode() { TreePath[] paths = logTree.getSelectionPaths(); + if (paths == null) { + return; + } + + LogLog.debug("Expanding all children of selected node"); + for (int i = 0; i < paths.length; i++) { TreePath path = paths[i]; DefaultMutableTreeNode treeNode = @@ -272,8 +364,62 @@ * component */ private void configureToolbarPanel() { + toolbar.setFloatable(false); + expandButton.setAction(expandAction); - expandButton.setText(""); - toolbarPanel.add(expandButton); + expandButton.setText(null); + editLoggerButton.setAction(editLoggerAction); + editLoggerButton.setText(null); + closeButton.setAction(closeAction); + closeButton.setText(null); + + toolbar.add(expandButton); + toolbar.add(editLoggerButton); + toolbar.addSeparator(); + + toolbar.add(Box.createHorizontalGlue()); + toolbar.add(closeButton); + toolbar.add(Box.createHorizontalStrut(5)); + } + + /** + * + * @author Paul Smith <[EMAIL PROTECTED]> + * + */ + private static class LoggerNameTreeCellRenderer + extends DefaultTreeCellRenderer { + private JPanel panel = new JPanel(); + + private LoggerNameTreeCellRenderer() { + super(); + panel.setBackground(UIManager.getColor("Tree.textBackground")); + + Icon leafIcon = getDefaultLeafIcon(); + Icon icon = new ImageIcon(ChainsawIcons.WINDOW_ICON); + + panel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); + panel.add(this); + + setLeafIcon(null); + setOpaque(false); + } + + /* (non-Javadoc) + * @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean) + */ + public Component getTreeCellRendererComponent( + JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, + int row, boolean hasFocus) { + Component component = + super.getTreeCellRendererComponent( + tree, value, sel, expanded, leaf, row, hasFocus); + + if (row == 0) { + } else { + } + + return panel; + } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]