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/

[email protected]
Newsgroups gmane.comp.apache.logging
Message-ID <[email protected]>
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>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.