psmith      2003/12/16 20:28:05

  Modified:    src/java/org/apache/log4j/chainsaw LoggerNameTreePanel.java
                        LogPanel.java
  Log:
  A LogPanel's Logger name ignore list is now saved and loaded with the
  preferences.
  
  Revision  Changes    Path
  1.21      +868 -606  
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.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- LoggerNameTreePanel.java  16 Dec 2003 00:45:26 -0000      1.20
  +++ LoggerNameTreePanel.java  17 Dec 2003 04:28:04 -0000      1.21
  @@ -46,11 +46,17 @@
    * Apache Software Foundation, please see <http://www.apache.org/>.
    *
    */
  -
   /*
    */
   package org.apache.log4j.chainsaw;
   
  +import org.apache.log4j.chainsaw.icons.ChainsawIcons;
  +import org.apache.log4j.chainsaw.icons.LineIconFactory;
  +import org.apache.log4j.helpers.LogLog;
  +import org.apache.log4j.rule.AbstractRule;
  +import org.apache.log4j.rule.Rule;
  +import org.apache.log4j.spi.LoggingEvent;
  +
   import java.awt.BorderLayout;
   import java.awt.Component;
   import java.awt.Cursor;
  @@ -64,9 +70,12 @@
   import java.awt.event.MouseEvent;
   import java.awt.event.MouseMotionAdapter;
   import java.awt.event.MouseMotionListener;
  +
   import java.beans.PropertyChangeEvent;
   import java.beans.PropertyChangeListener;
  +
   import java.util.ArrayList;
  +import java.util.Collection;
   import java.util.Collections;
   import java.util.Enumeration;
   import java.util.HashSet;
  @@ -107,13 +116,6 @@
   import javax.swing.tree.TreePath;
   import javax.swing.tree.TreeSelectionModel;
   
  -import org.apache.log4j.chainsaw.icons.ChainsawIcons;
  -import org.apache.log4j.chainsaw.icons.LineIconFactory;
  -import org.apache.log4j.helpers.LogLog;
  -import org.apache.log4j.rule.AbstractRule;
  -import org.apache.log4j.rule.Rule;
  -import org.apache.log4j.spi.LoggingEvent;
  -
   
   /**
    * A panel that encapsulates the Logger Name tree, with associated actions
  @@ -122,118 +124,62 @@
    *
    * @author Paul Smith <[EMAIL PROTECTED]>
    */
  -final class LoggerNameTreePanel extends JPanel implements Rule {
  -  private final class MouseKeyIconListener
  -    extends MouseMotionAdapter
  -    implements MouseMotionListener {
  -    Cursor focusOnCursor = 
Toolkit.getDefaultToolkit().createCustomCursor(ChainsawIcons.FOCUS_ON_ICON.getImage(), 
new Point(10,10), "");
  -    Cursor ignoreCursor = 
Toolkit.getDefaultToolkit().createCustomCursor(ChainsawIcons.IGNORE_ICON.getImage(), 
new Point(10,10), "");
  -      /* (non-Javadoc)
  -     * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
  -     */
  -    public void mouseMoved(MouseEvent e) {
  -//      LogLog.debug(e.toString());
  -      if((e.getModifiers() & InputEvent.CTRL_MASK)>0 && (e.getModifiers() & 
InputEvent.SHIFT_MASK)>0) {
  -        logTree.setCursor(ignoreCursor);
  -      }else if((e.getModifiers() & InputEvent.CTRL_MASK)>0) {
  -        logTree.setCursor(focusOnCursor);
  -      }else {
  -        logTree.setCursor(Cursor.getDefaultCursor());
  -      }
  -    }
  -}
  -  private final class MouseFocusOnListener extends MouseAdapter {
  -    
  -    /* (non-Javadoc)
  -     * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
  -     */
  -    public void mouseClicked(MouseEvent e) {
  -      if(e.getClickCount()>1 && (e.getModifiers() & InputEvent.CTRL_MASK)>0 && 
(e.getModifiers() & InputEvent.SHIFT_MASK)>0) {
  -        ignoreLoggerAtPoint(e.getPoint());
  -        e.consume();
  -        fireChangeEvent();
  -      }else if(e.getClickCount()>1 &&(e.getModifiers() & InputEvent.CTRL_MASK)>0) {
  -        focusAnLoggerAtPoint(e.getPoint());
  -        e.consume();
  -        fireChangeEvent();
  -      }    
  -    }
  +final class LoggerNameTreePanel extends JPanel implements Rule
  +{
  +  //~ Static fields/initializers ==============================================
   
  -    /**
  -     * @param point
  -     */
  -    private void focusAnLoggerAtPoint(Point point) {
  -      String logger = getLoggerAtPoint(point);
  -      if(logger!=null) {
  -        toggleFocusOnState();
  -      }
  -    }
  +  private static final int WARN_DEPTH = 4;
   
  -    /**
  -     * @param point
  -     * @return
  -     */
  -    private String getLoggerAtPoint(Point point) {
  -      TreePath path = logTree.getPathForLocation(point.x, point.y);
  -      if(path!=null) {
  -        return getLoggerName(path);
  -      }
  -      return null;
  -    }
  +  //~ Instance fields =========================================================
   
  -    /**
  -     * @param point
  -     */
  -    private void ignoreLoggerAtPoint(Point point) {
  -      String logger = getLoggerAtPoint(point);
  -      if(logger!=null) {
  -        toggleHiddenLogger(logger);
  -      }
  -      
  -    }
  -  }
  -  private static final int WARN_DEPTH = 4;
  -  private final JTree logTree;
  -  private final JScrollPane scrollTree;
  -  private final JToolBar toolbar = new JToolBar();
  -  private final JButton expandButton = new SmallButton();
  -  private final JButton collapseButton = new SmallButton();
  +  private LoggerNameTreeCellRenderer cellRenderer =
  +    new LoggerNameTreeCellRenderer();
  +  private final Action clearIgnoreListAction;
  +  private final Action closeAction;
     private final JButton closeButton = new SmallButton();
  -  private final SmallToggleButton focusOnLoggerButton =
  -    new SmallToggleButton();
  -  private final SmallToggleButton ignoreLoggerButton = new SmallToggleButton();
  -  private final JButton editLoggerButton = new SmallButton();
  -  private final Action expandAction;
     private final Action collapseAction;
  -  private final Action closeAction;
  +  private final JButton collapseButton = new SmallButton();
     private final Action editLoggerAction;
  +  private final JButton editLoggerButton = new SmallButton();
  +  private final Action expandAction;
  +  private final JButton expandButton = new SmallButton();
     private final Action focusOnAction;
  +  private final SmallToggleButton focusOnLoggerButton =
  +    new SmallToggleButton();
  +  private final Set hiddenSet = new HashSet();
     private final Action hideAction;
  -  private final Action clearIgnoreListAction;
  -  
  +
     private final JList ignoreList = new JList();
     private final JScrollPane ignoreListScroll = new JScrollPane(ignoreList);
  +  private final SmallToggleButton ignoreLoggerButton = new SmallToggleButton();
  +  private final EventListenerList listenerList = new EventListenerList();
  +  private final JTree logTree;
   
     //  private final EventListenerList focusOnActionListeners =
     //    new EventListenerList();
     private final LogPanelLoggerTreeModel logTreeModel;
  -  private LoggerNameTreeCellRenderer cellRenderer =
  -    new LoggerNameTreeCellRenderer();
  -  private final LoggerTreePopupMenu popupMenu;
     private final PopupListener popupListener;
  -  private final Set hiddenSet = new HashSet();
  -  private final EventListenerList listenerList = new EventListenerList();
  -  private Rule ruleDelegate =
  -    new AbstractRule() {
  -      public boolean evaluate(LoggingEvent e) {
  +  private final LoggerTreePopupMenu popupMenu;
  +  private Rule ruleDelegate = new AbstractRule()
  +    {
  +      public boolean evaluate(LoggingEvent e)
  +      {
           return true;
         }
       };
   
  +  private final JScrollPane scrollTree;
  +  private final JToolBar toolbar = new JToolBar();
  +
  +  //~ Constructors ============================================================
  +
     /**
  +   * Creates a new LoggerNameTreePanel object.
  +   *
      * @param logTreeModel
      */
  -  LoggerNameTreePanel(LogPanelLoggerTreeModel logTreeModel) {
  +  LoggerNameTreePanel(LogPanelLoggerTreeModel logTreeModel)
  +  {
       super();
       this.logTreeModel = logTreeModel;
   
  @@ -241,46 +187,55 @@
       setBorder(BorderFactory.createEtchedBorder());
   
       logTree =
  -      new JTree(logTreeModel) {
  -          public String getToolTipText(MouseEvent ev) {
  -            if (ev == null) {
  -              return null;
  -            }
  -
  -            TreePath path = logTree.getPathForLocation(ev.getX(), ev.getY());
  +    new JTree(logTreeModel)
  +      {
  +        public String getToolTipText(MouseEvent ev)
  +        {
  +          if (ev == null)
  +          {
  +            return null;
  +          }
   
  -            String loggerName = getLoggerName(path);
  +          TreePath path = logTree.getPathForLocation(ev.getX(), ev.getY());
   
  -            if (hiddenSet.contains(loggerName)) {
  -              loggerName += " (you are ignoring this logger)";
  -            }
  +          String loggerName = getLoggerName(path);
   
  -            return loggerName;
  +          if (hiddenSet.contains(loggerName))
  +          {
  +            loggerName += " (you are ignoring this logger)";
             }
  -        };
  +
  +          return loggerName;
  +        }
  +      };
   
       ToolTipManager.sharedInstance().registerComponent(logTree);
       logTree.setCellRenderer(cellRenderer);
   
       //       ============================================
  -    logTreeModel.addTreeModelListener(
  -      new TreeModelListener() {
  +    logTreeModel.addTreeModelListener(new TreeModelListener()
  +      {
           private boolean latched = false;
   
  -        public void treeNodesChanged(TreeModelEvent e) {
  +        public void treeNodesChanged(TreeModelEvent e)
  +        {
           }
   
  -        public void treeNodesInserted(TreeModelEvent e) {
  -          if (!latched) {
  +        public void treeNodesInserted(TreeModelEvent e)
  +        {
  +          if (!latched)
  +          {
               ensureRootExpanded();
               latched = true;
             }
           }
   
  -        public void treeNodesRemoved(TreeModelEvent e) {
  +        public void treeNodesRemoved(TreeModelEvent e)
  +        {
           }
   
  -        public void treeStructureChanged(TreeModelEvent e) {
  +        public void treeStructureChanged(TreeModelEvent e)
  +        {
           }
         });
   
  @@ -312,114 +267,123 @@
   
       add(toolbar, BorderLayout.NORTH);
       add(scrollTree, BorderLayout.CENTER);
  -    
  +
       add(ignoreListScroll, BorderLayout.SOUTH);
  -    
  -    CheckListCellRenderer cellRenderer = new CheckListCellRenderer(){
   
  -      protected boolean isSelected(Object value) {
  -        return true;
  -      }
  -    
  -    };
  -    
  +    CheckListCellRenderer cellRenderer = new CheckListCellRenderer()
  +      {
  +        protected boolean isSelected(Object value)
  +        {
  +          return true;
  +        }
  +      };
  +
       ignoreList.setCellRenderer(cellRenderer);
  -    
  -    ignoreList.addMouseListener(new MouseAdapter(){
  -      
  -      public void mouseClicked(MouseEvent e) {
  -        if (e.getClickCount()>1 && (e.getModifiers() & InputEvent.BUTTON1_MASK)>0) {
  -          int index = ignoreList.locationToIndex(e.getPoint());
  -
  -          if (index>=0) {
  -            String string =
  -              ignoreList.getModel().getElementAt(index).toString();
  -            toggleHiddenLogger(string);
  -            fireChangeEvent();
  -            /**
  -             * TODO this needs to get the node that has this logger and fire a 
visual update
  -             */
  -            LoggerNameTreePanel.this.logTreeModel.nodeStructureChanged((TreeNode) 
LoggerNameTreePanel.this.logTreeModel.getRoot());
  +
  +    ignoreList.addMouseListener(new MouseAdapter()
  +      {
  +        public void mouseClicked(MouseEvent e)
  +        {
  +          if (
  +            (e.getClickCount() > 1)
  +              && ((e.getModifiers() & InputEvent.BUTTON1_MASK) > 0))
  +          {
  +            int index = ignoreList.locationToIndex(e.getPoint());
  +
  +            if (index >= 0)
  +            {
  +              String string =
  +                ignoreList.getModel().getElementAt(index).toString();
  +              toggleHiddenLogger(string);
  +              fireChangeEvent();
  +
  +              /**
  +               * TODO this needs to get the node that has this logger and fire a 
visual update
  +               */
  +              LoggerNameTreePanel.this.logTreeModel.nodeStructureChanged(
  +                (TreeNode) LoggerNameTreePanel.this.logTreeModel.getRoot());
  +            }
             }
           }
  -      
  -      }
  -      
  -    });
  +      });
     }
   
  +  //~ Methods =================================================================
  +
     /**
      * Adds a change Listener to this LoggerNameTreePanel to be notfied
      * when the State of the Focus or Hidden details have changed.
      *
      * @param l
      */
  -  public void addChangeListener(ChangeListener l) {
  +  public void addChangeListener(ChangeListener l)
  +  {
       listenerList.add(ChangeListener.class, l);
     }
   
  -  public void removeChangeListener(ChangeListener l) {
  -    listenerList.remove(ChangeListener.class, l);
  +  /* (non-Javadoc)
  +   * @see 
org.apache.log4j.chainsaw.rule.Rule#evaluate(org.apache.log4j.spi.LoggingEvent)
  +   */
  +  /**
  +   * DOCUMENT ME!
  +   *
  +   * @param e DOCUMENT ME!
  +   *
  +   * @return DOCUMENT ME!
  +   */
  +  public boolean evaluate(LoggingEvent e)
  +  {
  +    return ruleDelegate.evaluate(e);
     }
   
     /**
  -  * @return
  -  */
  -  private Action createClearIgnoreListAction() {
  -    Action action =
  -      new AbstractAction("Clear Ignore list", null) {
  -        public void actionPerformed(ActionEvent e) {
  -          ignoreLoggerButton.setSelected(false);
  -          logTreeModel.reload();
  -          hiddenSet.clear();
  -          fireChangeEvent();
  -        }
  -      };
  -
  -    action.putValue(
  -      Action.SHORT_DESCRIPTION,
  -      "Removes all entries from the Ignore list so you can see their events in the 
view");
  -
  -    return action;
  +   * DOCUMENT ME!
  +   *
  +   * @param l DOCUMENT ME!
  +   */
  +  public void removeChangeListener(ChangeListener l)
  +  {
  +    listenerList.remove(ChangeListener.class, l);
     }
   
     /**
  -    * @return
  -    */
  -  private Action createIgnoreAction() {
  -    Action action =
  -      new AbstractAction(
  -        "Ignore this Logger", new ImageIcon(ChainsawIcons.ICON_COLLAPSE)) {
  -        public void actionPerformed(ActionEvent e) {
  -          String logger = getCurrentlySelectedLoggerName();
  -
  -          if (logger != null) {
  -            toggleHiddenLogger(logger);
  -            logTreeModel.nodeChanged(
  -              (TreeNode) logTree.getSelectionPath().getLastPathComponent());
  -            ignoreLoggerButton.setSelected(hiddenSet.contains(logger));
  -            focusOnAction.setEnabled(!hiddenSet.contains(logger));
  -            popupMenu.hideCheck.setSelected(hiddenSet.contains(logger));
  -          }
  -
  -          fireChangeEvent();
  -        }
  -      };
  +   * Ensures the Focus is set to a specific logger name
  +   * @param logger
  +   */
  +  public void setFocusOn(String logger)
  +  {
  +    DefaultMutableTreeNode node = logTreeModel.lookupLogger(logger);
   
  -    action.putValue(
  -      Action.SHORT_DESCRIPTION,
  -      "Adds the selected Logger to your Ignore list, filtering those events from 
view");
  +    if (node != null)
  +    {
  +      TreeNode[] nodes = node.getPath();
  +      TreePath treePath = new TreePath(nodes);
  +      logTree.setSelectionPath(treePath);
   
  -    return action;
  +      if (!focusOnLoggerButton.isSelected())
  +      {
  +        focusOnLoggerButton.doClick();
  +      }
  +    }
  +    else
  +    {
  +      LogLog.error("failed to lookup logger " + logger);
  +    }
     }
   
     /**
  +   * DOCUMENT ME!
  +   *
      * @param logger
      */
  -  protected void toggleHiddenLogger(String logger) {
  -    if (!hiddenSet.contains(logger)) {
  +  protected void toggleHiddenLogger(String logger)
  +  {
  +    if (!hiddenSet.contains(logger))
  +    {
         hiddenSet.add(logger);
  -    } else {
  +    }
  +    else
  +    {
         hiddenSet.remove(logger);
       }
   
  @@ -427,42 +391,6 @@
     }
   
     /**
  -   * Returns an unmodifiable set of those Loggers marked as hidden.
  -   * @return
  -   */
  -  Set getHiddenSet() {
  -    return Collections.unmodifiableSet(hiddenSet);
  -  }
  -
  -  /**
  -  * @return
  -  */
  -  private Action createFocusOnAction() {
  -    final Action action =
  -      new AbstractAction() {
  -        public void actionPerformed(ActionEvent e) {
  -          toggleFocusOnState();
  -        }
  -      };
  -
  -    action.putValue(Action.NAME, "Focus");
  -    action.putValue(
  -      Action.SHORT_DESCRIPTION,
  -      "Allows you to Focus on the selected logger by setting a filter that discards 
all but this Logger");
  -    action.putValue(
  -      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.WINDOW_ICON));
  -
  -    action.setEnabled(false);
  -
  -    return action;
  -  }
  -
  -  private void toggleFocusOnState() {
  -    setFocusOnSelected(!isFocusOnSelected());
  -    hideAction.setEnabled(!isFocusOnSelected());
  -  }
  -
  -  /**
      * Returns the full name of the Logger that is represented by
      * the currently selected Logger node in the tree.
      *
  @@ -471,10 +399,12 @@
      * If multiple Nodes are selected, the first path is used
      * @return Logger Name or null if nothing selected
      */
  -  String getCurrentlySelectedLoggerName() {
  +  String getCurrentlySelectedLoggerName()
  +  {
       TreePath[] paths = logTree.getSelectionPaths();
   
  -    if ((paths == null) || (paths.length == 0)) {
  +    if ((paths == null) || (paths.length == 0))
  +    {
         return null;
       }
   
  @@ -484,18 +414,32 @@
     }
   
     /**
  +   * Returns an unmodifiable set of those Loggers marked as hidden.
  +   * @return
  +   */
  +  Set getHiddenSet()
  +  {
  +    return Collections.unmodifiableSet(hiddenSet);
  +  }
  +
  +  /**
      * Returns the full
  +   * @param path DOCUMENT ME!
      * @return
      */
  -  String getLoggerName(TreePath path) {
  -    if (path != null) {
  +  String getLoggerName(TreePath path)
  +  {
  +    if (path != null)
  +    {
         Object[] objects = path.getPath();
         StringBuffer buf = new StringBuffer();
   
  -      for (int i = 1; i < objects.length; i++) {
  +      for (int i = 1; i < objects.length; i++)
  +      {
           buf.append(objects[i].toString());
   
  -        if (i < (objects.length - 1)) {
  +        if (i < (objects.length - 1))
  +        {
             buf.append(".");
           }
         }
  @@ -506,260 +450,201 @@
       return null;
     }
   
  -  private void ensureRootExpanded() {
  -    LogLog.debug("Ensuring Root node is expanded.");
  -
  -    final DefaultMutableTreeNode root =
  -      (DefaultMutableTreeNode) logTreeModel.getRoot();
  -    SwingUtilities.invokeLater(
  -      new Runnable() {
  -        public void run() {
  -          logTree.expandPath(new TreePath(root));
  -        }
  -      });
  +  /**
  +   * adds a Collection of Strings to the ignore List and notifise all listeners of
  +   * both the "hiddenSet" property and those expecting the Rule to change
  +   * via the ChangeListener interface 
  +   * @param fqnLoggersToIgnore
  +   */
  +  void ignore(Collection fqnLoggersToIgnore)
  +  {
  +    hiddenSet.addAll(fqnLoggersToIgnore);
  +    firePropertyChange("hiddenSet", null, null);
  +    fireChangeEvent();
     }
   
     /**
  -  * @return
  -  */
  -  private Action createCollapseAction() {
  -    Action action =
  -      new AbstractAction() {
  -        public void actionPerformed(ActionEvent e) {
  -          collapseCurrentlySelectedNode();
  -        }
  -      };
  -
  -    action.putValue(Action.SMALL_ICON, LineIconFactory.createCollapseIcon());
  -    action.putValue(Action.NAME, "Collapse Branch");
  -    action.putValue(
  -      Action.SHORT_DESCRIPTION,
  -      "Collapses all the children of the currently selected node");
  -    action.setEnabled(false);
  -
  -    return action;
  +   * Returns true if the FocusOn element has been selected
  +   * @return true if the FocusOn action/lement has been selected
  +   */
  +  boolean isFocusOnSelected()
  +  {
  +    return focusOnAction.getValue("checked") != null;
     }
   
  -  /**
  -     * 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, LineIconFactory.createCloseIcon());
  -
  -    return action;
  +  void setFocusOnSelected(boolean selected)
  +  {
  +    if (selected)
  +    {
  +      focusOnAction.putValue("checked", Boolean.TRUE);
  +    }
  +    else
  +    {
  +      focusOnAction.putValue("checked", null);
  +    }
     }
   
     /**
  -    * Configures varoius listeners etc for the components within
  -    * this Class.
  -    */
  -  private void setupListeners() {
  -    
  -    logTree.addMouseMotionListener(new MouseKeyIconListener());
  -    /**
  -       * Enable the actions depending on state of the tree selection
  -       */
  -    logTree.addTreeSelectionListener(
  -      new TreeSelectionListener() {
  -        public void valueChanged(TreeSelectionEvent e) {
  -          TreePath path = e.getNewLeadSelectionPath();
  -          TreeNode node = null;
  -
  -          if (path != null) {
  -            node = (TreeNode) path.getLastPathComponent();
  -          }
  +   * Given the currently selected nodes
  +   * collapses all the children of those nodes.
  +   *
  +   */
  +  private void collapseCurrentlySelectedNode()
  +  {
  +    TreePath[] paths = logTree.getSelectionPaths();
   
  -          //          editLoggerAction.setEnabled(path != null);
  -          String logger = getCurrentlySelectedLoggerName();
  -          focusOnAction.setEnabled(
  -            (path != null) && (node != null) && (node.getParent() != null)
  -            && !hiddenSet.contains(logger));
  -          hideAction.setEnabled(
  -            (path != null) && (node != null) && (node.getParent() != null)
  -            && !isFocusOnSelected());
  +    if (paths == null)
  +    {
  +      return;
  +    }
   
  -          if (!focusOnAction.isEnabled()) {
  -            setFocusOnSelected(false);
  -          } else {
  -          }
  +    if (LogLog.isDebugEnabled())
  +    {
  +      LogLog.debug("Collapsing all children of selected node");
  +    }
   
  -          expandAction.setEnabled(path != null);
  +    for (int i = 0; i < paths.length; i++)
  +    {
  +      TreePath path = paths[i];
  +      DefaultMutableTreeNode node =
  +        (DefaultMutableTreeNode) path.getLastPathComponent();
  +      Enumeration enumeration = node.depthFirstEnumeration();
   
  -          if (logger != null) {
  -            boolean isHidden = hiddenSet.contains(logger);
  -            popupMenu.hideCheck.setSelected(isHidden);
  -            ignoreLoggerButton.setSelected(isHidden);
  -          }
  +      while (enumeration.hasMoreElements())
  +      {
  +        DefaultMutableTreeNode child =
  +          (DefaultMutableTreeNode) enumeration.nextElement();
   
  -          collapseAction.setEnabled(path != null);
  +        if ((child.getParent() != null) && (child != node))
  +        {
  +          TreeNode[] nodes =
  +            ((DefaultMutableTreeNode) child.getParent()).getPath();
   
  -          reconfigureMenuText();
  +          TreePath treePath = new TreePath(nodes);
  +          logTree.collapsePath(treePath);
           }
  -      });
  +      }
  +    }
   
  -    logTree.addMouseListener(popupListener);
  +    ensureRootExpanded();
  +  }
   
  -    /**
  -     * This listener ensures the Tool bar toggle button and popup menu check box
  -     * stay in sync, plus notifies all the ChangeListeners that
  -     * an effective filter criteria has been modified
  +  /**
  +     * configures all the components that are used in the mini-toolbar of this
  +     * component
        */
  -    focusOnAction.addPropertyChangeListener(
  -      new PropertyChangeListener() {
  -        public void propertyChange(PropertyChangeEvent evt) {
  -          popupMenu.focusOnCheck.setSelected(isFocusOnSelected());
  -          focusOnLoggerButton.setSelected(isFocusOnSelected());
  -
  -          if (logTree.getSelectionPath() != null) {
  -            logTreeModel.nodeChanged(
  -              (TreeNode) logTree.getSelectionPath().getLastPathComponent());
  -          }
  +  private void configureToolbarPanel()
  +  {
  +    toolbar.setFloatable(false);
   
  -          fireChangeEvent();
  -        }
  -      });
  +    expandButton.setAction(expandAction);
  +    expandButton.setText(null);
  +    collapseButton.setAction(collapseAction);
  +    collapseButton.setText(null);
  +    focusOnLoggerButton.setAction(focusOnAction);
  +    focusOnLoggerButton.setText(null);
  +    ignoreLoggerButton.setAction(hideAction);
  +    ignoreLoggerButton.setText(null);
   
  -    hideAction.addPropertyChangeListener(
  -      new PropertyChangeListener() {
  -        public void propertyChange(PropertyChangeEvent evt) {
  -          if (logTree.getSelectionPath() != null) {
  -            logTreeModel.nodeChanged(
  -              (TreeNode) logTree.getSelectionPath().getLastPathComponent());
  -          }
  +    expandButton.setFont(expandButton.getFont().deriveFont(Font.BOLD));
  +    collapseButton.setFont(collapseButton.getFont().deriveFont(Font.BOLD));
   
  -          fireChangeEvent();
  -        }
  -      });
  +    editLoggerButton.setAction(editLoggerAction);
  +    editLoggerButton.setText(null);
  +    closeButton.setAction(closeAction);
  +    closeButton.setText(null);
   
  -//    /**
  -//     * Now add a MouseListener that fires the expansion
  -//     * action if CTRL + DBL CLICK is done.
  -//     */
  -//    logTree.addMouseListener(
  -//      new MouseAdapter() {
  -//        public void mouseClicked(MouseEvent e) {
  -//          if (
  -//            (e.getClickCount() > 1)
  -//              && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0)
  -//              && ((e.getModifiers() & InputEvent.BUTTON1_MASK) > 0)) {
  -//            expandCurrentlySelectedNode();
  -//            e.consume();
  -//          } else if (e.getClickCount() > 1) {
  -//            super.mouseClicked(e);
  -//            LogLog.debug("Ignoring dbl click event " + e);
  -//          }
  -//        }
  -//      });
  +    toolbar.add(expandButton);
  +    toolbar.add(collapseButton);
  +    toolbar.addSeparator();
  +    toolbar.add(focusOnLoggerButton);
  +    toolbar.add(ignoreLoggerButton);
   
  -    logTree.addMouseListener(new MouseFocusOnListener());
  -    /**
  -     * We listen for when the FocusOn action changes, and then  translate
  -     * that to a RuleChange
  -     */
  -    addChangeListener(
  -      new ChangeListener() {
  -        public void stateChanged(ChangeEvent evt) {
  -          final String currentlySelectedLoggerName =
  -            getCurrentlySelectedLoggerName();
  +    //    toolbar.add(editLoggerButton);
  +    toolbar.addSeparator();
   
  -          ruleDelegate =
  -            new AbstractRule() {
  -                public boolean evaluate(LoggingEvent e) {
  -                  boolean isHidden =
  -                    getHiddenSet().contains(e.getLoggerName());
  -                  boolean result = !isHidden;
  -
  -                  if (result && isFocusOnSelected()) {
  -                    result =
  -                      result
  -                      && e.getLoggerName().startsWith(
  -                        currentlySelectedLoggerName);
  -                  }
  +    toolbar.add(Box.createHorizontalGlue());
  +    toolbar.add(closeButton);
  +    toolbar.add(Box.createHorizontalStrut(5));
  +  }
   
  -                  return result;
  -                }
  -              };
  -              firePropertyChange("rule", null, null);
  +  /**
  +   * DOCUMENT ME!
  +   *
  +   * @return
  +  */
  +  private Action createClearIgnoreListAction()
  +  {
  +    Action action = new AbstractAction("Clear Ignore list", null)
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          ignoreLoggerButton.setSelected(false);
  +          logTreeModel.reload();
  +          hiddenSet.clear();
  +          fireChangeEvent();
           }
  -      });
  -      
  -      addPropertyChangeListener("hiddenSet",new PropertyChangeListener(){
  -
  -        public void propertyChange(PropertyChangeEvent arg0) {
  +      };
   
  -            DefaultListModel model = new DefaultListModel();
  -            
  -            List sortedIgnoreList = new ArrayList(getHiddenSet());
  -            Collections.sort(sortedIgnoreList);
  -            for (Iterator iter = sortedIgnoreList.iterator(); iter.hasNext();) {
  -              String string = (String) iter.next();
  -              model.addElement(string);
  -            }            
  -            ignoreList.setModel(model);          
  -        }});
  +    action.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Removes all entries from the Ignore list so you can see their events in the 
view");
   
  +    return action;
     }
   
  -  private void reconfigureMenuText() {
  -    String logger = getCurrentlySelectedLoggerName();
  +  /**
  +     * An action that closes (hides) this panel
  +    * @return
  +    */
  +  private Action createCloseAction()
  +  {
  +    Action action = new AbstractAction()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          LoggerNameTreePanel.this.setVisible(false);
  +        }
  +      };
   
  -    if ((logger == null) || (logger.length() == 0)) {
  -      focusOnAction.putValue(Action.NAME, "Focus On...");
  -      hideAction.putValue(Action.NAME, "Ignore ...");
  -    } else {
  -      focusOnAction.putValue(Action.NAME, "Focus On '" + logger + "'");
  -      hideAction.putValue(Action.NAME, "Ignore '" + logger + "'");
  -    }
  +    action.putValue(Action.NAME, "Close");
  +    action.putValue(Action.SHORT_DESCRIPTION, "Closes the Logger panel");
  +    action.putValue(Action.SMALL_ICON, LineIconFactory.createCloseIcon());
   
  -    // need to ensure the button doens't update itself with the text, looks stupid 
otherwise
  -    focusOnLoggerButton.setText(null);
  -    ignoreLoggerButton.setText(null);
  +    return action;
     }
   
     /**
  -   * Returns true if the FocusOn element has been selected
  -   * @return true if the FocusOn action/lement has been selected
  -   */
  -  boolean isFocusOnSelected() {
  -    return focusOnAction.getValue("checked") != null;
  -  }
  -
  -  void setFocusOnSelected(boolean selected) {
  -    if (selected) {
  -      focusOnAction.putValue("checked", Boolean.TRUE);
  -    } else {
  -      focusOnAction.putValue("checked", null);
  -    }
  -  }
  -
  -  private void fireChangeEvent() {
  -    ChangeListener[] listeners =
  -      (ChangeListener[]) listenerList.getListeners(ChangeListener.class);
  -    ChangeEvent e = null;
  +   * DOCUMENT ME!
  +   *
  +   * @return
  +  */
  +  private Action createCollapseAction()
  +  {
  +    Action action = new AbstractAction()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          collapseCurrentlySelectedNode();
  +        }
  +      };
   
  -    for (int i = 0; i < listeners.length; i++) {
  -      if (e == null) {
  -        e = new ChangeEvent(this);
  -      }
  +    action.putValue(Action.SMALL_ICON, LineIconFactory.createCollapseIcon());
  +    action.putValue(Action.NAME, "Collapse Branch");
  +    action.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Collapses all the children of the currently selected node");
  +    action.setEnabled(false);
   
  -      listeners[i].stateChanged(e);
  -    }
  +    return action;
     }
   
  -  private Action createEditLoggerAction() {
  -    Action action =
  -      new AbstractAction() {
  -        public void actionPerformed(ActionEvent e) {
  +  private Action createEditLoggerAction()
  +  {
  +    Action action = new AbstractAction()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
             // TODO Auto-generated method stub
           }
         };
  @@ -783,10 +668,12 @@
      * and all children
      * @return an Action
      */
  -  private Action createExpandAction() {
  -    Action action =
  -      new AbstractAction() {
  -        public void actionPerformed(ActionEvent e) {
  +  private Action createExpandAction()
  +  {
  +    Action action = new AbstractAction()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
             expandCurrentlySelectedNode();
           }
         };
  @@ -802,190 +689,403 @@
     }
   
     /**
  -   * Given the currently selected nodes
  -   * collapses all the children of those nodes.
  +   * DOCUMENT ME!
  +   *
  +   * @return
  +  */
  +  private Action createFocusOnAction()
  +  {
  +    final Action action = new AbstractAction()
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          toggleFocusOnState();
  +        }
  +      };
  +
  +    action.putValue(Action.NAME, "Focus");
  +    action.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Allows you to Focus on the selected logger by setting a filter that discards 
all but this Logger");
  +    action.putValue(
  +      Action.SMALL_ICON, new ImageIcon(ChainsawIcons.WINDOW_ICON));
  +
  +    action.setEnabled(false);
  +
  +    return action;
  +  }
  +
  +  /**
  +   * DOCUMENT ME!
  +   *
  +   * @return
  +    */
  +  private Action createIgnoreAction()
  +  {
  +    Action action =
  +      new AbstractAction(
  +        "Ignore this Logger", new ImageIcon(ChainsawIcons.ICON_COLLAPSE))
  +      {
  +        public void actionPerformed(ActionEvent e)
  +        {
  +          String logger = getCurrentlySelectedLoggerName();
  +
  +          if (logger != null)
  +          {
  +            toggleHiddenLogger(logger);
  +            logTreeModel.nodeChanged(
  +              (TreeNode) logTree.getSelectionPath().getLastPathComponent());
  +            ignoreLoggerButton.setSelected(hiddenSet.contains(logger));
  +            focusOnAction.setEnabled(!hiddenSet.contains(logger));
  +            popupMenu.hideCheck.setSelected(hiddenSet.contains(logger));
  +          }
  +
  +          fireChangeEvent();
  +        }
  +      };
  +
  +    action.putValue(
  +      Action.SHORT_DESCRIPTION,
  +      "Adds the selected Logger to your Ignore list, filtering those events from 
view");
  +
  +    return action;
  +  }
  +
  +  private void ensureRootExpanded()
  +  {
  +    if (LogLog.isDebugEnabled())
  +    {
  +      LogLog.debug("Ensuring Root node is expanded.");
  +    }
  +
  +    final DefaultMutableTreeNode root =
  +      (DefaultMutableTreeNode) logTreeModel.getRoot();
  +    SwingUtilities.invokeLater(new Runnable()
  +      {
  +        public void run()
  +        {
  +          logTree.expandPath(new TreePath(root));
  +        }
  +      });
  +  }
  +
  +  /**
  +   * Expands the currently selected node (if any)
  +   * including all the children.
      *
      */
  -  private void collapseCurrentlySelectedNode() {
  +  private void expandCurrentlySelectedNode()
  +  {
       TreePath[] paths = logTree.getSelectionPaths();
   
  -    if (paths == null) {
  +    if (paths == null)
  +    {
         return;
       }
   
  -    LogLog.debug("Collapsing all children of selected node");
  +    if (LogLog.isDebugEnabled())
  +    {
  +      LogLog.debug("Expanding all children of selected node");
  +    }
   
  -    for (int i = 0; i < paths.length; i++) {
  +    for (int i = 0; i < paths.length; i++)
  +    {
         TreePath path = paths[i];
  -      DefaultMutableTreeNode node =
  +
  +      /**
  +       * TODO this is commented out, right now it expands all nodes including the 
root, so if there is a large tree..... look out.
  +       */
  +
  +      //      /**
  +      //       * Handle an expansion of the Root node by only doing the first level.
  +      //       * Safe...
  +      //       */
  +      //      if (path.getPathCount() == 1) {
  +      //        logTree.expandPath(path);
  +      //
  +      //        return;
  +      //      }
  +
  +      DefaultMutableTreeNode treeNode =
           (DefaultMutableTreeNode) path.getLastPathComponent();
  -      Enumeration enumeration = node.depthFirstEnumeration();
   
  -      while (enumeration.hasMoreElements()) {
  -        DefaultMutableTreeNode child =
  -          (DefaultMutableTreeNode) enumeration.nextElement();
  +      Enumeration depthEnum = treeNode.depthFirstEnumeration();
   
  -        if (child.getParent() != null && child!=node) {
  -          TreeNode[] nodes =
  -            ((DefaultMutableTreeNode) child.getParent()).getPath();
  +      if (!depthEnum.hasMoreElements())
  +      {
  +        break;
  +      }
  +
  +      List depths = new ArrayList();
  +
  +      while (depthEnum.hasMoreElements())
  +      {
  +        depths.add(
  +          new Integer(
  +            ((DefaultMutableTreeNode) depthEnum.nextElement()).getDepth()));
  +      }
  +
  +      Collections.sort(depths);
  +      Collections.reverse(depths);
  +
  +      int maxDepth = ((Integer) depths.get(0)).intValue();
  +
  +      if (maxDepth > WARN_DEPTH)
  +      {
  +        LogLog.warn("Should warn user, depth=" + maxDepth);
  +      }
  +
  +      depthEnum = treeNode.depthFirstEnumeration();
   
  +      while (depthEnum.hasMoreElements())
  +      {
  +        DefaultMutableTreeNode node =
  +          (DefaultMutableTreeNode) depthEnum.nextElement();
  +
  +        if (node.isLeaf())
  +        {
  +          TreeNode[] nodes =
  +            ((DefaultMutableTreeNode) node.getParent()).getPath();
             TreePath treePath = new TreePath(nodes);
  -          logTree.collapsePath(treePath);
  +
  +          LogLog.debug("Expanding path:" + treePath);
  +
  +          logTree.expandPath(treePath);
           }
         }
       }
  +  }
   
  -    ensureRootExpanded();
  +  private void fireChangeEvent()
  +  {
  +    ChangeListener[] listeners =
  +      (ChangeListener[]) listenerList.getListeners(ChangeListener.class);
  +    ChangeEvent e = null;
  +
  +    for (int i = 0; i < listeners.length; i++)
  +    {
  +      if (e == null)
  +      {
  +        e = new ChangeEvent(this);
  +      }
  +
  +      listeners[i].stateChanged(e);
  +    }
     }
   
  -  /**
  -   * Expands the currently selected node (if any)
  -   * including all the children.
  -   *
  -   */
  -  private void expandCurrentlySelectedNode() {
  -    TreePath[] paths = logTree.getSelectionPaths();
  +  private void reconfigureMenuText()
  +  {
  +    String logger = getCurrentlySelectedLoggerName();
  +
  +    if ((logger == null) || (logger.length() == 0))
  +    {
  +      focusOnAction.putValue(Action.NAME, "Focus On...");
  +      hideAction.putValue(Action.NAME, "Ignore ...");
  +    }
  +    else
  +    {
  +      focusOnAction.putValue(Action.NAME, "Focus On '" + logger + "'");
  +      hideAction.putValue(Action.NAME, "Ignore '" + logger + "'");
  +    }
  +
  +    // need to ensure the button doens't update itself with the text, looks stupid 
otherwise
  +    focusOnLoggerButton.setText(null);
  +    ignoreLoggerButton.setText(null);
  +  }
   
  -    if (paths == null) {
  -      return;
  -    }
  +  /**
  +    * Configures varoius listeners etc for the components within
  +    * this Class.
  +    */
  +  private void setupListeners()
  +  {
  +    logTree.addMouseMotionListener(new MouseKeyIconListener());
   
  -    LogLog.debug("Expanding all children of selected node");
  +    /**
  +       * Enable the actions depending on state of the tree selection
  +       */
  +    logTree.addTreeSelectionListener(new TreeSelectionListener()
  +      {
  +        public void valueChanged(TreeSelectionEvent e)
  +        {
  +          TreePath path = e.getNewLeadSelectionPath();
  +          TreeNode node = null;
   
  -    for (int i = 0; i < paths.length; i++) {
  -      TreePath path = paths[i];
  +          if (path != null)
  +          {
  +            node = (TreeNode) path.getLastPathComponent();
  +          }
   
  -/**
  - * TODO this is commented out, right now it expands all nodes including the root, 
so if there is a large tree..... look out.
  - */
  -//      /**
  -//       * Handle an expansion of the Root node by only doing the first level.
  -//       * Safe...
  -//       */
  -//      if (path.getPathCount() == 1) {
  -//        logTree.expandPath(path);
  -//
  -//        return;
  -//      }
  +          //          editLoggerAction.setEnabled(path != null);
  +          String logger = getCurrentlySelectedLoggerName();
  +          focusOnAction.setEnabled(
  +            (path != null) && (node != null) && (node.getParent() != null)
  +            && !hiddenSet.contains(logger));
  +          hideAction.setEnabled(
  +            (path != null) && (node != null) && (node.getParent() != null)
  +            && !isFocusOnSelected());
   
  -      DefaultMutableTreeNode treeNode =
  -        (DefaultMutableTreeNode) path.getLastPathComponent();
  +          if (!focusOnAction.isEnabled())
  +          {
  +            setFocusOnSelected(false);
  +          }
  +          else
  +          {
  +          }
   
  -      Enumeration depthEnum = treeNode.depthFirstEnumeration();
  +          expandAction.setEnabled(path != null);
   
  -      if (!depthEnum.hasMoreElements()) {
  -        break;
  -      }
  +          if (logger != null)
  +          {
  +            boolean isHidden = hiddenSet.contains(logger);
  +            popupMenu.hideCheck.setSelected(isHidden);
  +            ignoreLoggerButton.setSelected(isHidden);
  +          }
   
  -      List depths = new ArrayList();
  +          collapseAction.setEnabled(path != null);
   
  -      while (depthEnum.hasMoreElements()) {
  -        depths.add(
  -          new Integer(
  -            ((DefaultMutableTreeNode) depthEnum.nextElement()).getDepth()));
  -      }
  +          reconfigureMenuText();
  +        }
  +      });
   
  -      Collections.sort(depths);
  -      Collections.reverse(depths);
  +    logTree.addMouseListener(popupListener);
   
  -      int maxDepth = ((Integer) depths.get(0)).intValue();
  +    /**
  +     * This listener ensures the Tool bar toggle button and popup menu check box
  +     * stay in sync, plus notifies all the ChangeListeners that
  +     * an effective filter criteria has been modified
  +     */
  +    focusOnAction.addPropertyChangeListener(new PropertyChangeListener()
  +      {
  +        public void propertyChange(PropertyChangeEvent evt)
  +        {
  +          popupMenu.focusOnCheck.setSelected(isFocusOnSelected());
  +          focusOnLoggerButton.setSelected(isFocusOnSelected());
   
  -      if (maxDepth > WARN_DEPTH) {
  -        LogLog.warn("Should warn user, depth=" + maxDepth);
  -      }
  +          if (logTree.getSelectionPath() != null)
  +          {
  +            logTreeModel.nodeChanged(
  +              (TreeNode) logTree.getSelectionPath().getLastPathComponent());
  +          }
   
  -      depthEnum = treeNode.depthFirstEnumeration();
  +          fireChangeEvent();
  +        }
  +      });
   
  -      while (depthEnum.hasMoreElements()) {
  -        DefaultMutableTreeNode node =
  -          (DefaultMutableTreeNode) depthEnum.nextElement();
  +    hideAction.addPropertyChangeListener(new PropertyChangeListener()
  +      {
  +        public void propertyChange(PropertyChangeEvent evt)
  +        {
  +          if (logTree.getSelectionPath() != null)
  +          {
  +            logTreeModel.nodeChanged(
  +              (TreeNode) logTree.getSelectionPath().getLastPathComponent());
  +          }
   
  -        if (node.isLeaf()) {
  -          TreeNode[] nodes =
  -            ((DefaultMutableTreeNode) node.getParent()).getPath();
  -          TreePath treePath = new TreePath(nodes);
  +          fireChangeEvent();
  +        }
  +      });
   
  -          LogLog.debug("Expanding path:" + treePath);
  +    //    /**
  +    //     * Now add a MouseListener that fires the expansion
  +    //     * action if CTRL + DBL CLICK is done.
  +    //     */
  +    //    logTree.addMouseListener(
  +    //      new MouseAdapter() {
  +    //        public void mouseClicked(MouseEvent e) {
  +    //          if (
  +    //            (e.getClickCount() > 1)
  +    //              && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0)
  +    //              && ((e.getModifiers() & InputEvent.BUTTON1_MASK) > 0)) {
  +    //            expandCurrentlySelectedNode();
  +    //            e.consume();
  +    //          } else if (e.getClickCount() > 1) {
  +    //            super.mouseClicked(e);
  +    //            LogLog.debug("Ignoring dbl click event " + e);
  +    //          }
  +    //        }
  +    //      });
   
  -          logTree.expandPath(treePath);
  -        }
  -      }
  -    }
  -  }
  +    logTree.addMouseListener(new MouseFocusOnListener());
   
  -  /**
  -     * configures all the components that are used in the mini-toolbar of this
  -     * component
  +    /**
  +     * We listen for when the FocusOn action changes, and then  translate
  +     * that to a RuleChange
        */
  -  private void configureToolbarPanel() {
  -    toolbar.setFloatable(false);
  +    addChangeListener(new ChangeListener()
  +      {
  +        public void stateChanged(ChangeEvent evt)
  +        {
  +          final String currentlySelectedLoggerName =
  +            getCurrentlySelectedLoggerName();
   
  -    expandButton.setAction(expandAction);
  -    expandButton.setText(null);
  -    collapseButton.setAction(collapseAction);
  -    collapseButton.setText(null);
  -    focusOnLoggerButton.setAction(focusOnAction);
  -    focusOnLoggerButton.setText(null);
  -    ignoreLoggerButton.setAction(hideAction);
  -    ignoreLoggerButton.setText(null);
  +          ruleDelegate =
  +          new AbstractRule()
  +            {
  +              public boolean evaluate(LoggingEvent e)
  +              {
  +                boolean isHidden = getHiddenSet().contains(e.getLoggerName());
  +                boolean result = !isHidden;
  +
  +                if (result && isFocusOnSelected())
  +                {
  +                  result =
  +                  result
  +                    && e.getLoggerName().startsWith(
  +                      currentlySelectedLoggerName);
  +                }
   
  -    expandButton.setFont(expandButton.getFont().deriveFont(Font.BOLD));
  -    collapseButton.setFont(collapseButton.getFont().deriveFont(Font.BOLD));
  +                return result;
  +              }
  +            };
  +          firePropertyChange("rule", null, null);
  +        }
  +      });
   
  -    editLoggerButton.setAction(editLoggerAction);
  -    editLoggerButton.setText(null);
  -    closeButton.setAction(closeAction);
  -    closeButton.setText(null);
  +    addPropertyChangeListener("hiddenSet", new PropertyChangeListener()
  +      {
  +        public void propertyChange(PropertyChangeEvent arg0)
  +        {
  +          DefaultListModel model = new DefaultListModel();
   
  -    toolbar.add(expandButton);
  -    toolbar.add(collapseButton);
  -    toolbar.addSeparator();
  -    toolbar.add(focusOnLoggerButton);
  -    toolbar.add(ignoreLoggerButton);
  +          List sortedIgnoreList = new ArrayList(getHiddenSet());
  +          Collections.sort(sortedIgnoreList);
   
  -    //    toolbar.add(editLoggerButton);
  -    toolbar.addSeparator();
  +          for (Iterator iter = sortedIgnoreList.iterator(); iter.hasNext();)
  +          {
  +            String string = (String) iter.next();
  +            model.addElement(string);
  +          }
   
  -    toolbar.add(Box.createHorizontalGlue());
  -    toolbar.add(closeButton);
  -    toolbar.add(Box.createHorizontalStrut(5));
  +          ignoreList.setModel(model);
  +        }
  +      });
     }
   
  -  /**
  -   * Ensures the Focus is set to a specific logger name
  -   * @param string
  -   */
  -  public void setFocusOn(String logger) {
  -    DefaultMutableTreeNode node = logTreeModel.lookupLogger(logger);
  -
  -    if (node != null) {
  -      TreeNode[] nodes = node.getPath();
  -      TreePath treePath = new TreePath(nodes);
  -      logTree.setSelectionPath(treePath);
  -
  -      if (!focusOnLoggerButton.isSelected()) {
  -        focusOnLoggerButton.doClick();
  -      }
  -    } else {
  -      LogLog.error("failed to lookup logger " + logger);
  -    }
  +  private void toggleFocusOnState()
  +  {
  +    setFocusOnSelected(!isFocusOnSelected());
  +    hideAction.setEnabled(!isFocusOnSelected());
     }
   
  -  /* (non-Javadoc)
  -   * @see 
org.apache.log4j.chainsaw.rule.Rule#evaluate(org.apache.log4j.spi.LoggingEvent)
  -   */
  -  public boolean evaluate(LoggingEvent e) {
  -    return ruleDelegate.evaluate(e);
  -  }
  +  //~ Inner Classes ===========================================================
   
     /**
  -        *
  -        * @author Paul Smith <[EMAIL PROTECTED]>
  +   * DOCUMENT ME!
  +   *
  +   * @author $author$
  +   * @version $Revision$, $Date$
  +   *
  +   * @author Paul Smith <[EMAIL PROTECTED]>
           *
           */
  -  private class LoggerNameTreeCellRenderer extends DefaultTreeCellRenderer {
  +  private class LoggerNameTreeCellRenderer extends DefaultTreeCellRenderer
  +  {
  +    //~ Constructors ==========================================================
  +
       //    private JPanel panel = new JPanel();
  -    private LoggerNameTreeCellRenderer() {
  +    private LoggerNameTreeCellRenderer()
  +    {
         super();
   
         //      panel.setBackground(UIManager.getColor("Tree.textBackground"));
  @@ -998,12 +1098,28 @@
         setOpaque(false);
       }
   
  +    //~ Methods ===============================================================
  +
       /* (non-Javadoc)
        * @see 
javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, 
java.lang.Object, boolean, boolean, boolean, int, boolean)
        */
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param tree DOCUMENT ME!
  +     * @param value DOCUMENT ME!
  +     * @param sel DOCUMENT ME!
  +     * @param expanded DOCUMENT ME!
  +     * @param leaf DOCUMENT ME!
  +     * @param row DOCUMENT ME!
  +     * @param hasFocus DOCUMENT ME!
  +     *
  +     * @return DOCUMENT ME!
  +     */
       public Component getTreeCellRendererComponent(
         JTree tree, Object value, boolean sel, boolean expanded, boolean leaf,
  -      int row, boolean hasFocus) {
  +      int row, boolean hasFocus)
  +    {
         JLabel component =
           (JLabel) super.getTreeCellRendererComponent(
             tree, value, sel, expanded, leaf, row, hasFocus);
  @@ -1012,7 +1128,8 @@
   
         int style = Font.PLAIN;
   
  -      if (sel && focusOnLoggerButton.isSelected()) {
  +      if (sel && focusOnLoggerButton.isSelected())
  +      {
           style = style | Font.BOLD;
         }
   
  @@ -1020,43 +1137,78 @@
           getLoggerName(
             new TreePath(((DefaultMutableTreeNode) value).getPath()));
   
  -      if (hiddenSet.contains(logger)) {
  +      if (hiddenSet.contains(logger))
  +      {
           //        component.setEnabled(false);
           //        component.setIcon(leaf?null:getDefaultOpenIcon());
           style = style | Font.ITALIC;
   
           //        LogLog.debug("TreeRenderer: '" + logger + "' is in hiddenSet, 
italicizing");
  -      } else {
  +      }
  +      else
  +      {
           //          LogLog.debug("TreeRenderer: '" + logger + "' is NOT in 
hiddenSet, leaving plain");
           //        component.setEnabled(true);
         }
   
  -      if (originalFont!=null)
  +      if (originalFont != null)
         {
           Font font2 = originalFont.deriveFont(style);
  +
           if (font2 != null)
           {
             component.setFont(font2);
           }
  -        
         }
   
         return component;
       }
     }
   
  -  private class LoggerTreePopupMenu extends JPopupMenu {
  +  private class LoggerTreePopupMenu extends JPopupMenu
  +  {
  +    //~ Instance fields =======================================================
  +
       JCheckBoxMenuItem focusOnCheck = new JCheckBoxMenuItem();
       JCheckBoxMenuItem hideCheck = new JCheckBoxMenuItem();
   
  -    private LoggerTreePopupMenu() {
  +    //~ Constructors ==========================================================
  +
  +    private LoggerTreePopupMenu()
  +    {
         initMenu();
       }
   
  +    //~ Methods ===============================================================
  +
  +    /* (non-Javadoc)
  +     * @see javax.swing.JPopupMenu#show(java.awt.Component, int, int)
  +     */
       /**
  -       *
  -       */
  -    private void initMenu() {
  +     * DOCUMENT ME!
  +     *
  +     * @param invoker DOCUMENT ME!
  +     * @param x DOCUMENT ME!
  +     * @param y DOCUMENT ME!
  +     */
  +    public void show(Component invoker, int x, int y)
  +    {
  +      DefaultMutableTreeNode node =
  +        (DefaultMutableTreeNode) logTree.getLastSelectedPathComponent();
  +
  +      if (node == null)
  +      {
  +        return;
  +      }
  +
  +      super.show(invoker, x, y);
  +    }
  +
  +    /**
  +     * DOCUMENT ME!
  +    */
  +    private void initMenu()
  +    {
         add(expandAction);
         add(collapseAction);
         addSeparator();
  @@ -1069,19 +1221,129 @@
         addSeparator();
         add(clearIgnoreListAction);
       }
  +  }
  +
  +  private final class MouseFocusOnListener extends MouseAdapter
  +  {
  +    //~ Methods ===============================================================
   
       /* (non-Javadoc)
  -    * @see javax.swing.JPopupMenu#show(java.awt.Component, int, int)
  -    */
  -    public void show(Component invoker, int x, int y) {
  -      DefaultMutableTreeNode node =
  -        (DefaultMutableTreeNode) logTree.getLastSelectedPathComponent();
  +     * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
  +     */
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseClicked(MouseEvent e)
  +    {
  +      if (
  +        (e.getClickCount() > 1)
  +          && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0)
  +          && ((e.getModifiers() & InputEvent.SHIFT_MASK) > 0))
  +      {
  +        ignoreLoggerAtPoint(e.getPoint());
  +        e.consume();
  +        fireChangeEvent();
  +      }
  +      else if (
  +        (e.getClickCount() > 1)
  +          && ((e.getModifiers() & InputEvent.CTRL_MASK) > 0))
  +      {
  +        focusAnLoggerAtPoint(e.getPoint());
  +        e.consume();
  +        fireChangeEvent();
  +      }
  +    }
   
  -      if (node == null) {
  -        return;
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param point
  +     */
  +    private void focusAnLoggerAtPoint(Point point)
  +    {
  +      String logger = getLoggerAtPoint(point);
  +
  +      if (logger != null)
  +      {
  +        toggleFocusOnState();
         }
  +    }
   
  -      super.show(invoker, x, y);
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param point
  +     * @return
  +     */
  +    private String getLoggerAtPoint(Point point)
  +    {
  +      TreePath path = logTree.getPathForLocation(point.x, point.y);
  +
  +      if (path != null)
  +      {
  +        return getLoggerName(path);
  +      }
  +
  +      return null;
  +    }
  +
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param point
  +     */
  +    private void ignoreLoggerAtPoint(Point point)
  +    {
  +      String logger = getLoggerAtPoint(point);
  +
  +      if (logger != null)
  +      {
  +        toggleHiddenLogger(logger);
  +      }
  +    }
  +  }
  +
  +  private final class MouseKeyIconListener extends MouseMotionAdapter
  +    implements MouseMotionListener
  +  {
  +    //~ Instance fields =======================================================
  +
  +    Cursor focusOnCursor =
  +      Toolkit.getDefaultToolkit().createCustomCursor(
  +        ChainsawIcons.FOCUS_ON_ICON.getImage(), new Point(10, 10), "");
  +    Cursor ignoreCursor =
  +      Toolkit.getDefaultToolkit().createCustomCursor(
  +        ChainsawIcons.IGNORE_ICON.getImage(), new Point(10, 10), "");
  +
  +    //~ Methods ===============================================================
  +
  +    /* (non-Javadoc)
  +     * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
  +     */
  +    /**
  +     * DOCUMENT ME!
  +     *
  +     * @param e DOCUMENT ME!
  +     */
  +    public void mouseMoved(MouseEvent e)
  +    {
  +      //      LogLog.debug(e.toString());
  +      if (
  +        ((e.getModifiers() & InputEvent.CTRL_MASK) > 0)
  +          && ((e.getModifiers() & InputEvent.SHIFT_MASK) > 0))
  +      {
  +        logTree.setCursor(ignoreCursor);
  +      }
  +      else if ((e.getModifiers() & InputEvent.CTRL_MASK) > 0)
  +      {
  +        logTree.setCursor(focusOnCursor);
  +      }
  +      else
  +      {
  +        logTree.setCursor(Cursor.getDefaultCursor());
  +      }
       }
     }
   }
  
  
  
  1.41      +9 -0      jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java
  
  Index: LogPanel.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- LogPanel.java     17 Dec 2003 02:06:50 -0000      1.40
  +++ LogPanel.java     17 Dec 2003 04:28:04 -0000      1.41
  @@ -1407,6 +1407,13 @@
               getPreferenceModel().isLogTreePanelVisible());
           
   
  +        Set set = logTreePanel.getHiddenSet();
  +        int index = 0;
  +        for (Iterator iter = set.iterator(); iter.hasNext(); )
  +        {
  +          Object logger = (Object) iter.next();
  +          event.saveSetting("Logger.Ignore." + index++, logger.toString() );
  +        }
           saveColumnSettings();
           saveColorSettings();
       }
  @@ -1497,6 +1504,8 @@
   
           lowerPanel.setDividerLocation(0.5d);
   
  +        logTreePanel.ignore(event.getSettingsStartingWith("Logger.Ignore."));
  +        
           File f = new File(SettingsManager.getInstance().getSettingsDirectory() +
                   File.separator + identifier + LogUI.COLUMNS_EXTENSION);
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to