You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@logging.apache.org by sd...@apache.org on 2010/04/08 07:48:09 UTC

svn commit: r931786 - in /logging/chainsaw/trunk/src/main: java/org/apache/log4j/chainsaw/ resources/org/apache/log4j/chainsaw/ resources/org/apache/log4j/chainsaw/help/

Author: sdeboy
Date: Thu Apr  8 05:48:08 2010
New Revision: 931786

URL: http://svn.apache.org/viewvc?rev=931786&view=rev
Log:
Forward and backward search, as well as forward and backward next-color search now wrap
Added display of matching search count in status bar
Added null checks around calls to tablemodel.getRow
Added string[] length checks before attempting to access index zero
Updated Welcome panel to include ctrl-n, ctrl-p

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.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/TableColorizingRenderer.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ThrowableRenderPanel.java
    logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
    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/ChainsawCyclicBufferTableModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java?rev=931786&r1=931785&r2=931786&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java Thu Apr  8 05:48:08 2010
@@ -169,12 +169,24 @@ class ChainsawCyclicBufferTableModel ext
             return i;
           }
         }
+        //if there was no match, start at row zero and go to startLocation
+        for (int i = 0; i < startLocation; i++) {
+          if (rule.evaluate((LoggingEvent) filteredList.get(i))) {
+            return i;
+          }
+        }
       } else {
         for (int i = startLocation; i > -1; i--) {
           if (rule.evaluate((LoggingEvent) filteredList.get(i))) {
             return i;
           }
         }
+        //if there was no match, start at row list.size() - 1 and go to startLocation
+        for (int i = filteredList.size() - 1; i > startLocation; i--) {
+          if (rule.evaluate((LoggingEvent) filteredList.get(i))) {
+            return i;
+          }
+        }
       }
     }
 
@@ -347,10 +359,16 @@ class ChainsawCyclicBufferTableModel ext
         }
     }
 
-    public void updateEventsWithFindRule(Rule findRule) {
+    public int updateEventsWithFindRule(Rule findRule) {
+        int count = 0;
         for (Iterator iter = unfilteredList.iterator();iter.hasNext();) {
-            ((ExtendedLoggingEvent)iter.next()).evaluateSearchRule(findRule);
+            ExtendedLoggingEvent extendedLoggingEvent = (ExtendedLoggingEvent) iter.next();
+            extendedLoggingEvent.evaluateSearchRule(findRule);
+            if (extendedLoggingEvent.isSearchMatch()) {
+                count++;
+            }
         }
+        return count;
     }
 
     public int findColoredRow(int startLocation, boolean searchForward) {
@@ -363,6 +381,14 @@ class ChainsawCyclicBufferTableModel ext
                 return i;
             }
           }
+          //searching forward, no colorized event was found - now start at row zero and go to startLocation
+          for (int i = 0; i < startLocation; i++) {
+            ExtendedLoggingEvent event = (ExtendedLoggingEvent)filteredList.get(i);
+            if (!event.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND) ||
+                    !event.getColorRuleForeground().equals(ChainsawConstants.COLOR_DEFAULT_FOREGROUND)) {
+                return i;
+            }
+          }
         } else {
           for (int i = startLocation; i > -1; i--) {
               ExtendedLoggingEvent event = (ExtendedLoggingEvent)filteredList.get(i);
@@ -371,6 +397,14 @@ class ChainsawCyclicBufferTableModel ext
                   return i;
             }
           }
+          //searching backward, no colorized event was found - now start at list.size() - 1 and go to startLocation
+          for (int i = filteredList.size() - 1; i > startLocation; i--) {
+              ExtendedLoggingEvent event = (ExtendedLoggingEvent)filteredList.get(i);
+              if (!event.getColorRuleBackground().equals(ChainsawConstants.COLOR_DEFAULT_BACKGROUND) ||
+                      !event.getColorRuleForeground().equals(ChainsawConstants.COLOR_DEFAULT_FOREGROUND)) {
+                  return i;
+            }
+          }
         }
       }
 
@@ -602,16 +636,19 @@ class ChainsawCyclicBufferTableModel ext
 
     public void fireRowUpdated(int row, boolean checkForNewColumns) {
         ExtendedLoggingEvent event = getRow(row);
-        event.updateColorRuleColors(colorizer.getBackgroundColor(event), colorizer.getForegroundColor(event));
-        Rule findRule = colorizer.getFindRule();
-        if (findRule != null) {
-          event.evaluateSearchRule(colorizer.getFindRule());
-        }
+        if (event != null)
+        {
+            event.updateColorRuleColors(colorizer.getBackgroundColor(event), colorizer.getForegroundColor(event));
+            Rule findRule = colorizer.getFindRule();
+            if (findRule != null) {
+              event.evaluateSearchRule(colorizer.getFindRule());
+            }
 
-        fireTableRowsUpdated(row, row);
-        if (checkForNewColumns) {
-            //row may have had a column added..if so, make sure a column is added
-            checkForNewColumn(getRow(row));
+            fireTableRowsUpdated(row, row);
+            if (checkForNewColumns) {
+                //row may have had a column added..if so, make sure a column is added
+                checkForNewColumn(event);
+            }
         }
     }
 

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java?rev=931786&r1=931785&r2=931786&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawStatusBar.java Thu Apr  8 05:48:08 2010
@@ -48,6 +48,7 @@ public class ChainsawStatusBar extends J
   private static final int DELAY_PERIOD = 5000;
   private static final String DEFAULT_MSG = "Welcome to Chainsaw v2!";
   private final JLabel statusMsg = new JLabel(DEFAULT_MSG);
+  private final JLabel searchMatchLabel = new JLabel("", SwingConstants.CENTER);
   private final JLabel pausedLabel = new JLabel("", SwingConstants.CENTER);
   private final JLabel lineSelectionLabel = new JLabel("", SwingConstants.CENTER);
   private final JLabel eventCountLabel = new JLabel("", SwingConstants.CENTER);
@@ -95,9 +96,16 @@ public class ChainsawStatusBar extends J
 	eventCountLabel.setMinimumSize(
 	new Dimension(
 	eventCountLabel.getFontMetrics(eventCountLabel.getFont())
-						.stringWidth("99999:99999") + 5,
+						.stringWidth("Filtered/Total: 999999999999:999999999999") + 5,
 	  (int) eventCountLabel.getPreferredSize().getHeight()));
 	  
+    searchMatchLabel.setBorder(statusBarComponentBorder);
+    searchMatchLabel.setToolTipText("<# viewable events>:<# total events>");
+    searchMatchLabel.setMinimumSize(
+    new Dimension(
+    searchMatchLabel.getFontMetrics(eventCountLabel.getFont()).stringWidth("Search matches: 999999999999") + 5,
+            (int) searchMatchLabel.getPreferredSize().getHeight()));
+
     receivedConnectionlabel.setBorder(statusBarComponentBorder);
     receivedConnectionlabel.setToolTipText(
       "Indicates whether Chainsaw has received a remote connection");
@@ -110,14 +118,14 @@ public class ChainsawStatusBar extends J
     lineSelectionLabel.setMinimumSize(
       new Dimension(
         lineSelectionLabel.getFontMetrics(lineSelectionLabel.getFont())
-                          .stringWidth("999999"),
+                          .stringWidth("999999999"),
         (int) lineSelectionLabel.getPreferredSize().getHeight()));
     lineSelectionLabel.setToolTipText(
       "The current line # selected");
 
     JComponent[] toFix =
       new JComponent[] {
-		eventCountLabel,
+        searchMatchLabel, eventCountLabel,
         receivedConnectionlabel, lineSelectionLabel, receivedEventLabel,
         pausedLabel
       };
@@ -153,19 +161,24 @@ public class ChainsawStatusBar extends J
 	c.gridx = 2;
 	add(lineSelectionLabel, c);
 	
+    c.weightx = 0.0;
+    c.weighty = 0.0;
+    c.gridx = 3;
+    add(searchMatchLabel, c);
+
 	c.weightx = 0.0;
 	c.weighty = 0.0;
-	c.gridx = 3;
+	c.gridx = 4;
 	add(eventCountLabel, c);
 
     c.weightx = 0.0;
     c.weighty = 0.0;
-    c.gridx = 4;
+    c.gridx = 5;
     add(receivedEventLabel, c);
 
     c.weightx = 0.0;
     c.weighty = 0.0;
-    c.gridx = 5;
+    c.gridx = 6;
 
     add(pausedLabel, c);
 
@@ -244,13 +257,20 @@ public class ChainsawStatusBar extends J
     SwingUtilities.invokeLater(
       new Runnable() {
         public void run() {
-          lineSelectionLabel.setText(
-            selectedLine+"");
-			eventCountLabel.setText(lineCount + ":" + total);
+          lineSelectionLabel.setText(selectedLine+"");
+	      eventCountLabel.setText("Filtered/Total: " + lineCount + ":" + total);
         }
       });
   }
 
+  void setSearchMatchCount(int searchMatchCount) {
+      if (searchMatchCount == 0) {
+        searchMatchLabel.setText("");
+      } else {
+        searchMatchLabel.setText("Search matches: " + searchMatchCount);
+      }
+  }
+
   void setNothingSelected() {
     SwingUtilities.invokeLater(
       new Runnable() {

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java?rev=931786&r1=931785&r2=931786&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java Thu Apr  8 05:48:08 2010
@@ -178,7 +178,7 @@ public interface EventContainer extends 
    * Evaluate all events against the find rule
    * @param findRule
    */
-  void updateEventsWithFindRule(Rule findRule);
+  int updateEventsWithFindRule(Rule findRule);
 
   /**
    * Determine next row with a non-default color 

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=931786&r1=931785&r2=931786&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 Apr  8 05:48:08 2010
@@ -42,13 +42,8 @@ import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.io.EOFException;
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -1312,7 +1307,7 @@ public class LogPanel extends DockablePa
               Object o = table.getValueAt(row, column);
 
               if (o != null) {
-                if (o instanceof String[]) {
+                if (o instanceof String[] && ((String[])o).length > 0) {
                   value = ((String[]) o)[0];
                   operator = "~=";
                 } else {
@@ -1352,7 +1347,7 @@ public class LogPanel extends DockablePa
             } else {
               Object o = table.getValueAt(row, column).toString();
 
-              if (o instanceof String[]) {
+              if (o instanceof String[] && ((String[])o).length > 0) {
                 value = ((String[]) o)[0];
                 operator = "~=";
               } else {
@@ -1423,7 +1418,7 @@ public class LogPanel extends DockablePa
               Object o = table.getValueAt(row, column);
 
               if (o != null) {
-                if (o instanceof String[]) {
+                if (o instanceof String[] && ((String[])o).length > 0) {
                   value = ((String[]) o)[0];
                   operator = "~=";
                 } else {
@@ -1446,7 +1441,7 @@ public class LogPanel extends DockablePa
         new AbstractAction("Clear find next") {
           public void actionPerformed(ActionEvent e) {
             findField.setText(null);
-            updateRule(null);
+            updateFindRule(null);
           }
         };
 
@@ -1480,8 +1475,11 @@ public class LogPanel extends DockablePa
             if (currentPoint != null) {
               int row = table.rowAtPoint(currentPoint);
               LoggingEvent event = tableModel.getRow(row);
-              renderer.setUseRelativeTimes(event.getTimeStamp());
-              tableModel.reFilter();
+              if (event != null)
+              {
+                  renderer.setUseRelativeTimes(event.getTimeStamp());
+                  tableModel.reFilter();
+              }
               menuItemDisplayNormalTimes.setEnabled(true);
             }
         }
@@ -1987,7 +1985,7 @@ public class LogPanel extends DockablePa
     return tableModel.isCyclic();
   }
 
-  public void updateRule(String ruleText) {
+  public void updateFindRule(String ruleText) {
     if ((ruleText == null) || (ruleText.trim().equals(""))) {
       findRule = null;
       tableModel.updateEventsWithFindRule(null);
@@ -1996,6 +1994,7 @@ public class LogPanel extends DockablePa
       findField.setBackground(UIManager.getColor("TextField.background"));
       findField.setToolTipText(
         "Enter expression - right click or ctrl-space for menu");
+      statusBar.setSearchMatchCount(0);
     } else {
       //only turn off scrolltobottom when finding something (find not empty)
       preferenceModel.setScrollToBottom(false);
@@ -2008,15 +2007,17 @@ public class LogPanel extends DockablePa
         findField.setToolTipText(
           "Enter expression - right click or ctrl-space for menu");
         findRule = ExpressionRule.getRule(ruleText);
-        tableModel.updateEventsWithFindRule(findRule);
+        int matchCount = tableModel.updateEventsWithFindRule(findRule);
         colorizer.setFindRule(findRule);
         //valid expression, reset background color in case we were previously an invalid expression
         findField.setBackground(UIManager.getColor("TextField.background"));
+        statusBar.setSearchMatchCount(matchCount);
       } catch (IllegalArgumentException re) {
         findField.setToolTipText(re.getMessage());
         findField.setBackground(INVALID_EXPRESSION_BACKGROUND);
         colorizer.setFindRule(null);
         tableModel.updateEventsWithFindRule(null);
+        statusBar.setSearchMatchCount(0);
       }
     }
   }
@@ -2382,7 +2383,7 @@ public class LogPanel extends DockablePa
    *
    */
   public void findNext() {
-    updateRule(findField.getText());
+    updateFindRule(findField.getText());
 
     if (findRule != null) {
       try {
@@ -2405,7 +2406,7 @@ public class LogPanel extends DockablePa
    *
    */
   public void findPrevious() {
-    updateRule(findField.getText());
+    updateFindRule(findField.getText());
 
     if (findRule != null) {
       try {
@@ -2588,14 +2589,16 @@ public class LogPanel extends DockablePa
         int row = table.getSelectedRow();
         if (row != -1) {
           LoggingEvent event = tableModel.getRow(row);
-          Object marker = event.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
-          if (marker == null) {
-              event.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, "set");
-          } else {
-              event.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+          if (event != null) {
+              Object marker = event.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+              if (marker == null) {
+                  event.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, "set");
+              } else {
+                  event.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+              }
+              //if marker -was- null, it no longer is (may need to add the column)
+              tableModel.fireRowUpdated(row, (marker == null));
           }
-          //if marker -was- null, it no longer is (may need to add the column)
-          tableModel.fireRowUpdated(row, (marker == null));
         }
     }
 
@@ -2723,14 +2726,16 @@ public class LogPanel extends DockablePa
               int row = table.rowAtPoint(evt.getPoint());
               if (row != -1) {
                 ExtendedLoggingEvent event = tableModel.getRow(row);
-                Object marker = event.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
-                if (marker == null) {
-                    event.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, "set");
-                } else {
-                    event.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+                if (event != null) {
+                    Object marker = event.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+                    if (marker == null) {
+                        event.setProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE, "set");
+                    } else {
+                        event.removeProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE);
+                    }
+                    //if marker -was- null, it no longer is (may need to add the column)
+                    tableModel.fireRowUpdated(row, (marker == null));
                 }
-                //if marker -was- null, it no longer is (may need to add the column)
-                tableModel.fireRowUpdated(row, (marker == null));
               }
           }
       }
@@ -2997,8 +3002,10 @@ public class LogPanel extends DockablePa
         public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
         {
             currentEvent = tableModel.getRow(row);
-            textField.setText(currentEvent.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE));
-            textField.selectAll();
+            if (currentEvent != null) {
+                textField.setText(currentEvent.getProperty(ChainsawConstants.LOG4J_MARKER_COL_NAME_LOWERCASE));
+                textField.selectAll();
+            }
             return textField;
         }
     }

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=931786&r1=931785&r2=931786&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 Apr  8 05:48:08 2010
@@ -599,7 +599,7 @@ public class LogUI extends JFrame implem
         Plugin plugin = (Plugin) pluginClass.newInstance();
         pluginRegistry.addPlugin(plugin);
         plugin.activateOptions();
-        MessageCenter.getInstance().getLogger().info("Looks like ZeroConf stuff is available... WooHoo!");
+        MessageCenter.getInstance().getLogger().info("Looks like ZeroConf is available... WooHoo!");
     } catch (Throwable e) {
         MessageCenter.getInstance().getLogger().error("Doesn't look like ZeroConf is available", e);
     }

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java?rev=931786&r1=931785&r2=931786&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java Thu Apr  8 05:48:08 2010
@@ -111,7 +111,7 @@ public class TableColorizingRenderer ext
       break;
 
     case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
-      if (value instanceof String[]) {
+      if (value instanceof String[] && ((String[])value).length > 0){
         c.setText(((String[]) value)[0]);
       }
       break;

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ThrowableRenderPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ThrowableRenderPanel.java?rev=931786&r1=931785&r2=931786&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ThrowableRenderPanel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ThrowableRenderPanel.java Thu Apr  8 05:48:08 2010
@@ -79,8 +79,8 @@ class ThrowableRenderPanel extends Abstr
    */
   public Component getTableCellEditorComponent(
     JTable table, Object value, boolean isSelected, int row, int column) {
-    if(value!=null){
-	    lbl.setText(((String[]) value)[0]);
+    if (value instanceof String[] && ((String[])value).length > 0) {
+        lbl.setText(((String[]) value)[0]);
     }else {
     	lbl.setText("");
     }

Modified: logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html?rev=931786&r1=931785&r2=931786&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html (original)
+++ logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html Thu Apr  8 05:48:08 2010
@@ -30,10 +30,17 @@
 	<td nowrap class="HotKey">CTRL-LEFT</td>
 	<td width="50" align="center">-</td>
 	<td>Activate a tab to the left</td>
-	<td nowrap class="HotKey">F1</td>
-	<td width="50" align="center">-</td>
-	<td>Hide/Show Welcome Panel/Help page</td>
-
+    <td nowrap class="HotKey">CTRL-RIGHT</td>
+    <td width="50" align="center">-</td>
+    <td>Activate a tab to the right</td>
+</tr>
+<tr valign="top" bgcolor="#EEEEEE">
+    <td nowrap class="HotKey">F3</td>
+    <td width="50" align="center">-</td>
+    <td>Find Next</td>
+    <td nowrap class="HotKey">SHIFT-F3</td>
+    <td width="50" align="center">-</td>
+    <td>Find previous</td>
 </tr>
 <tr valign="top">
     <td nowrap class="HotKey">CTRL-A</td>
@@ -44,22 +51,22 @@
     <td>Scroll to bottom</td>
 </tr>
 <tr valign="top" bgcolor="#EEEEEE">
-    <td nowrap class="HotKey">Ctrl-F2 (or double-click on a row)</td>
+    <td nowrap class="HotKey">CTRL-F2 or double-click on a row</td>
     <td width="50" align="center">-</td>
-    <td colspan="1">Define a 'marker' (add a note to a row)</td>
-    <td nowrap class="HotKey">F2</td>
+    <td>Define a 'marker' (add a note to a row)</td>
+    <td nowrap class="HotKey">CTRL-SHIFT-F2</td>
     <td width="50" align="center">-</td>
-    <td colspan="1">Find next marker</td>
+    <td>Clear all markers</td>
 </tr>
-<tr valign="top" bgcolor="#EEEEEE">
-    <td nowrap class="HotKey">Shift-F2</td>
+<tr valign="top">
+    <td nowrap class="HotKey">F2</td>
     <td width="50" align="center">-</td>
-    <td colspan="1">Find previous marker</td>
-    <td nowrap class="HotKey">Ctrl-shift-F2</td>
+    <td>Find next marker</td>
+    <td nowrap class="HotKey">SHIFT-F2</td>
     <td width="50" align="center">-</td>
-    <td colspan="1">Clear all markers</td>
+    <td>Find previous marker</td>
 </tr>
-<tr valign="top">
+<tr valign="top" bgcolor="#EEEEEE">
     <td nowrap class="HotKey">ALT-J</td>
     <td width="50" align="center">-</td>
     <td>Set focus in 'search' field</td>
@@ -67,62 +74,56 @@
     <td width="50" align="center">-</td>
     <td>Set focus in 'refine focus' field</td>
 </tr>
-<tr valign="top" bgcolor="#EEEEEE">
-	<td nowrap class="HotKey">CTRL-RIGHT</td>
-	<td width="50" align="center">-</td>
-	<td>Activate a tab to the right</td>
-	<td nowrap class="HotKey">F3</td>
-	<td width="50" align="center">-</td>
-	<td>Find Next</td>
-</tr>
 <tr valign="top" >
 	<td nowrap class="HotKey">CTRL-S</td>
 	<td width="50" align="center">-</td>
-	<td>Shows a File Save dialog to save the current tab's events as XML</td>
-	<td nowrap class="HotKey">F6</td>
-	<td width="50" align="center">-</td>
-	<td>Show Receivers Dialog</td>
+	<td>Save displayed events as XML</td>
+    <td nowrap class="HotKey">CTRL-O</td>
+    <td width="50" align="center">-</td>
+    <td>Load file of XML events</td>
 </tr>
 <tr valign="top" bgcolor="#EEEEEE">
-	<td nowrap class="HotKey">CTRL-O</td>
-	<td width="50" align="center">-</td>
-	<td>Shows a File Open dialog to open an XML file of events into Chainsaw</td>
+    <td nowrap class="HotKey">ALT-C or CTRL-BACKSPACE</td>
+    <td width="50" align="center">-</td>
+    <td>Purges current panels events</td>
 	<td nowrap class="HotKey">ALT-P or F12</td>
 	<td width="50" align="center">-</td>
 	<td>Pause display</td>
 </tr>
 <tr valign="top">
-	<td nowrap class="HotKey">ALT-C or CTRL-BACKSPACE</td>
-	<td width="50" align="center">-</td>
-	<td colspan="4">Purges current panels events</td>
-</tr>
-<tr valign="top" bgcolor="#EEEEEE">
 	<td nowrap class="HotKey">ALT-D</td>
 	<td width="50" align="center">-</td>
-	<td colspan="1">Show/Hide the Detail pane</td>
+	<td>Show/Hide the Detail pane</td>
 	<td nowrap class="HotKey">ALT-T</td>
 	<td width="50" align="center">-</td>
-	<td colspan="1">Show/Hide the Logger Tree pane</td>
+	<td>Show/Hide the Logger Tree pane</td>
 </tr>
 <tr valign="top" bgcolor="#EEEEEE">
-	<td nowrap class="HotKey">F3</td>
-	<td width="50" align="center">-</td>
-	<td colspan="1">Find next</td>
-	<td nowrap class="HotKey">Shift-F3</td>
-	<td width="50" align="center">-</td>
-	<td colspan="1">Find previous</td>
+    <td nowrap class="HotKey">F1</td>
+    <td width="50" align="center">-</td>
+    <td>Hide/Show Welcome Panel/Help page</td>
+    <td nowrap class="HotKey">F6</td>
+    <td width="50" align="center">-</td>
+    <td>Show Receivers Dialog</td>
+</tr>
+<tr valign="top">
+    <td nowrap class="HotKey">CTRL-N</td>
+    <td width="50" align="center">-</td>
+    <td>Go to next colored row</td>
+    <td nowrap class="HotKey">CTRL-P</td>
+    <td width="50" align="center">-</td>
+    <td>Go to previous colored row</td>
 </tr>
 <tr valign="top" bgcolor="#EEEEEE">
-	<td nowrap class="HotKey">ALT-X</td>
-	<td width="50" align="center">-</td>
-	<td colspan="1">Exits the Application</td>
     <td nowrap class="HotKey">CTRL-G</td>
     <td width="50" align="center">-</td>
-    <td colspan="1">Go to line</td>
+    <td>Go to line</td>
+	<td nowrap class="HotKey">ALT-X</td>
+	<td width="50" align="center">-</td>
+	<td>Exits the Application</td>
 </tr>
 </table></P>
 <!--<p><a href="#TheTop">Back to top</a></p>-->
-<a name="Receivers"></a>
 <h2>Receivers</h2>
 <p>Log4j has a concept of a 'Receiver', an object that receives events
 from some source, and deposits them into the Log4j framework in the local JVM.  

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=931786&r1=931785&r2=931786&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 Apr  8 05:48:08 2010
@@ -10,6 +10,11 @@
 <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>1.99.99</h1>
+<h2>7 Apr 2010</h2>
+<ul>
+<li>Forward and backward search, as well as forward and backward next-color search now wrap.</li>
+<li>Added display of matching search count in status bar.</li>
+</ul>
 <h2>6 Apr 2010</h2>
 <ul>
 <li>Added default color rule support (ability to assign a tab's color rules as the default color rules for new tabs).  Default color rules can be applied to pre-existing tabs via the 'apply a tabs colors' drop down box in the color rule dialog.</li>