Author: sdeboy
Date: Thu May 13 07:25:18 2010
New Revision: 943831

URL: http://svn.apache.org/viewvc?rev=943831&view=rev
Log:
Added ability to quickly define color rules for field under mouse pointer in 
the table as well as for the selected logger in the logger tree (uses default 
color chooser dialog)
Added support for defining refine focus expressions from the logger tree, and 
modifying the expression by appending additional logger expressions to the 
refine focus expression (via OR rules).
Fixed issues preventing welcome tab from correctly hiding if it was set as 
hidden when Chainsaw was last closed
Added ability to hide zeroconf panel if it was set as hidden when Chainsaw was 
last closed
Minor UI cleanup - removed drag & drop xml file tab (users can use file-open 
menu to load the file)
Added 'exception exists' to default error/fatal color rule
Renamed context menu text in an attempt to better describe the feature


Modified:
    
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawTabbedPane.java
    
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java
    
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
    
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/SavableTabSetting.java
    
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java
    
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/RuleColorizer.java
    
logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html

Modified: 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawTabbedPane.java
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawTabbedPane.java?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawTabbedPane.java
 (original)
+++ 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawTabbedPane.java
 Thu May 13 07:25:18 2010
@@ -63,7 +63,7 @@ import org.apache.log4j.chainsaw.prefs.S
 class ChainsawTabbedPane extends JTabbedPane implements SettingsListener {
   public SavableTabSetting tabSetting;
   public static final String WELCOME_TAB = "Welcome";
-  public static final String DRAG_DROP_TAB = "Drag & Drop XML log files here";
+  public static final String ZEROCONF = "Zeroconf";
   /**
    *
    * Create the tabbed pane.  
@@ -145,12 +145,12 @@ class ChainsawTabbedPane extends JTabbed
      SavableTabSetting setting = new SavableTabSetting();
      for(int i = 0 ; i < count ; i++){
        title = super.getTitleAt(i);
-       if(title.equals("Welcome")){
+       if(title.equals(WELCOME_TAB)){
          setting.setWelcome(true);
-       } else if (title.equals("Drag & Drop XML log files here")){
-         setting.setDragdrop(true);
        } else if (title.equals("chainsaw-log")){
          setting.setChainsawLog(true);
+       } else if (title.equals(ZEROCONF)){
+         setting.setZeroconf(true);
        }
      }
 
@@ -158,6 +158,7 @@ class ChainsawTabbedPane extends JTabbed
      writer.close();
 
    } catch (Exception e) {
+     file.delete();
      e.printStackTrace();
    }
   }
@@ -179,11 +180,12 @@ class ChainsawTabbedPane extends JTabbed
       } else {
         tabSetting = new SavableTabSetting();
         tabSetting.setWelcome(true);
-        tabSetting.setDragdrop(true);
         tabSetting.setChainsawLog(true);
+        tabSetting.setZeroconf(true);
       }
     } catch (Exception e) {
       e.printStackTrace();
+      file.delete();
     }
   }
 }

Modified: 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
 (original)
+++ 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
 Thu May 13 07:25:18 2010
@@ -74,7 +74,7 @@ class ChainsawToolBarAndMenus implements
   private final JTextField findField;
   private final Action changeModelAction;
   private final Action clearAction;
-  private final Action closeAction;
+  private final Action toggleWelcomeVisibleAction;
   private final Action findNextAction;
   private final Action findPreviousAction;
   private final Action findPreviousColorizedEventAction;
@@ -110,7 +110,7 @@ class ChainsawToolBarAndMenus implements
     new JCheckBoxMenuItem();
   private final JMenu viewMenu = new JMenu("View");
   private final JMenuBar menuBar;
-  private final JCheckBoxMenuItem menuItemClose = new JCheckBoxMenuItem();
+  private final JCheckBoxMenuItem menuShowWelcome = new JCheckBoxMenuItem();
   private final JToolBar toolbar;
   private final LogUI logui;
   private final SmallButton clearButton = new SmallButton();
@@ -128,7 +128,7 @@ class ChainsawToolBarAndMenus implements
     toolbar = new JToolBar(SwingConstants.HORIZONTAL);
     menuBar = new JMenuBar();
     fileMenu = new FileMenu(logui);
-    closeAction = createCloseHelpAction();
+    toggleWelcomeVisibleAction = toggleWelcomeVisibleAction();
     changeModelAction = createChangeModelAction();
     findField = new JTextField();
     findNextAction = getFindNextAction();
@@ -409,16 +409,15 @@ class ChainsawToolBarAndMenus implements
     return action;
   }
 
-  private Action createCloseHelpAction() {
+  private Action toggleWelcomeVisibleAction() {
     final Action action =
       new AbstractAction() {
         public void actionPerformed(ActionEvent e) {
-          closeAction.putValue(Action.NAME, "Welcome tab");
-          logui.removeWelcomePanel();
-
-          if (menuItemClose.isSelected()) {
+          toggleWelcomeVisibleAction.putValue(Action.NAME, "Welcome tab");
+          if (menuShowWelcome.isSelected()) {
             logui.addWelcomePanel();
           } else {
+            logui.removeWelcomePanel();
           }
         }
       };
@@ -455,7 +454,7 @@ class ChainsawToolBarAndMenus implements
         }
       });
 
-    menuItemClose.setAction(closeAction);
+    menuShowWelcome.setAction(toggleWelcomeVisibleAction);
 
     JCheckBoxMenuItem pause = new JCheckBoxMenuItem(pauseAction);
     JMenuItem menuPrefs = new JMenuItem(showPreferencesAction);
@@ -540,7 +539,7 @@ class ChainsawToolBarAndMenus implements
     viewMenu.add(showToolbarCheck);
     viewMenu.add(toggleStatusBarCheck);
     viewMenu.add(toggleShowReceiversCheck);
-    viewMenu.add(menuItemClose);
+    viewMenu.add(menuShowWelcome);
     viewMenu.addSeparator();
     viewMenu.add(menuCustomExpressionPanel);
 
@@ -893,7 +892,7 @@ class ChainsawToolBarAndMenus implements
     }
     showReceiversButton.setSelected(
       logui.getApplicationPreferenceModel().isReceivers());
-    menuItemClose.setSelected(logui.getTabbedPane().containsWelcomePanel());
+    menuShowWelcome.setSelected(logui.getTabbedPane().containsWelcomePanel());
 
     /**
      * We get the currently selected LogPanel, and if null, deactivate some
@@ -917,7 +916,7 @@ class ChainsawToolBarAndMenus implements
       findPanel.add(Box.createRigidArea(new Dimension(5, 0)));
       searchLabel.setLabelFor(findField);
       activeTabMenu.setEnabled(false);
-      closeAction.setEnabled(true);
+      toggleWelcomeVisibleAction.setEnabled(true);
       detailPaneButton.setSelected(false);
       toggleCyclicButton.setSelected(false);
     } else {

Modified: 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java 
(original)
+++ 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java 
Thu May 13 07:25:18 2010
@@ -80,6 +80,7 @@ import javax.swing.ComboBoxEditor;
 import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JColorChooser;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
@@ -141,6 +142,7 @@ import org.apache.log4j.chainsaw.prefs.S
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
 import org.apache.log4j.chainsaw.xstream.TableColumnConverter;
 import org.apache.log4j.helpers.Constants;
+import org.apache.log4j.rule.ColorRule;
 import org.apache.log4j.rule.ExpressionRule;
 import org.apache.log4j.rule.Rule;
 import org.apache.log4j.spi.LoggingEvent;
@@ -695,7 +697,7 @@ public class LogPanel extends DockablePa
      *
      */
     LogPanelLoggerTreeModel logTreeModel = new LogPanelLoggerTreeModel();
-    logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel, 
this);
+    logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel, 
this, colorizer);
     logTreePanel.addPropertyChangeListener("searchExpression", new 
PropertyChangeListener()
     {
         public void propertyChange(PropertyChangeEvent evt)
@@ -1356,7 +1358,7 @@ public class LogPanel extends DockablePa
     menuItemLogPanelPreferences.setIcon(ChainsawIcons.ICON_PREFERENCES);
 
     final JMenuItem menuItemFocusOn =
-      new JMenuItem("Set 'refine focus' field");
+      new JMenuItem("Set 'refine focus' field to value under pointer");
     menuItemFocusOn.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
@@ -1392,7 +1394,7 @@ public class LogPanel extends DockablePa
       });
 
     final JMenuItem menuDefineAddCustomFilter =
-      new JMenuItem("Add to 'refine focus' field");
+      new JMenuItem("Add value under pointer to 'refine focus' field");
     menuDefineAddCustomFilter.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
@@ -1431,6 +1433,51 @@ public class LogPanel extends DockablePa
         }
       });
 
+    final JMenuItem menuBuildColorRule =
+      new JMenuItem("Define color rule for value under pointer");
+    menuBuildColorRule.addActionListener(
+      new ActionListener() {
+        public void actionPerformed(ActionEvent evt) {
+          if (currentPoint != null) {
+            String operator = "==";
+            int column = table.columnAtPoint(currentPoint);
+            int row = table.rowAtPoint(currentPoint);
+            String colName = table.getColumnName(column).toUpperCase();
+            String value = "";
+
+            if 
(colName.equalsIgnoreCase(ChainsawConstants.TIMESTAMP_COL_NAME)) {
+              JComponent comp =
+                (JComponent) table.getCellRenderer(row, column);
+
+              if (comp instanceof JLabel) {
+                value = ((JLabel) comp).getText();
+              }
+            } else if 
(colName.equalsIgnoreCase(ChainsawConstants.LOGGER_COL_NAME)) {
+                operator = "like";
+                value = "^" + table.getValueAt(row, column).toString() + ".*";
+            } else {
+              Object o = table.getValueAt(row, column).toString();
+
+              if (o instanceof String[] && ((String[])o).length > 0) {
+                value = ((String[]) o)[0];
+                operator = "~=";
+              } else {
+                value = o.toString();
+              }
+            }
+
+            if (columnNameKeywordMap.containsKey(colName)) {
+                Color c = JColorChooser.showDialog(getRootPane(), "Choose a 
color", Color.red);
+                if (c != null) {
+                    String expression = 
columnNameKeywordMap.get(colName).toString() + " " + operator + " '" + value + 
"'";
+                    
colorizer.addRule(ChainsawConstants.DEFAULT_COLOR_RULE_NAME, new 
ColorRule(expression,
+                            ExpressionRule.getRule(expression), c, 
ChainsawConstants.COLOR_DEFAULT_FOREGROUND));
+                }
+            }
+          }
+        }
+      });
+
     final JPopupMenu p = new JPopupMenu();
 
     final Action clearFocusAction =
@@ -1467,7 +1514,7 @@ public class LogPanel extends DockablePa
     p.add(new JSeparator());
 
         final JMenuItem menuItemSearch =
-      new JMenuItem("Find next");
+      new JMenuItem("Search for value under pointer");
     menuItemSearch.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
@@ -1480,6 +1527,9 @@ public class LogPanel extends DockablePa
 
             if 
(colName.equalsIgnoreCase(ChainsawConstants.TIMESTAMP_COL_NAME)) {
                value = timestampExpressionFormat.format(new 
Date(table.getValueAt(row, column).toString()));
+            } else if 
(colName.equalsIgnoreCase(ChainsawConstants.LOGGER_COL_NAME)) {
+                operator = "like";
+                value = "^" + table.getValueAt(row, column).toString() + ".*";
             } else {
               Object o = table.getValueAt(row, column);
 
@@ -1504,7 +1554,7 @@ public class LogPanel extends DockablePa
       });
 
       final Action clearSearchAction =
-        new AbstractAction("Clear find next") {
+        new AbstractAction("Clear search field") {
           public void actionPerformed(ActionEvent e) {
             findField.setText(null);
             updateFindRule(null);
@@ -1534,7 +1584,7 @@ public class LogPanel extends DockablePa
     });
 
     final JMenuItem menuItemDisplayRelativeTimesToRowUnderCursor =
-      new JMenuItem("Show times relative to this row");
+      new JMenuItem("Show times relative to this event");
     menuItemDisplayRelativeTimesToRowUnderCursor.addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent e) {
@@ -1556,6 +1606,9 @@ public class LogPanel extends DockablePa
     p.add(menuItemDisplayNormalTimes);
     p.add(new JSeparator());
 
+    p.add(menuBuildColorRule);
+    p.add(new JSeparator());
+        
     p.add(menuItemToggleDetails);
     p.add(menuItemLoggerTree);
     p.add(menuItemToggleToolTips);
@@ -1589,6 +1642,15 @@ public class LogPanel extends DockablePa
        return preferenceModel.isScrollToBottom();
   }
 
+  public void setRefineFocusText(String refineFocusText) {
+      final JTextField filterText =(JTextField) 
filterCombo.getEditor().getEditorComponent();
+      filterText.setText(refineFocusText);
+  }
+
+  public String getRefineFocusText() {
+      final JTextField filterText =(JTextField) 
filterCombo.getEditor().getEditorComponent();
+      return filterText.getText();
+  }
   /**
    * Mutator
    *
@@ -2309,7 +2371,7 @@ public class LogPanel extends DockablePa
     undockedFindNextAction.putValue(Action.NAME, "Find next");
     undockedFindNextAction.putValue(
       Action.SHORT_DESCRIPTION,
-      "Find the next occurrence of the rule from the current row");
+      "Find the next search occurrence");
     undockedFindNextAction.putValue(
       Action.SMALL_ICON, new ImageIcon(ChainsawIcons.DOWN));
 
@@ -2334,7 +2396,7 @@ public class LogPanel extends DockablePa
     undockedFindPreviousAction.putValue(Action.NAME, "Find previous");
     undockedFindPreviousAction.putValue(
       Action.SHORT_DESCRIPTION,
-      "Find the previous occurrence of the rule from the current row");
+      "Find the previous search occurrence");
     undockedFindPreviousAction.putValue(
       Action.SMALL_ICON, new ImageIcon(ChainsawIcons.UP));
 

Modified: 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java 
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java 
Thu May 13 07:25:18 2010
@@ -543,7 +543,6 @@ public class LogUI extends JFrame implem
             
         }});
 
-       addDragDropPanel();
     applicationPreferenceModelPanel = new 
ApplicationPreferenceModelPanel(applicationPreferenceModel);
 
     applicationPreferenceModelPanel.setOkCancelActionListener(
@@ -565,23 +564,6 @@ public class LogUI extends JFrame implem
   
   }
 
-  private void addDragDropPanel(){
-    final JLabel lbl  = new JLabel();
-    lbl.setEnabled(false);
-    final String dndTitle = ChainsawTabbedPane.DRAG_DROP_TAB;
-    SwingUtilities.invokeLater(new Runnable() {
-       public void run() {
-           ensureWelcomePanelVisible();
-           getTabbedPane().addANewTab(dndTitle,lbl,null, "You can Drag & Drop 
XML log files onto the Tabbed Pane and they will be loaded into Chainsaw" );
-           getTabbedPane().setEnabledAt(getTabbedPane().indexOfTab(dndTitle), 
false);
-            if (!getPanelMap().containsKey(dndTitle)) {
-              getPanelMap().put(dndTitle, lbl);
-            }
-        }
-    });
-  }
-
-
   private void initPlugins(PluginRegistry pluginRegistry) {
     pluginRegistry.addPluginListener(
       new PluginListener() {
@@ -589,6 +571,7 @@ public class LogUI extends JFrame implem
           if (e.getPlugin() instanceof JComponent) {
             JComponent plugin = (JComponent) e.getPlugin();
             getTabbedPane().addANewTab(plugin.getName(), plugin, null, null);
+            getPanelMap().put(plugin.getName(), plugin);
           }
         }
 
@@ -688,7 +671,7 @@ public class LogUI extends JFrame implem
       }
       getTabbedPane().setSelectedComponent(welcomePanel);
   }
-  
+
   /**
    * Given the load event, configures the size/location of the main window etc
    * etc.
@@ -944,7 +927,7 @@ public class LogUI extends JFrame implem
           } else if (selectedComp instanceof WelcomePanel) {
             currentName = ChainsawTabbedPane.WELCOME_TAB;
           } else {
-            currentName = ChainsawTabbedPane.DRAG_DROP_TAB;
+            currentName = ChainsawTabbedPane.ZEROCONF;
           }
 
           int count = getTabbedPane().getTabCount();
@@ -1179,8 +1162,8 @@ public class LogUI extends JFrame implem
     if (!getTabbedPane().tabSetting.isWelcome()){
       displayPanel(ChainsawTabbedPane.WELCOME_TAB, false);
     }
-    if (!getTabbedPane().tabSetting.isDragdrop()){
-      displayPanel(ChainsawTabbedPane.DRAG_DROP_TAB, false);
+    if (!getTabbedPane().tabSetting.isZeroconf()){
+      displayPanel(ChainsawTabbedPane.ZEROCONF, false);
     }
     tbms.stateChange();
 
@@ -1527,10 +1510,16 @@ public class LogUI extends JFrame implem
   }
 
   void removeWelcomePanel() {
-    if (getTabbedPane().containsWelcomePanel()) {
-      getTabbedPane().remove(
-        
getTabbedPane().getComponentAt(getTabbedPane().indexOfTab(ChainsawTabbedPane.WELCOME_TAB)));
-    }
+    EventQueue.invokeLater(new Runnable()
+    {
+        public void run()
+        {
+            if (getTabbedPane().containsWelcomePanel()) {
+              getTabbedPane().remove(
+                
getTabbedPane().getComponentAt(getTabbedPane().indexOfTab(ChainsawTabbedPane.WELCOME_TAB)));
+            }
+        }
+    });
   }
 
   ChainsawStatusBar getStatusBar() {
@@ -1571,31 +1560,18 @@ public class LogUI extends JFrame implem
   }
 
   void displayPanel(String panelName, boolean display) {
-    Object o = getPanelMap().get(panelName);
-    Component p = null;
+    Component p = (Component)getPanelMap().get(panelName);
 
-    if (o instanceof LogPanel) {
-      p = (LogPanel) o;
-    } else if (o instanceof WelcomePanel) {
-      p = (WelcomePanel) o;
-    } else if (o instanceof JLabel) {
-      p = (JLabel) o;
-    }
-
-      int index = getTabbedPane().indexOfTab(panelName);
-
-      if ((index == -1) && display) {
-        if (panelName.equals(ChainsawTabbedPane.DRAG_DROP_TAB)){
-          addDragDropPanel();
-        } else {
-          getTabbedPane().addTab(panelName, p);
-        }
-      }
+    int index = getTabbedPane().indexOfTab(panelName);
 
-      if ((index > -1) && !display) {
-        getTabbedPane().removeTabAt(index);
-      }
-   }
+    if ((index == -1) && display) {
+      getTabbedPane().addTab(panelName, p);
+    }
+
+    if ((index > -1) && !display) {
+      getTabbedPane().removeTabAt(index);
+    }
+  }
   
 
   /**

Modified: 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
 (original)
+++ 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
 Thu May 13 07:25:18 2010
@@ -19,6 +19,7 @@
 package org.apache.log4j.chainsaw;
 
 import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Component;
 import java.awt.Cursor;
 import java.awt.FlowLayout;
@@ -52,6 +53,7 @@ import javax.swing.DefaultListModel;
 import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JColorChooser;
 import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.JList;
@@ -78,9 +80,12 @@ import javax.swing.tree.TreeSelectionMod
 
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
+import org.apache.log4j.chainsaw.color.RuleColorizer;
 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
 import org.apache.log4j.chainsaw.icons.LineIconFactory;
 import org.apache.log4j.rule.AbstractRule;
+import org.apache.log4j.rule.ColorRule;
+import org.apache.log4j.rule.ExpressionRule;
 import org.apache.log4j.rule.Rule;
 import org.apache.log4j.spi.LoggingEvent;
 
@@ -112,10 +117,12 @@ final class LoggerNameTreePanel extends 
   private final Action expandAction;
   private final Action findNextAction;
   private final Action clearFindNextAction;
+  private final Action defineColorRuleForLoggerAction;
+  private final Action setRefineFocusAction;
+  private final Action updateRefineFocusAction;
   private final JButton expandButton = new SmallButton();
-  private final JButton findNextButton = new SmallButton();
-  private final JButton clearFindNextButton = new SmallButton();
   private final Action focusOnAction;
+  private final Action clearRefineFocusAction;
   private final SmallToggleButton focusOnLoggerButton =
     new SmallToggleButton();
   private final Set hiddenSet = new HashSet();
@@ -141,6 +148,7 @@ final class LoggerNameTreePanel extends 
   private final JScrollPane scrollTree;
   private final JToolBar toolbar = new JToolBar();
   private final LogPanel logPanel;
+  private final RuleColorizer colorizer;
 
     //~ Constructors 
============================================================
 
@@ -149,12 +157,13 @@ final class LoggerNameTreePanel extends 
    *
    * @param logTreeModel
    */
-  LoggerNameTreePanel(LogPanelLoggerTreeModel logTreeModel, 
LogPanelPreferenceModel preferenceModel, LogPanel logPanel)
+  LoggerNameTreePanel(LogPanelLoggerTreeModel logTreeModel, 
LogPanelPreferenceModel preferenceModel, LogPanel logPanel, RuleColorizer 
colorizer)
   {
     super();
     this.logTreeModel = logTreeModel;
     this.preferenceModel = preferenceModel;
     this.logPanel = logPanel;
+    this.colorizer = colorizer;
 
     setLayout(new BorderLayout());
 
@@ -261,6 +270,10 @@ final class LoggerNameTreePanel extends 
     expandAction = createExpandAction();
     findNextAction = createFindNextAction();
     clearFindNextAction = createClearFindNextAction();
+    defineColorRuleForLoggerAction = createDefineColorRuleForLoggerAction();
+    clearRefineFocusAction = createClearRefineFocusAction();
+    setRefineFocusAction = createSetRefineFocusAction();
+    updateRefineFocusAction = createUpdateRefineFocusAction();
     editLoggerAction = createEditLoggerAction();
     closeAction = createCloseAction();
     collapseAction = createCollapseAction();
@@ -604,12 +617,6 @@ final class LoggerNameTreePanel extends 
     ignoreLoggerButton.setAction(hideAction);
     ignoreLoggerButton.setText(null);
 
-    findNextButton.setAction(findNextAction);
-    findNextButton.setText(null);
-
-    clearFindNextButton.setAction(clearFindNextAction);
-    clearFindNextButton.setText(null);
-
     expandButton.setFont(expandButton.getFont().deriveFont(Font.BOLD));
     collapseButton.setFont(collapseButton.getFont().deriveFont(Font.BOLD));
 
@@ -776,6 +783,97 @@ final class LoggerNameTreePanel extends 
       return action;
     }
 
+    private Action createSetRefineFocusAction()
+    {
+      Action action = new AbstractAction()
+        {
+          public void actionPerformed(ActionEvent e)
+          {
+            setRefineFocusUsingCurrentlySelectedNode();
+          }
+        };
+
+      action.putValue(Action.NAME, "Set 'refine focus' to selected logger");
+      action.putValue(
+        Action.SHORT_DESCRIPTION,
+        "Refine focus on the selected node");
+      action.setEnabled(false);
+
+      return action;
+    }
+
+    private Action createUpdateRefineFocusAction()
+    {
+      Action action = new AbstractAction()
+        {
+          public void actionPerformed(ActionEvent e)
+          {
+            updateRefineFocusUsingCurrentlySelectedNode();
+          }
+        };
+
+      action.putValue(Action.NAME, "Update 'refine focus' to include selected 
logger");
+      action.putValue(
+        Action.SHORT_DESCRIPTION,
+        "Add selected node to 'refine focus' field");
+      action.setEnabled(false);
+
+      return action;
+    }
+
+    private void updateRefineFocusUsingCurrentlySelectedNode()
+    {
+        String selectedLogger = getCurrentlySelectedLoggerName();
+        TreePath[] paths = logTree.getSelectionPaths();
+
+        if (paths == null)
+        {
+          return;
+        }
+        String currentFilterText = logPanel.getRefineFocusText();
+        logPanel.setRefineFocusText(currentFilterText + " || logger like '^" + 
selectedLogger + ".*'");
+    }
+
+    private void setRefineFocusUsingCurrentlySelectedNode()
+    {
+        String selectedLogger = getCurrentlySelectedLoggerName();
+        TreePath[] paths = logTree.getSelectionPaths();
+
+        if (paths == null)
+        {
+          return;
+        }
+        logPanel.setRefineFocusText("logger like '^" + selectedLogger + ".*'");
+    }
+
+    private Action createDefineColorRuleForLoggerAction() {
+        Action action = new AbstractAction()
+          {
+            public void actionPerformed(ActionEvent e)
+            {
+                String selectedLogger = getCurrentlySelectedLoggerName();
+                TreePath[] paths = logTree.getSelectionPaths();
+
+                if (paths == null)
+                {
+                  return;
+                }
+            Color c = JColorChooser.showDialog(getRootPane(), "Choose a 
color", Color.red);
+            if (c != null) {
+                String expression = "logger like '^" + selectedLogger + ".*'";
+                colorizer.addRule(ChainsawConstants.DEFAULT_COLOR_RULE_NAME, 
new ColorRule(expression,
+                        ExpressionRule.getRule(expression), c, 
ChainsawConstants.COLOR_DEFAULT_FOREGROUND));
+            }
+        }};
+
+        action.putValue(Action.NAME, "Define color rule for selected logger");
+        action.putValue(
+          Action.SHORT_DESCRIPTION,
+          "Define color rule for logger");
+        action.setEnabled(false);
+        return action;
+    }
+
     /**
      * Creates an action that is used to find the next match of the selected 
node (similar to default selection behavior
      * except the search field is populated and the next match is selected.
@@ -791,15 +889,33 @@ final class LoggerNameTreePanel extends 
           }
         };
 
-      action.putValue(Action.NAME, "Clear find next");
+      action.putValue(Action.NAME, "Clear search field");
       action.putValue(
         Action.SHORT_DESCRIPTION,
-        "Search using the selected node");
+        "Clear the search field");
       action.setEnabled(false);
 
       return action;
     }
 
+    private Action createClearRefineFocusAction()
+    {
+      Action action = new AbstractAction()
+        {
+          public void actionPerformed(ActionEvent e)
+          {
+            clearRefineFocus();
+          }
+        };
+
+      action.putValue(Action.NAME, "Clear 'refine focus' field");
+      action.putValue(
+        Action.SHORT_DESCRIPTION,
+        "Clear the refine focus field");
+      action.setEnabled(false);
+
+      return action;
+    }
 
   /**
    * DOCUMENT ME!
@@ -888,7 +1004,7 @@ final class LoggerNameTreePanel extends 
       {
         return;
       }
-      firePropertyChange("searchExpression", null, "logger ~= " + 
selectedLogger);
+      firePropertyChange("searchExpression", null, "logger like '^" + 
selectedLogger + ".*'");
   }
 
   private void clearFindNext()
@@ -896,6 +1012,11 @@ final class LoggerNameTreePanel extends 
       firePropertyChange("searchExpression", null, "");
   }
 
+  private void clearRefineFocus()
+  {
+      logPanel.setRefineFocusText("");
+  }
+
   /**
    * Expands the currently selected node (if any)
    * including all the children.
@@ -1005,19 +1126,24 @@ final class LoggerNameTreePanel extends 
     {
       focusOnAction.putValue(Action.NAME, "Focus On...");
       hideAction.putValue(Action.NAME, "Ignore...");
-      findNextAction.putValue(Action.NAME, "Find next...");
+      findNextAction.putValue(Action.NAME, "Search for...");
+      setRefineFocusAction.putValue(Action.NAME, "Set refine focus field");
+      updateRefineFocusAction.putValue(Action.NAME, "Add to refine focus 
field");
+      defineColorRuleForLoggerAction.putValue(Action.NAME, "Define color 
rule");
     }
     else
     {
       focusOnAction.putValue(Action.NAME, "Focus On '" + logger + "'");
       hideAction.putValue(Action.NAME, "Ignore '" + logger + "'");
-      findNextAction.putValue(Action.NAME, "Find next '" + logger + "'");
+      findNextAction.putValue(Action.NAME, "Search for '" + logger + "'");
+      setRefineFocusAction.putValue(Action.NAME, "Set refine focus field to '" 
+ logger + "'");
+      updateRefineFocusAction.putValue(Action.NAME, "Add '" + logger + "' to 
'refine focus' field");
+      defineColorRuleForLoggerAction.putValue(Action.NAME, "Define color rule 
for '" + logger + "'");
     }
 
     // need to ensure the button doens't update itself with the text, looks 
stupid otherwise
     focusOnLoggerButton.setText(null);
     ignoreLoggerButton.setText(null);
-    findNextButton.setText(null);
   }
 
   /**
@@ -1063,6 +1189,10 @@ final class LoggerNameTreePanel extends 
           expandAction.setEnabled(path != null);
           findNextAction.setEnabled(path != null);
           clearFindNextAction.setEnabled(true);
+          defineColorRuleForLoggerAction.setEnabled(path != null);
+          setRefineFocusAction.setEnabled(path != null);
+          updateRefineFocusAction.setEnabled(path != null);
+          clearRefineFocusAction.setEnabled(true);
 
           if (logger != null)
           {
@@ -1341,14 +1471,20 @@ final class LoggerNameTreePanel extends 
       add(expandAction);
       add(collapseAction);
       addSeparator();
-      add(findNextAction);
-      add(clearFindNextAction);
-      addSeparator();
       add(focusOnCheck);
       add(hideCheck);
+      addSeparator();
+      add(setRefineFocusAction);
+      add(updateRefineFocusAction);
+      add(clearRefineFocusAction);
+      addSeparator();
+      add(findNextAction);
+      add(clearFindNextAction);
 
-      //      add(editLoggerAction);
       addSeparator();
+      add(defineColorRuleForLoggerAction);
+      addSeparator();
+
       add(clearIgnoreListAction);
     }
   }

Modified: 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/SavableTabSetting.java
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/SavableTabSetting.java?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/SavableTabSetting.java
 (original)
+++ 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/SavableTabSetting.java
 Thu May 13 07:25:18 2010
@@ -7,12 +7,10 @@ package org.apache.log4j.chainsaw;
 
 public class SavableTabSetting {
     private boolean welcome = false;
-    private boolean dragdrop = false;
     private boolean chainsawLog = false;
-
-    public void setDragdrop(boolean dragdrop) {
-        this.dragdrop = dragdrop;
-    }
+    private boolean zeroConf = false;
+    //not used currently, but leaving it here to prevent xstream exception for 
older clients
+    private boolean dragdrop = false;
 
     public void setWelcome(boolean welcome) {
         this.welcome = welcome;
@@ -22,15 +20,20 @@ public class SavableTabSetting {
         this.chainsawLog = chainsawLog;
     }
 
-    public boolean isWelcome() {
-        return welcome;
+    public void setZeroconf(boolean zeroConf)
+    {
+        this.zeroConf = zeroConf;
     }
 
-    public boolean isDragdrop() {
-        return dragdrop;
+    public boolean isWelcome() {
+        return welcome;
     }
 
     public boolean isChainsawLog() {
         return chainsawLog;
     }
+
+    public boolean isZeroconf() {
+        return zeroConf;
+    }
 }

Modified: 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java
 (original)
+++ 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/ColorPanel.java
 Thu May 13 07:25:18 2010
@@ -353,47 +353,14 @@ public class ColorPanel extends JPanel
       return data;
   }
 
-  private Vector getDefaultColors() {
-    Vector vec = new Vector();
-
-    vec.add(Color.white);
-    vec.add(Color.black);
-    //add default alternating color & search backgrounds (both foreground are 
black)
-    vec.add(ChainsawConstants.COLOR_ODD_ROW_BACKGROUND);
-    vec.add(ChainsawConstants.FIND_LOGGER_BACKGROUND);
-
-    vec.add(new Color(255, 255, 225));
-    vec.add(new Color(255, 225, 255));
-    vec.add(new Color(225, 255, 255));
-    vec.add(new Color(255, 225, 225));
-    vec.add(new Color(225, 255, 225));
-    vec.add(new Color(225, 225, 255));
-    vec.add(new Color(225, 225, 183));
-    vec.add(new Color(225, 183, 225));
-    vec.add(new Color(183, 225, 225));
-    vec.add(new Color(183, 225, 183));
-    vec.add(new Color(183, 183, 225));
-    vec.add(new Color(232, 201, 169));
-    vec.add(new Color(255, 255, 153));
-    vec.add(new Color(255, 153, 153));
-    vec.add(new Color(189, 156, 89));
-    vec.add(new Color(255, 102, 102));
-    vec.add(new Color(255, 177, 61));
-    vec.add(new Color(61, 255, 61));
-    vec.add(new Color(153, 153, 255));
-    vec.add(new Color(255, 153, 255));
-      
-    return vec;
-  }
-
   private void configureTable() {
     table.setToolTipText("Double click to edit");
     table.setRowHeight(20);
     table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     table.setColumnSelectionAllowed(false);
 
-    Vector backgroundColors = getDefaultColors();
-    Vector foregroundColors = getDefaultColors();
+    Vector backgroundColors = colorizer.getDefaultColors();
+    Vector foregroundColors = colorizer.getDefaultColors();
     backgroundColors.add("Browse...");
     foregroundColors.add("Browse...");
 
@@ -432,8 +399,8 @@ public class ColorPanel extends JPanel
       thisTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
       thisTable.setColumnSelectionAllowed(false);
 
-      Vector backgroundColors = getDefaultColors();
-      Vector foregroundColors = getDefaultColors();
+      Vector backgroundColors = colorizer.getDefaultColors();
+      Vector foregroundColors = colorizer.getDefaultColors();
       backgroundColors.add("Browse...");
       foregroundColors.add("Browse...");
 

Modified: 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/RuleColorizer.java
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/RuleColorizer.java?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/RuleColorizer.java
 (original)
+++ 
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color/RuleColorizer.java
 Thu May 13 07:25:18 2010
@@ -36,6 +36,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Vector;
 
 import org.apache.log4j.chainsaw.ChainsawConstants;
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
@@ -52,32 +53,31 @@ import org.apache.log4j.spi.LoggingEvent
  * @author Scott Deboy <[email protected]>
  */
 public class RuleColorizer implements Colorizer {
-  public static final String DEFAULT_NAME = "Default";
   private Map rules;
   private final PropertyChangeSupport colorChangeSupport =
     new PropertyChangeSupport(this);
   private Map defaultRules = new HashMap();
-  private String currentRuleSet = DEFAULT_NAME;
+  private String currentRuleSet = ChainsawConstants.DEFAULT_COLOR_RULE_NAME;
   private Rule findRule;
   private Rule loggerRule;
 
   private static final String COLORS_EXTENSION = ".colors";
 
   private final Color WARN_DEFAULT_COLOR = new Color(255, 255, 153);
-  private final Color ERROR_OR_FATAL_DEFAULT_COLOR = new Color(255, 153, 153);
+  private final Color FATAL_OR_ERROR_DEFAULT_COLOR = new Color(255, 153, 153);
   private final Color MARKER_DEFAULT_COLOR = new Color(153, 255, 153);
 
   private final String DEFAULT_WARN_EXPRESSION = "level == WARN";
-  private final String DEFAULT_ERROR_FATAL_EXPRESSION = "level == FATAL || 
level == ERROR";
+  private final String DEFAULT_FATAL_ERROR_EXCEPTION_EXPRESSION = "level == 
FATAL || level == ERROR || exception exists";
   private final String DEFAULT_MARKER_EXPRESSION = "prop.log4j.marker exists";
 
   public RuleColorizer() {
     List rulesList = new ArrayList();
 
-      String expression = DEFAULT_ERROR_FATAL_EXPRESSION;
+      String expression = DEFAULT_FATAL_ERROR_EXCEPTION_EXPRESSION;
       rulesList.add(
       new ColorRule(
-        expression, ExpressionRule.getRule(expression), 
ERROR_OR_FATAL_DEFAULT_COLOR,
+        expression, ExpressionRule.getRule(expression), 
FATAL_OR_ERROR_DEFAULT_COLOR,
         Color.black));
       expression = DEFAULT_WARN_EXPRESSION;
       rulesList.add(
@@ -91,7 +91,7 @@ public class RuleColorizer implements Co
           expression, ExpressionRule.getRule(expression), MARKER_DEFAULT_COLOR,
           Color.black));
 
-    defaultRules.put(DEFAULT_NAME, rulesList);
+    defaultRules.put(currentRuleSet, rulesList);
     setRules(defaultRules);
   }
 
@@ -294,4 +294,38 @@ public class RuleColorizer implements Co
     }
     return f.exists();
   }
+
+    public Vector getDefaultColors() {
+      Vector vec = new Vector();
+
+      vec.add(Color.white);
+      vec.add(Color.black);
+      //add default alternating color & search backgrounds (both foreground 
are black)
+      vec.add(ChainsawConstants.COLOR_ODD_ROW_BACKGROUND);
+      vec.add(ChainsawConstants.FIND_LOGGER_BACKGROUND);
+
+      vec.add(new Color(255, 255, 225));
+      vec.add(new Color(255, 225, 255));
+      vec.add(new Color(225, 255, 255));
+      vec.add(new Color(255, 225, 225));
+      vec.add(new Color(225, 255, 225));
+      vec.add(new Color(225, 225, 255));
+      vec.add(new Color(225, 225, 183));
+      vec.add(new Color(225, 183, 225));
+      vec.add(new Color(183, 225, 225));
+      vec.add(new Color(183, 225, 183));
+      vec.add(new Color(183, 183, 225));
+      vec.add(new Color(232, 201, 169));
+      vec.add(new Color(255, 255, 153));
+      vec.add(new Color(255, 153, 153));
+      vec.add(new Color(189, 156, 89));
+      vec.add(new Color(255, 102, 102));
+      vec.add(new Color(255, 177, 61));
+      vec.add(new Color(61, 255, 61));
+      vec.add(new Color(153, 153, 255));
+      vec.add(new Color(255, 153, 255));
+
+      return vec;
+    }
+
 }

Modified: 
logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
URL: 
http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html?rev=943831&r1=943830&r2=943831&view=diff
==============================================================================
--- 
logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
 (original)
+++ 
logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
 Thu May 13 07:25:18 2010
@@ -10,6 +10,15 @@
 <b>NOTE:</b> The mechanism and format used to persist settings in Chainsaw is 
subject to change.  If you are experiencing problems displaying events in 
Chainsaw, please delete everything in the $user.dir/.chainsaw directory and 
restart Chainsaw.
 <br>
 <h1>2.0</h1>
+<h2>13 May 2010</h2>
+<ul>
+<li>Added ability to quickly define color rules for field under mouse pointer 
in the table as well as for the selected logger in the logger tree (uses 
default color chooser dialog).</li>
+<li>Added support for defining refine focus expressions from the logger tree, 
and modifying the expression by appending additional logger expressions to the 
refine focus expression (via OR rules).</li>
+<li>Fixed issues preventing welcome tab from correctly hiding if it was set as 
hidden when Chainsaw was last closed.</li>
+<li>Added ability to hide zeroconf panel if it was set as hidden when Chainsaw 
was last closed.</li>
+<li>Added 'exception exists' to default error/fatal color rule.</li>
+<li>Renamed context menu text in an attempt to better describe the 
feature.</li>
+</ul>
 <h2>11 May 2010</h2>
 <ul>
 <li>Added search and alternating row color global preferences (updated from 
color settings window)</li>


Reply via email to