<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>general@logging.apache.org Archives</title>
<link rel="self" href="http://mail-archives.apache.org/mod_mbox/logging-general/?format=atom"/>
<link href="http://mail-archives.apache.org/mod_mbox/logging-general/"/>
<id>http://mail-archives.apache.org/mod_mbox/logging-general/</id>
<updated>2009-12-08T02:27:35Z</updated>
<entry>
<title>svn commit: r880629 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ApplicationPreferenceModelPanel.java ChainsawCyclicBufferTableModel.java receivers/ReceiversHelper.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c20091116065108.3FC7D23888D1@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091116065108-3FC7D23888D1@eris-apache-org%3e</id>
<updated>2009-11-16T06:51:04Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Mon Nov 16 06:51:00 2009
New Revision: 880629

URL: http://svn.apache.org/viewvc?rev=880629&amp;view=rev
Log:
Minor changes to give more room to auto config URL field
Prevent/log situations that were triggering uncaught exceptions

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java?rev=880629&amp;r1=880628&amp;r2=880629&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
Mon Nov 16 06:51:00 2009
@@ -419,7 +419,7 @@
       configurationURL = new JComboBox(new DefaultComboBoxModel(committedPreferenceModel.getConfigurationURLs()));
       configurationURL.setEditable(true);
       configurationURL.setPrototypeDisplayValue("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
-      configurationURL.setPreferredSize(new Dimension(375, 15));
+      configurationURL.setPreferredSize(new Dimension(375, 13));
 
       identifierExpression = new JTextField(30);
       toolTipDisplayMillis = new JTextField(8);
@@ -480,7 +480,7 @@
       Box p6 = new Box(BoxLayout.Y_AXIS);
 
       Box configURLPanel = new Box(BoxLayout.X_AXIS);
-      JLabel configLabel = new JLabel("Automatic Configuration URL");
+      JLabel configLabel = new JLabel("Auto Config URL");
       configURLPanel.add(configLabel);
       configURLPanel.add(Box.createHorizontalStrut(5));
 

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=880629&amp;r1=880628&amp;r2=880629&amp;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
Mon Nov 16 06:51:00 2009
@@ -626,6 +626,10 @@
     case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
       return true;
     }
+
+    if (columnIndex &gt;= columnNames.size()) {
+        return false;
+    }
     String columnName = getColumnName(columnIndex);
     if (columnName.toLowerCase().equals(ChainsawConstants.MARKER_PROPERTY_NAME)) {
       return true;

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java?rev=880629&amp;r1=880628&amp;r2=880629&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversHelper.java
Mon Nov 16 06:51:00 2009
@@ -52,7 +52,10 @@
 
         URL url = this.getClass().getClassLoader().getResource(
             this.getClass().getPackage().getName().replace('.','/') + "/known.receivers");
-
+        if (url == null) {
+            logger.warn("Failed to locate known.receivers file");
+            return;
+        }
         LineNumberReader stream = null;
         try {
 




</pre>
</div>
</content>
</entry>
<entry>
<title>Re: svn commit: r829505 - in /logging/chainsaw/trunk/src/main:	java/org/apache/log4j/chainsaw/ java/org/apache/log4j/chainsaw/icons/	resources/org/apache/log4j/chainsaw/</title>
<author><name>=?UTF-8?Q?Renan_Vin=C3=ADcius_Mozone?= &lt;renan.mozone@gmail.com&gt;</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c1fbadfe50911111536k5b2e772dm3f533f6a90cefe85@mail.gmail.com%3e"/>
<id>urn:uuid:%3c1fbadfe50911111536k5b2e772dm3f533f6a90cefe85@mail-gmail-com%3e</id>
<updated>2009-11-11T23:36:50Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Unsubscribe

On Sun, Oct 25, 2009 at 05:42, &lt;sdeboy@apache.org&gt; wrote:

&gt; Author: sdeboy
&gt; Date: Sun Oct 25 07:42:21 2009
&gt; New Revision: 829505
&gt;
&gt; URL: http://svn.apache.org/viewvc?rev=829505&amp;view=rev
&gt; Log:
&gt; Add new 'marker' feature
&gt; Marker is displayed as an icon that appears in the first displayed column
&gt; (using 'about' icon currently)
&gt;
&gt; Ctrl-F2 or double-click: toggle a marker on or off
&gt; F2: search for next marker
&gt; Shift-F2: search for previous marker
&gt; Ctrl-Shift-F2: clear all markers
&gt;
&gt; To facilitate search, rendering &amp; toggle of markers, adding a marker
&gt; temporarily adds a new property to events that have the marker set called
&gt; 'log4j.marker' (value 'true')'.
&gt;
&gt; Also added a new method to LoggingEvent:
&gt; public Object removeProperty(String propName)
&gt; to facilitate removal of this temporary property when the marker is un-set
&gt; for a loggingevent
&gt;
&gt; Modified:
&gt;
&gt;  logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
&gt;
&gt;  logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
&gt;
&gt;  logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
&gt;
&gt;  logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
&gt;
&gt;  logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
&gt;
&gt;  logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
&gt;
&gt;  logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
&gt;
&gt;  logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
&gt;
&gt; Modified:
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
&gt; URL:
&gt; http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
&gt;
&gt; ==============================================================================
&gt; ---
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
&gt; (original)
&gt; +++
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
&gt; Sun Oct 25 07:42:21 2009
&gt; @@ -79,7 +79,9 @@
&gt;
&gt;   static final String LEVEL_DISPLAY = "level.display";
&gt;   static final String LEVEL_DISPLAY_ICONS = "icons";
&gt; -  static final String LEVEL_DISPLAY_TEXT = "text";
&gt; +  static final String LEVEL_DISPLAY_TEXT = "text";
&gt; +
&gt; +  static final String MARKER_PROPERTY_NAME = "log4j.marker";
&gt;
&gt;   static final String DATETIME_FORMAT = "EEE MMM dd HH:mm:ss z yyyy";
&gt;
&gt;
&gt; Modified:
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
&gt; URL:
&gt; http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
&gt;
&gt; ==============================================================================
&gt; ---
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
&gt; (original)
&gt; +++
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
&gt; Sun Oct 25 07:42:21 2009
&gt; @@ -333,7 +333,21 @@
&gt;     }
&gt;   }
&gt;
&gt; -  public int getColumnCount() {
&gt; +    public void removePropertyFromEvents(String propName) {
&gt; +        for (Iterator iter = unfilteredList.iterator();iter.hasNext();) {
&gt; +            LoggingEvent event = (LoggingEvent)iter.next();
&gt; +            event.removeProperty(propName);
&gt; +        }
&gt; +        for (int i=0;i&lt;filteredList.size();i++) {
&gt; +            LoggingEvent event = (LoggingEvent)filteredList.get(i);
&gt; +            Object result = event.removeProperty(propName);
&gt; +            if (result != null) {
&gt; +                fireRowUpdated(i);
&gt; +            }
&gt; +        }
&gt; +    }
&gt; +
&gt; +    public int getColumnCount() {
&gt;     return columnNames.size();
&gt;   }
&gt;
&gt; @@ -549,7 +563,11 @@
&gt;   }});
&gt;   }
&gt;
&gt; -  /**
&gt; +    public void fireRowUpdated(int row) {
&gt; +        fireTableRowsUpdated(row, row);
&gt; +    }
&gt; +
&gt; +    /**
&gt;   * @param e
&gt;   */
&gt;   private void fireNewKeyColumnAdded(NewKeyEvent e) {
&gt;
&gt; Modified:
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
&gt; URL:
&gt; http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
&gt;
&gt; ==============================================================================
&gt; ---
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
&gt; (original)
&gt; +++
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
&gt; Sun Oct 25 07:42:21 2009
&gt; @@ -75,6 +75,10 @@
&gt;   private final Action closeAction;
&gt;   private final Action findNextAction;
&gt;   private final Action findPreviousAction;
&gt; +  private final Action findNextMarkerAction;
&gt; +  private final Action findPreviousMarkerAction;
&gt; +  private final Action toggleMarkerAction;
&gt; +  private final Action clearAllMarkersAction;
&gt;   private final Action pauseAction;
&gt;   private final Action showPreferencesAction;
&gt;   private final Action showColorPanelAction;
&gt; @@ -114,7 +118,7 @@
&gt;   private final JMenu activeTabMenu = new JMenu("Current tab");
&gt;   private final JPanel findPanel;
&gt;
&gt; -  ChainsawToolBarAndMenus(final LogUI logui) {
&gt; +    ChainsawToolBarAndMenus(final LogUI logui) {
&gt;     this.logui = logui;
&gt;     toolbar = new JToolBar(SwingConstants.HORIZONTAL);
&gt;     menuBar = new JMenuBar();
&gt; @@ -124,6 +128,10 @@
&gt;     findField = new JTextField();
&gt;     findNextAction = getFindNextAction();
&gt;     findPreviousAction = getFindPreviousAction();
&gt; +    findNextMarkerAction = createFindNextMarkerAction();
&gt; +    findPreviousMarkerAction = createFindPreviousMarkerAction();
&gt; +    toggleMarkerAction = createToggleMarkerAction();
&gt; +    clearAllMarkersAction = createClearAllMarkersAction();
&gt;     customExpressionPanelAction = createCustomExpressionPanelAction();
&gt;     showPreferencesAction = createShowPreferencesAction();
&gt;     showColorPanelAction = createShowColorPanelAction();
&gt; @@ -155,7 +163,8 @@
&gt;
&gt;     logPanelSpecificActions =
&gt;       new Action[] {
&gt; -        pauseAction, findNextAction, findPreviousAction, clearAction,
&gt; +        pauseAction, findNextAction, findPreviousAction,
&gt; findNextMarkerAction, findPreviousMarkerAction,
&gt; +        toggleMarkerAction, clearAllMarkersAction, clearAction,
&gt;         fileMenu.getFileSaveAction(), toggleDetailPaneAction,
&gt;         showPreferencesAction, showColorPanelAction, undockAction,
&gt;         toggleLogTreeAction, toggleScrollToBottomAction, changeModelAction,
&gt; @@ -250,6 +259,78 @@
&gt;      return action;
&gt;    }
&gt;
&gt; +     private Action createFindNextMarkerAction() {
&gt; +       Action action =
&gt; +         new AbstractAction("Find next marker") {
&gt; +           public void actionPerformed(ActionEvent e) {
&gt; +             if (logui.getCurrentLogPanel() != null) {
&gt; +               logui.getCurrentLogPanel().findNextMarker();
&gt; +             }
&gt; +           }
&gt; +         };
&gt; +
&gt; +       action.putValue(Action.SHORT_DESCRIPTION, "Searches for the next
&gt; marker from the current location");
&gt; +       action.putValue("enabled", Boolean.TRUE);
&gt; +       action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_N));
&gt; +       action.putValue(Action.ACCELERATOR_KEY,
&gt; KeyStroke.getKeyStroke("F2"));
&gt; +
&gt; +       return action;
&gt; +     }
&gt; +
&gt; +    private Action createFindPreviousMarkerAction() {
&gt; +      Action action =
&gt; +        new AbstractAction("Find previous marker") {
&gt; +          public void actionPerformed(ActionEvent e) {
&gt; +            if (logui.getCurrentLogPanel() != null) {
&gt; +              logui.getCurrentLogPanel().findPreviousMarker();
&gt; +            }
&gt; +          }
&gt; +        };
&gt; +
&gt; +      action.putValue(Action.SHORT_DESCRIPTION, "Searches for the previous
&gt; marker from the current location");
&gt; +      action.putValue("enabled", Boolean.TRUE);
&gt; +      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
&gt; +      action.putValue(Action.ACCELERATOR_KEY,
&gt; KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.SHIFT_MASK));
&gt; +
&gt; +      return action;
&gt; +    }
&gt; +
&gt; +    private Action createToggleMarkerAction() {
&gt; +      Action action =
&gt; +        new AbstractAction("Toggle marker") {
&gt; +          public void actionPerformed(ActionEvent e) {
&gt; +            if (logui.getCurrentLogPanel() != null) {
&gt; +              logui.getCurrentLogPanel().toggleMarker();
&gt; +            }
&gt; +          }
&gt; +        };
&gt; +
&gt; +      action.putValue(Action.SHORT_DESCRIPTION, "Toggle marker for
&gt; selected row");
&gt; +      action.putValue("enabled", Boolean.TRUE);
&gt; +      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_T));
&gt; +      action.putValue(Action.ACCELERATOR_KEY,
&gt; KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.CTRL_MASK));
&gt; +
&gt; +      return action;
&gt; +    }
&gt; +
&gt; +    private Action createClearAllMarkersAction() {
&gt; +      Action action =
&gt; +        new AbstractAction("Clear all markers") {
&gt; +          public void actionPerformed(ActionEvent e) {
&gt; +            if (logui.getCurrentLogPanel() != null) {
&gt; +              logui.getCurrentLogPanel().clearAllMarkers();
&gt; +            }
&gt; +          }
&gt; +        };
&gt; +
&gt; +      action.putValue(Action.SHORT_DESCRIPTION, "Removes all markers");
&gt; +      action.putValue("enabled", Boolean.TRUE);
&gt; +      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_R));
&gt; +      action.putValue(Action.ACCELERATOR_KEY,
&gt; KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.CTRL_MASK |
&gt; InputEvent.SHIFT_MASK));
&gt; +
&gt; +      return action;
&gt; +    }
&gt; +
&gt;    /**
&gt;    * DOCUMENT ME!
&gt;    */
&gt; @@ -412,6 +493,13 @@
&gt;     activeTabMenu.addSeparator();
&gt;     activeTabMenu.add(new CopyEventsToClipboardAction(logui));
&gt;     activeTabMenu.add(new JMenuItem(clearAction));
&gt; +
&gt; +    activeTabMenu.addSeparator();
&gt; +    activeTabMenu.add(new JMenuItem(toggleMarkerAction));
&gt; +    activeTabMenu.add(new JMenuItem(findNextMarkerAction));
&gt; +    activeTabMenu.add(new JMenuItem(findPreviousMarkerAction));
&gt; +    activeTabMenu.add(new JMenuItem(clearAllMarkersAction));
&gt; +
&gt;     activeTabMenu.addSeparator();
&gt;     activeTabMenu.add(toggleScrollToBottomMenuItem);
&gt;     activeTabMenu.add(menuItemUseRightMouse);
&gt;
&gt; Modified:
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
&gt; URL:
&gt; http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
&gt;
&gt; ==============================================================================
&gt; ---
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
&gt; (original)
&gt; +++
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/EventContainer.java
&gt; Sun Oct 25 07:42:21 2009
&gt; @@ -140,6 +140,11 @@
&gt;    */
&gt;   void fireTableEvent(int begin, int end, int count);
&gt;
&gt; +    /**
&gt; +     * A row was updated
&gt; +     * @param row
&gt; +     */
&gt; +  void fireRowUpdated(int row);
&gt;   /**
&gt;    * Allow a forced notification of the EventCountListeners
&gt;    *
&gt; @@ -157,4 +162,10 @@
&gt;    * @param e
&gt;    */
&gt;   int getRowIndex(LoggingEvent e);
&gt; +
&gt; +  /**
&gt; +   * Remove property from all events in container
&gt; +   * @param propName the property name to remove
&gt; +   */
&gt; +  void removePropertyFromEvents(String propName);
&gt;  }
&gt;
&gt; Modified:
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
&gt; URL:
&gt; http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
&gt;
&gt; ==============================================================================
&gt; ---
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
&gt; (original)
&gt; +++
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
&gt; Sun Oct 25 07:42:21 2009
&gt; @@ -230,6 +230,7 @@
&gt;   private Point currentPoint;
&gt;   private boolean paused = false;
&gt;   private Rule findRule;
&gt; +  private Rule findMarkerRule;
&gt;   private final JPanel findPanel;
&gt;   private JTextField findField;
&gt;   private final int dividerSize;
&gt; @@ -559,6 +560,13 @@
&gt;      */
&gt;     tableModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize);
&gt;     table = new JSortTable(tableModel);
&gt; +
&gt; +    //we've mapped f2, shift f2 and ctrl-f2 to marker-related actions,
&gt; unmap them from the table
&gt; +
&gt;  table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"),
&gt; "none");
&gt; +
&gt;  table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
&gt; InputEvent.SHIFT_MASK), "none");
&gt; +
&gt;  table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
&gt; InputEvent.CTRL_MASK), "none");
&gt; +
&gt;  table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
&gt; InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK), "none");
&gt; +
&gt;     //add a listener to update the 'refine focus'
&gt;     tableModel.addNewKeyListener(new NewKeyListener() {
&gt;                public void newKeyAdded(NewKeyEvent e) {
&gt; @@ -681,6 +689,7 @@
&gt;     table.setAutoCreateColumnsFromModel(false);
&gt;
&gt;     table.addMouseMotionListener(new TableColumnDetailMouseListener());
&gt; +    table.addMouseListener(new TableMarkerListener());
&gt;
&gt;     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
&gt;
&gt; @@ -1022,7 +1031,8 @@
&gt;
&gt;         }
&gt;     });
&gt; -
&gt; +    findMarkerRule = ExpressionRule.getRule("prop." +
&gt; ChainsawConstants.MARKER_PROPERTY_NAME + " exists");
&gt; +
&gt;     tableModel.addTableModelListener(new TableModelListener() {
&gt;                public void tableChanged(TableModelEvent e) {
&gt;
&gt;  detailPaneUpdater.setSelectedRow(table.getSelectedRow());
&gt; @@ -1874,7 +1884,7 @@
&gt;         "Enter expression - right click or ctrl-space for menu");
&gt;       return false;
&gt;     } else {
&gt; -      //only turn off scroltobottom when finding something (find not
&gt; empty)
&gt; +      //only turn off scrolltobottom when finding something (find not
&gt; empty)
&gt;       preferenceModel.setScrollToBottom(false);
&gt;       try {
&gt;         findField.setToolTipText(
&gt; @@ -2477,7 +2487,41 @@
&gt;     filterModel.processNewLoggingEvent(event);
&gt;   }
&gt;
&gt; -  /**
&gt; +    public void findNextMarker() {
&gt; +      final int nextRow = tableModel.find(findMarkerRule,
&gt; table.getSelectedRow() + 1, true);
&gt; +
&gt; +      if (nextRow &gt; -1) {
&gt; +        table.scrollToRow(nextRow);
&gt; +      }
&gt; +    }
&gt; +
&gt; +    public void findPreviousMarker() {
&gt; +        final int previousRow = tableModel.find(findMarkerRule,
&gt; table.getSelectedRow() - 1, false);
&gt; +
&gt; +        if (previousRow &gt; -1) {
&gt; +          table.scrollToRow(previousRow);
&gt; +        }
&gt; +    }
&gt; +
&gt; +    public void clearAllMarkers() {
&gt; +
&gt;  tableModel.removePropertyFromEvents(ChainsawConstants.MARKER_PROPERTY_NAME);
&gt; +    }
&gt; +
&gt; +    public void toggleMarker() {
&gt; +        int row = table.getSelectedRow();
&gt; +        if (row != -1) {
&gt; +          LoggingEvent event = tableModel.getRow(row);
&gt; +          Object marker =
&gt; event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
&gt; +          if (marker == null) {
&gt; +              event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME,
&gt; "true");
&gt; +          } else {
&gt; +
&gt;  event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
&gt; +          }
&gt; +          tableModel.fireRowUpdated(row);
&gt; +        }
&gt; +    }
&gt; +
&gt; +    /**
&gt;    * This class receives notification when the Refine focus text field is
&gt;    * updated, where a backgrounh thread periodically wakes up and checks if
&gt;    * they have stopped typing yet. This ensures that the filtering of the
&gt; @@ -2595,6 +2639,24 @@
&gt;     }
&gt;   }
&gt;
&gt; +  private final class TableMarkerListener extends MouseAdapter {
&gt; +      public void mouseClicked(MouseEvent evt) {
&gt; +          if (evt.getClickCount() == 2) {
&gt; +              int row = table.rowAtPoint(evt.getPoint());
&gt; +              if (row != -1) {
&gt; +                LoggingEvent event = tableModel.getRow(row);
&gt; +                Object marker =
&gt; event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
&gt; +                if (marker == null) {
&gt; +
&gt;  event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "true");
&gt; +                } else {
&gt; +
&gt;  event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
&gt; +                }
&gt; +                tableModel.fireRowUpdated(row);
&gt; +              }
&gt; +          }
&gt; +      }
&gt; +  }
&gt; +
&gt;   /**
&gt;    * Update active tooltip
&gt;    */
&gt;
&gt; Modified:
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
&gt; URL:
&gt; http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
&gt;
&gt; ==============================================================================
&gt; ---
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
&gt; (original)
&gt; +++
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
&gt; Sun Oct 25 07:42:21 2009
&gt; @@ -27,12 +27,14 @@
&gt;
&gt;  import javax.swing.BorderFactory;
&gt;  import javax.swing.Icon;
&gt; +import javax.swing.ImageIcon;
&gt;  import javax.swing.JLabel;
&gt;  import javax.swing.JTable;
&gt;  import javax.swing.SwingConstants;
&gt;  import javax.swing.table.DefaultTableCellRenderer;
&gt;
&gt;  import org.apache.log4j.chainsaw.color.Colorizer;
&gt; +import org.apache.log4j.chainsaw.icons.ChainsawIcons;
&gt;  import org.apache.log4j.chainsaw.icons.LevelIconFactory;
&gt;  import org.apache.log4j.helpers.Constants;
&gt;  import org.apache.log4j.spi.LoggingEvent;
&gt; @@ -60,6 +62,7 @@
&gt;   private int loggerPrecision = 0;
&gt;   private boolean toolTipsVisible;
&gt;   private String dateFormatTZ;
&gt; +  private final Icon markerIcon = new ImageIcon(ChainsawIcons.MARKER);
&gt;
&gt;   /**
&gt;    * Creates a new TableColorizingRenderer object.
&gt; @@ -90,6 +93,9 @@
&gt;         isSelected, hasFocus, row, col);
&gt;     int colIndex = table.getColumnModel().getColumn(col).getModelIndex() +
&gt; 1;
&gt;
&gt; +    EventContainer container = (EventContainer) table.getModel();
&gt; +    LoggingEvent event = container.getRow(row);
&gt; +
&gt;     switch (colIndex) {
&gt;     case ChainsawColumns.INDEX_ID_COL_NAME:
&gt;       idComponent.setText(value.toString());
&gt; @@ -150,6 +156,12 @@
&gt;     default:
&gt;       break;
&gt;     }
&gt; +    //set the 'info' icon next to the zeroth column if marker is set
&gt; +    if (col == 0 &amp;&amp; event.getProperty("log4j.marker") != null) {
&gt; +        c.setIcon(markerIcon);
&gt; +    } else {
&gt; +        c.setIcon(null);
&gt; +    }
&gt;
&gt;     if (isSelected) {
&gt;       return c;
&gt; @@ -159,8 +171,6 @@
&gt;     Color foreground = null;
&gt;
&gt;     if (colorizer != null) {
&gt; -      EventContainer container = (EventContainer) table.getModel();
&gt; -      LoggingEvent event = container.getRow(row);
&gt;
&gt;       if (event == null) {
&gt;         //ignore...probably changed displayed cols
&gt; @@ -206,7 +216,7 @@
&gt;
&gt;   /**
&gt;    * Changes the Logger precision.
&gt; -   * @param precision
&gt; +   * @param loggerPrecisionText
&gt;    */
&gt;   void setLoggerPrecision(String loggerPrecisionText) {
&gt;     try {
&gt;
&gt; Modified:
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
&gt; URL:
&gt; http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
&gt;
&gt; ==============================================================================
&gt; ---
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
&gt; (original)
&gt; +++
&gt; logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
&gt; Sun Oct 25 07:42:21 2009
&gt; @@ -85,6 +85,9 @@
&gt;   public static final URL HELP =
&gt;     ChainsawIcons.class.getClassLoader().getResource(
&gt;       BASE_ICON_PATH + "Help16.gif");
&gt; +  public static final URL MARKER =
&gt; +    ChainsawIcons.class.getClassLoader().getResource(
&gt; +      BASE_ICON_PATH + "About16.gif");
&gt;   public static final Icon ICON_UP = new ImageIcon(UP);
&gt;   public static final Icon ICON_DOWN = new ImageIcon(DOWN);
&gt;   public static final Icon ICON_HELP = new ImageIcon(HELP);
&gt;
&gt; Modified:
&gt; logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
&gt; URL:
&gt; http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
&gt;
&gt; ==============================================================================
&gt; ---
&gt; logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
&gt; (original)
&gt; +++
&gt; logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html
&gt; Sun Oct 25 07:42:21 2009
&gt; @@ -84,6 +84,22 @@
&gt;     &lt;td width="50" align="center"&gt;-&lt;/td&gt;
&gt;     &lt;td colspan="1"&gt;Go to line&lt;/td&gt;
&gt;  &lt;/tr&gt;
&gt; +    &lt;tr valign="top" bgcolor="#EEEEEE"&gt;
&gt; +        &lt;td nowrap class="HotKey"&gt;Ctrl-F2 (or double-click on a row)&lt;/td&gt;
&gt; +        &lt;td width="50" align="center"&gt;-&lt;/td&gt;
&gt; +        &lt;td colspan="1"&gt;Toggle marker&lt;/td&gt;
&gt; +        &lt;td nowrap class="HotKey"&gt;F2&lt;/td&gt;
&gt; +        &lt;td width="50" align="center"&gt;-&lt;/td&gt;
&gt; +        &lt;td colspan="1"&gt;Find next marker&lt;/td&gt;
&gt; +    &lt;/tr&gt;
&gt; +    &lt;tr valign="top" bgcolor="#EEEEEE"&gt;
&gt; +        &lt;td nowrap class="HotKey"&gt;Shift-F2&lt;/td&gt;
&gt; +        &lt;td width="50" align="center"&gt;-&lt;/td&gt;
&gt; +        &lt;td colspan="1"&gt;Find previous marker&lt;/td&gt;
&gt; +        &lt;td nowrap class="HotKey"&gt;Ctrl-shift-F2&lt;/td&gt;
&gt; +        &lt;td width="50" align="center"&gt;-&lt;/td&gt;
&gt; +        &lt;td colspan="1"&gt;Clear all markers&lt;/td&gt;
&gt; +    &lt;/tr&gt;
&gt;  &lt;/table&gt;&lt;/P&gt;
&gt;  &lt;!--&lt;p&gt;&lt;a href="#TheTop"&gt;Back to top&lt;/a&gt;&lt;/p&gt;--&gt;
&gt;  &lt;a name="Receivers"&gt;&lt;/a&gt;
&gt;
&gt;
&gt;


</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r834797 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ApplicationPreferenceModelPanel.java LogUI.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c20091111081131.F06C62388996@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091111081131-F06C62388996@eris-apache-org%3e</id>
<updated>2009-11-11T08:11:31Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Wed Nov 11 08:11:31 2009
New Revision: 834797

URL: http://svn.apache.org/viewvc?rev=834797&amp;view=rev
Log:
Updates to App preference model panel layout

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java?rev=834797&amp;r1=834796&amp;r2=834797&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
Wed Nov 11 08:11:31 2009
@@ -419,13 +419,13 @@
       configurationURL = new JComboBox(new DefaultComboBoxModel(committedPreferenceModel.getConfigurationURLs()));
       configurationURL.setEditable(true);
       configurationURL.setPrototypeDisplayValue("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
-      configurationURL.setPreferredSize(new Dimension(375, 25));
+      configurationURL.setPreferredSize(new Dimension(375, 15));
 
-      identifierExpression = new JTextField(20);
+      identifierExpression = new JTextField(30);
       toolTipDisplayMillis = new JTextField(8);
       cyclicBufferSize = new JTextField(8);
       Box p = new Box(BoxLayout.X_AXIS);
-
+                                                           
       p.add(showNoReceiverWarning);
       p.add(Box.createHorizontalGlue());
 
@@ -460,7 +460,7 @@
       add(p2);
       add(p3);
       add(ok4);
-      
+
       JPanel p4 = new JPanel(new FlowLayout(FlowLayout.LEFT));
 
       p4.add(new JLabel("ToolTip Display (millis)"));
@@ -473,14 +473,21 @@
       p5.add(new JLabel("Cyclic buffer size"));
       p5.add(Box.createHorizontalStrut(5));
       p5.add(cyclicBufferSize);
+      p5.add(Box.createHorizontalStrut(5));
+      p5.add(new JLabel("Cyclic buffer size change will take effect on Chainsaw restart"));
       add(p5);
 
-      JPanel p6 = new JPanel(new FlowLayout(FlowLayout.LEFT));
+      Box p6 = new Box(BoxLayout.Y_AXIS);
 
-      p6.add(new JLabel("Automatic Configuration URL"));
-      p6.add(Box.createHorizontalStrut(5));
-      p6.add(configurationURL);
-      add(p6);
+      Box configURLPanel = new Box(BoxLayout.X_AXIS);
+      JLabel configLabel = new JLabel("Automatic Configuration URL");
+      configURLPanel.add(configLabel);
+      configURLPanel.add(Box.createHorizontalStrut(5));
+
+      configURLPanel.add(configurationURL);
+      configURLPanel.add(Box.createHorizontalGlue());
+
+      p6.add(configURLPanel);
 
       JButton browseButton = new JButton("Browse");
       browseButton.addActionListener(new ActionListener()
@@ -518,19 +525,14 @@
               }
           }
       });
+      Box browsePanel = new Box(BoxLayout.X_AXIS);
+      browsePanel.add(Box.createHorizontalGlue());
+      browsePanel.add(browseButton);
+      p6.add(Box.createVerticalStrut(5));
+      p6.add(browsePanel);
+      p6.add(Box.createVerticalGlue());
+      add(p6);
 
-      JPanel p7 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-      p7.add(browseButton);
-      add(p7);
-
-      JPanel p8 = new JPanel(new FlowLayout(FlowLayout.LEFT));
-      p8.add(
-        new JLabel(
-          "Cyclic buffer size change will apply the next time you start Chainsaw"));
-      add(p8);
-
-      add(Box.createVerticalGlue());
-      
       configurationURL.setToolTipText("A complete and valid URL identifying the location
of a valid log4 xml configuration file to auto-configure Receivers and other Plugins");
       configurationURL.setInputVerifier(new InputVerifier() {
 

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=834797&amp;r1=834796&amp;r2=834797&amp;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 Wed Nov 11 08:11:31
2009
@@ -883,7 +883,7 @@
       ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage());
     preferencesFrame.getContentPane().add(applicationPreferenceModelPanel);
 
-    preferencesFrame.setSize(640, 520);
+    preferencesFrame.setSize(750, 520);
 
     Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
     preferencesFrame.setLocation(




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r834778 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c20091111061445.ADAAB2388906@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091111061445-ADAAB2388906@eris-apache-org%3e</id>
<updated>2009-11-11T06:14:45Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Wed Nov 11 06:14:45 2009
New Revision: 834778

URL: http://svn.apache.org/viewvc?rev=834778&amp;view=rev
Log:
Increase default cyclic buffer size to 50K (events can still be loaded in VM w/default heap
size)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java?rev=834778&amp;r1=834777&amp;r2=834778&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
Wed Nov 11 06:14:45 2009
@@ -37,7 +37,7 @@
     private boolean showSplash = true;
     private String lookAndFeelClassName = "";
     private int toolTipDisplayMillis = 4000;
-    private int cyclicBufferSize = 5000;
+    private int cyclicBufferSize = 50000;
     private String lastUsedVersion = "";
     private int responsiveness = 3;
     




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r834774 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c20091111055902.3096123888D1@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091111055902-3096123888D1@eris-apache-org%3e</id>
<updated>2009-11-11T05:59:02Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Wed Nov 11 05:59:01 2009
New Revision: 834774

URL: http://svn.apache.org/viewvc?rev=834774&amp;view=rev
Log:
Don't set a null configurationURL vector if one wasn't found in the existing configuration
(will cause the related model to trigger an NPE on construction)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java?rev=834774&amp;r1=834773&amp;r2=834774&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
Wed Nov 11 05:59:01 2009
@@ -190,7 +190,7 @@
       setCyclicBufferSize(model.getCyclicBufferSize());
       Vector configurationURLs = model.getConfigurationURLs();
       if (configurationURLs != null) {
-        setConfigurationURLs(model.getConfigurationURLs());
+        setConfigurationURLs(configurationURLs);
       }
       setConfigurationURL(model.getConfigurationURL());
       setLastUsedVersion(model.getLastUsedVersion());
@@ -246,7 +246,9 @@
     }
 
     public void setConfigurationURLs(Vector urls) {
-        configurationURLs = urls;
+        if (urls != null) {
+            configurationURLs = urls;
+        }
     }
 
     /**




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833948 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c20091109000806.0612C238887A@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091109000806-0612C238887A@eris-apache-org%3e</id>
<updated>2009-11-09T00:08:05Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Mon Nov  9 00:08:05 2009
New Revision: 833948

URL: http://svn.apache.org/viewvc?rev=833948&amp;view=rev
Log:
Don't set a null configurationURL vector if one wasn't found in the existing configuration
(will cause the related model to trigger an NPE on construction)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java?rev=833948&amp;r1=833947&amp;r2=833948&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
Mon Nov  9 00:08:05 2009
@@ -188,7 +188,10 @@
       setShowSplash(model.isShowSplash());
       setToolTipDisplayMillis(model.getToolTipDisplayMillis());
       setCyclicBufferSize(model.getCyclicBufferSize());
-      setConfigurationURLs(model.getConfigurationURLs());
+      Vector configurationURLs = model.getConfigurationURLs();
+      if (configurationURLs != null) {
+        setConfigurationURLs(model.getConfigurationURLs());
+      }
       setConfigurationURL(model.getConfigurationURL());
       setLastUsedVersion(model.getLastUsedVersion());
       setOkToRemoveSecurityManager(model.isOkToRemoveSecurityManager());




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833851 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c20091108092034.04D7B2388882@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091108092034-04D7B2388882@eris-apache-org%3e</id>
<updated>2009-11-08T09:20:33Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sun Nov  8 09:20:31 2009
New Revision: 833851

URL: http://svn.apache.org/viewvc?rev=833851&amp;view=rev
Log:
Only add a browsed-to configuration URL if it doesn't already exist on the list

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java?rev=833851&amp;r1=833850&amp;r2=833851&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
Sun Nov  8 09:20:31 2009
@@ -506,7 +506,9 @@
                   try
                   {
                       String newConfigurationFile = f.toURI().toURL().toExternalForm();
-                      configurationURL.addItem(newConfigurationFile);
+                      if (!committedPreferenceModel.getConfigurationURLs().contains(newConfigurationFile))
{
+                        configurationURL.addItem(newConfigurationFile);
+                      }
                       configurationURL.setSelectedItem(newConfigurationFile);
                   }
                   catch (MalformedURLException e1)




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833850 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ApplicationPreferenceModel.java ApplicationPreferenceModelPanel.java ApplicationPreferenceModelSaver.java LogUI.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c20091108090836.D88D62388882@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091108090836-D88D62388882@eris-apache-org%3e</id>
<updated>2009-11-08T09:08:36Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sun Nov  8 09:08:36 2009
New Revision: 833850

URL: http://svn.apache.org/viewvc?rev=833850&amp;view=rev
Log:
Replaced application-wide preferences automatic configuration URL textfield with editable
combobox remembering 10 most-recently used configuration URLs
 - added a browse button to build the configuration file URL
 - manually changing or browsing to an entry and pressing 'ok' button automatically loads
the configuration
 - list is persisted &amp; restored on Chainsaw restart
 - MRU count: 10

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelSaver.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java?rev=833850&amp;r1=833849&amp;r2=833850&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModel.java
Sun Nov  8 09:08:36 2009
@@ -18,6 +18,7 @@
 
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
+import java.util.Vector;
 
 
 /**
@@ -50,13 +51,15 @@
     /**
      * If not 'empty', this property will be used as the URL to load log4j configuration
at startup
      */
-    private String configurationURL="";
-	  
+    private Vector configurationURLs=new Vector();
+
+    private String configurationURL = "";
     /**
      *    this means for Receivers that require optional jars that can't be delivered
      *    by the Web start classloader, we need to be able to remove the SecurityManager
in place
      */
     private boolean okToRemoveSecurityManager = false;
+    private static final int CONFIGURATION_URL_ENTRY_COUNT = 10;
 
     /**
      * @param listener
@@ -185,6 +188,7 @@
       setShowSplash(model.isShowSplash());
       setToolTipDisplayMillis(model.getToolTipDisplayMillis());
       setCyclicBufferSize(model.getCyclicBufferSize());
+      setConfigurationURLs(model.getConfigurationURLs());
       setConfigurationURL(model.getConfigurationURL());
       setLastUsedVersion(model.getLastUsedVersion());
       setOkToRemoveSecurityManager(model.isOkToRemoveSecurityManager());
@@ -234,6 +238,14 @@
       return statusBar;
     }
 
+    public Vector getConfigurationURLs() {
+        return configurationURLs;
+    }
+
+    public void setConfigurationURLs(Vector urls) {
+        configurationURLs = urls;
+    }
+
     /**
      * @param statusBar The statusBar to set.
      */
@@ -333,9 +345,20 @@
      */
     public final void setConfigurationURL(String configurationURL)
     {
+        //don't add empty entries
+        if (configurationURL == null || configurationURL.trim().equals("")) {
+            return;
+        }
         Object oldValue = this.configurationURL;
-        this.configurationURL = configurationURL;
-        firePropertyChange("configurationURL", oldValue, this.configurationURL);
+        //add entry to MRU list
+        if (!configurationURLs.contains(configurationURL)) {
+          if (configurationURLs.size() == CONFIGURATION_URL_ENTRY_COUNT) {
+              configurationURLs.remove(CONFIGURATION_URL_ENTRY_COUNT - 1);
+          }
+          configurationURLs.add(0, configurationURL);
+        }
+      this.configurationURL = configurationURL;
+      firePropertyChange("configurationURL", oldValue, this.configurationURL);
     }
     /**
      * @return Returns the lastUsedVersion.

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java?rev=833850&amp;r1=833849&amp;r2=833850&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelPanel.java
Sun Nov  8 09:08:36 2009
@@ -17,11 +17,14 @@
 
 package org.apache.log4j.chainsaw;
 
+import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.Dictionary;
 import java.util.Enumeration;
@@ -31,9 +34,13 @@
 import javax.swing.Box;
 import javax.swing.BoxLayout;
 import javax.swing.ButtonGroup;
+import javax.swing.DefaultComboBoxModel;
 import javax.swing.InputVerifier;
+import javax.swing.JButton;
 import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
 import javax.swing.JComponent;
+import javax.swing.JFileChooser;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
@@ -67,7 +74,7 @@
   private JTextField identifierExpression;
   private JTextField toolTipDisplayMillis;
   private JTextField cyclicBufferSize;    
-  private final JTextField configurationURL = new JTextField(35);
+  private JComboBox configurationURL;
   private final Logger logger;
 
   ApplicationPreferenceModelPanel(ApplicationPreferenceModel model) {
@@ -77,7 +84,7 @@
     getOkButton().addActionListener(
       new ActionListener() {
         public void actionPerformed(ActionEvent e) {
-          uncommittedPreferenceModel.setConfigurationURL(configurationURL.getText());
+          uncommittedPreferenceModel.setConfigurationURL((String)configurationURL.getSelectedItem());
           uncommittedPreferenceModel.setIdentifierExpression(
             identifierExpression.getText());
             try {
@@ -409,6 +416,11 @@
     private void initComponents() {
       setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
 
+      configurationURL = new JComboBox(new DefaultComboBoxModel(committedPreferenceModel.getConfigurationURLs()));
+      configurationURL.setEditable(true);
+      configurationURL.setPrototypeDisplayValue("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+      configurationURL.setPreferredSize(new Dimension(375, 25));
+
       identifierExpression = new JTextField(20);
       toolTipDisplayMillis = new JTextField(8);
       cyclicBufferSize = new JTextField(8);
@@ -470,11 +482,50 @@
       p6.add(configurationURL);
       add(p6);
 
-      JPanel p7 = new JPanel(new FlowLayout(FlowLayout.LEFT));
-      p7.add(
+      JButton browseButton = new JButton("Browse");
+      browseButton.addActionListener(new ActionListener()
+      {
+          public void actionPerformed(ActionEvent e)
+          {
+
+              String defaultPath = ".";
+              if (configurationURL.getItemCount() &gt; 0) {
+                File currentConfigurationPath = new File(configurationURL.getSelectedItem().toString()).getParentFile();
+                  defaultPath = currentConfigurationPath.getPath();
+                  //JFileChooser constructor will not navigate to this location unless we
remove the prefixing protocol and slash
+                  //at least on winxp
+                  if (defaultPath.toLowerCase().startsWith("file:\\")) {
+                      defaultPath = defaultPath.substring("file:\\".length());
+                  }
+              }
+
+              JFileChooser chooser = new JFileChooser(defaultPath);
+              int result = chooser.showOpenDialog(ApplicationPreferenceModelPanel.this);
+              if (JFileChooser.APPROVE_OPTION == result) {
+                  File f = chooser.getSelectedFile();
+                  try
+                  {
+                      String newConfigurationFile = f.toURI().toURL().toExternalForm();
+                      configurationURL.addItem(newConfigurationFile);
+                      configurationURL.setSelectedItem(newConfigurationFile);
+                  }
+                  catch (MalformedURLException e1)
+                  {
+                      e1.printStackTrace();  //To change body of catch statement use File
| Settings | File Templates.
+                  }
+              }
+          }
+      });
+
+      JPanel p7 = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+      p7.add(browseButton);
+      add(p7);
+
+      JPanel p8 = new JPanel(new FlowLayout(FlowLayout.LEFT));
+      p8.add(
         new JLabel(
           "Cyclic buffer size change will apply the next time you start Chainsaw"));
-      add(p7);
+      add(p8);
 
       add(Box.createVerticalGlue());
       
@@ -484,12 +535,13 @@
         public boolean verify(JComponent input)
         {
             try {
-                new URL(configurationURL.getText());
+                new URL((String)configurationURL.getSelectedItem());
             } catch (Exception e) {
                 return false;
             }
             return true;
         }});
+        configurationURL.setSelectedItem(committedPreferenceModel.getConfigurationURL());
     }
 
     private void initSliderComponent() {
@@ -643,7 +695,7 @@
 
           public void propertyChange(PropertyChangeEvent evt) {
             String value = evt.getNewValue().toString();
-            configurationURL.setText(value);
+            configurationURL.setSelectedItem(value);
           }});
       confirmExit.addActionListener(
         new ActionListener() {
@@ -673,7 +725,7 @@
       identifierExpression.setText(uncommittedPreferenceModel.getIdentifierExpression());
       toolTipDisplayMillis.setText(uncommittedPreferenceModel.getToolTipDisplayMillis()+"");
       cyclicBufferSize.setText(uncommittedPreferenceModel.getCyclicBufferSize() + "");
-      configurationURL.setText(uncommittedPreferenceModel.getConfigurationURL());
+      configurationURL.setSelectedItem(uncommittedPreferenceModel.getConfigurationURL());
     }
   }
 }

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelSaver.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelSaver.java?rev=833850&amp;r1=833849&amp;r2=833850&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelSaver.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ApplicationPreferenceModelSaver.java
Sun Nov  8 09:08:36 2009
@@ -4,14 +4,14 @@
 import java.io.FileReader;
 import java.io.FileWriter;
 
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
 import org.apache.log4j.chainsaw.prefs.LoadSettingsEvent;
 import org.apache.log4j.chainsaw.prefs.SaveSettingsEvent;
 import org.apache.log4j.chainsaw.prefs.SettingsListener;
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
 
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.xml.DomDriver;
-
 /**
  * Helper class that helps delegate the work of loading and saving the  values
  * of the ApplicationPreferenceModel, allowing that class to remain a simple
@@ -37,8 +37,8 @@
 
     public void loadSettings(LoadSettingsEvent event) {
         XStream stream = new XStream(new DomDriver());
+        File file = getApplicationPreferenceXMLFile(SettingsManager.getInstance().getSettingsDirectory());
         try {
-            File file = getApplicationPreferenceXMLFile(SettingsManager.getInstance().getSettingsDirectory());
             if (file.exists()) {
                 FileReader reader = new FileReader(file);
                 ApplicationPreferenceModel loadedModel = (ApplicationPreferenceModel) stream
@@ -49,8 +49,9 @@
         } catch (Exception e) {
 //            TODO exception handling
             e.printStackTrace();
+            //unable to process - delete file 
+            file.delete();
         }
-
     }
 
     public void saveSettings(SaveSettingsEvent event) {

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=833850&amp;r1=833849&amp;r2=833850&amp;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 Sun Nov  8 09:08:36
2009
@@ -373,6 +373,7 @@
     
     Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
 		public void uncaughtException(Thread t, Throwable e) {
+            e.printStackTrace();
 			logger.error("Uncaught exception in thread " + t, e);
 		}
     });
@@ -405,7 +406,7 @@
             }
         }});
 
-    if (config == null) {
+    if (config == null || config.trim().equals("")) {
       logger.info("No auto-configuration file found within the ApplicationPreferenceModel");
     } else {
       logger.info("Using '" + config + "' for auto-configuration");




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r833805 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200911.mbox/%3c20091108021345.BC5F0238889D@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091108021345-BC5F0238889D@eris-apache-org%3e</id>
<updated>2009-11-08T02:13:45Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sun Nov  8 02:13:45 2009
New Revision: 833805

URL: http://svn.apache.org/viewvc?rev=833805&amp;view=rev
Log:
route httpclient logging to the chainsaw-log tab (vfslogfilepatternreceiver with an http file
system uses httpclient)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java

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=833805&amp;r1=833804&amp;r2=833805&amp;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 Sun Nov  8 02:13:45
2009
@@ -354,6 +354,20 @@
     Logger.getLogger("org.apache").removeAllAppenders();
     Logger.getLogger("org.apache").addAppender(rewriteAppender);
     Logger.getLogger("org.apache").setAdditivity(false);
+
+    //commons-vfs uses httpclient for http filesystem support, route this to the chainsaw-log
tab as well
+    appenders = Logger.getLogger("httpclient").getAllAppenders();
+    if (!appenders.hasMoreElements()) {
+        appenders = Logger.getRootLogger().getAllAppenders();
+    }
+    while (appenders.hasMoreElements()) {
+        Appender nextAppender = (Appender)appenders.nextElement();
+        rewriteAppender.addAppender(nextAppender);
+    }
+    Logger.getLogger("httpclient").removeAllAppenders();
+    Logger.getLogger("httpclient").addAppender(rewriteAppender);
+    Logger.getLogger("httpclient").setAdditivity(false);
+
     //set the commons.vfs.cache logger to info, since it can contain password information
     Logger.getLogger("org.apache.commons.vfs.cache").setLevel(Level.INFO);
     




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831519 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091031080037.5902F23888D4@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091031080037-5902F23888D4@eris-apache-org%3e</id>
<updated>2009-10-31T08:00:37Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sat Oct 31 08:00:36 2009
New Revision: 831519

URL: http://svn.apache.org/viewvc?rev=831519&amp;view=rev
Log:
If LEVEL is 1st column, don't null out icon when determining if marker icon should be displayed

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java

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=831519&amp;r1=831518&amp;r2=831519&amp;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
Sat Oct 31 08:00:36 2009
@@ -195,7 +195,10 @@
       if (event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME) != null) {
         c.setIcon(markerIcon);
       } else {
-        c.setIcon(null);
+        //only null out the column if it's not the level field
+        if (colIndex != ChainsawColumns.INDEX_LEVEL_COL_NAME) {
+            c.setIcon(null);
+        }
       }
     }
 




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r831518 - in /logging/chainsaw/trunk/src/main: java/org/apache/log4j/chainsaw/ resources/org/apache/log4j/chainsaw/prefs/</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091031073430.5A14423888A6@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091031073430-5A14423888A6@eris-apache-org%3e</id>
<updated>2009-10-31T07:34:30Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sat Oct 31 07:34:29 2009
New Revision: 831518

URL: http://svn.apache.org/viewvc?rev=831518&amp;view=rev
Log:
Chainsaw bug fixes
 - when undocking a logpanel, the initial size would be incorrect
 - level icons lost when marker icon was added
 - prevent NPE in tablecolorizingrenderer

Also, changed the default chainsaw frame size to 1024x768

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/DockablePanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
    logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties

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=831518&amp;r1=831517&amp;r2=831518&amp;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
Sat Oct 31 07:34:29 2009
@@ -613,6 +613,7 @@
   private Action createCustomExpressionPanelAction() {
     final JDialog dialog = new JDialog(logui, "Define tab", true);
     dialog.getContentPane().add(getCustomExpressionPanel());
+    dialog.setLocationRelativeTo(null);
     dialog.pack();
 
     Action createExpressionPanel =
@@ -623,7 +624,7 @@
       };
 
     createExpressionPanel.putValue(
-      Action.SHORT_DESCRIPTION, "Create custom expression LogPanel...");
+      Action.SHORT_DESCRIPTION, "Create custom expression LogPanel...   ");
 
     // TODO think of good mnemonics and HotKey for this action
     return createExpressionPanel;

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/DockablePanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/DockablePanel.java?rev=831518&amp;r1=831517&amp;r2=831518&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/DockablePanel.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/DockablePanel.java Sat
Oct 31 07:34:29 2009
@@ -17,6 +17,8 @@
 
 package org.apache.log4j.chainsaw;
 
+import java.awt.Dimension;
+
 import javax.swing.JPanel;
 
 
@@ -38,4 +40,8 @@
     return isDocked;
   }
 
+    public Dimension getPreferredSize()
+    {
+        return new Dimension(1024, 768);
+    }
 }

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=831518&amp;r1=831517&amp;r2=831518&amp;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 Sat Oct 31
07:34:29 2009
@@ -318,7 +318,6 @@
 
     externalPanel = new DockablePanel();
     externalPanel.setLayout(new BorderLayout());
-    undockedFrame.getContentPane().add(externalPanel);
 
     undockedFrame.addWindowListener(
       new WindowAdapter() {
@@ -329,6 +328,8 @@
 
     undockedToolbar = createDockwindowToolbar();
     externalPanel.add(undockedToolbar, BorderLayout.NORTH);
+    undockedFrame.getContentPane().add(externalPanel);
+    undockedFrame.setSize(new Dimension(1024, 768));
     undockedFrame.pack();
 
     /*
@@ -1593,8 +1594,14 @@
                 nameTreeAndMainPanelSplit.setDividerLocation(in.readInt());
                 detailLayout.setConversionPattern(in.readObject().toString());
                 Point p = (Point)in.readObject();
-                undockedFrame.setLocation(p.x, p.y);
-                undockedFrame.setSize(((Dimension)in.readObject()));
+                Dimension d = (Dimension)in.readObject();
+                if (p.x != 0 &amp;&amp; p.y != 0) {
+                    undockedFrame.setLocation(p.x, p.y);
+                    undockedFrame.setSize(d);
+                } else {
+                    undockedFrame.setLocation(0, 0);
+                    undockedFrame.setSize(new Dimension(1024, 768));
+                }
 
                 int versionNumber = 0;
                 Vector savedVector;
@@ -1806,6 +1813,7 @@
     externalPanel.add(undockedToolbar, BorderLayout.NORTH);
     externalPanel.add(nameTreeAndMainPanelSplit, BorderLayout.CENTER);
     externalPanel.setDocked(false);
+    undockedFrame.pack();
 
     undockedFrame.setVisible(true);
     dockingAction.putValue(Action.NAME, "Dock");

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=831518&amp;r1=831517&amp;r2=831518&amp;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
Sat Oct 31 07:34:29 2009
@@ -100,6 +100,10 @@
 
     EventContainer container = (EventContainer) table.getModel();
     LoggingEvent event = container.getRow(row);
+    //no event, use default renderer
+    if (event == null) {
+        return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row,
col);
+    }
 
     switch (colIndex) {
     case ChainsawColumns.INDEX_ID_COL_NAME:
@@ -187,10 +191,12 @@
         break;
     }
     //set the 'marker' icon next to the zeroth column if marker is set
-    if (col == 0 &amp;&amp; event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME) !=
null) {
+    if (col == 0) {
+      if (event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME) != null) {
         c.setIcon(markerIcon);
-    } else {
+      } else {
         c.setIcon(null);
+      }
     }
 
     if (isSelected) {

Modified: logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties?rev=831518&amp;r1=831517&amp;r2=831518&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
(original)
+++ logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
Sat Oct 31 07:34:29 2009
@@ -4,10 +4,10 @@
 
 # These next settings define the location and dimenions of the main
 # window when it is first realized on startup
-main.window.x=50
-main.window.y=50
-main.window.width=640
-main.window.height=480
+main.window.x=0
+main.window.y=0
+main.window.width=1024
+main.window.height=768
 
 table.columns.order=ID,TIMESTAMP,LEVEL,LOGGER,MESSAGE,THROWABLE,THREAD,NDC,CLASS,METHOD,FILE,LINE
 table.columns.widths=50,150,50,100,300,100,150,150,300,150,100,100




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r830433 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091028035322.CBED523888CE@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091028035322-CBED523888CE@eris-apache-org%3e</id>
<updated>2009-10-28T03:53:22Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Wed Oct 28 03:53:22 2009
New Revision: 830433

URL: http://svn.apache.org/viewvc?rev=830433&amp;view=rev
Log:
Remove propertieslistmodelmap from eventtypeentrycontainer (auto-completion of property keys
still supported, just not property values)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java?rev=830433&amp;r1=830432&amp;r2=830433&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/filter/EventTypeEntryContainer.java
Wed Oct 28 03:53:22 2009
@@ -53,7 +53,6 @@
   private DefaultListModel loggerListModel = new DefaultListModel();
   private DefaultListModel threadListModel = new DefaultListModel();
   private DefaultListModel fileNameListModel = new DefaultListModel();
-  private Map propertiesListModelMap = new HashMap();
   private Map modelMap = new HashMap();
   private static final String LOGGER_FIELD = "LOGGER";
   private static final String LEVEL_FIELD = "LEVEL";
@@ -77,7 +76,7 @@
   
   public boolean modelExists(String fieldName) {
       if (fieldName != null) {
-        return (fieldName.toUpperCase().startsWith(PROP_FIELD) || modelMap.keySet().contains(fieldName.toUpperCase()));
+        return modelMap.keySet().contains(fieldName.toUpperCase());
       }
       return false;
   }
@@ -88,14 +87,6 @@
           if (model != null) {
               return model;
           }
-          //drop prop field and optional ticks around field name
-          if (fieldName.startsWith(PROP_FIELD)) {
-              fieldName = fieldName.substring(PROP_FIELD.length());
-              if ((fieldName.startsWith("'")) &amp;&amp; (fieldName.endsWith("'"))) {
-                  fieldName = fieldName.substring(1, fieldName.length() - 1);
-              }
-          }
-          return (ListModel)propertiesListModelMap.get(fieldName);
       }
       return null;
   } 
@@ -157,14 +148,6 @@
             if (!(propListModel.contains(entry.getKey()))) {
                 propListModel.addElement(entry.getKey());
             }
-            DefaultListModel model = (DefaultListModel)propertiesListModelMap.get(entry.getKey());
-            if (model == null) {
-                model = new DefaultListModel();
-                propertiesListModelMap.put(entry.getKey(), model);
-            }
-            if (!(model.contains(entry.getValue()))) {
-                model.addElement(entry.getValue());
-            }
         }
     }
 }




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r830053 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ChainsawCyclicBufferTableModel.java LogPanel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091027042100.95E7F23888D0@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091027042100-95E7F23888D0@eris-apache-org%3e</id>
<updated>2009-10-27T04:21:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Tue Oct 27 04:20:59 2009
New Revision: 830053

URL: http://svn.apache.org/viewvc?rev=830053&amp;view=rev
Log:
Implement a custom table cell editor for the marker column
 - highlighting the value when the cell is edited
 - when edited column loses focus, stop editing (accept edited entries)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java

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=830053&amp;r1=830052&amp;r2=830053&amp;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
Tue Oct 27 04:20:59 2009
@@ -634,20 +634,6 @@
     return super.isCellEditable(rowIndex, columnIndex);
   }
 
-    public void setValueAt(Object value, int rowIndex, int columnIndex)
-    {
-        String columnName = getColumnName(columnIndex);
-        if (columnName.toLowerCase().equals(ChainsawConstants.MARKER_PROPERTY_NAME)) {
-            LoggingEvent event = getRow(rowIndex);
-            //if the entry is cleared, remove the property
-            if (value != null &amp;&amp; !value.toString().trim().equals("")) {
-                event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, value.toString());
-            } else {
-                event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
-            }
-        }
-    }
-
   /* (non-Javadoc)
    * @see org.apache.log4j.chainsaw.EventContainer#setCyclic(boolean)
    */

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=830053&amp;r1=830052&amp;r2=830053&amp;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 Tue Oct 27
04:20:59 2009
@@ -61,11 +61,13 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Enumeration;
+import java.util.EventObject;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
@@ -101,6 +103,7 @@
 import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
 import javax.swing.WindowConstants;
+import javax.swing.event.CellEditorListener;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
@@ -110,6 +113,7 @@
 import javax.swing.event.TableColumnModelListener;
 import javax.swing.event.TableModelEvent;
 import javax.swing.event.TableModelListener;
+import javax.swing.table.TableCellEditor;
 import javax.swing.table.TableColumn;
 import javax.swing.table.TableColumnModel;
 import javax.swing.text.Document;
@@ -243,6 +247,7 @@
   private final Logger logger = LogManager.getLogger(LogPanel.class);
   private final Vector filterExpressionVector;
   private static final Color INVALID_EXPRESSION_BACKGROUND = new Color(251, 186, 186);
+  private TableCellEditor markerCellEditor;
 
     /**
    * Creates a new LogPanel object.  If a LogPanel with this identifier has
@@ -795,6 +800,7 @@
      * Throwable popup
      */
     throwableRenderPanel = new ThrowableRenderPanel();
+    markerCellEditor = new MarkerCellEditor();
 
     final JDialog detailDialog = new JDialog((JFrame) null, true);
     Container container = detailDialog.getContentPane();
@@ -2723,6 +2729,9 @@
           (column.getModelIndex() + 1) == ChainsawColumns.INDEX_THROWABLE_COL_NAME) {
           column.setCellEditor(throwableRenderPanel);
         }
+        if (column.getHeaderValue().toString().toLowerCase().equals(ChainsawConstants.MARKER_PROPERTY_NAME))
{
+          column.setCellEditor(markerCellEditor);
+        }
       }
     }
 
@@ -2846,4 +2855,66 @@
         });
     }
   }
+
+    private class MarkerCellEditor implements TableCellEditor {
+        JTextField textField = new JTextField();
+        Set cellEditorListeners = new HashSet();
+        private LoggingEvent currentEvent;
+
+        public Object getCellEditorValue()
+        {
+            return textField.getText();
+        }
+
+        public boolean isCellEditable(EventObject anEvent)
+        {
+            return true;
+        }
+
+        public boolean shouldSelectCell(EventObject anEvent)
+        {
+            textField.selectAll();
+            return true;
+        }
+
+        public boolean stopCellEditing()
+        {
+            if (textField.getText().trim().equals("")) {
+                currentEvent.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+            } else {
+                currentEvent.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, textField.getText());
+            }
+            ChangeEvent event = new ChangeEvent(table);
+            for (Iterator iter = cellEditorListeners.iterator();iter.hasNext();) {
+                ((CellEditorListener)iter.next()).editingStopped(event);
+            }
+            return true;
+        }
+
+        public void cancelCellEditing()
+        {
+           ChangeEvent event = new ChangeEvent(table);
+           for (Iterator iter = cellEditorListeners.iterator();iter.hasNext();) {
+               ((CellEditorListener)iter.next()).editingCanceled(event);
+           }
+        }
+
+        public void addCellEditorListener(CellEditorListener l)
+        {
+            cellEditorListeners.add(l);
+        }
+
+        public void removeCellEditorListener(CellEditorListener l)
+        {
+            cellEditorListeners.remove(l);
+        }
+
+        public Component getTableCellEditorComponent(JTable table, Object value, boolean
isSelected, int row, int column)
+        {
+            currentEvent = tableModel.getRow(row);
+            textField.setText(currentEvent.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME));
+            textField.selectAll();
+            return textField;
+        }
+    }
 }




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r829704 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091026052540.36819238888D@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091026052540-36819238888D@eris-apache-org%3e</id>
<updated>2009-10-26T05:25:40Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Mon Oct 26 05:25:39 2009
New Revision: 829704

URL: http://svn.apache.org/viewvc?rev=829704&amp;view=rev
Log:
If marker field is edited and cleared, remove the property

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java

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=829704&amp;r1=829703&amp;r2=829704&amp;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
Mon Oct 26 05:25:39 2009
@@ -639,7 +639,12 @@
         String columnName = getColumnName(columnIndex);
         if (columnName.toLowerCase().equals(ChainsawConstants.MARKER_PROPERTY_NAME)) {
             LoggingEvent event = getRow(rowIndex);
-            event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, value.toString());
+            //if the entry is cleared, remove the property
+            if (value != null &amp;&amp; !value.toString().trim().equals("")) {
+                event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, value.toString());
+            } else {
+                event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+            }
         }
     }
 




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r829702 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ChainsawCyclicBufferTableModel.java EventContainer.java LogPanel.java TableColorizingRenderer.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091026052039.6EE8323888C2@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091026052039-6EE8323888C2@eris-apache-org%3e</id>
<updated>2009-10-26T05:20:39Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Mon Oct 26 05:20:38 2009
New Revision: 829702

URL: http://svn.apache.org/viewvc?rev=829702&amp;view=rev
Log:
Fix bug preventing properties from not being displayed correctly in the table
Add  'marker' column to the table when a marker is set
Changed default text in marker column to 'set'
Marker column is now editable (double-click cell)
(Marker values are re-loaded if events are saved &amp; reopened later)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.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/TableColorizingRenderer.java

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=829702&amp;r1=829701&amp;r2=829702&amp;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
Mon Oct 26 05:20:38 2009
@@ -342,7 +342,7 @@
             LoggingEvent event = (LoggingEvent)filteredList.get(i);
             Object result = event.removeProperty(propName);
             if (result != null) {
-                fireRowUpdated(i);
+                fireRowUpdated(i, false);
             }
         }
     }
@@ -501,34 +501,39 @@
       }
     }
 
-    /**
-     * Is this a new Property key we haven't seen before?  Remember that now MDC has been
merged
-     * into the Properties collection
-     */
-    boolean newColumn = uniquePropertyKeys.addAll(e.getPropertyKeySet());
+    checkForNewColumn(e);
+
+    return rowAdded;
+  }
 
-    if (newColumn) {
+   private void checkForNewColumn(LoggingEvent e)
+   {
       /**
-       * If so, we should add them as columns and notify listeners.
+       * Is this a new Property key we haven't seen before?  Remember that now MDC has been
merged
+       * into the Properties collection
        */
-      for (Iterator iter = e.getPropertyKeySet().iterator(); iter.hasNext();) {
-        String key = iter.next().toString().toUpperCase();
+      boolean newColumn = uniquePropertyKeys.addAll(e.getPropertyKeySet());
 
-        //add all keys except the 'log4jid' key (columnNames is all-caps)
-        if (!columnNames.contains(key) &amp;&amp; !(Constants.LOG4J_ID_KEY.equalsIgnoreCase(key)))
{
-          columnNames.add(key);
-          logger.debug("Adding col '" + key + "', columnNames=" + columnNames);
-          fireNewKeyColumnAdded(
-            new NewKeyEvent(
-              this, columnNames.indexOf(key), key, e.getProperty(key)));
+      if (newColumn) {
+        /**
+         * If so, we should add them as columns and notify listeners.
+         */
+        for (Iterator iter = e.getPropertyKeySet().iterator(); iter.hasNext();) {
+          String key = iter.next().toString().toUpperCase();
+
+          //add all keys except the 'log4jid' key (columnNames is all-caps)
+          if (!columnNames.contains(key) &amp;&amp; !(Constants.LOG4J_ID_KEY.equalsIgnoreCase(key)))
{
+            columnNames.add(key);
+            logger.debug("Adding col '" + key + "', columnNames=" + columnNames);
+            fireNewKeyColumnAdded(
+              new NewKeyEvent(
+                this, columnNames.indexOf(key), key, e.getProperty(key)));
+          }
         }
       }
-    }
+   }
 
-    return rowAdded;
-  }
-
-  public int getLastAdded() {
+    public int getLastAdded() {
     int last = 0;
 
     if (cyclic) {
@@ -563,8 +568,12 @@
   }});
   }
 
-    public void fireRowUpdated(int row) {
+    public void fireRowUpdated(int row, boolean checkForNewColumns) {
         fireTableRowsUpdated(row, row);
+        if (checkForNewColumns) {
+            //row may have had a column added..if so, make sure a column is added
+            checkForNewColumn(getRow(row));
+        }
     }
 
     /**
@@ -617,10 +626,23 @@
     case ChainsawColumns.INDEX_THROWABLE_COL_NAME:
       return true;
     }
+    String columnName = getColumnName(columnIndex);
+    if (columnName.toLowerCase().equals(ChainsawConstants.MARKER_PROPERTY_NAME)) {
+      return true;
+    }
 
     return super.isCellEditable(rowIndex, columnIndex);
   }
 
+    public void setValueAt(Object value, int rowIndex, int columnIndex)
+    {
+        String columnName = getColumnName(columnIndex);
+        if (columnName.toLowerCase().equals(ChainsawConstants.MARKER_PROPERTY_NAME)) {
+            LoggingEvent event = getRow(rowIndex);
+            event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, value.toString());
+        }
+    }
+
   /* (non-Javadoc)
    * @see org.apache.log4j.chainsaw.EventContainer#setCyclic(boolean)
    */

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=829702&amp;r1=829701&amp;r2=829702&amp;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 Mon
Oct 26 05:20:38 2009
@@ -143,8 +143,9 @@
     /**
      * A row was updated
      * @param row
+     * @param checkForNewColumns
      */
-  void fireRowUpdated(int row);
+  void fireRowUpdated(int row, boolean checkForNewColumns);
   /**
    * Allow a forced notification of the EventCountListeners
    *

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=829702&amp;r1=829701&amp;r2=829702&amp;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 Mon Oct 26
05:20:38 2009
@@ -2513,11 +2513,12 @@
           LoggingEvent event = tableModel.getRow(row);
           Object marker = event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
           if (marker == null) {
-              event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "true");
+              event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "set");
           } else {
               event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
           }
-          tableModel.fireRowUpdated(row);
+          //if marker -was- null, it no longer is (may need to add the column)
+          tableModel.fireRowUpdated(row, (marker == null));
         }
     }
 
@@ -2647,11 +2648,12 @@
                 LoggingEvent event = tableModel.getRow(row);
                 Object marker = event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
                 if (marker == null) {
-                    event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "true");
+                    event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "set");
                 } else {
                     event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
                 }
-                tableModel.fireRowUpdated(row);
+                //if marker -was- null, it no longer is (may need to add the column)
+                tableModel.fireRowUpdated(row, (marker == null));
               }
           }
       }

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=829702&amp;r1=829701&amp;r2=829702&amp;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
Mon Oct 26 05:20:38 2009
@@ -22,7 +22,9 @@
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 import java.util.TimeZone;
 
 import javax.swing.BorderFactory;
@@ -32,6 +34,7 @@
 import javax.swing.JTable;
 import javax.swing.SwingConstants;
 import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableColumn;
 
 import org.apache.log4j.chainsaw.color.Colorizer;
 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
@@ -91,7 +94,9 @@
 
     JLabel c = (JLabel)super.getTableCellRendererComponent(table, value, 
         isSelected, hasFocus, row, col);
-    int colIndex = table.getColumnModel().getColumn(col).getModelIndex() + 1;
+
+    TableColumn tableColumn = table.getColumnModel().getColumn(col);
+    int colIndex = tableColumn.getModelIndex() + 1;
 
     EventContainer container = (EventContainer) table.getModel();
     LoggingEvent event = container.getRow(row);
@@ -126,6 +131,16 @@
 
     c.setText(logger.substring(startPos + 1));
       break;
+    case ChainsawColumns.INDEX_CLASS_COL_NAME:
+    case ChainsawColumns.INDEX_FILE_COL_NAME:
+    case ChainsawColumns.INDEX_LINE_COL_NAME:
+    case ChainsawColumns.INDEX_MESSAGE_COL_NAME:
+    case ChainsawColumns.INDEX_NDC_COL_NAME:
+    case ChainsawColumns.INDEX_THREAD_COL_NAME:
+    case ChainsawColumns.INDEX_TIMESTAMP_COL_NAME:
+    case ChainsawColumns.INDEX_METHOD_COL_NAME:
+      c.setText(value.toString());
+      break;
 
     case ChainsawColumns.INDEX_LEVEL_COL_NAME:
       if (levelUseIcons) {
@@ -153,11 +168,26 @@
       c = levelComponent;
       break;
 
+    //remaining entries are properties
     default:
-      break;
+        Set propertySet = event.getPropertyKeySet();
+        String headerName = tableColumn.getHeaderValue().toString().toLowerCase();
+        String thisProp = null;
+        //find the property in the property set...case-sensitive
+        for (Iterator iter = propertySet.iterator();iter.hasNext();) {
+            String entry = iter.next().toString();
+            if (entry.toLowerCase().equals(headerName)) {
+                thisProp = entry;
+                break;
+            }
+        }
+        if (thisProp != null) {
+            c.setText(event.getProperty(headerName));
+        }
+        break;
     }
-    //set the 'info' icon next to the zeroth column if marker is set
-    if (col == 0 &amp;&amp; event.getProperty("log4j.marker") != null) {
+    //set the 'marker' icon next to the zeroth column if marker is set
+    if (col == 0 &amp;&amp; event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME) !=
null) {
         c.setIcon(markerIcon);
     } else {
         c.setIcon(null);




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r829666 - /logging/chainsaw/trunk/pom.xml</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091025221101.3CFB423888CE@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091025221101-3CFB423888CE@eris-apache-org%3e</id>
<updated>2009-10-25T22:11:01Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sun Oct 25 22:11:00 2009
New Revision: 829666

URL: http://svn.apache.org/viewvc?rev=829666&amp;view=rev
Log:
Chainsaw now relies on log4j 1.2.16 (uses removeProperty)

Modified:
    logging/chainsaw/trunk/pom.xml

Modified: logging/chainsaw/trunk/pom.xml
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/pom.xml?rev=829666&amp;r1=829665&amp;r2=829666&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/pom.xml (original)
+++ logging/chainsaw/trunk/pom.xml Sun Oct 25 22:11:00 2009
@@ -349,7 +349,7 @@
     &lt;dependency&gt;
       &lt;groupId&gt;log4j&lt;/groupId&gt;
       &lt;artifactId&gt;log4j&lt;/artifactId&gt;
-      &lt;version&gt;1.2.15&lt;/version&gt;
+      &lt;version&gt;1.2.16&lt;/version&gt;
     &lt;/dependency&gt;
     &lt;dependency&gt;
       &lt;groupId&gt;xstream&lt;/groupId&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r829507 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091025081025.468F323888CF@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091025081025-468F323888CF@eris-apache-org%3e</id>
<updated>2009-10-25T08:10:25Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sun Oct 25 08:10:24 2009
New Revision: 829507

URL: http://svn.apache.org/viewvc?rev=829507&amp;view=rev
Log:
When saving events for a Chainsaw tab, save properties as well (including new 'marker' property
if any events have the marker set)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java?rev=829507&amp;r1=829506&amp;r2=829507&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileSaveAction.java Sun
Oct 25 08:10:24 2009
@@ -88,6 +88,7 @@
 
     File selectedFile = chooser.getSelectedFile();
     XMLLayout layout = new XMLLayout();
+    layout.setProperties(true);
     LoggingEvent event = null;
     PrintWriter out = null;
 




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r829505 - in /logging/chainsaw/trunk/src/main: java/org/apache/log4j/chainsaw/ java/org/apache/log4j/chainsaw/icons/ resources/org/apache/log4j/chainsaw/</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091025074222.936C523888CF@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091025074222-936C523888CF@eris-apache-org%3e</id>
<updated>2009-10-25T07:42:22Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sun Oct 25 07:42:21 2009
New Revision: 829505

URL: http://svn.apache.org/viewvc?rev=829505&amp;view=rev
Log:
Add new 'marker' feature
Marker is displayed as an icon that appears in the first displayed column (using 'about' icon
currently)

Ctrl-F2 or double-click: toggle a marker on or off
F2: search for next marker
Shift-F2: search for previous marker
Ctrl-Shift-F2: clear all markers

To facilitate search, rendering &amp; toggle of markers, adding a marker temporarily adds
a new property to events that have the marker set called 'log4j.marker' (value 'true')'.

Also added a new method to LoggingEvent: 
public Object removeProperty(String propName)
to facilitate removal of this temporary property when the marker is un-set for a loggingevent

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawToolBarAndMenus.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/TableColorizingRenderer.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
    logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
Sun Oct 25 07:42:21 2009
@@ -79,7 +79,9 @@
 
   static final String LEVEL_DISPLAY = "level.display";
   static final String LEVEL_DISPLAY_ICONS = "icons";
-  static final String LEVEL_DISPLAY_TEXT = "text";  
+  static final String LEVEL_DISPLAY_TEXT = "text";
+
+  static final String MARKER_PROPERTY_NAME = "log4j.marker";
 
   static final String DATETIME_FORMAT = "EEE MMM dd HH:mm:ss z yyyy";
   

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=829505&amp;r1=829504&amp;r2=829505&amp;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
Sun Oct 25 07:42:21 2009
@@ -333,7 +333,21 @@
     }
   }
 
-  public int getColumnCount() {
+    public void removePropertyFromEvents(String propName) {
+        for (Iterator iter = unfilteredList.iterator();iter.hasNext();) {
+            LoggingEvent event = (LoggingEvent)iter.next();
+            event.removeProperty(propName);
+        }
+        for (int i=0;i&lt;filteredList.size();i++) {
+            LoggingEvent event = (LoggingEvent)filteredList.get(i);
+            Object result = event.removeProperty(propName);
+            if (result != null) {
+                fireRowUpdated(i);
+            }
+        }
+    }
+
+    public int getColumnCount() {
     return columnNames.size();
   }
 
@@ -549,7 +563,11 @@
   }});
   }
 
-  /**
+    public void fireRowUpdated(int row) {
+        fireTableRowsUpdated(row, row);
+    }
+
+    /**
   * @param e
   */
   private void fireNewKeyColumnAdded(NewKeyEvent e) {

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=829505&amp;r1=829504&amp;r2=829505&amp;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
Sun Oct 25 07:42:21 2009
@@ -75,6 +75,10 @@
   private final Action closeAction;
   private final Action findNextAction;
   private final Action findPreviousAction;
+  private final Action findNextMarkerAction;
+  private final Action findPreviousMarkerAction;
+  private final Action toggleMarkerAction;
+  private final Action clearAllMarkersAction;
   private final Action pauseAction;
   private final Action showPreferencesAction;
   private final Action showColorPanelAction;
@@ -114,7 +118,7 @@
   private final JMenu activeTabMenu = new JMenu("Current tab");
   private final JPanel findPanel;
 
-  ChainsawToolBarAndMenus(final LogUI logui) {
+    ChainsawToolBarAndMenus(final LogUI logui) {
     this.logui = logui;
     toolbar = new JToolBar(SwingConstants.HORIZONTAL);
     menuBar = new JMenuBar();
@@ -124,6 +128,10 @@
     findField = new JTextField();
     findNextAction = getFindNextAction();
     findPreviousAction = getFindPreviousAction();
+    findNextMarkerAction = createFindNextMarkerAction();
+    findPreviousMarkerAction = createFindPreviousMarkerAction();
+    toggleMarkerAction = createToggleMarkerAction();
+    clearAllMarkersAction = createClearAllMarkersAction();
     customExpressionPanelAction = createCustomExpressionPanelAction();
     showPreferencesAction = createShowPreferencesAction();
     showColorPanelAction = createShowColorPanelAction();
@@ -155,7 +163,8 @@
 
     logPanelSpecificActions =
       new Action[] {
-        pauseAction, findNextAction, findPreviousAction, clearAction,
+        pauseAction, findNextAction, findPreviousAction, findNextMarkerAction, findPreviousMarkerAction,
+        toggleMarkerAction, clearAllMarkersAction, clearAction,
         fileMenu.getFileSaveAction(), toggleDetailPaneAction,
         showPreferencesAction, showColorPanelAction, undockAction,
         toggleLogTreeAction, toggleScrollToBottomAction, changeModelAction,
@@ -250,6 +259,78 @@
      return action;
    }
 
+     private Action createFindNextMarkerAction() {
+       Action action =
+         new AbstractAction("Find next marker") {
+           public void actionPerformed(ActionEvent e) {
+             if (logui.getCurrentLogPanel() != null) {
+               logui.getCurrentLogPanel().findNextMarker();
+             }
+           }
+         };
+
+       action.putValue(Action.SHORT_DESCRIPTION, "Searches for the next marker from the current
location");
+       action.putValue("enabled", Boolean.TRUE);
+       action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_N));
+       action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("F2"));
+
+       return action;
+     }
+
+    private Action createFindPreviousMarkerAction() {
+      Action action =
+        new AbstractAction("Find previous marker") {
+          public void actionPerformed(ActionEvent e) {
+            if (logui.getCurrentLogPanel() != null) {
+              logui.getCurrentLogPanel().findPreviousMarker();
+            }
+          }
+        };
+
+      action.putValue(Action.SHORT_DESCRIPTION, "Searches for the previous marker from the
current location");
+      action.putValue("enabled", Boolean.TRUE);
+      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_P));
+      action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.SHIFT_MASK));
+
+      return action;
+    }
+
+    private Action createToggleMarkerAction() {
+      Action action =
+        new AbstractAction("Toggle marker") {
+          public void actionPerformed(ActionEvent e) {
+            if (logui.getCurrentLogPanel() != null) {
+              logui.getCurrentLogPanel().toggleMarker();
+            }
+          }
+        };
+
+      action.putValue(Action.SHORT_DESCRIPTION, "Toggle marker for selected row");
+      action.putValue("enabled", Boolean.TRUE);
+      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_T));
+      action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.CTRL_MASK));
+
+      return action;
+    }
+
+    private Action createClearAllMarkersAction() {
+      Action action =
+        new AbstractAction("Clear all markers") {
+          public void actionPerformed(ActionEvent e) {
+            if (logui.getCurrentLogPanel() != null) {
+              logui.getCurrentLogPanel().clearAllMarkers();
+            }
+          }
+        };
+
+      action.putValue(Action.SHORT_DESCRIPTION, "Removes all markers");
+      action.putValue("enabled", Boolean.TRUE);
+      action.putValue(Action.MNEMONIC_KEY, new Integer(KeyEvent.VK_R));
+      action.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_F2,  InputEvent.CTRL_MASK
| InputEvent.SHIFT_MASK));
+
+      return action;
+    }
+
    /**
    * DOCUMENT ME!
    */
@@ -412,6 +493,13 @@
     activeTabMenu.addSeparator();
     activeTabMenu.add(new CopyEventsToClipboardAction(logui));
     activeTabMenu.add(new JMenuItem(clearAction));
+
+    activeTabMenu.addSeparator();
+    activeTabMenu.add(new JMenuItem(toggleMarkerAction));
+    activeTabMenu.add(new JMenuItem(findNextMarkerAction));
+    activeTabMenu.add(new JMenuItem(findPreviousMarkerAction));
+    activeTabMenu.add(new JMenuItem(clearAllMarkersAction));
+
     activeTabMenu.addSeparator();
     activeTabMenu.add(toggleScrollToBottomMenuItem);
     activeTabMenu.add(menuItemUseRightMouse);

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=829505&amp;r1=829504&amp;r2=829505&amp;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 Sun
Oct 25 07:42:21 2009
@@ -140,6 +140,11 @@
    */
   void fireTableEvent(int begin, int end, int count);
 
+    /**
+     * A row was updated
+     * @param row
+     */
+  void fireRowUpdated(int row);
   /**
    * Allow a forced notification of the EventCountListeners
    *
@@ -157,4 +162,10 @@
    * @param e
    */
   int getRowIndex(LoggingEvent e);
+
+  /**
+   * Remove property from all events in container
+   * @param propName the property name to remove
+   */
+  void removePropertyFromEvents(String propName);
 }

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=829505&amp;r1=829504&amp;r2=829505&amp;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 Sun Oct 25
07:42:21 2009
@@ -230,6 +230,7 @@
   private Point currentPoint;
   private boolean paused = false;
   private Rule findRule;
+  private Rule findMarkerRule;
   private final JPanel findPanel;
   private JTextField findField;
   private final int dividerSize;
@@ -559,6 +560,13 @@
      */
     tableModel = new ChainsawCyclicBufferTableModel(cyclicBufferSize);
     table = new JSortTable(tableModel);
+
+    //we've mapped f2, shift f2 and ctrl-f2 to marker-related actions, unmap them from the
table
+    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F2"),
"none");
+    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
InputEvent.SHIFT_MASK), "none");
+    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
InputEvent.CTRL_MASK), "none");
+    table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_F2,
InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK), "none");
+
     //add a listener to update the 'refine focus'
     tableModel.addNewKeyListener(new NewKeyListener() {
 		public void newKeyAdded(NewKeyEvent e) {
@@ -681,6 +689,7 @@
     table.setAutoCreateColumnsFromModel(false);
 
     table.addMouseMotionListener(new TableColumnDetailMouseListener());
+    table.addMouseListener(new TableMarkerListener());
 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
@@ -1022,7 +1031,8 @@
             
         }
     });
-
+    findMarkerRule = ExpressionRule.getRule("prop." + ChainsawConstants.MARKER_PROPERTY_NAME
+ " exists");
+        
     tableModel.addTableModelListener(new TableModelListener() {
 		public void tableChanged(TableModelEvent e) {
 			detailPaneUpdater.setSelectedRow(table.getSelectedRow());
@@ -1874,7 +1884,7 @@
         "Enter expression - right click or ctrl-space for menu");
       return false;
     } else {
-      //only turn off scroltobottom when finding something (find not empty)
+      //only turn off scrolltobottom when finding something (find not empty)
       preferenceModel.setScrollToBottom(false);
       try {
         findField.setToolTipText(
@@ -2477,7 +2487,41 @@
     filterModel.processNewLoggingEvent(event);
   }
 
-  /**
+    public void findNextMarker() {
+      final int nextRow = tableModel.find(findMarkerRule, table.getSelectedRow() + 1, true);
+
+      if (nextRow &gt; -1) {
+        table.scrollToRow(nextRow);
+      }
+    }
+
+    public void findPreviousMarker() {
+        final int previousRow = tableModel.find(findMarkerRule, table.getSelectedRow() -
1, false);
+
+        if (previousRow &gt; -1) {
+          table.scrollToRow(previousRow);
+        }
+    }
+
+    public void clearAllMarkers() {
+        tableModel.removePropertyFromEvents(ChainsawConstants.MARKER_PROPERTY_NAME);
+    }
+
+    public void toggleMarker() {
+        int row = table.getSelectedRow();
+        if (row != -1) {
+          LoggingEvent event = tableModel.getRow(row);
+          Object marker = event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+          if (marker == null) {
+              event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "true");
+          } else {
+              event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+          }
+          tableModel.fireRowUpdated(row);
+        }
+    }
+
+    /**
    * This class receives notification when the Refine focus text field is
    * updated, where a backgrounh thread periodically wakes up and checks if
    * they have stopped typing yet. This ensures that the filtering of the
@@ -2595,6 +2639,24 @@
     }
   }
 
+  private final class TableMarkerListener extends MouseAdapter {
+      public void mouseClicked(MouseEvent evt) {
+          if (evt.getClickCount() == 2) {
+              int row = table.rowAtPoint(evt.getPoint());
+              if (row != -1) {
+                LoggingEvent event = tableModel.getRow(row);
+                Object marker = event.getProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+                if (marker == null) {
+                    event.setProperty(ChainsawConstants.MARKER_PROPERTY_NAME, "true");
+                } else {
+                    event.removeProperty(ChainsawConstants.MARKER_PROPERTY_NAME);
+                }
+                tableModel.fireRowUpdated(row);
+              }
+          }
+      }
+  }
+
   /**
    * Update active tooltip
    */

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=829505&amp;r1=829504&amp;r2=829505&amp;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
Sun Oct 25 07:42:21 2009
@@ -27,12 +27,14 @@
 
 import javax.swing.BorderFactory;
 import javax.swing.Icon;
+import javax.swing.ImageIcon;
 import javax.swing.JLabel;
 import javax.swing.JTable;
 import javax.swing.SwingConstants;
 import javax.swing.table.DefaultTableCellRenderer;
 
 import org.apache.log4j.chainsaw.color.Colorizer;
+import org.apache.log4j.chainsaw.icons.ChainsawIcons;
 import org.apache.log4j.chainsaw.icons.LevelIconFactory;
 import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.spi.LoggingEvent;
@@ -60,6 +62,7 @@
   private int loggerPrecision = 0;
   private boolean toolTipsVisible;
   private String dateFormatTZ;
+  private final Icon markerIcon = new ImageIcon(ChainsawIcons.MARKER);
 
   /**
    * Creates a new TableColorizingRenderer object.
@@ -90,6 +93,9 @@
         isSelected, hasFocus, row, col);
     int colIndex = table.getColumnModel().getColumn(col).getModelIndex() + 1;
 
+    EventContainer container = (EventContainer) table.getModel();
+    LoggingEvent event = container.getRow(row);
+
     switch (colIndex) {
     case ChainsawColumns.INDEX_ID_COL_NAME:
       idComponent.setText(value.toString());
@@ -150,6 +156,12 @@
     default:
       break;
     }
+    //set the 'info' icon next to the zeroth column if marker is set
+    if (col == 0 &amp;&amp; event.getProperty("log4j.marker") != null) {
+        c.setIcon(markerIcon);
+    } else {
+        c.setIcon(null);
+    }
 
     if (isSelected) {
       return c;
@@ -159,8 +171,6 @@
     Color foreground = null;
 
     if (colorizer != null) {
-      EventContainer container = (EventContainer) table.getModel();
-      LoggingEvent event = container.getRow(row);
 
       if (event == null) {
         //ignore...probably changed displayed cols
@@ -206,7 +216,7 @@
 
   /**
    * Changes the Logger precision.
-   * @param precision
+   * @param loggerPrecisionText
    */
   void setLoggerPrecision(String loggerPrecisionText) {
     try {

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java?rev=829505&amp;r1=829504&amp;r2=829505&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/icons/ChainsawIcons.java
Sun Oct 25 07:42:21 2009
@@ -85,6 +85,9 @@
   public static final URL HELP =
     ChainsawIcons.class.getClassLoader().getResource(
       BASE_ICON_PATH + "Help16.gif");
+  public static final URL MARKER =
+    ChainsawIcons.class.getClassLoader().getResource(
+      BASE_ICON_PATH + "About16.gif");
   public static final Icon ICON_UP = new ImageIcon(UP);
   public static final Icon ICON_DOWN = new ImageIcon(DOWN);
   public static final Icon ICON_HELP = new ImageIcon(HELP);

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=829505&amp;r1=829504&amp;r2=829505&amp;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
Sun Oct 25 07:42:21 2009
@@ -84,6 +84,22 @@
     &lt;td width="50" align="center"&gt;-&lt;/td&gt;
     &lt;td colspan="1"&gt;Go to line&lt;/td&gt;
 &lt;/tr&gt;
+    &lt;tr valign="top" bgcolor="#EEEEEE"&gt;
+        &lt;td nowrap class="HotKey"&gt;Ctrl-F2 (or double-click on a row)&lt;/td&gt;
+        &lt;td width="50" align="center"&gt;-&lt;/td&gt;
+        &lt;td colspan="1"&gt;Toggle marker&lt;/td&gt;
+        &lt;td nowrap class="HotKey"&gt;F2&lt;/td&gt;
+        &lt;td width="50" align="center"&gt;-&lt;/td&gt;
+        &lt;td colspan="1"&gt;Find next marker&lt;/td&gt;
+    &lt;/tr&gt;
+    &lt;tr valign="top" bgcolor="#EEEEEE"&gt;
+        &lt;td nowrap class="HotKey"&gt;Shift-F2&lt;/td&gt;
+        &lt;td width="50" align="center"&gt;-&lt;/td&gt;
+        &lt;td colspan="1"&gt;Find previous marker&lt;/td&gt;
+        &lt;td nowrap class="HotKey"&gt;Ctrl-shift-F2&lt;/td&gt;
+        &lt;td width="50" align="center"&gt;-&lt;/td&gt;
+        &lt;td colspan="1"&gt;Clear all markers&lt;/td&gt;
+    &lt;/tr&gt;
 &lt;/table&gt;&lt;/P&gt;
 &lt;!--&lt;p&gt;&lt;a href="#TheTop"&gt;Back to top&lt;/a&gt;&lt;/p&gt;--&gt;
 &lt;a name="Receivers"&gt;&lt;/a&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r826975 - in /logging/chainsaw/trunk/src/main: java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java java/org/apache/log4j/chainsaw/LogPanel.java resources/org/apache/log4j/chainsaw/prefs/default.properties</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091020064328.1E37423888D4@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091020064328-1E37423888D4@eris-apache-org%3e</id>
<updated>2009-10-20T06:43:27Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Tue Oct 20 06:43:27 2009
New Revision: 826975

URL: http://svn.apache.org/viewvc?rev=826975&amp;view=rev
Log:
Fix 'set refine focus' and 'find next' - mixed-case col names weren't matching

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties

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=826975&amp;r1=826974&amp;r2=826975&amp;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
Tue Oct 20 06:43:27 2009
@@ -338,9 +338,7 @@
   }
 
   public String getColumnName(int column) {
-      //columnNames all upper, make 1st char upper &amp; rest lower
-      String col = (String) columnNames.get(column);
-      return col.substring(0, 1).toUpperCase() + col.substring(1).toLowerCase();
+      return (String) columnNames.get(column);
   }
 
   public LoggingEvent getRow(int row) {
@@ -506,10 +504,9 @@
         if (!columnNames.contains(key) &amp;&amp; !(Constants.LOG4J_ID_KEY.equalsIgnoreCase(key)))
{
           columnNames.add(key);
           logger.debug("Adding col '" + key + "', columnNames=" + columnNames);
-          String mixedCaseKey = key.substring(0, 1).toUpperCase() + key.substring(1).toLowerCase();
           fireNewKeyColumnAdded(
             new NewKeyEvent(
-              this, columnNames.indexOf(key), mixedCaseKey, e.getProperty(key)));
+              this, columnNames.indexOf(key), key, e.getProperty(key)));
         }
       }
     }

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=826975&amp;r1=826974&amp;r2=826975&amp;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 Tue Oct 20
06:43:27 2009
@@ -1234,7 +1234,7 @@
             String operator = "==";
             int column = table.columnAtPoint(currentPoint);
             int row = table.rowAtPoint(currentPoint);
-            String colName = table.getColumnName(column);
+            String colName = table.getColumnName(column).toUpperCase();
             String value = "";
 
             if (colName.equalsIgnoreCase(ChainsawConstants.TIMESTAMP_COL_NAME)) {
@@ -1270,7 +1270,7 @@
             String operator = "==";
             int column = table.columnAtPoint(currentPoint);
             int row = table.rowAtPoint(currentPoint);
-            String colName = table.getColumnName(column);
+            String colName = table.getColumnName(column).toUpperCase();
             String value = "";
 
             if (colName.equalsIgnoreCase(ChainsawConstants.TIMESTAMP_COL_NAME)) {
@@ -1345,7 +1345,7 @@
             String operator = "~=";
             int column = table.columnAtPoint(currentPoint);
             int row = table.rowAtPoint(currentPoint);
-            String colName = table.getColumnName(column);
+            String colName = table.getColumnName(column).toUpperCase();
             String value = "";
 
             if (colName.equalsIgnoreCase(ChainsawConstants.TIMESTAMP_COL_NAME)) {
@@ -1554,7 +1554,7 @@
                 int index = 0;
                 StringTokenizer tok = new StringTokenizer(columnOrder, ",");
                 while (tok.hasMoreElements()) {
-                  String element = tok.nextElement().toString().trim();
+                  String element = tok.nextElement().toString().trim().toUpperCase();
                   TableColumn column = new TableColumn(index++);
                   column.setHeaderValue(element);
                   preferenceModel.addColumn(column);
@@ -2336,7 +2336,7 @@
     Map columnNameMap = new HashMap();
 
     for (int i = 0; i &lt; columnModel.getColumnCount(); i++) {
-      columnNameMap.put(table.getColumnName(i), columnModel.getColumn(i));
+      columnNameMap.put(table.getColumnName(i).toUpperCase(), columnModel.getColumn(i));
     }
 
     int index = 0;
@@ -2349,7 +2349,7 @@
        (may be a subset of possible columns)
      **/
     while (tok.hasMoreElements()) {
-      String element = (String) tok.nextElement();
+      String element = tok.nextElement().toString().trim().toUpperCase();
       TableColumn column = (TableColumn) columnNameMap.get(element);
 
       if (column != null) {

Modified: logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties?rev=826975&amp;r1=826974&amp;r2=826975&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
(original)
+++ logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
Tue Oct 20 06:43:27 2009
@@ -9,8 +9,7 @@
 main.window.width=640
 main.window.height=480
 
-#entries need to have 1st char uppercase, remaining lowercase
-table.columns.order=Id,Timestamp,Level,Logger,Message,Throwable,Thread,Ndc,Class,Method,File,Line
+table.columns.order=ID,TIMESTAMP,LEVEL,LOGGER,MESSAGE,THROWABLE,THREAD,NDC,CLASS,METHOD,FILE,LINE
 table.columns.widths=50,150,50,100,300,100,150,150,300,150,100,100
 
 SavedConfigs.Size=0




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r825384 - in /logging/chainsaw/trunk/src/main: java/org/apache/log4j/chainsaw/ resources/org/apache/log4j/chainsaw/prefs/</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091015035545.E22CB238888F@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091015035545-E22CB238888F@eris-apache-org%3e</id>
<updated>2009-10-15T03:55:45Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Thu Oct 15 03:55:45 2009
New Revision: 825384

URL: http://svn.apache.org/viewvc?rev=825384&amp;view=rev
Log:
Make sure all default columns are added to the 'columns' of the preferencemodel (so defaults
can be re-enabled if previously disabled)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
    logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties

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=825384&amp;r1=825383&amp;r2=825384&amp;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 Oct 15
03:55:45 2009
@@ -1547,7 +1547,19 @@
             	in = stream.createObjectInputStream(r);
             	
                 LogPanelPreferenceModel storedPrefs = (LogPanelPreferenceModel)in.readObject();
+                String columnOrder = event.getSetting(TABLE_COLUMN_ORDER);
                 preferenceModel.apply(storedPrefs);
+
+                //update prefModel columns to include defaults
+                int index = 0;
+                StringTokenizer tok = new StringTokenizer(columnOrder, ",");
+                while (tok.hasMoreElements()) {
+                  String element = tok.nextElement().toString().trim();
+                  TableColumn column = new TableColumn(index++);
+                  column.setHeaderValue(element);
+                  preferenceModel.addColumn(column);
+                }
+
                 TableColumnModel columnModel = table.getColumnModel();
                 //remove previous columns
                 while (columnModel.getColumnCount() &gt; 0) {

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java?rev=825384&amp;r1=825383&amp;r2=825384&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
Thu Oct 15 03:55:45 2009
@@ -134,7 +134,7 @@
 	  if (findColumnByHeader(allColumns, column.getHeaderValue().toString()) != null) {
 		  return false;
 	  }
-	  
+
       Object oldValue = allColumns;
       allColumns = new ArrayList(allColumns);
       allColumns.add(column);
@@ -276,11 +276,11 @@
   /**
    * Returns true if the named column should be made visible otherwise
    * false.
-   * @param columnName
+   * @param column
    * @return column visible flag
    */
   public boolean isColumnVisible(TableColumn column) {
-	  return (visibleColumns.contains(column));
+	  return (findColumnByHeader(visibleColumns, column.getHeaderValue().toString()) != null);
   }
 
   private void setVisibleColumns(List visibleColumns) {
@@ -292,20 +292,19 @@
 
   public void setColumnVisible(String columnName, boolean isVisible) {
     boolean wasVisible = findColumnByHeader(visibleColumns, columnName) != null;
-    boolean newVisible = isVisible;
 
-    //because we're a list and not a set, ensure we keep at most
+      //because we're a list and not a set, ensure we keep at most
     //one entry for a tablecolumn
     Object col = findColumnByHeader(allColumns, columnName);
-    if (newVisible &amp;&amp; !wasVisible) {
+    if (isVisible &amp;&amp; !wasVisible) {
 		visibleColumns.add(col);
 		visibleColumnOrder.add(col);
-	    propertySupport.firePropertyChange("visibleColumns", new Boolean(newVisible), new Boolean(wasVisible));
     
+	    propertySupport.firePropertyChange("visibleColumns", new Boolean(isVisible), new Boolean(wasVisible));
 	}
-    if (!newVisible &amp;&amp; wasVisible) {
+    if (!isVisible &amp;&amp; wasVisible) {
 		visibleColumns.remove(col);
 		visibleColumnOrder.remove(col);
-	    propertySupport.firePropertyChange("visibleColumns", new Boolean(newVisible), new Boolean(wasVisible));
     
+	    propertySupport.firePropertyChange("visibleColumns", new Boolean(isVisible), new Boolean(wasVisible));
 	}
   }
   

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java?rev=825384&amp;r1=825383&amp;r2=825384&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferencePanel.java
Thu Oct 15 03:55:45 2009
@@ -25,6 +25,7 @@
 import java.awt.event.MouseEvent;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.List;
 
@@ -174,7 +175,18 @@
         Iterator iter = preferenceModel.getColumns().iterator();
           iter.hasNext();)
       {
-        columnListModel.addElement(iter.next());
+          TableColumn col = (TableColumn)iter.next();
+          Enumeration enumeration = columnListModel.elements();
+          boolean found = false;
+          while (enumeration.hasMoreElements()) {
+              TableColumn thisCol = (TableColumn) enumeration.nextElement();
+              if (thisCol.getHeaderValue().equals(col.getHeaderValue())) {
+                  found = true;
+              }
+          }
+            if (!found) {
+              columnListModel.addElement(col);
+            }
       }
 
       columnList.setModel(columnListModel);
@@ -643,7 +655,15 @@
           	          iter.hasNext();)
           	      {
           	        TableColumn col = (TableColumn) iter.next();
-          	        if (!columnListModel.contains(col)) {
+                    Enumeration enumeration = columnListModel.elements();
+                    boolean found = false;
+                    while (enumeration.hasMoreElements()) {
+                        TableColumn thisCol = (TableColumn) enumeration.nextElement();
+                        if (thisCol.getHeaderValue().equals(col.getHeaderValue())) {
+                            found = true;
+                        }
+                    }
+          	        if (!found) {
           	        	columnListModel.addElement(col);
           	            columnListModel.fireContentsChanged();
           	        }
@@ -658,7 +678,6 @@
                     columnListModel.fireContentsChanged();
                   }
                 });
-
     }
   }
 }

Modified: logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties?rev=825384&amp;r1=825383&amp;r2=825384&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
(original)
+++ logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/prefs/default.properties
Thu Oct 15 03:55:45 2009
@@ -9,7 +9,8 @@
 main.window.width=640
 main.window.height=480
 
-table.columns.order=ID,Timestamp,Level,Logger,Message,Throwable,Thread,NDC,Class,Method,File,Line
+#entries need to have 1st char uppercase, remaining lowercase
+table.columns.order=Id,Timestamp,Level,Logger,Message,Throwable,Thread,Ndc,Class,Method,File,Line
 table.columns.widths=50,150,50,100,300,100,150,150,300,150,100,100
 
 SavedConfigs.Size=0




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r824604 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091013062359.E9C0C23888D0@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091013062359-E9C0C23888D0@eris-apache-org%3e</id>
<updated>2009-10-13T06:23:59Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Tue Oct 13 06:23:59 2009
New Revision: 824604

URL: http://svn.apache.org/viewvc?rev=824604&amp;view=rev
Log:
Fix 47210 - -  ignore not ignoring, yet "focus on" works

'Ignore' was only working for specific packages, not subpackages, and only working if a logger
was selected in the list

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java

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=824604&amp;r1=824603&amp;r2=824604&amp;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
Tue Oct 13 06:23:59 2009
@@ -159,16 +159,16 @@
     	public boolean evaluate(LoggingEvent e)
         {
           String currentlySelectedLoggerName = getCurrentlySelectedLoggerName();
+          boolean hidden = e.getLoggerName() != null &amp;&amp; isHidden(e.getLoggerName());
           if (currentlySelectedLoggerName == null) {
-          	//if there is no selected logger, all events should pass
-          	return true;
+          	//if there is no selected logger, pass if not hidden
+          	return !hidden;
           }
-          boolean isHidden = getHiddenSet().contains(e.getLoggerName());
-          boolean result = (e.getLoggerName() != null) &amp;&amp; (!isHidden);
+          boolean result = (e.getLoggerName() != null) &amp;&amp; !hidden;
 
           if (result &amp;&amp; isFocusOnSelected())
           {
-            result = result &amp;&amp;  (e.getLoggerName() != null &amp;&amp; (e.getLoggerName().startsWith(currentlySelectedLoggerName+".")
|| e.getLoggerName().endsWith(currentlySelectedLoggerName))) ;
+            result = (e.getLoggerName() != null &amp;&amp; (e.getLoggerName().startsWith(currentlySelectedLoggerName+".")
|| e.getLoggerName().endsWith(currentlySelectedLoggerName)));
           }
 
           return result;
@@ -180,10 +180,10 @@
         {
           public boolean evaluate(LoggingEvent e)
           {
-            boolean isHidden = getHiddenSet().contains(e.getLoggerName());
+            boolean hidden = e.getLoggerName() != null &amp;&amp; isHidden(e.getLoggerName());
             String currentlySelectedLoggerName = getCurrentlySelectedLoggerName();
 
-            if (!isFocusOnSelected() &amp;&amp; !isHidden &amp;&amp; currentlySelectedLoggerName
!= null &amp;&amp; !"".equals(currentlySelectedLoggerName))
+            if (!isFocusOnSelected() &amp;&amp; !hidden &amp;&amp; currentlySelectedLoggerName
!= null &amp;&amp; !"".equals(currentlySelectedLoggerName))
             {
             	return (e.getLoggerName().startsWith(currentlySelectedLoggerName+".") || e.getLoggerName().endsWith(currentlySelectedLoggerName))
;
             }
@@ -401,7 +401,7 @@
 
   /**
    * Ensures the Focus is set to a specific logger name
-   * @param logger
+   * @param
    */
   public void setFocusOn(String newLogger)
   {
@@ -424,6 +424,18 @@
     }
   }
 
+  private boolean isHidden(String loggerName) {
+    for (Iterator iter = hiddenSet.iterator();iter.hasNext();) {
+      String hiddenLoggerEntry = iter.next().toString();
+      if (loggerName.startsWith(hiddenLoggerEntry + ".") || loggerName.endsWith(hiddenLoggerEntry))
{
+          return true;
+      }
+    }
+    return false;
+  }
+
+
+
   /**
    * DOCUMENT ME!
    *
@@ -467,15 +479,6 @@
   }
 
   /**
-   * Returns an unmodifiable set of those Loggers marked as hidden.
-   * @return
-   */
-  Set getHiddenSet()
-  {
-    return Collections.unmodifiableSet(hiddenSet);
-  }
-
-  /**
    * Returns the full
    * @param path DOCUMENT ME!
    * @return
@@ -1159,7 +1162,7 @@
   private void updateHiddenSetModels() {
       DefaultListModel model = (DefaultListModel) ignoreList.getModel();
       model.clear();
-      List sortedIgnoreList = new ArrayList(getHiddenSet());
+      List sortedIgnoreList = new ArrayList(hiddenSet);
       Collections.sort(sortedIgnoreList);
 
       for (Iterator iter = sortedIgnoreList.iterator(); iter.hasNext();)
@@ -1181,6 +1184,10 @@
     hideAction.setEnabled(!isFocusOnSelected());
   }
 
+    public Collection getHiddenSet() {
+        return Collections.unmodifiableSet(hiddenSet);
+    }
+
     //~ Inner Classes ===========================================================
 
   /**




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r824593 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileLoadAction.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091013053553.77AD423888D3@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091013053553-77AD423888D3@eris-apache-org%3e</id>
<updated>2009-10-13T05:35:53Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Tue Oct 13 05:35:53 2009
New Revision: 824593

URL: http://svn.apache.org/viewvc?rev=824593&amp;view=rev
Log:
Fix 35180: Multiple lines "XML files (*.xml)" in drop down list "Files of type"

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileLoadAction.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileLoadAction.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileLoadAction.java?rev=824593&amp;r1=824592&amp;r2=824593&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileLoadAction.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/FileLoadAction.java Tue
Oct 13 05:35:53 2009
@@ -84,22 +84,22 @@
         if (!remoteURL) {
             if (chooser == null) {
                 chooser = new JFileChooser();
-            }
 
-            chooser.setDialogTitle("Load Events from XML file...");
+                chooser.setDialogTitle("Load Events from XML file...");
 
-            chooser.setAcceptAllFileFilterUsed(true);
+                chooser.setAcceptAllFileFilterUsed(true);
 
-            chooser.setFileFilter(new FileFilter() {
-                public boolean accept(File f) {
-                    return (f.getName().toLowerCase().endsWith(".xml") || f
-                            .isDirectory());
-                }
+                chooser.setFileFilter(new FileFilter() {
+                    public boolean accept(File f) {
+                        return (f.getName().toLowerCase().endsWith(".xml") || f
+                                .isDirectory());
+                    }
 
-                public String getDescription() {
-                    return "XML files (*.xml)";
-                }
-            });
+                    public String getDescription() {
+                        return "XML files (*.xml)";
+                    }
+                });
+            }
 
             int i = chooser.showOpenDialog(parent);
             if (i != JFileChooser.APPROVE_OPTION) {




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r824592 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: receivers/PluginPropertyEditorPanel.java receivers/ReceiverTreeCellRenderer.java receivers/ReceiversPanel.java vfs/VFSLogFilePatternReceiver.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091013052437.4704023888D3@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091013052437-4704023888D3@eris-apache-org%3e</id>
<updated>2009-10-13T05:24:37Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Tue Oct 13 05:24:36 2009
New Revision: 824592

URL: http://svn.apache.org/viewvc?rev=824592&amp;view=rev
Log:
Chainsaw UI updates
 - increase receiver panel tree and table row heights, add scroll pane around receivers table
 - require non-blank name field when creating or editing receiver configuration
 - modify receivers jtree cell cell rendering logic so preferred size is wider
VFSLogFilePatternReceiver 
  - if null fileURL is provided, log instead of throw NPE

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/PluginPropertyEditorPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/PluginPropertyEditorPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/PluginPropertyEditorPanel.java?rev=824592&amp;r1=824591&amp;r2=824592&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/PluginPropertyEditorPanel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/PluginPropertyEditorPanel.java
Tue Oct 13 05:24:36 2009
@@ -84,7 +84,7 @@
      *
      */
     private void initComponents() {
-        setPreferredSize(new Dimension(160, 120));
+        propertyTable.setRowHeight(19);
         setLayout(new BorderLayout());
         scrollPane.setViewportView(propertyTable);
 
@@ -348,6 +348,10 @@
 
 
             if (columnIndex == 1) {
+                if (descriptors[rowIndex].getName().toLowerCase().equals("name") &amp;&amp;
aValue == null || aValue.toString().trim().equals("")) {
+                    logger.error("Name required");
+                    return;
+                }
                 aValue = translateValueIfNeeded(rowIndex, aValue);
                 logger.debug(
                     "setValueAt, " + rowIndex + ", " + columnIndex +
@@ -370,7 +374,7 @@
         }
 
         /**
-         * @param columnIndex
+         * @param row
          * @param value
          * @return
          */

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java?rev=824592&amp;r1=824591&amp;r2=824592&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiverTreeCellRenderer.java
Tue Oct 13 05:24:36 2009
@@ -17,14 +17,9 @@
 
 package org.apache.log4j.chainsaw.receivers;
 
-import java.awt.BorderLayout;
-import java.awt.Component;
+import java.awt.*;
 
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTree;
+import javax.swing.*;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeCellRenderer;
 
@@ -48,10 +43,13 @@
 
   public ReceiverTreeCellRenderer() {
     super();
+    BoxLayout layout = new BoxLayout(panel, BoxLayout.X_AXIS);
+    panel.setLayout(layout);
     panel.setOpaque(false);
-    panel.setLayout(new BorderLayout());
-    panel.add(this, BorderLayout.CENTER);
-    panel.add(levelLabel, BorderLayout.EAST);
+    panel.add(levelLabel);
+    //set preferredsize to something wide
+    setPreferredSize(new Dimension(200, 19));
+    panel.add(this);
   }
 
   public Component getTreeCellRendererComponent(

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java?rev=824592&amp;r1=824591&amp;r2=824592&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/receivers/ReceiversPanel.java
Tue Oct 13 05:24:36 2009
@@ -17,9 +17,7 @@
 
 package org.apache.log4j.chainsaw.receivers;
 
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
+import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
@@ -375,6 +373,7 @@
 
     receiversTree.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
     receiversTree.setCellRenderer(new ReceiverTreeCellRenderer());
+    receiversTree.setRowHeight(19);
 
     buttonPanel = new ReceiverToolbar();
     receiversTree.addTreeSelectionListener(buttonPanel);
@@ -763,11 +762,15 @@
                   panel.getOkPanel().getOkButton().addActionListener(
                     new ActionListener() {
                       public void actionPerformed(ActionEvent e2) {
-                        dialog.dispose();
                         Plugin plugin = panel.getPlugin();
-                        pluginRegistry.addPlugin(plugin);
-                        plugin.activateOptions();
-                        MessageCenter.getInstance().addMessage("Plugin '" + plugin.getName()
+ "' started");
+                        if (plugin.getName() != null &amp;&amp; !plugin.getName().trim().equals(""))
{
+                            dialog.dispose();
+                            pluginRegistry.addPlugin(plugin);
+                            plugin.activateOptions();
+                            MessageCenter.getInstance().addMessage("Plugin '" + plugin.getName()
+ "' started");
+                        } else {
+                            MessageCenter.getInstance().getLogger().error("Name required
to create receiver");
+                        }
                       }
                     });
                   dialog.setVisible(true);

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java?rev=824592&amp;r1=824591&amp;r2=824592&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
Tue Oct 13 05:24:36 2009
@@ -303,18 +303,22 @@
     		  }}).start();
       } else {
         String oldURL = getFileURL();
-		int index = oldURL.indexOf("://");
-		String lastPart = oldURL.substring(index + "://".length());
-		int passEndIndex = lastPart.indexOf("@");
-		if (passEndIndex &gt; -1) { //we have a username/password
-		    int passBeginIndex = lastPart.indexOf(":");
-//	        String userName = lastPart.substring(0, passBeginIndex);
-	        password = lastPart.substring(passBeginIndex + 1, passEndIndex);
-            setHost(oldURL.substring(0, index + "://".length()));
-            setPath(lastPart.substring(passEndIndex + 1));
-		}
-        vfsReader = new VFSReader();
-   	    new Thread(vfsReader).start();
+        if (oldURL != null) {
+            int index = oldURL.indexOf("://");
+            String lastPart = oldURL.substring(index + "://".length());
+            int passEndIndex = lastPart.indexOf("@");
+            if (passEndIndex &gt; -1) { //we have a username/password
+                int passBeginIndex = lastPart.indexOf(":");
+    //	        String userName = lastPart.substring(0, passBeginIndex);
+                password = lastPart.substring(passBeginIndex + 1, passEndIndex);
+                setHost(oldURL.substring(0, index + "://".length()));
+                setPath(lastPart.substring(passEndIndex + 1));
+            }
+            vfsReader = new VFSReader();
+            new Thread(vfsReader).start();
+        } else {
+            getLogger().info("null URL - unable to parse file");
+        }
       }
    }
 




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r824265 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ChainsawConstants.java ChainsawCyclicBufferTableModel.java ChainsawTabbedPane.java LogPanel.java LogPanelPreferenceModel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091012085227.1D1712388897@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091012085227-1D1712388897@eris-apache-org%3e</id>
<updated>2009-10-12T08:52:26Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Mon Oct 12 08:52:26 2009
New Revision: 824265

URL: http://svn.apache.org/viewvc?rev=824265&amp;view=rev
Log:
Minor Chainsaw tweaks:
- Avoid case-sensitive column entry mismatch issues by making all columns stored in uppercase
- When a new tab is addd (which isn't the chainsaw-log tab), select the tab
- Add a serialversionuid member to logpanelpreferencemodel, preventing serialization issues

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawTabbedPane.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java?rev=824265&amp;r1=824264&amp;r2=824265&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawConstants.java
Mon Oct 12 08:52:26 2009
@@ -56,18 +56,18 @@
   static final String SETTINGS_EXTENSION = ".settings";
 
   //COLUMN NAMES
-  static final String LOGGER_COL_NAME = "Logger";
-  static final String TIMESTAMP_COL_NAME = "Timestamp";
-  static final String LEVEL_COL_NAME = "Level";
-  static final String THREAD_COL_NAME = "Thread";
-  static final String MESSAGE_COL_NAME = "Message";
+  static final String LOGGER_COL_NAME = "LOGGER";
+  static final String TIMESTAMP_COL_NAME = "TIMESTAMP";
+  static final String LEVEL_COL_NAME = "LEVEL";
+  static final String THREAD_COL_NAME = "THREAD";
+  static final String MESSAGE_COL_NAME = "MESSAGE";
   static final String NDC_COL_NAME = "NDC";
-  static final String THROWABLE_COL_NAME = "Throwable";
-  static final String CLASS_COL_NAME = "Class";
-  static final String METHOD_COL_NAME = "Method";
-  static final String FILE_COL_NAME = "File";
-  static final String LINE_COL_NAME = "Line";
-  static final String PROPERTIES_COL_NAME = "Properties";
+  static final String THROWABLE_COL_NAME = "THROWABLE";
+  static final String CLASS_COL_NAME = "CLASS";
+  static final String METHOD_COL_NAME = "METHOD";
+  static final String FILE_COL_NAME = "FILE";
+  static final String LINE_COL_NAME = "LINE";
+  static final String PROPERTIES_COL_NAME = "PROPERTIES";
   static final String ID_COL_NAME = "ID";
 
   //none is not a real column name, but is used by filters as a way to apply no filter for
colors or display

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=824265&amp;r1=824264&amp;r2=824265&amp;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
Mon Oct 12 08:52:26 2009
@@ -338,7 +338,9 @@
   }
 
   public String getColumnName(int column) {
-    return columnNames.get(column).toString();
+      //columnNames all upper, make 1st char upper &amp; rest lower
+      String col = (String) columnNames.get(column);
+      return col.substring(0, 1).toUpperCase() + col.substring(1).toLowerCase();
   }
 
   public LoggingEvent getRow(int row) {
@@ -498,15 +500,16 @@
        * If so, we should add them as columns and notify listeners.
        */
       for (Iterator iter = e.getPropertyKeySet().iterator(); iter.hasNext();) {
-        Object key = iter.next();
+        String key = iter.next().toString().toUpperCase();
 
-        //add all keys except the 'log4jid' key
-        if (!columnNames.contains(key) &amp;&amp; !(Constants.LOG4J_ID_KEY.equalsIgnoreCase(key.toString())))
{
+        //add all keys except the 'log4jid' key (columnNames is all-caps)
+        if (!columnNames.contains(key) &amp;&amp; !(Constants.LOG4J_ID_KEY.equalsIgnoreCase(key)))
{
           columnNames.add(key);
-          logger.debug("Adding col '" + key + "', columNames=" + columnNames);
+          logger.debug("Adding col '" + key + "', columnNames=" + columnNames);
+          String mixedCaseKey = key.substring(0, 1).toUpperCase() + key.substring(1).toLowerCase();
           fireNewKeyColumnAdded(
             new NewKeyEvent(
-              this, columnNames.indexOf(key), key, e.getProperty(key.toString())));
+              this, columnNames.indexOf(key), mixedCaseKey, e.getProperty(key)));
         }
       }
     }

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=824265&amp;r1=824264&amp;r2=824265&amp;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
Mon Oct 12 08:52:26 2009
@@ -21,15 +21,11 @@
 */
 package org.apache.log4j.chainsaw;
 
-import org.apache.log4j.chainsaw.prefs.SettingsManager;
-import org.apache.log4j.chainsaw.prefs.SettingsListener;
-import org.apache.log4j.chainsaw.prefs.LoadSettingsEvent;
-import org.apache.log4j.chainsaw.prefs.SaveSettingsEvent;
-
 import java.awt.Component;
+import java.awt.EventQueue;
 import java.io.File;
-import java.io.FileWriter;
 import java.io.FileReader;
+import java.io.FileWriter;
 
 import javax.swing.Icon;
 import javax.swing.JComponent;
@@ -38,6 +34,11 @@
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.io.xml.DomDriver;
 
+import org.apache.log4j.chainsaw.prefs.LoadSettingsEvent;
+import org.apache.log4j.chainsaw.prefs.SaveSettingsEvent;
+import org.apache.log4j.chainsaw.prefs.SettingsListener;
+import org.apache.log4j.chainsaw.prefs.SettingsManager;
+
 
 /**
  * The only reason this class is needed is because
@@ -97,6 +98,13 @@
     super.insertTab(name, icon, component, null, getTabCount());
 
     super.fireStateChanged();
+    if (!"chainsaw-log".equals(name)) {
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                setSelectedTab(getTabCount() - 1);
+            }
+        });
+    }
   }
 
   public void setSelectedTab(int index) {

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=824265&amp;r1=824264&amp;r2=824265&amp;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 Mon Oct 12
08:52:26 2009
@@ -235,7 +235,6 @@
   private final int dividerSize;
   static final String TABLE_COLUMN_ORDER = "table.columns.order";
   static final String TABLE_COLUMN_WIDTHS = "table.columns.widths";
-  static final String COLUMNS_EXTENSION = ".columns";
   static final String COLORS_EXTENSION = ".colors";
   private static final int LOG_PANEL_SERIALIZATION_VERSION_NUMBER = 1;
   private int previousLastIndex = -1;

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java?rev=824265&amp;r1=824264&amp;r2=824265&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanelPreferenceModel.java
Mon Oct 12 08:52:26 2009
@@ -47,6 +47,7 @@
   public static final Collection DATE_FORMATS;
   private static final Logger logger = LogManager.getLogger(LogPanelPreferenceModel.class);
 
+ private static final long serialVersionUID = 7526472295622776147L;
   static {
     Collection list = new ArrayList();
 




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r824263 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091012085014.3E91B23888E3@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091012085014-3E91B23888E3@eris-apache-org%3e</id>
<updated>2009-10-12T08:50:14Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Mon Oct 12 08:50:13 2009
New Revision: 824263

URL: http://svn.apache.org/viewvc?rev=824263&amp;view=rev
Log:
Move VFS reader thread specific state to the reader thread inner class, fixing receiver restart
issues

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java?rev=824263&amp;r1=824262&amp;r2=824263&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
Mon Oct 12 08:50:13 2009
@@ -169,43 +169,24 @@
  */
 public class VFSLogFilePatternReceiver extends LogFilePatternReceiver implements VisualReceiver
{
 
-  private Reader reader;
   private boolean promptForUserInfo = false;
   private Container container;
   private Object waitForContainerLock = new Object();
   private String password;
   private boolean autoReconnect;
-  private FileObject fileObject;
+  private VFSReader vfsReader;
 
     public VFSLogFilePatternReceiver() {
     super();
   }
 
   public void shutdown() {
-    getLogger().info("shutdown");
+    getLogger().info("shutdown VFSLogFilePatternReceiver");
     active = false;
 	container = null;
-    if (fileObject != null)
-    {
-        try
-        {
-            if (fileObject.exists()) {
-                fileObject.getContent().getInputStream().close();
-            }
-            fileObject.close();
-        }
-        catch (IOException e)
-        {
-            getLogger().warn("Unable to close fileObject", e);
-        }
-    }
-    if (reader != null) {
-      try {
-        reader.close();
-        reader = null;
-      } catch (IOException ioe) {
-        getLogger().warn("Unable to close reader", ioe);
-      }
+    if (vfsReader != null) {
+      vfsReader.terminate();
+      vfsReader = null;
     }
   }
   
@@ -315,7 +296,8 @@
     	  			        setHost(oldURL.substring(0, index + "://".length()));
     	  		            setPath(oldURL.substring(index + "://".length()));
     	  				}
-    	  				new Thread(new VFSReader()).start();
+                        vfsReader = new VFSReader();
+    	  				new Thread(vfsReader).start();
     	  			  }
     	  		  });
     		  }}).start();
@@ -331,14 +313,19 @@
             setHost(oldURL.substring(0, index + "://".length()));
             setPath(lastPart.substring(passEndIndex + 1));
 		}
-   	    new Thread(new VFSReader()).start();
+        vfsReader = new VFSReader();
+   	    new Thread(vfsReader).start();
       }
    }
 
   private class VFSReader implements Runnable {
-        public void run() {
+      private boolean terminated = false;
+      private Reader reader;
+      private FileObject fileObject;
+
+      public void run() {
         	//thread should end when we're no longer active
-            while (reader == null &amp;&amp; isActive()) {
+            while (reader == null &amp;&amp; !terminated) {
             	int atIndex = getFileURL().indexOf("@");
             	int protocolIndex = getFileURL().indexOf("://");
             	
@@ -379,7 +366,7 @@
                     }
                 }
             }
-            if (!isActive()) {
+            if (terminated) {
                 //shut down while waiting for a file
                 return;
             }
@@ -410,7 +397,7 @@
                         fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
 
                         //file may not exist..
-                        if (fileObject.exists()) {
+                        if (fileObject != null &amp;&amp; fileObject.exists()) {
                             try {
                                 //available in vfs as of 30 Mar 2006 - will load but not
tail if not available
                                 fileObject.refresh();
@@ -436,37 +423,36 @@
                                 lastFileSize = fileObject.getContent().getSize();
                                 rac.close();
                             }
+                            try {
+                                //release file so it can be externally deleted/renamed if
necessary
+                                fileObject.close();
+                                fileObject = null;
+                            }
+                            catch (IOException e)
+                            {
+                                getLogger().debug(getPath() + " - unable to close fileobject",
e);
+                            }
+                            try {
+                                if (reader != null) {
+                                    reader.close();
+                                    reader = null;
+                                }
+                            } catch (IOException ioe) {
+                                getLogger().debug(getPath() + " - unable to close reader",
ioe);
+                            }
                         } else {
                             getLogger().info(getPath() + " - not available - will re-attempt
to load after waiting " + getWaitMillis() + " millis");
                         }
 
                         try {
-                            //release file so it can be externally deleted/renamed if necessary
-                            fileObject.close();
-                            fileObject = null;
-                        }
-                        catch (IOException e)
-                        {
-                            getLogger().debug(getPath() + " - unable to close fileobject",
e);
-                        }
-                        try {
-                            if (reader != null) {
-                                reader.close();
-                                reader = null;
-                            }
-                        } catch (IOException ioe) {
-                            getLogger().debug(getPath() + " - unable to close reader", ioe);
-                        }
-                        
-                        try {
                             synchronized (this) {
                                 wait(getWaitMillis());
                             }
                         } catch (InterruptedException ie) {}
-                        if (isTailing()) {
+                        if (isTailing() &amp;&amp; !terminated) {
                             getLogger().debug(getPath() + " - tailing file - file size: "
+ lastFileSize);
                         }
-                    } while (isTailing() &amp;&amp; isActive());
+                    } while (isTailing() &amp;&amp; !terminated);
                 } catch (IOException ioe) {
                     getLogger().info(getPath() + " - exception processing file", ioe);
                     try {
@@ -482,11 +468,15 @@
                         }
                     } catch (InterruptedException ie) {}
                 }
-            } while (isAutoReconnect() &amp;&amp; isActive());
+            } while (isAutoReconnect() &amp;&amp; !terminated);
             getLogger().debug(getPath() + " - processing complete");
-            shutdown();
         }
-    }
+
+      public void terminate()
+      {
+          terminated = true;
+      }
+  }
   
   public class UserNamePasswordDialog extends JDialog {
 	  private String userName;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r821258 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ChainsawCyclicBufferTableModel.java LogPanel.java vfs/VFSLogFilePatternReceiver.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200910.mbox/%3c20091003063331.01FDC238889D@eris.apache.org%3e"/>
<id>urn:uuid:%3c20091003063331-01FDC238889D@eris-apache-org%3e</id>
<updated>2009-10-03T06:33:30Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Sat Oct  3 06:33:30 2009
New Revision: 821258

URL: http://svn.apache.org/viewvc?rev=821258&amp;view=rev
Log:
Chainsaw UI updates 
 - improve event load performance by holding off on tablemodel update notification until the
entire batch is processed (50K+ events loaded in just a few seconds on a fast machine)
VFS/LogFilePatternReceiver changes
 - improve event parsing by assuming logger and level must not contain spaces
 - rework logFormat parsing to beter support properties (when the property name contains part
of a keyword name, or vice versa: PROP(TIME), PROP(LOGGER1), etc)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java

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=821258&amp;r1=821257&amp;r2=821258&amp;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
Sat Oct  3 06:33:30 2009
@@ -511,11 +511,6 @@
       }
     }
 
-    if (rowAdded) {
-      int lastAdded = getLastAdded();
-      fireTableEvent(lastAdded, lastAdded, 1);
-    }
-
     return rowAdded;
   }
 
@@ -555,7 +550,7 @@
   }
 
   /**
-  * @param key
+  * @param e
   */
   private void fireNewKeyColumnAdded(NewKeyEvent e) {
     NewKeyListener[] listeners =

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=821258&amp;r1=821257&amp;r2=821258&amp;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 Sat Oct 
3 06:33:30 2009
@@ -711,7 +711,7 @@
     table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
         public void valueChanged(ListSelectionEvent evt) {
             if (((evt.getFirstIndex() == evt.getLastIndex())
-                &amp;&amp; (evt.getFirstIndex() &gt; 0)) || (evt.getValueIsAdjusting()))
{
+                &amp;&amp; (evt.getFirstIndex() &gt; 0) &amp;&amp; previousLastIndex != -1)
|| (evt.getValueIsAdjusting())) {
               return;
             }
             boolean lastIndexOnLastRow = (evt.getLastIndex() == (table.getRowCount() - 1));
@@ -741,7 +741,7 @@
       new ListSelectionListener() {
         public void valueChanged(ListSelectionEvent evt) {
           if (((evt.getFirstIndex() == evt.getLastIndex())
-              &amp;&amp; (evt.getFirstIndex() &gt; 0)) || (evt.getValueIsAdjusting())) {
+              &amp;&amp; (evt.getFirstIndex() &gt; 0) &amp;&amp; previousLastIndex != -1)
|| (evt.getValueIsAdjusting())) {
             return;
           }
 
@@ -1475,8 +1475,8 @@
         if (isPaused()) {
           return;
         }
-
         final int selectedRow = table.getSelectedRow();
+        final int startingRow = table.getRowCount();
         final LoggingEvent selectedEvent;
         if (selectedRow &gt;= 0) {
           selectedEvent = tableModel.getRow(selectedRow);
@@ -1486,14 +1486,22 @@
 
         boolean rowAdded = false;
 
+        int addedRowCount = 0;
         for (Iterator iter = events.iterator(); iter.hasNext();) {
           LoggingEvent event = (LoggingEvent) iter.next();
 
           updateOtherModels(event);
 
           boolean isCurrentRowAdded = tableModel.isAddRow(event);
+          if (isCurrentRowAdded) {
+              addedRowCount++;
+          }
           rowAdded = rowAdded || isCurrentRowAdded;
         }
+        //fire after adding all events
+        if (rowAdded) {
+          tableModel.fireTableEvent(startingRow, startingRow + addedRowCount, addedRowCount);
+        }
 
         //tell the model to notify the count listeners
         tableModel.notifyCountListeners();
@@ -2195,6 +2203,7 @@
    * Reset the LoggingEvent container, detail panel and status bar
    */
   private void clearModel() {
+    previousLastIndex = -1;
     tableModel.clearModel();
 
     synchronized (detail) {

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java?rev=821258&amp;r1=821257&amp;r2=821258&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
Sat Oct  3 06:33:30 2009
@@ -417,6 +417,9 @@
                             } catch (Error err) {
                                 getLogger().info(getPath() + " - unable to refresh fileobject",
err);
                             }
+                            if (lastFileSize == 0) {
+                                getLogger().info(getPath() + " - loading file");
+                            }
                             //could have been truncated or appended to (don't do anything
if same size)
                             if (fileObject.getContent().getSize() &lt; lastFileSize) {
                                 reader = new InputStreamReader(fileObject.getContent().getInputStream());




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r819428 - /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200909.mbox/%3c20090928001306.CCD5F2388882@eris.apache.org%3e"/>
<id>urn:uuid:%3c20090928001306-CCD5F2388882@eris-apache-org%3e</id>
<updated>2009-09-28T00:13:06Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Mon Sep 28 00:13:06 2009
New Revision: 819428

URL: http://svn.apache.org/viewvc?rev=819428&amp;view=rev
Log:
Update LogFilePatternReceivers
 - fix bugs in regular &amp; VFS receiver's activateOptions &amp; shutdown code to ensure
the tailing thread is shut down when appropriate
 - For VFS receiver, release the file during the sleep interval, allowing the file to be deleted/renamed
during tailing if necessary

Removed some tests from the set ran by the log4j ant script due to the fact that they always
fail.

Also, had to run skip tests for zeroconf.
jmDns has an updated (and now incompatible) api, that should be changed that at some point.

It's also odd we have a couple of duplicate source files in extras (UtilLoggingLevel can be
found in receivers, UnrecognizedElementHandler is in core log4j)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java?rev=819428&amp;r1=819427&amp;r2=819428&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
Mon Sep 28 00:13:06 2009
@@ -175,13 +175,30 @@
   private Object waitForContainerLock = new Object();
   private String password;
   private boolean autoReconnect;
+  private FileObject fileObject;
 
     public VFSLogFilePatternReceiver() {
     super();
   }
 
   public void shutdown() {
+    getLogger().info("shutdown");
+    active = false;
 	container = null;
+    if (fileObject != null)
+    {
+        try
+        {
+            if (fileObject.exists()) {
+                fileObject.getContent().getInputStream().close();
+            }
+            fileObject.close();
+        }
+        catch (IOException e)
+        {
+            getLogger().warn("Unable to close fileObject", e);
+        }
+    }
     if (reader != null) {
       try {
         reader.close();
@@ -239,6 +256,8 @@
    * Read and process the log file.
    */
   public void activateOptions() {
+      //we don't want to call super.activateOptions, but we do want active to be set to true
+      active = true;
       //on receiver restart, only prompt for credentials if we don't already have them
       if (promptForUserInfo &amp;&amp; getFileURL().indexOf("@") == -1) {
     	  /*
@@ -312,14 +331,12 @@
             setHost(oldURL.substring(0, index + "://".length()));
             setPath(lastPart.substring(passEndIndex + 1));
 		}
-		
    	    new Thread(new VFSReader()).start();
       }
    }
 
   private class VFSReader implements Runnable {
         public void run() {
-        	FileObject fileObject = null;
         	//thread should end when we're no longer active
             while (reader == null &amp;&amp; isActive()) {
             	int atIndex = getFileURL().indexOf("@");
@@ -339,16 +356,22 @@
                     }
 
                     fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
-                    reader = new InputStreamReader(fileObject.getContent().getInputStream());
-                    //now that we have a reader, remove additional portions of the file url
(sftp passwords, etc.)
-                    //check to see if the name is a URLFileName..if so, set file name to
not include username/pass
-                    if (fileObject.getName() instanceof URLFileName) {
-                        URLFileName urlFileName = (URLFileName) fileObject.getName();
-                        setHost(urlFileName.getHostName());
-                        setPath(urlFileName.getPath());
+                    if (fileObject.exists()) {
+                        reader = new InputStreamReader(fileObject.getContent().getInputStream());
+                        //now that we have a reader, remove additional portions of the file
url (sftp passwords, etc.)
+                        //check to see if the name is a URLFileName..if so, set file name
to not include username/pass
+                        if (fileObject.getName() instanceof URLFileName) {
+                            URLFileName urlFileName = (URLFileName) fileObject.getName();
+                            setHost(urlFileName.getHostName());
+                            setPath(urlFileName.getPath());
+                        }
+                    } else {
+                        getLogger().info(loggableFileURL + " not available - will re-attempt
to load after waiting " + MISSING_FILE_RETRY_MILLIS + " millis");
                     }
                 } catch (FileSystemException fse) {
-                    getLogger().info("file not available - may be due to incorrect credentials,
but will re-attempt to load in 10 seconds", fse);
+                    getLogger().info(loggableFileURL + " not available - may be due to incorrect
credentials, but will re-attempt to load after waiting " + MISSING_FILE_RETRY_MILLIS + " millis",
fse);
+                }
+                if (reader == null) {
                     synchronized (this) {
                         try {
                             wait(MISSING_FILE_RETRY_MILLIS);
@@ -356,15 +379,17 @@
                     }
                 }
             }
+            if (!isActive()) {
+                //shut down while waiting for a file
+                return;
+            }
             initialize();
-
+            getLogger().debug(getPath() + " exists");
 
             do {
                 long lastFilePointer = 0;
                 long lastFileSize = 0;
-                BufferedReader bufferedReader;
                 createPattern();
-                getLogger().debug("tailing file: " + isTailing());
                 try {
                     do {
                         FileSystemManager fileSystemManager = VFS.getManager();
@@ -377,46 +402,76 @@
                             getLogger().warn("JSch not on classpath!", ncdfe);
                         }
 
-                        fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
-                        reader = new InputStreamReader(fileObject.getContent().getInputStream());
-                        //could have been truncated or appended to
-                        if (fileObject.getContent().getSize() &lt; lastFileSize) {
-                            lastFileSize = 0; //seek to beginning of file
-                            lastFilePointer = 0; 
+                        //fileobject was created above, release it and construct a new one
+                        if (fileObject != null) {
+                            fileObject.close();
+                            fileObject = null;
                         }
-                        if (fileObject.getContent().getSize() &gt; lastFileSize) {
-                            RandomAccessContent rac = fileObject.getContent().getRandomAccessContent(RandomAccessMode.READ);
-                            reader = new InputStreamReader(rac.getInputStream());
-                            bufferedReader = new BufferedReader(reader);
-                            rac.seek(lastFilePointer);
-                            process(bufferedReader);
-                            lastFilePointer = rac.getFilePointer();
-                            lastFileSize = fileObject.getContent().getSize();
-                            rac.close();
+                        fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
+
+                        //file may not exist..
+                        if (fileObject.exists()) {
+                            try {
+                                //available in vfs as of 30 Mar 2006 - will load but not
tail if not available
+                                fileObject.refresh();
+                            } catch (Error err) {
+                                getLogger().info(getPath() + " - unable to refresh fileobject",
err);
+                            }
+                            //could have been truncated or appended to (don't do anything
if same size)
+                            if (fileObject.getContent().getSize() &lt; lastFileSize) {
+                                reader = new InputStreamReader(fileObject.getContent().getInputStream());
+                                getLogger().debug(getPath() + " was truncated");
+                                lastFileSize = 0; //seek to beginning of file
+                                lastFilePointer = 0;
+                            } else if (fileObject.getContent().getSize() &gt; lastFileSize)
{
+                                RandomAccessContent rac = fileObject.getContent().getRandomAccessContent(RandomAccessMode.READ);
+                                rac.seek(lastFilePointer);
+                                reader = new InputStreamReader(rac.getInputStream());
+                                BufferedReader bufferedReader = new BufferedReader(reader);
+                                process(bufferedReader);
+                                lastFilePointer = rac.getFilePointer();
+                                lastFileSize = fileObject.getContent().getSize();
+                                rac.close();
+                            }
+                        } else {
+                            getLogger().info(getPath() + " - not available - will re-attempt
to load after waiting " + getWaitMillis() + " millis");
                         }
 
                         try {
-                            synchronized (this) {
-                                wait(getWaitMillis());
+                            //release file so it can be externally deleted/renamed if necessary
+                            fileObject.close();
+                            fileObject = null;
+                        }
+                        catch (IOException e)
+                        {
+                            getLogger().debug(getPath() + " - unable to close fileobject",
e);
+                        }
+                        try {
+                            if (reader != null) {
+                                reader.close();
+                                reader = null;
                             }
-                        } catch (InterruptedException ie) {
+                        } catch (IOException ioe) {
+                            getLogger().debug(getPath() + " - unable to close reader", ioe);
                         }
+                        
                         try {
-                            //available in vfs as of 30 Mar 2006 - will load but not tail
if not available
-                            fileObject.refresh();
-                        } catch (Error err) {
-                            getLogger().info("Unable to refresh fileobject", err);
+                            synchronized (this) {
+                                wait(getWaitMillis());
+                            }
+                        } catch (InterruptedException ie) {}
+                        if (isTailing()) {
+                            getLogger().debug(getPath() + " - tailing file - file size: "
+ lastFileSize);
                         }
-
-                    } while (isTailing());
+                    } while (isTailing() &amp;&amp; isActive());
                 } catch (IOException ioe) {
-                    getLogger().info("stream closed", ioe);
+                    getLogger().info(getPath() + " - exception processing file", ioe);
                     try {
                         if (fileObject != null) {
                             fileObject.close();
                         }
                     } catch (FileSystemException e) {
-                        e.printStackTrace();
+                        getLogger().info(getPath() + " - exception processing file", e);
                     }
                     try {
                         synchronized(this) {
@@ -424,8 +479,8 @@
                         }
                     } catch (InterruptedException ie) {}
                 }
-            } while (isAutoReconnect());
-            getLogger().debug("processing complete");
+            } while (isAutoReconnect() &amp;&amp; isActive());
+            getLogger().debug(getPath() + " - processing complete");
             shutdown();
         }
     }




</pre>
</div>
</content>
</entry>
<entry>
<title>Re: Log4cxx Reconnection</title>
<author><name>arturobernalg@gmail.com</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200907.mbox/%3c27974854.31247732458760.JavaMail.root@wombat%3e"/>
<id>urn:uuid:%3c27974854-31247732458760-JavaMail-root@wombat%3e</id>
<updated>2009-07-16T08:20:58Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Hi

I have the same problem and I could not solve. I have installed the version apache-log4cxx-0.10.0.
apr-1.3.6 and apr-util-1.3.8. in a Red Hat 5 x64

I tried with the patch 596934 and does not work.

    
When the program ends gives an exception

terminate called after throwing an instance of 'log4cxx::helpers::MutexException'
  what():  Mutex exception: stat = 22
./tester.sh: line 71: 17226 Aborted                 ./tester

--
This message was sent on behalf of arturobernalg@gmail.com at openSubscriber.com
http://www.opensubscriber.com/message/general@logging.apache.org/12563343.html


</pre>
</div>
</content>
</entry>
<entry>
<title>Mutex exception</title>
<author><name>Arturo Bernal &lt;arturobernalg@gmail.com&gt;</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200907.mbox/%3c982644df0907160118u740e6e41q39cbd455a71cfbe3@mail.gmail.com%3e"/>
<id>urn:uuid:%3c982644df0907160118u740e6e41q39cbd455a71cfbe3@mail-gmail-com%3e</id>
<updated>2009-07-16T08:18:42Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Hi

I have the same problem and I could not solve. I have installed the version
apache-log4cxx-0.10.0. apr-1.3.6 and apr-util-1.3.8. in a Red Hat 5 x64

I tried with the patch 596934 and does not work.


When the program ends gives an exception

terminate called after throwing an instance of
'log4cxx::helpers::MutexException'
  what():  Mutex exception: stat = 22
./tester.sh: line 71: 17226 Aborted                 ./tester



-- 
Arturo Bernal Gimeno


</pre>
</div>
</content>
</entry>
<entry>
<title>Log4cxx Reconnection</title>
<author><name>Arturo Bernal &lt;arturobernalg@gmail.com&gt;</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200907.mbox/%3c982644df0907130457o334c6c54o6deaf7253f572956@mail.gmail.com%3e"/>
<id>urn:uuid:%3c982644df0907130457o334c6c54o6deaf7253f572956@mail-gmail-com%3e</id>
<updated>2009-07-13T11:57:43Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Hi

I have installed the version of apache-log4cxx-0.10.0 in a Red Hat 5 64bits
and reconnecting does not work.

I changed the class socketappenderskeleton.cpp


      if (! thread.isActive ()) (
                 thread.run (monitor, this);
        )

but only reconnects one .I nedd  to try to reconnect indefinitely.

when commenting lines

/ / If (! Thread.isActive ()) (
                  thread.run (monitor, this);
  / /)

in Red Hat 4 works perfectly. But in Red Hat 5 gives me an error


*log4cxx*::helpers::MutexException' what(): *Mutex exception*: *stat* = *22*


-- 
Arturo Bernal Gimeno


</pre>
</div>
</content>
</entry>
<entry>
<title>Log4j for shell interpreters</title>
<author><name>&quot;Hiltibidal, Rob&quot; &lt;Rob.Hiltibidal@argushealth.com&gt;</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200906.mbox/%3c40FB2AE5907F9743A593A85015F157BF01B27CF2@ARG-EXVS03.corp.argushealth.com%3e"/>
<id>urn:uuid:%3c40FB2AE5907F9743A593A85015F157BF01B27CF2@ARG-EXVS03-corp-argushealth-com%3e</id>
<updated>2009-06-29T20:16:22Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Greetings

 

Has anyone figured out a way to get shell scripts to log in log4j? Of
particular interst is korn shell.

 

Thanks!

-R

 

 


PRIVILEGED AND CONFIDENTIAL
This email transmission contains privileged and confidential information intended only for
the use of the individual or entity named above.  If the reader of the email is not the intended
recipient or the employee or agent responsible for delivering it to the intended recipient,
you are hereby notified that any use, dissemination or copying of this email transmission
is strictly prohibited by the sender.  If you have received this transmission in error, please
delete the email and immediately notify the sender via the email return address or mailto:postmaster@argushealth.com.
 Thank you.





</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r777386 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: LogPanel.java LogUI.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200905.mbox/%3c20090522055134.A7F96238885B@eris.apache.org%3e"/>
<id>urn:uuid:%3c20090522055134-A7F96238885B@eris-apache-org%3e</id>
<updated>2009-05-22T05:51:34Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Fri May 22 05:51:34 2009
New Revision: 777386

URL: http://svn.apache.org/viewvc?rev=777386&amp;view=rev
Log:
Goto line now works when table results are being filtered (via refine focus or the tree)

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogUI.java

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=777386&amp;r1=777385&amp;r2=777386&amp;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 Fri May 22
05:51:34 2009
@@ -1814,8 +1814,9 @@
    *
    * @param eventNumber
    */
-  void setSelectedEvent(int eventNumber){
-      table.scrollTo(eventNumber - 1, 0);
+  void setSelectedEvent(int eventNumber) {
+      int row = tableModel.find(ExpressionRule.getRule("prop.log4jid == " + eventNumber),
0, true);
+      table.scrollTo(row, 0);
   }
 
   /**

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=777386&amp;r1=777385&amp;r2=777386&amp;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 Fri May 22 05:51:34
2009
@@ -792,7 +792,7 @@
           String inputLine = JOptionPane.showInputDialog(LogUI.this, "Enter the line number
to go:", "Goto Line", -1);
           try {
         	  int lineNumber = Integer.parseInt(inputLine);
-              List eventList = getCurrentLogPanel().getFilteredEvents();
+              List eventList = getCurrentLogPanel().getEvents();
 
               if (lineNumber &gt; 0 &amp;&amp; lineNumber &lt;= eventList.size()) {
                   getCurrentLogPanel().setSelectedEvent(lineNumber);




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r777023 - in /logging/chainsaw/trunk/src/main: java/org/apache/log4j/chainsaw/LogPanel.java java/org/apache/log4j/chainsaw/LogUI.java java/org/apache/log4j/chainsaw/color/ColorPanel.java resources/org/apache/log4j/chainsaw/WelcomePanel.html</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200905.mbox/%3c20090521085845.5E1472388873@eris.apache.org%3e"/>
<id>urn:uuid:%3c20090521085845-5E1472388873@eris-apache-org%3e</id>
<updated>2009-05-21T08:58:45Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Thu May 21 08:58:44 2009
New Revision: 777023

URL: http://svn.apache.org/viewvc?rev=777023&amp;view=rev
Log:
Add support for copying color rules from one tab to another (from color panel)
Also added Ctrl-G goto-line info to Welcome tab

Modified:
    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/color/ColorPanel.java
    logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/WelcomePanel.html

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=777023&amp;r1=777022&amp;r2=777023&amp;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 21
08:58:44 2009
@@ -200,6 +200,7 @@
   private final String identifier;
   private final ChainsawStatusBar statusBar;
   private final JFrame preferencesFrame = new JFrame();
+  private ColorPanel colorPanel;
   private final JFrame colorFrame = new JFrame();
   private final JFrame undockedFrame;
   private final DockablePanel externalPanel;
@@ -243,14 +244,14 @@
   private final Vector filterExpressionVector;
   private static final Color INVALID_EXPRESSION_BACKGROUND = new Color(251, 186, 186);
 
-  /**
+    /**
    * Creates a new LogPanel object.  If a LogPanel with this identifier has
    * been loaded previously, reload settings saved on last exit.
    *
    * @param statusBar shared status bar, provided by main application
    * @param identifier used to load and save settings
    */
-  public LogPanel(final ChainsawStatusBar statusBar, final String identifier, int cyclicBufferSize)
{
+  public LogPanel(final ChainsawStatusBar statusBar, final String identifier, int cyclicBufferSize,
Map allColorizers) {
     this.identifier = identifier;
     this.statusBar = statusBar;
     logger.debug("creating logpanel for " + identifier);
@@ -647,7 +648,8 @@
     colorFrame.setIconImage(
       ((ImageIcon) ChainsawIcons.ICON_PREFERENCES).getImage());
 
-    final ColorPanel colorPanel = new ColorPanel(colorizer, filterModel);
+    allColorizers.put(identifier, colorizer);
+    colorPanel = new ColorPanel(colorizer, filterModel, allColorizers);
 
     colorFrame.getContentPane().add(colorPanel);
 
@@ -1678,6 +1680,7 @@
    * Display the color rule frame
    */
   void showColorPreferences() {
+    colorPanel.loadLogPanelColorizers();
     colorFrame.pack();
     colorFrame.setVisible(true);
   }

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=777023&amp;r1=777022&amp;r2=777023&amp;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 21 08:58:44
2009
@@ -107,10 +107,8 @@
 import org.apache.log4j.chainsaw.prefs.SettingsManager;
 import org.apache.log4j.chainsaw.receivers.ReceiversPanel;
 import org.apache.log4j.chainsaw.version.VersionManager;
-import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.net.SocketNodeEventListener;
 import org.apache.log4j.plugins.Plugin;
-import org.apache.log4j.xml.DOMConfigurator;
 import org.apache.log4j.plugins.PluginEvent;
 import org.apache.log4j.plugins.PluginListener;
 import org.apache.log4j.plugins.PluginRegistry;
@@ -124,6 +122,7 @@
 import org.apache.log4j.spi.LoggerRepositoryEx;
 import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.RepositorySelector;
+import org.apache.log4j.xml.DOMConfigurator;
 import org.apache.log4j.xml.XMLDecoder;
 
 
@@ -202,8 +201,10 @@
   private static final LoggerRepositoryExImpl repositoryExImpl = new LoggerRepositoryExImpl(LogManager.getLoggerRepository());
   
   private PluginRegistry pluginRegistry;
+  //map of tab names to rulecolorizers
+  private Map allColorizers = new HashMap();
 
-  /**
+    /**
    * Constructor which builds up all the visual elements of the frame including
    * the Menu bar
    */
@@ -1918,7 +1919,8 @@
   private void buildLogPanel(
       boolean customExpression, final String ident, final List events)
       throws IllegalArgumentException {
-      final LogPanel thisPanel = new LogPanel(getStatusBar(), ident, cyclicBufferSize);
+      final LogPanel thisPanel = new LogPanel(getStatusBar(), ident, cyclicBufferSize, allColorizers);
+
 
       /**
                * Now add the panel as a batch listener so it can handle it's own

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=777023&amp;r1=777022&amp;r2=777023&amp;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 21 08:58:44 2009
@@ -38,11 +38,12 @@
 import java.util.Vector;
 
 import javax.swing.AbstractAction;
+import javax.swing.Action;
 import javax.swing.BorderFactory;
 import javax.swing.Box;
 import javax.swing.BoxLayout;
 import javax.swing.DefaultCellEditor;
-import javax.swing.DefaultListModel;
+import javax.swing.DefaultComboBoxModel;
 import javax.swing.Icon;
 import javax.swing.JButton;
 import javax.swing.JColorChooser;
@@ -82,8 +83,10 @@
  * @author Scott Deboy &lt;sdeboy@apache.org&gt;
  */
 public class ColorPanel extends JPanel {
+  private static final String DEFAULT_STATUS = "&lt;html&gt;Double click a rule field to
edit the rule&lt;/html&gt;";
+  private final String currentRuleSet = "Default";
+
   private RuleColorizer colorizer;
-  private JPanel ruleSetsPanel;
   private JPanel rulesPanel;
   private FilterModel filterModel;
   private DefaultTableModel tableModel;
@@ -92,17 +95,20 @@
   private ActionListener closeListener;
   private JLabel statusBar;
   private Vector columns;
-  private String currentRuleSet = "Default";
-  private DefaultListModel ruleSetListModel;
+  private final String currentTabString = "Current tab";
+  private DefaultComboBoxModel logPanelColorizersModel;
+  private Map allLogPanelColorizers;
+  private RuleColorizer currentLogPanelColorizer;
 
-  public ColorPanel(
-    final RuleColorizer colorizer, final FilterModel filterModel) {
+    public ColorPanel(final RuleColorizer currentLogPanelColorizer, final FilterModel filterModel,
final Map allLogPanelColorizers) {
     super(new BorderLayout());
 
-    this.colorizer = colorizer;
+    this.currentLogPanelColorizer = currentLogPanelColorizer;
+    this.colorizer = currentLogPanelColorizer;
     this.filterModel = filterModel;
-    
-    colorizer.addPropertyChangeListener(
+    this.allLogPanelColorizers = allLogPanelColorizers;
+
+    currentLogPanelColorizer.addPropertyChangeListener(
     	      "colorrule",
     	      new PropertyChangeListener() {
     	        public void propertyChange(PropertyChangeEvent evt) {
@@ -113,14 +119,12 @@
     tableModel = new DefaultTableModel();
     table = new JTable(tableModel);
 
-    ruleSetListModel = new DefaultListModel();
-    
     columns = new Vector();
     columns.add("Expression");
     columns.add("Background");
     columns.add("Foreground");
 
-    table.setPreferredScrollableViewportSize(new Dimension(400, 200));
+    table.setPreferredScrollableViewportSize(new Dimension(525, 200));
     tableScrollPane = new JScrollPane(table);
 
     Vector data = getColorizerVector();    
@@ -134,10 +138,7 @@
 
     configureTable();
 
-    statusBar = new JLabel("Ruleset support not yet implemented");
-
-    ruleSetsPanel = buildRuleSetsPanel();
-    ruleSetsPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+    statusBar = new JLabel(DEFAULT_STATUS);
 
     rulesPanel = buildRulesPanel();
     rulesPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
@@ -164,18 +165,87 @@
     rightPanel.add(southPanel, BorderLayout.SOUTH);
     rightOuterPanel.add(rightPanel);
 
-    add(ruleSetsPanel, BorderLayout.WEST);
+    JPanel topPanel = new JPanel();
+    topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.X_AXIS));
+
+    JLabel selectText = new JLabel("Apply a tab's colors");
+    topPanel.add(selectText);
+    topPanel.add(Box.createHorizontalStrut(5));
+
+    logPanelColorizersModel = new DefaultComboBoxModel();
+    final JComboBox loadPanelColorizersComboBox = new JComboBox(logPanelColorizersModel);
+    loadLogPanelColorizers();
+
+    topPanel.add(loadPanelColorizersComboBox);
+
+    topPanel.add(Box.createHorizontalStrut(5));
+    final Action copyRulesAction = new AbstractAction() {
+        public void actionPerformed(ActionEvent e)
+          {
+              tableModel.getDataVector().clear();
+              RuleColorizer sourceColorizer = (RuleColorizer) allLogPanelColorizers.get(loadPanelColorizersComboBox.getSelectedItem().toString());
+              colorizer.setRules(sourceColorizer.getRules());
+              updateColors();
+          }
+      };
+        
+      loadPanelColorizersComboBox.addActionListener(new ActionListener() {
+          public void actionPerformed(ActionEvent e) {
+              String selectedColorizerName = loadPanelColorizersComboBox.getSelectedItem().toString();
+              copyRulesAction.setEnabled(!(currentTabString.equals(selectedColorizerName)));
+          }
+      });
+
+    copyRulesAction.putValue(Action.NAME, "Copy color rules");
+    copyRulesAction.setEnabled(!(currentTabString.equals(loadPanelColorizersComboBox.getSelectedItem())));
+
+    JButton copyRulesButton = new JButton(copyRulesAction);
+    topPanel.add(copyRulesButton);
+
+    add(topPanel, BorderLayout.NORTH);
     add(rightOuterPanel, BorderLayout.CENTER);
     if (table.getRowCount() &gt; 0) {
         table.getSelectionModel().setSelectionInterval(0, 0);
     }
   }
 
+  public void loadLogPanelColorizers() {
+      if (logPanelColorizersModel.getIndexOf(currentTabString) == -1) {
+        logPanelColorizersModel.addElement(currentTabString);
+      }
+      for (Iterator iter = allLogPanelColorizers.entrySet().iterator();iter.hasNext();) {
+          Map.Entry entry = (Map.Entry)iter.next();
+          if (!entry.getValue().equals(currentLogPanelColorizer)) {
+              if (logPanelColorizersModel.getIndexOf(entry.getKey()) == -1) {
+                logPanelColorizersModel.addElement(entry.getKey());
+              }
+          }
+      }
+  }
+
   public static void main(String[] args) {
     FilterModel filterModel = new FilterModel();
     RuleColorizer colorizer = new RuleColorizer();
 
-    ColorPanel p = new ColorPanel(colorizer, filterModel);
+    Map otherColorizers = new HashMap();
+
+    RuleColorizer panel1Colorizer = new RuleColorizer();
+    HashMap entry1 = new HashMap();
+    List list1 = new ArrayList();
+    list1.add(new ColorRule("logger == test1", ExpressionRule.getRule("logger == test1"),
Color.YELLOW, Color.BLACK));
+    entry1.put("Default", list1);
+    panel1Colorizer.setRules(entry1);
+    otherColorizers.put("test1", panel1Colorizer);
+
+    RuleColorizer panel2Colorizer = new RuleColorizer();
+    HashMap entry2 = new HashMap();
+    List list2 = new ArrayList();
+    list2.add(new ColorRule("logger == test2", ExpressionRule.getRule("logger == test2"),
Color.YELLOW, Color.BLACK));
+    entry2.put("Default", list2);
+    panel2Colorizer.setRules(entry2);
+    otherColorizers.put("test2", panel2Colorizer);
+
+    ColorPanel p = new ColorPanel(colorizer, filterModel, otherColorizers);
     final JFrame f = new JFrame();
 
     p.setCloseActionListener(
@@ -186,7 +256,7 @@
       });
 
 //    Following does not compile on JDK 1.3.1
-//    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
     f.getContentPane().add(p);
     f.pack();
     f.setVisible(true);
@@ -195,20 +265,19 @@
   public void updateColors() {
     tableModel.getDataVector().clear();
     tableModel.getDataVector().addAll(getColorizerVector());
+    tableModel.fireTableDataChanged();
   }
   
   private Vector getColorizerVector() {
       Vector data = new Vector();
       Map map = colorizer.getRules();
       Iterator iter = map.entrySet().iterator();
-      ruleSetListModel.removeAllElements();
       while (iter.hasNext()) {
         Map.Entry entry = (Map.Entry)iter.next();
         //update ruleset list
-        ruleSetListModel.addElement(entry.getKey());
         if (entry.getKey().equals(currentRuleSet)) {
             Iterator iter2 = ((List)entry.getValue()).iterator();
-      
+
             while (iter2.hasNext()) {
                 ColorRule rule = (ColorRule)iter2.next();
                 Vector v = new Vector();
@@ -340,7 +409,7 @@
     if (result.toString().equals("")) {
       ((ExpressionTableCellRenderer) table.getColumnModel().getColumn(0).getCellRenderer())
       .setToolTipText("Double click to edit");
-      statusBar.setText("");
+      statusBar.setText(DEFAULT_STATUS);
 
       //only update rules if there were no errors
       Map map = new HashMap();
@@ -472,53 +541,11 @@
     return panel;
   }
 
-  JPanel buildRuleSetsPanel() {
-    JPanel panel = new JPanel(new BorderLayout());
-
-    JLabel ruleSetLabel = new JLabel("RuleSets:");
-    panel.add(ruleSetLabel, BorderLayout.NORTH);
-
-    final JList list = new JList(ruleSetListModel);
-    JScrollPane scrollPane = new JScrollPane(list);
-    list.setEnabled(false);
-
-    panel.add(scrollPane, BorderLayout.CENTER);
-
-    JPanel buttonPanel = new JPanel(new GridLayout(0, 2));
-
-    JPanel newPanel = new JPanel();
-    JButton newButton = new JButton("New");
-    newButton.setEnabled(false);
-    newPanel.add(newButton);
-
-    JPanel deletePanel = new JPanel();
-    JButton deleteButton = new JButton("Delete");
-    deleteButton.setEnabled(false);
-    deletePanel.add(deleteButton);
-
-    buttonPanel.add(newPanel);
-    buttonPanel.add(deletePanel);
-
-    panel.add(buttonPanel, BorderLayout.SOUTH);
-
-    return panel;
-  }
-
   JPanel buildRulesPanel() {
     JPanel listPanel = new JPanel(new BorderLayout());
     JPanel panel = new JPanel();
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
 
-    JLabel ruleSetLabel = new JLabel("RuleSet Name:");
-    panel.add(ruleSetLabel);
-
-    JTextField ruleSetTextField = new JTextField(20);
-    ruleSetTextField.setText(currentRuleSet);
-    ruleSetTextField.setAlignmentX(Component.LEFT_ALIGNMENT);
-    ruleSetTextField.setEnabled(false);
-
-    panel.add(ruleSetTextField);
-
     panel.add(Box.createVerticalStrut(10));
 
     JLabel rulesLabel = new JLabel("Rules:");
@@ -607,7 +634,7 @@
     return listPanel;
   }
 
-  class ColorListCellRenderer extends JLabel implements ListCellRenderer {
+    class ColorListCellRenderer extends JLabel implements ListCellRenderer {
     ColorListCellRenderer() {
       setOpaque(true);
     }

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=777023&amp;r1=777022&amp;r2=777023&amp;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 May 21 08:58:44 2009
@@ -76,10 +76,13 @@
 	&lt;td width="50" align="center"&gt;-&lt;/td&gt;
 	&lt;td colspan="1"&gt;Find previous&lt;/td&gt;
 &lt;/tr&gt;
-&lt;tr valign="top"&gt;
+&lt;tr valign="top" bgcolor="#EEEEEE"&gt;
 	&lt;td nowrap class="HotKey"&gt;ALT-X&lt;/td&gt;
 	&lt;td width="50" align="center"&gt;-&lt;/td&gt;
-	&lt;td colspan="4"&gt;Exits the Application&lt;/td&gt;
+	&lt;td colspan="1"&gt;Exits the Application&lt;/td&gt;
+    &lt;td nowrap class="HotKey"&gt;CTRL-G&lt;/td&gt;
+    &lt;td width="50" align="center"&gt;-&lt;/td&gt;
+    &lt;td colspan="1"&gt;Go to line&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/table&gt;&lt;/P&gt;
 &lt;!--&lt;p&gt;&lt;a href="#TheTop"&gt;Back to top&lt;/a&gt;&lt;/p&gt;--&gt;




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r776608 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/color: ColorPanel.java RuleColorizer.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200905.mbox/%3c20090520082146.7B9FA2388898@eris.apache.org%3e"/>
<id>urn:uuid:%3c20090520082146-7B9FA2388898@eris-apache-org%3e</id>
<updated>2009-05-20T08:21:46Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Wed May 20 08:21:45 2009
New Revision: 776608

URL: http://svn.apache.org/viewvc?rev=776608&amp;view=rev
Log:
Replaced colors in colorpanel's drop down color list - fewer colors in the list, lighter shades
and still readable with the default black text color.

Also updated default row colorization for WARN and FATAL/ERROR to use the new colors (only
new tabs will automatically get the new warn and fatal/error colors-for existing tabs, you
will have to change the color rules yourself)

Modified:
    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

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=776608&amp;r1=776607&amp;r2=776608&amp;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 Wed
May 20 08:21:45 2009
@@ -228,37 +228,27 @@
     vec.add(Color.white);
     vec.add(Color.black);
 
-    vec.add(new Color(0, 153, 0));
-    vec.add(new Color(0, 204, 51));
-    vec.add(new Color(153, 255, 153));
-    vec.add(new Color(51, 255, 0));
-    vec.add(new Color(204, 255, 204));
-    vec.add(new Color(0, 153, 153));
-    vec.add(new Color(0, 204, 204));
-    vec.add(new Color(153, 102, 0));
-    vec.add(new Color(102, 102, 0));
-    vec.add(new Color(153, 153, 0));
-    vec.add(new Color(204, 204, 0));
-    vec.add(new Color(255, 255, 0));
-    vec.add(new Color(255, 255, 204));
-    vec.add(new Color(255, 153, 51));
-    vec.add(new Color(204, 0, 51));
-    vec.add(new Color(255, 51, 51));
+    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(255, 204, 204));
-    vec.add(new Color(204, 0, 204));
-    vec.add(new Color(255, 51, 255));
-    vec.add(new Color(153, 51, 255));
-    vec.add(new Color(0, 0, 153));
-    vec.add(new Color(0, 0, 255));
-    vec.add(new Color(51, 153, 255));
+    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(204, 204, 255));
-    vec.add(new Color(102, 255, 255));
-    vec.add(new Color(102, 102, 102));
-    vec.add(new Color(153, 153, 153));
-    vec.add(new Color(204, 204, 204));
-
+    vec.add(new Color(255, 153, 255));
+      
     return vec;
   }
 

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=776608&amp;r1=776607&amp;r2=776608&amp;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
Wed May 20 08:21:45 2009
@@ -58,12 +58,12 @@
     String expression = "level == FATAL || level == ERROR";
     rulesList.add(
       new ColorRule(
-        expression, ExpressionRule.getRule(expression), new Color(147, 22, 0),
-        Color.white));
+        expression, ExpressionRule.getRule(expression), new Color(255, 153, 153),
+        Color.black));
     expression = "level == WARN";
     rulesList.add(
       new ColorRule(
-        expression, ExpressionRule.getRule(expression), Color.yellow.brighter(),
+        expression, ExpressionRule.getRule(expression), new Color(255, 255, 153),
         Color.black));
     defaultRules.put(DEFAULT_NAME, rulesList);
     setRules(defaultRules);




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r774243 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: LogPanel.java LoggerNameTreePanel.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200905.mbox/%3c20090513071554.321B62388858@eris.apache.org%3e"/>
<id>urn:uuid:%3c20090513071554-321B62388858@eris-apache-org%3e</id>
<updated>2009-05-13T07:15:54Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Wed May 13 07:15:53 2009
New Revision: 774243

URL: http://svn.apache.org/viewvc?rev=774243&amp;view=rev
Log:
Added 'find next' and 'clear find next' menu items to logger tree and logPanel popup menus

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.java

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=774243&amp;r1=774242&amp;r2=774243&amp;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 Wed May 13
07:15:53 2009
@@ -114,6 +114,9 @@
 import javax.swing.table.TableColumnModel;
 import javax.swing.text.Document;
 
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
@@ -138,9 +141,6 @@
 import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.LoggingEventFieldResolver;
 
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.xml.DomDriver;
-
 
 /**
  * A LogPanel provides a view to a collection of LoggingEvents.&lt;br&gt;
@@ -621,6 +621,15 @@
      */
     LogPanelLoggerTreeModel logTreeModel = new LogPanelLoggerTreeModel();
     logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel);
+    logTreePanel.addPropertyChangeListener("searchExpression", new PropertyChangeListener()
+    {
+        public void propertyChange(PropertyChangeEvent evt)
+        {
+            findField.setText(evt.getNewValue().toString());
+            findNext();
+        }
+    });
+      
     tableModel.addLoggerNameListener(logTreeModel);
 
     /**
@@ -1320,24 +1329,80 @@
     /*
      * Popup definition
      */
-    p.add(clearFocusAction);
     p.add(menuItemFocusOn);
     p.add(menuDefineAddCustomFilter);
+    p.add(clearFocusAction);
+
+    p.add(new JSeparator());
+
+        final JMenuItem menuItemSearch =
+      new JMenuItem("Find next");
+    menuItemSearch.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);
+            String value = "";
+
+            if (colName.equalsIgnoreCase(ChainsawConstants.TIMESTAMP_COL_NAME)) {
+            	value = timestampExpressionFormat.format(new Date(table.getValueAt(row, column).toString()));
+            } else {
+              Object o = table.getValueAt(row, column);
+
+              if (o != null) {
+                if (o instanceof String[]) {
+                  value = ((String[]) o)[0];
+                  operator = "~=";
+                } else {
+                  value = o.toString();
+                }
+              }
+            }
+
+            if (columnNameKeywordMap.containsKey(colName)) {
+              findField.setText(
+                columnNameKeywordMap.get(colName).toString() + " " + operator
+                + " '" + value + "'");
+              findNext();
+            }
+          }
+        }
+      });
+
+      final Action clearSearchAction =
+        new AbstractAction("Clear find next") {
+          public void actionPerformed(ActionEvent e) {
+            findField.setText(null);
+            updateRule(null);
+          }
+        };
+
+    p.add(menuItemSearch);
+    p.add(clearSearchAction);
+      
     p.add(new JSeparator());
 
     p.add(menuItemBestFit);
+
     p.add(new JSeparator());
 
     p.add(menuItemToggleDetails);
     p.add(menuItemLoggerTree);
     p.add(menuItemToggleToolTips);
+
     p.add(new JSeparator());
+
     p.add(menuItemScrollBottom);
 
     p.add(new JSeparator());
+
     p.add(menuItemToggleDock);
 
     p.add(new JSeparator());
+
     p.add(menuItemColorPanel);
     p.add(menuItemLogPanelPreferences);
 

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=774243&amp;r1=774242&amp;r2=774243&amp;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
Wed May 13 07:15:53 2009
@@ -109,7 +109,11 @@
   private final Action editLoggerAction;
   private final JButton editLoggerButton = new SmallButton();
   private final Action expandAction;
+  private final Action findNextAction;
+  private final Action clearFindNextAction;
   private final JButton expandButton = new SmallButton();
+  private final JButton findNextButton = new SmallButton();
+  private final JButton clearFindNextButton = new SmallButton();
   private final Action focusOnAction;
   private final SmallToggleButton focusOnLoggerButton =
     new SmallToggleButton();
@@ -136,7 +140,7 @@
   private final JScrollPane scrollTree;
   private final JToolBar toolbar = new JToolBar();
 
-  //~ Constructors ============================================================
+    //~ Constructors ============================================================
 
   /**
    * Creates a new LoggerNameTreePanel object.
@@ -252,6 +256,8 @@
     toolbar.setLayout(new BoxLayout(toolbar, BoxLayout.X_AXIS));
 
     expandAction = createExpandAction();
+    findNextAction = createFindNextAction();
+    clearFindNextAction = createClearFindNextAction();
     editLoggerAction = createEditLoggerAction();
     closeAction = createCloseAction();
     collapseAction = createCollapseAction();
@@ -590,6 +596,12 @@
     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));
 
@@ -732,6 +744,55 @@
     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.
+     * @return an Action
+     */
+    private Action createFindNextAction()
+    {
+      Action action = new AbstractAction()
+        {
+          public void actionPerformed(ActionEvent e)
+          {
+            findNextUsingCurrentlySelectedNode();
+          }
+        };
+
+      action.putValue(Action.NAME, "Find next");
+      action.putValue(
+        Action.SHORT_DESCRIPTION,
+        "Search using the selected node");
+      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.
+     * @return an Action
+     */
+    private Action createClearFindNextAction()
+    {
+      Action action = new AbstractAction()
+        {
+          public void actionPerformed(ActionEvent e)
+          {
+            clearFindNext();
+          }
+        };
+
+      action.putValue(Action.NAME, "Clear find next");
+      action.putValue(
+        Action.SHORT_DESCRIPTION,
+        "Search using the selected node");
+      action.setEnabled(false);
+
+      return action;
+    }
+
+
   /**
    * DOCUMENT ME!
    *
@@ -810,6 +871,23 @@
       });
   }
 
+  private void findNextUsingCurrentlySelectedNode()
+  {
+      String selectedLogger = getCurrentlySelectedLoggerName();
+      TreePath[] paths = logTree.getSelectionPaths();
+
+      if (paths == null)
+      {
+        return;
+      }
+      firePropertyChange("searchExpression", null, "logger ~= " + selectedLogger);
+  }
+
+  private void clearFindNext()
+  {
+      firePropertyChange("searchExpression", null, "");
+  }
+
   /**
    * Expands the currently selected node (if any)
    * including all the children.
@@ -918,17 +996,20 @@
     if ((logger == null) || (logger.length() == 0))
     {
       focusOnAction.putValue(Action.NAME, "Focus On...");
-      hideAction.putValue(Action.NAME, "Ignore ...");
+      hideAction.putValue(Action.NAME, "Ignore...");
+      findNextAction.putValue(Action.NAME, "Find next...");
     }
     else
     {
       focusOnAction.putValue(Action.NAME, "Focus On '" + logger + "'");
       hideAction.putValue(Action.NAME, "Ignore '" + logger + "'");
+      findNextAction.putValue(Action.NAME, "Find next '" + 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);
   }
 
   /**
@@ -972,6 +1053,8 @@
           }
 
           expandAction.setEnabled(path != null);
+          findNextAction.setEnabled(path != null);
+          clearFindNextAction.setEnabled(true);
 
           if (logger != null)
           {
@@ -1098,7 +1181,7 @@
     hideAction.setEnabled(!isFocusOnSelected());
   }
 
-  //~ Inner Classes ===========================================================
+    //~ Inner Classes ===========================================================
 
   /**
    * DOCUMENT ME!
@@ -1235,11 +1318,14 @@
     */
     private void initMenu()
     {
+      focusOnCheck.setAction(focusOnAction);
+      hideCheck.setAction(hideAction);
       add(expandAction);
       add(collapseAction);
       addSeparator();
-      focusOnCheck.setAction(focusOnAction);
-      hideCheck.setAction(hideAction);
+      add(findNextAction);
+      add(clearFindNextAction);
+      addSeparator();
       add(focusOnCheck);
       add(hideCheck);
 




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r774218 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs: VFSLogFilePatternReceiver.java VFSLogFilePatternReceiverBeanInfo.java</title>
<author><name>sdeboy@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200905.mbox/%3c20090513055449.C8B1D2388857@eris.apache.org%3e"/>
<id>urn:uuid:%3c20090513055449-C8B1D2388857@eris-apache-org%3e</id>
<updated>2009-05-13T05:54:49Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: sdeboy
Date: Wed May 13 05:54:49 2009
New Revision: 774218

URL: http://svn.apache.org/viewvc?rev=774218&amp;view=rev
Log:
Added two new parameters to LogFilePatternReceiver:
 - waitmillis (configurable delay between checks for updates to a file - used when tailing=true)
 - appendNonMatches (if true, append non-matching lines to the log, associated with the logger
'Unknown')

Added one new parameter to VFSLogFilePatternReceiver (extends LogFilePatternReceiver, so it

inherits the waitMillis and appendNonMatches params): 
 - autoReconnect (if true, when a file is truncated, begin processing the file contents from
the beginning of the file - supports continuous tailing of a file even when the file is recreated)
 

Modified:
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
    logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java?rev=774218&amp;r1=774217&amp;r2=774218&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiver.java
Wed May 13 05:54:49 2009
@@ -38,6 +38,9 @@
 import javax.swing.JTextField;
 import javax.swing.SwingUtilities;
 
+import com.jcraft.jsch.UIKeyboardInteractive;
+import com.jcraft.jsch.UserInfo;
+
 import org.apache.commons.vfs.FileObject;
 import org.apache.commons.vfs.FileSystemException;
 import org.apache.commons.vfs.FileSystemManager;
@@ -50,9 +53,6 @@
 import org.apache.log4j.chainsaw.receivers.VisualReceiver;
 import org.apache.log4j.varia.LogFilePatternReceiver;
 
-import com.jcraft.jsch.UIKeyboardInteractive;
-import com.jcraft.jsch.UserInfo;
-
 /**
  * A VFS-enabled version of org.apache.log4j.varia.LogFilePatternReceiver.
  * 
@@ -174,8 +174,9 @@
   private Container container;
   private Object waitForContainerLock = new Object();
   private String password;
-  
-  public VFSLogFilePatternReceiver() {
+  private boolean autoReconnect;
+
+    public VFSLogFilePatternReceiver() {
     super();
   }
 
@@ -205,6 +206,22 @@
 	  return promptForUserInfo;
   }
 
+    /**
+     * Accessor
+     * @return
+     */
+    public boolean isAutoReconnect() {
+      return autoReconnect;
+    }
+
+    /**
+     * Mutator
+     * @param autoReconnect
+     */
+    public void setAutoReconnect(boolean autoReconnect) {
+        this.autoReconnect = autoReconnect;
+    }
+
   /**
    * Implementation of VisualReceiver interface - allows this receiver to provide
    * a username/password dialog.
@@ -334,63 +351,80 @@
                     getLogger().info("file not available - may be due to incorrect credentials,
but will re-attempt to load in 10 seconds", fse);
                     synchronized (this) {
                         try {
-                            wait(10000);
+                            wait(MISSING_FILE_RETRY_MILLIS);
                         } catch (InterruptedException ie) {}
                     }
                 }
             }
             initialize();
 
-            try {
+
+            do {
                 long lastFilePointer = 0;
                 long lastFileSize = 0;
                 BufferedReader bufferedReader;
                 createPattern();
                 getLogger().debug("tailing file: " + isTailing());
+                try {
+                    do {
+                        FileSystemManager fileSystemManager = VFS.getManager();
+                        FileSystemOptions opts = new FileSystemOptions();
+                        //if jsch not in classpath, can get NoClassDefFoundError here
+                        try {
+                            SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts,
"no");
+                            SftpFileSystemConfigBuilder.getInstance().setUserInfo(opts, new
MyUserInfo(password));
+                        } catch (NoClassDefFoundError ncdfe) {
+                            getLogger().warn("JSch not on classpath!", ncdfe);
+                        }
 
-                do {
-                    FileSystemManager fileSystemManager = VFS.getManager();
-                    FileSystemOptions opts = new FileSystemOptions();
-                    //if jsch not in classpath, can get NoClassDefFoundError here
-                    try {
-                    	SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts,
"no");
-                    	SftpFileSystemConfigBuilder.getInstance().setUserInfo(opts, new MyUserInfo(password));
-                    } catch (NoClassDefFoundError ncdfe) {
-                    	getLogger().warn("JSch not on classpath!", ncdfe);
-                    }
-
-                    fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
-                    reader = new InputStreamReader(fileObject.getContent().getInputStream());
+                        fileObject = fileSystemManager.resolveFile(getFileURL(), opts);
+                        reader = new InputStreamReader(fileObject.getContent().getInputStream());
+                        //could have been truncated or appended to
+                        if (fileObject.getContent().getSize() &lt; lastFileSize) {
+                            lastFileSize = 0; //seek to beginning of file
+                            lastFilePointer = 0; 
+                        }
+                        if (fileObject.getContent().getSize() &gt; lastFileSize) {
+                            RandomAccessContent rac = fileObject.getContent().getRandomAccessContent(RandomAccessMode.READ);
+                            reader = new InputStreamReader(rac.getInputStream());
+                            bufferedReader = new BufferedReader(reader);
+                            rac.seek(lastFilePointer);
+                            process(bufferedReader);
+                            lastFilePointer = rac.getFilePointer();
+                            lastFileSize = fileObject.getContent().getSize();
+                            rac.close();
+                        }
 
-                    if (fileObject.getContent().getSize() &gt; lastFileSize) {
-                        RandomAccessContent rac = fileObject.getContent().getRandomAccessContent(RandomAccessMode.READ);
-                        rac.seek(lastFilePointer);
-                        reader = new InputStreamReader(rac.getInputStream());
-                        bufferedReader = new BufferedReader(reader);
-                        process(bufferedReader);
-                        lastFilePointer = rac.getFilePointer();
-                        lastFileSize = fileObject.getContent().getSize();
-                        rac.close();
-                    }
+                        try {
+                            synchronized (this) {
+                                wait(getWaitMillis());
+                            }
+                        } catch (InterruptedException ie) {
+                        }
+                        try {
+                            //available in vfs as of 30 Mar 2006 - will load but not tail
if not available
+                            fileObject.refresh();
+                        } catch (Error err) {
+                            getLogger().info("Unable to refresh fileobject", err);
+                        }
 
+                    } while (isTailing());
+                } catch (IOException ioe) {
+                    getLogger().info("stream closed", ioe);
                     try {
-                        synchronized (this) {
-                            wait(5000);
+                        if (fileObject != null) {
+                            fileObject.close();
                         }
-                    } catch (InterruptedException ie) {
+                    } catch (FileSystemException e) {
+                        e.printStackTrace();
                     }
                     try {
-                    	//available in vfs as of 30 Mar 2006 - will load but not tail if not
available
-                    	fileObject.refresh();
-                    } catch (Error err) {
-                    	getLogger().info("Unable to refresh fileobject", err);
-                    }
-
-                } while (isTailing());
-
-            } catch (IOException ioe) {
-                getLogger().info("stream closed", ioe);
-            }
+                        synchronized(this) {
+                            wait(getWaitMillis());
+                        }
+                    } catch (InterruptedException ie) {}
+                }
+            } while (isAutoReconnect());
             getLogger().debug("processing complete");
             shutdown();
         }

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java?rev=774218&amp;r1=774217&amp;r2=774218&amp;view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java
(original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/vfs/VFSLogFilePatternReceiverBeanInfo.java
Wed May 13 05:54:49 2009
@@ -38,6 +38,9 @@
         new PropertyDescriptor("logFormat", VFSLogFilePatternReceiver.class),
         new PropertyDescriptor("name", VFSLogFilePatternReceiver.class),
         new PropertyDescriptor("tailing", VFSLogFilePatternReceiver.class),
+        new PropertyDescriptor("autoReconnect", VFSLogFilePatternReceiver.class),
+        new PropertyDescriptor("waitMillis", VFSLogFilePatternReceiver.class),
+        new PropertyDescriptor("appendNonMatches", VFSLogFilePatternReceiver.class),
         new PropertyDescriptor(
           "filterExpression", VFSLogFilePatternReceiver.class),
           new PropertyDescriptor(




</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r731823 - /logging/pmc/</title>
<author><name>carnold@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200901.mbox/%3c20090106040359.39723238889F@eris.apache.org%3e"/>
<id>urn:uuid:%3c20090106040359-39723238889F@eris-apache-org%3e</id>
<updated>2009-01-06T04:03:59Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: carnold
Date: Mon Jan  5 20:03:58 2009
New Revision: 731823

URL: http://svn.apache.org/viewvc?rev=731823&amp;view=rev
Log:
Removing pmc dir after finding repos/private/pmc

Removed:
    logging/pmc/



</pre>
</div>
</content>
</entry>
<entry>
<title>svn commit: r731819 - /logging/pmc/</title>
<author><name>carnold@apache.org</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200901.mbox/%3c20090106032946.A65CB2388870@eris.apache.org%3e"/>
<id>urn:uuid:%3c20090106032946-A65CB2388870@eris-apache-org%3e</id>
<updated>2009-01-06T03:29:46Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Author: carnold
Date: Mon Jan  5 19:29:46 2009
New Revision: 731819

URL: http://svn.apache.org/viewvc?rev=731819&amp;view=rev
Log:
Adding PMC private area

Added:
    logging/pmc/



</pre>
</div>
</content>
</entry>
<entry>
<title>would like to be listed</title>
<author><name>Dmitry &lt;dmiperl@gmail.com&gt;</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200812.mbox/%3c494557A9.2040007@gmail.com%3e"/>
<id>urn:uuid:%3c494557A9-2040007@gmail-com%3e</id>
<updated>2008-12-14T18:59:53Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>
Hello,
We have developed a product entirely based on log4j.
It's called logFaces and it provides log streams aggregation as well as 
real-time viewer and query browser for multiple users.
More detailed information can be found here: http://www.moonlit-software.com
We will be more than happy to be in the software list you maintain with 
log related software.

Thank you in advance,
Dmitry Perlroizen



</pre>
</div>
</content>
</entry>
<entry>
<title>How to update chainsaw along with xml</title>
<author><name>dragon bull &lt;akhilachuthan@yahoo.co.in&gt;</name></author>
<link rel="alternate" href="http://mail-archives.apache.org/mod_mbox/logging-general/200809.mbox/%3c19737060.post@talk.nabble.com%3e"/>
<id>urn:uuid:%3c19737060-post@talk-nabble-com%3e</id>
<updated>2008-09-30T06:54:08Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<pre>

Hi,

I have a log4j compliant xml file written out of the Audit log db data. I
can open it in chainsaw, but the chainsaw does not update itself as the xml
gets updated with more rows.

What can i do to have the chainsaw update itself along with the xml opened.

-- 
View this message in context: http://www.nabble.com/How-to-update-chainsaw-along-with-xml-tp19737060p19737060.html
Sent from the Apache Logging - General mailing list archive at Nabble.com.



</pre>
</div>
</content>
</entry>
</feed>
