Added persistent "always display" expression support (button below the logger 
tree).  The 'always display' expression overrides hidden loggers and the hidden 
expression but not the refine focus filtering mechanism.  Often used with 
expressions like 'exception exists || level > warn' to ensure errors and 
exceptions are not filtered out due to the hidden expression or hidden logger 
mechanism.


Project: http://git-wip-us.apache.org/repos/asf/logging-chainsaw/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-chainsaw/commit/decd6ab8
Tree: http://git-wip-us.apache.org/repos/asf/logging-chainsaw/tree/decd6ab8
Diff: http://git-wip-us.apache.org/repos/asf/logging-chainsaw/diff/decd6ab8

Branch: refs/heads/master
Commit: decd6ab883ad9783b10f2daf8ca90e5c503cb11b
Parents: 11e4448
Author: Scott Deboy <[email protected]>
Authored: Mon Oct 3 05:38:28 2011 +0000
Committer: Scott Deboy <[email protected]>
Committed: Mon Oct 3 05:38:28 2011 +0000

----------------------------------------------------------------------
 .../org/apache/log4j/chainsaw/LogPanel.java     |   2 +
 .../log4j/chainsaw/LogPanelPreferenceModel.java |  12 ++
 .../log4j/chainsaw/LoggerNameTreePanel.java     | 111 +++++++++++++++++--
 .../log4j/chainsaw/help/release-notes.html      |   4 +
 4 files changed, 118 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/decd6ab8/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java 
b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
index aef99d7..6fe2a8b 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
@@ -2335,6 +2335,7 @@ public class LogPanel extends DockablePanel implements 
EventBatchListener, Profi
     searchModel.setCyclic(preferenceModel.isCyclic());
     logTreePanel.ignore(preferenceModel.getHiddenLoggers());
     logTreePanel.setHiddenExpression(preferenceModel.getHiddenExpression());
+    
logTreePanel.setAlwaysDisplayExpression(preferenceModel.getAlwaysDisplayExpression());
     if (preferenceModel.getClearTableExpression() != null) {
         try {
             clearTableExpressionRule = 
ExpressionRule.getRule(preferenceModel.getClearTableExpression());
@@ -2366,6 +2367,7 @@ public class LogPanel extends DockablePanel implements 
EventBatchListener, Profi
 
     preferenceModel.setHiddenLoggers(new HashSet(logTreePanel.getHiddenSet()));
     preferenceModel.setHiddenExpression(logTreePanel.getHiddenExpression());
+    
preferenceModel.setAlwaysDisplayExpression(logTreePanel.getAlwaysDisplayExpression());
     List visibleOrder = new ArrayList();
     Enumeration cols = table.getColumnModel().getColumns();
     while (cols.hasMoreElements()) {

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/decd6ab8/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java 
b/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
index 8634055..a1fdec6 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
@@ -84,6 +84,7 @@ public class LogPanelPreferenceModel implements Serializable{
   private boolean wrapMsg = true;
   private boolean highlightSearchMatchText;
   private String hiddenExpression;
+  private String alwaysDisplayExpression;
   private String clearTableExpression;
   //default to cyclic mode off
   private boolean cyclic = false;
@@ -254,6 +255,7 @@ public class LogPanelPreferenceModel implements 
Serializable{
     setVisibleColumns(model.getVisibleColumns());
     setHiddenLoggers(model.getHiddenLoggers());
     setHiddenExpression(model.getHiddenExpression());
+    setAlwaysDisplayExpression(model.getAlwaysDisplayExpression());
     setShowMillisDeltaAsGap(model.isShowMillisDeltaAsGap());
     setClearTableExpression(model.getClearTableExpression());
   }
@@ -506,6 +508,16 @@ public class LogPanelPreferenceModel implements 
Serializable{
     return hiddenExpression;
   }
 
+  public void setAlwaysDisplayExpression(String alwaysDisplayExpression) {
+    Object oldValue = this.hiddenExpression;
+    this.alwaysDisplayExpression = alwaysDisplayExpression;
+    propertySupport.firePropertyChange("alwaysDisplayExpression", oldValue, 
this.alwaysDisplayExpression);
+  }
+
+  public String getAlwaysDisplayExpression() {
+    return alwaysDisplayExpression;
+  }
+
   public void setClearTableExpression(String clearTableExpression) {
     Object oldValue = this.clearTableExpression;
     this.clearTableExpression = clearTableExpression;

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/decd6ab8/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java 
b/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
index b451709..57f4ed9 100644
--- a/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
+++ b/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java
@@ -137,11 +137,14 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
 
   private final JList ignoreList = new JList();
   private final JEditorPane ignoreExpressionEntryField = new JEditorPane();
+  private final JEditorPane alwaysDisplayExpressionEntryField = new 
JEditorPane();
   private final JScrollPane ignoreListScroll = new JScrollPane(ignoreList);
   private final JDialog ignoreDialog = new JDialog();
   private final JDialog ignoreExpressionDialog = new JDialog();
+  private final JDialog alwaysDisplayExpressionDialog = new JDialog();
   private final JLabel ignoreSummary = new JLabel("0 hidden loggers");
   private final JLabel ignoreExpressionSummary = new JLabel("Ignore 
expression");
+  private final JLabel alwaysDisplayExpressionSummary = new JLabel("Always 
displayed expression");
   private final SmallToggleButton ignoreLoggerButton = new SmallToggleButton();
   private final EventListenerList listenerList = new EventListenerList();
   private final JTree logTree;
@@ -159,6 +162,7 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
   private final LogPanel logPanel;
   private final RuleColorizer colorizer;
   private Rule ignoreExpressionRule;
+  private Rule alwaysDisplayExpressionRule;
   private boolean expandRootLatch = false;
   private String currentlySelectedLoggerName;
 
@@ -179,12 +183,13 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
 
     setLayout(new BorderLayout());
     ignoreExpressionEntryField.setPreferredSize(new Dimension(300, 150));
-
+    alwaysDisplayExpressionEntryField.setPreferredSize(new Dimension(300, 
150));
+    alwaysDisplayExpressionSummary.setMinimumSize(new Dimension(10, 
alwaysDisplayExpressionSummary.getHeight()));
     ignoreExpressionSummary.setMinimumSize(new Dimension(10, 
ignoreExpressionSummary.getHeight()));
     ignoreSummary.setMinimumSize(new Dimension(10, ignoreSummary.getHeight()));
 
     JTextComponentFormatter.applySystemFontAndSize(ignoreExpressionEntryField);
-
+    
JTextComponentFormatter.applySystemFontAndSize(alwaysDisplayExpressionEntryField);
 
     visibilityRuleDelegate = new VisibilityRuleDelegate();
     colorRuleDelegate = 
@@ -194,7 +199,8 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
           {
             boolean hiddenLogger = e.getLoggerName() != null && 
isHiddenLogger(e.getLoggerName());
             boolean hiddenExpression = (ignoreExpressionRule != null && 
ignoreExpressionRule.evaluate(e, null));
-            boolean hidden = hiddenLogger || hiddenExpression;
+            boolean alwaysDisplayExpression = (alwaysDisplayExpressionRule != 
null && alwaysDisplayExpressionRule.evaluate(e, null));
+            boolean hidden = (!alwaysDisplayExpression) && (hiddenLogger || 
hiddenExpression);
             String currentlySelectedLoggerName = 
getCurrentlySelectedLoggerName();
 
             if (!isFocusOnSelected() && !hidden && currentlySelectedLoggerName 
!= null && !"".equals(currentlySelectedLoggerName))
@@ -298,6 +304,9 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
     ignoreExpressionDialog.setTitle("Hidden/Ignored Expression");
     ignoreExpressionDialog.setModal(true);
 
+    alwaysDisplayExpressionDialog.setTitle("Always displayed Expression");
+    alwaysDisplayExpressionDialog.setModal(true);
+
     JPanel ignorePanel = new JPanel();
     ignorePanel.setLayout(new BoxLayout(ignorePanel, BoxLayout.Y_AXIS));
     JPanel ignoreSummaryPanel = new JPanel();
@@ -315,6 +324,14 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
           LogPanel.centerAndSetVisible(ignoreExpressionDialog);
       }
     };
+
+
+    Action showAlwaysDisplayExpressionDialogAction = new AbstractAction("...") 
{
+      public void actionPerformed(ActionEvent e) {
+          LogPanel.centerAndSetVisible(alwaysDisplayExpressionDialog);
+      }
+    };
+
     showIgnoreDialogAction.putValue(Action.SHORT_DESCRIPTION, "Click to view 
and manage your hidden/ignored loggers");
     JButton btnShowIgnoreDialog = new SmallButton(showIgnoreDialogAction);
     
@@ -329,6 +346,16 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
     ignoreExpressionPanel.add(btnShowIgnoreExpressionDialog);
 
     ignorePanel.add(ignoreExpressionPanel);
+
+    JPanel alwaysDisplayExpressionPanel = new JPanel();
+    alwaysDisplayExpressionPanel.setLayout(new 
BoxLayout(alwaysDisplayExpressionPanel, BoxLayout.X_AXIS));
+    alwaysDisplayExpressionPanel.add(alwaysDisplayExpressionSummary);
+    showAlwaysDisplayExpressionDialogAction.putValue(Action.SHORT_DESCRIPTION, 
"Click to view and manage your always-displayed expression");
+    JButton btnShowAlwaysDisplayExpressionDialog = new 
SmallButton(showAlwaysDisplayExpressionDialogAction);
+    alwaysDisplayExpressionPanel.add(btnShowAlwaysDisplayExpressionDialog);
+
+    ignorePanel.add(alwaysDisplayExpressionPanel);
+
     add(ignorePanel, BorderLayout.SOUTH);
 
     ignoreList.setModel(new DefaultListModel());
@@ -376,9 +403,29 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
                 ignoreExpressionDialog.setVisible(false);
               }
           }});
-    JPanel closePanel = new JPanel();
-    closePanel.add(ignoreExpressionCloseButton);
-    ignoreExpressionDialogPanel.add(closePanel, BorderLayout.SOUTH);
+
+
+    JPanel alwaysDisplayExpressionDialogPanel = new JPanel(new BorderLayout());
+    alwaysDisplayExpressionEntryField.addKeyListener(new 
ExpressionRuleContext(filterModel, alwaysDisplayExpressionEntryField));
+
+    alwaysDisplayExpressionDialogPanel.add(new 
JScrollPane(alwaysDisplayExpressionEntryField), BorderLayout.CENTER);
+    JButton alwaysDisplayExpressionCloseButton = new JButton(new 
AbstractAction(" Close ") {
+          public void actionPerformed(ActionEvent e)
+          {
+              String alwaysDisplayText = 
alwaysDisplayExpressionEntryField.getText();
+
+              if (updateAlwaysDisplayExpression(alwaysDisplayText)) {
+                alwaysDisplayExpressionDialog.setVisible(false);
+              }
+          }});
+
+    JPanel closeAlwaysDisplayExpressionPanel = new JPanel();
+    closeAlwaysDisplayExpressionPanel.add(alwaysDisplayExpressionCloseButton);
+    alwaysDisplayExpressionDialogPanel.add(closeAlwaysDisplayExpressionPanel, 
BorderLayout.SOUTH);
+
+    JPanel closeIgnoreExpressionPanel = new JPanel();
+    closeIgnoreExpressionPanel.add(ignoreExpressionCloseButton);
+    ignoreExpressionDialogPanel.add(closeIgnoreExpressionPanel, 
BorderLayout.SOUTH);
 
     Box ignoreListButtonPanel = Box.createHorizontalBox();
     
@@ -415,6 +462,9 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
 
     ignoreExpressionDialog.getContentPane().add(ignoreExpressionDialogPanel);
     ignoreExpressionDialog.pack();
+
+    
alwaysDisplayExpressionDialog.getContentPane().add(alwaysDisplayExpressionDialogPanel);
+    alwaysDisplayExpressionDialog.pack();
   }
 
     private boolean updateIgnoreExpression(String ignoreText)
@@ -427,7 +477,7 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
             }
             visibilityRuleDelegate.firePropertyChange("hiddenSet", null, null);
 
-            updateAllIgnoreStuff();
+            updateDisplay();
             
ignoreExpressionEntryField.setBackground(UIManager.getColor("TextField.background"));
             return true;
         } catch (IllegalArgumentException iae) {
@@ -437,6 +487,26 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
         }
     }
 
+    private boolean updateAlwaysDisplayExpression(String alwaysDisplayText)
+    {
+        try {
+            if (alwaysDisplayText != null && 
!alwaysDisplayText.trim().equals("")) {
+                alwaysDisplayExpressionRule = 
ExpressionRule.getRule(alwaysDisplayText);
+            } else {
+                alwaysDisplayExpressionRule = null;
+            }
+            visibilityRuleDelegate.firePropertyChange("alwaysDisplayedSet", 
null, null);
+
+            updateDisplay();
+            
alwaysDisplayExpressionEntryField.setBackground(UIManager.getColor("TextField.background"));
+            return true;
+        } catch (IllegalArgumentException iae) {
+            alwaysDisplayExpressionEntryField.setToolTipText(iae.getMessage());
+            
alwaysDisplayExpressionEntryField.setBackground(ChainsawConstants.INVALID_EXPRESSION_BACKGROUND);
+            return false;
+        }
+    }
+
     //~ Methods 
=================================================================
 
   /**
@@ -1426,7 +1496,7 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
         public void stateChanged(ChangeEvent evt)
         {
           visibilityRuleDelegate.firePropertyChange("rule", null, null);
-          updateAllIgnoreStuff();
+          updateDisplay();
         }
       });
 
@@ -1435,16 +1505,17 @@ final class LoggerNameTreePanel extends JPanel 
implements LoggerNameListener
         public void propertyChange(PropertyChangeEvent event)
         {
           if (event.getPropertyName().equals("hiddenSet")) {
-            updateAllIgnoreStuff();
+            updateDisplay();
           }
         }
       });
   }
 
-  private void updateAllIgnoreStuff() {
+  private void updateDisplay() {
       updateHiddenSetModels();
       updateIgnoreSummary();
       updateIgnoreExpressionSummary();
+      updateAlwaysDisplayExpressionSummary();
   }
   
   private void updateHiddenSetModels() {
@@ -1470,6 +1541,10 @@ final class LoggerNameTreePanel extends JPanel 
implements LoggerNameListener
     ignoreExpressionSummary.setText(ignoreExpressionRule != null?"Ignore 
(set)":"Ignore (unset)");
   }
   
+  private void updateAlwaysDisplayExpressionSummary() {
+    alwaysDisplayExpressionSummary.setText(alwaysDisplayExpressionRule != 
null?"Always displayed (set)":"Always displayed (unset)");
+  }
+
   private void toggleFocusOnState()
   {
     setFocusOnSelected(!isFocusOnSelected());
@@ -1493,6 +1568,19 @@ final class LoggerNameTreePanel extends JPanel 
implements LoggerNameListener
         updateIgnoreExpression(hiddenExpression);
     }
 
+    public String getAlwaysDisplayExpression() {
+        String text = alwaysDisplayExpressionEntryField.getText();
+        if (text == null || text.trim().equals("")) {
+            return null;
+        }
+        return text.trim();
+    }
+
+    public void setAlwaysDisplayExpression(String alwaysDisplayExpression) {
+        alwaysDisplayExpressionEntryField.setText(alwaysDisplayExpression);
+        updateAlwaysDisplayExpression(alwaysDisplayExpression);
+    }
+
     public void loggerNameAdded(String loggerName)
     {
         //no-op
@@ -1810,7 +1898,8 @@ final class LoggerNameTreePanel extends JPanel implements 
LoggerNameListener
           String currentlySelectedLoggerName = 
getCurrentlySelectedLoggerName();
           boolean hiddenLogger = e.getLoggerName() != null && 
isHiddenLogger(e.getLoggerName());
           boolean hiddenExpression = (ignoreExpressionRule != null && 
ignoreExpressionRule.evaluate(e, null));
-          boolean hidden = hiddenLogger || hiddenExpression;
+          boolean alwaysDisplayExpression = (alwaysDisplayExpressionRule != 
null && alwaysDisplayExpressionRule.evaluate(e, null));
+          boolean hidden = (!alwaysDisplayExpression) && (hiddenLogger || 
hiddenExpression);
           if (currentlySelectedLoggerName == null) {
                //if there is no selected logger, pass if not hidden
                return !hidden;

http://git-wip-us.apache.org/repos/asf/logging-chainsaw/blob/decd6ab8/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
----------------------------------------------------------------------
diff --git 
a/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html 
b/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
index cf5e053..98e26df 100644
--- a/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
+++ b/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
@@ -10,6 +10,10 @@
 <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.1</h1>
+<h2>2 Oct 2011</h2>
+<ul>
+<li>Added persistent "always display" expression support (button below the 
logger tree).  The 'always display' expression overrides hidden loggers and the 
hidden expression but not the refine focus filtering mechanism.  Often used 
with expressions like 'exception exists || level > warn' to ensure errors and 
exceptions are not filtered out due to the hidden expression or hidden logger 
mechanism. </li>
+</ul>
 <h2>11 Nov 2010</h2>
 <ul>
 <li>Added per-tab preference to not use a search match color in the primary 
table</li>

Reply via email to