svn commit: r1022406 [3/3] - in /logging/chainsaw/trunk/src/main: java/org/apache/log4j/chainsaw/ java/org/apache/log4j/chainsaw/messages/ java/org/apache/log4j/chainsaw/vfs/ resources/org/apache/log4j/chainsaw/help/ resources/org/apache/log4j/chainsaw...

[email protected]
Newsgroups gmane.comp.apache.logging
Message-ID <[email protected]>
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=1022406&r1=1022405&r2=1022406&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 14 08:01:36 2010
@@ -88,9 +88,11 @@ public class LogPanelPreferenceModel imp
   private boolean highlightSearchMatchText;
   private String hiddenExpression;
   private String clearTableExpression;
-  //default to cyclic mode
-  private boolean cyclic = true;
+  //default to cyclic mode off
+  private boolean cyclic = false;
   private boolean showMillisDeltaAsGap;
+  //default search results to visible
+  private boolean searchResultsVisible = true;
 
     /**
    * Returns an <b>unmodifiable</b> list of the columns.
@@ -248,7 +250,7 @@ public class LogPanelPreferenceModel imp
     setDetailPaneVisible(model.isDetailPaneVisible());
     setLogTreePanelVisible(model.isLogTreePanelVisible());
     setVisibleColumnOrder(model.getVisibleColumnOrder());
-
+    setSearchResultsVisible(model.isSearchResultsVisible());
     // we have to copy the list, because getColumns() is unmodifiable
     setColumns(model.getColumns());
     
@@ -291,6 +293,16 @@ public class LogPanelPreferenceModel imp
     propertySupport.firePropertyChange("levelIcons", !levelIcons, levelIcons);
   }
 
+  public void setSearchResultsVisible(boolean searchResultsVisible) {
+    boolean oldValue = this.searchResultsVisible;
+    this.searchResultsVisible = searchResultsVisible;
+    propertySupport.firePropertyChange("searchResultsVisible", oldValue, searchResultsVisible);
+  }
+
+  public boolean isSearchResultsVisible() {
+    return searchResultsVisible;
+  }
+
   /**
    * @param wrapMsg
    */

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=1022406&r1=1022405&r2=1022406&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 14 08:01:36 2010
@@ -21,7 +21,6 @@ import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.event.InputEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.beans.PropertyChangeEvent;
@@ -206,10 +205,6 @@ public class LogPanelPreferencePanel ext
         {
           public void mouseClicked(MouseEvent e)
           {
-            if (
-              (e.getClickCount() == 1)
-                && ((e.getModifiers() & InputEvent.BUTTON1_MASK) > 0))
-            {
               int i = columnList.locationToIndex(e.getPoint());
 
               if (i >= 0)
@@ -217,7 +212,6 @@ public class LogPanelPreferencePanel ext
                 Object column = columnListModel.get(i);
                 preferenceModel.toggleColumn(((TableColumn)column));
               }
-            }
           }
         });
       columnList.setCellRenderer(cellRenderer);
@@ -537,6 +531,7 @@ public class LogPanelPreferencePanel ext
     private final JCheckBox loggerTreePanel =
       new JCheckBox("Show Logger Tree");
     private final JCheckBox wrapMessage = new JCheckBox("Wrap message field (display multi-line rows) ");
+    private final JCheckBox searchResultsVisible = new JCheckBox("Display search results in details panel ");
     private final JCheckBox highlightSearchMatchText = new JCheckBox("Highlight search match text ");
     private final JCheckBox scrollToBottom =
       new JCheckBox("Scroll to bottom (view tracks with new events)");
@@ -582,7 +577,7 @@ public class LogPanelPreferencePanel ext
       add(scrollToBottom);
       add(wrapMessage);
       add(highlightSearchMatchText);
-
+      add(searchResultsVisible);
       add(showMillisDeltaAsGap);
       JPanel clearPanel = new JPanel(new BorderLayout());
       clearPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
@@ -597,6 +592,7 @@ public class LogPanelPreferencePanel ext
       toolTips.setSelected(preferenceModel.isToolTips());
       thumbnailBarToolTips.setSelected(preferenceModel.isThumbnailBarToolTips());
       detailPanelVisible.setSelected(preferenceModel.isDetailPaneVisible());
+      searchResultsVisible.setSelected(preferenceModel.isSearchResultsVisible());
       loggerTreePanel.setSelected(preferenceModel.isLogTreePanelVisible());
     }
 
@@ -615,6 +611,16 @@ public class LogPanelPreferencePanel ext
 
         wrapMessage.addActionListener(wrapMessageListener);
 
+        ActionListener searchResultsVisibleListener = new ActionListener()
+        {
+            public void actionPerformed(ActionEvent e)
+            {
+                preferenceModel.setSearchResultsVisible(searchResultsVisible.isSelected());
+            }
+        };
+
+        searchResultsVisible.addActionListener(searchResultsVisibleListener);
+
         ActionListener highlightSearchMatchTextListener = new ActionListener()
         {
             public void actionPerformed(ActionEvent e)
@@ -635,6 +641,16 @@ public class LogPanelPreferencePanel ext
             }
           });
 
+      preferenceModel.addPropertyChangeListener(
+        "searchResultsVisible", new PropertyChangeListener()
+        {
+          public void propertyChange(PropertyChangeEvent evt)
+          {
+            boolean value = ((Boolean) evt.getNewValue()).booleanValue();
+            searchResultsVisible.setSelected(value);
+          }
+        });
+
         preferenceModel.addPropertyChangeListener(
           "highlightSearchMatchText", new PropertyChangeListener()
           {

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=1022406&r1=1022405&r2=1022406&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 Oct 14 08:01:36 2010
@@ -55,6 +55,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.BorderFactory;
@@ -84,6 +85,7 @@ import javax.swing.event.ChangeListener;
 import javax.swing.event.EventListenerList;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
+
 import org.apache.log4j.Appender;
 import org.apache.log4j.AppenderSkeleton;
 import org.apache.log4j.Level;
@@ -209,7 +211,7 @@ public class LogUI extends JFrame implem
    * the Menu bar
    */
   public LogUI() {
-    super("Chainsaw v2 - Log Viewer");
+    super("Chainsaw");
     setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
 
     if (ChainsawIcons.WINDOW_ICON != null) {
@@ -2105,8 +2107,8 @@ public class LogUI extends JFrame implem
         Iterator iter2 = panel.getMatchingEvents(rule).iterator();
 
         while (iter2.hasNext()) {
-          LoggingEvent e = (LoggingEvent) iter2.next();
-          list.add(e);
+          LoggingEventWrapper e = (LoggingEventWrapper) iter2.next();
+          list.add(e.getLoggingEvent());
         }
       }
 
@@ -2133,7 +2135,11 @@ public class LogUI extends JFrame implem
             try {
               // we temporarily swap the TCCL so that plugins can find resources
               Thread.currentThread().setContextClassLoader(classLoader);
-              DOMConfigurator.configure(url);
+              try {
+                DOMConfigurator.configure(url);
+              } catch (Exception e) {
+                logger.warn("Unable to load configuration URL: " + url, e);
+              }
             }finally{
                 // now switch it back...
                 Thread.currentThread().setContextClassLoader(previousTCCL);

Copied: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java (from r1021624, logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ExtendedLoggingEvent.java)
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java?p2=logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java&p1=logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ExtendedLoggingEvent.java&r1=1021624&r2=1022406&rev=1022406&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ExtendedLoggingEvent.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggingEventWrapper.java Thu Oct 14 08:01:36 2010
@@ -18,100 +18,189 @@ package org.apache.log4j.chainsaw;
 
 import java.awt.Color;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
-import org.apache.log4j.Logger;
+import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.rule.Rule;
 import org.apache.log4j.spi.LoggingEvent;
 
-public class ExtendedLoggingEvent extends LoggingEvent
-{
-    private static final int DEFAULT_HEIGHT = -1;
-
-    private Color colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
-    private Color colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
-    private int markerHeight = DEFAULT_HEIGHT;
-    private int msgHeight = DEFAULT_HEIGHT;
-
-    private boolean searchMatch = false;
-    //a Map of event fields to Sets of string matches (can be used to render matches differently)
-    Map eventMatches = new HashMap();
-
-    //copy constructor
-    public ExtendedLoggingEvent(LoggingEvent e) {
-        super(e.getFQNOfLoggerClass(), e.getLogger() != null ? e.getLogger() : Logger.getLogger(e.getLoggerName()), e.getTimeStamp(), e.getLevel(), e.getMessage(), e.getThreadName(), e.getThrowableInformation(), e.getNDC(), e.getLocationInformation(), e.getProperties());
-    }
-
-    public void updateColorRuleColors(Color backgroundColor, Color foregroundColor) {
-        if (backgroundColor != null && foregroundColor != null) {
-            this.colorRuleBackground = backgroundColor;
-            this.colorRuleForeground = foregroundColor;
-        } else {
-            this.colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
-            this.colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
-        }
-    }
-
-    public void evaluateSearchRule(Rule searchRule) {
-        eventMatches.clear();
-        searchMatch = searchRule != null && searchRule.evaluate(this, eventMatches);
-    }
-
-    public Map getSearchMatches() {
-        return eventMatches;
-    }
-    
-    public Color getForeground() {
-        return colorRuleForeground;
-    }
-
-    public Color getBackground() {
-        return colorRuleBackground;
-    }
-
-    public Color getColorRuleBackground() {
-        return colorRuleBackground;
-    }
-
-    public Color getColorRuleForeground() {
-        return colorRuleForeground;
-    }
-
-    public boolean isSearchMatch() {
-        return searchMatch;
-    }
-
-    public void setMarkerHeight(int markerHeight) {
-        this.markerHeight = markerHeight;
-    }
-
-    public int getMarkerHeight() {
-        return markerHeight;
-    }
-
-    public void setMsgHeight(int msgHeight) {
-        this.msgHeight = msgHeight;
-    }
-
-    public int getMsgHeight() {
-        return msgHeight;
-    }
-
-    public void setDisplayed(boolean b)
-    {
-        markerHeight = DEFAULT_HEIGHT;
-        msgHeight = DEFAULT_HEIGHT;
-        if (!b) {
-            setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, "");
-        }
-    }
-
-    public String toString() {
-        return "ExtendedLoggingEvent - id: " + getProperty("log4jid") + " background: " + getBackground() + ", foreground: " + getForeground() + ", msg: " + getMessage();
-    }
-
-    public void setPreviousDisplayedEventTimestamp(long previousDisplayedEventTimeStamp)
-    {
-        setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, String.valueOf(timeStamp - previousDisplayedEventTimeStamp));
-    }
+/**
+ * Wrap access to a LoggingEvent.  All property updates need to go through this object and not through the wrapped logging event,
+ * since the properties are shared by two views of the same backing LoggingEvent, and loggingEvent itself creates a copy of passed-in properties..
+ *
+ * Property reads can be made on the actual LoggingEvent.
+ */
+public class LoggingEventWrapper {
+  private final LoggingEvent loggingEvent;
+  private static final int DEFAULT_HEIGHT = -1;
+
+  private Color colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
+  private Color colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
+  private int markerHeight = DEFAULT_HEIGHT;
+  private int msgHeight = DEFAULT_HEIGHT;
+
+  //set to the log4jid value via setId - assumed to never change
+  private int id;
+
+  private boolean searchMatch = false;
+  //a Map of event fields to Sets of string matches (can be used to render matches differently)
+  Map eventMatches = new HashMap();
+  private LoggingEventWrapper syncWrapper;
+  private EventContainer eventContainer;
+
+  public LoggingEventWrapper(LoggingEvent loggingEvent, EventContainer eventContainer) {
+    this.loggingEvent = loggingEvent;
+    this.eventContainer = eventContainer;
+  }
+
+  public LoggingEventWrapper(LoggingEventWrapper loggingEventWrapper, EventContainer eventContainer) {
+    this.loggingEvent = loggingEventWrapper.getLoggingEvent();
+    this.id = loggingEventWrapper.id;
+    this.syncWrapper = loggingEventWrapper;
+    this.eventContainer = eventContainer;
+    loggingEventWrapper.syncWrapper = this;
+    Map theseProperties = loggingEvent.getProperties();
+
+    LoggingEvent thatLoggingEvent = syncWrapper.getLoggingEvent();
+    Map syncEventPropertiesCopy = new HashMap(thatLoggingEvent.getProperties());
+    for (Iterator iter = syncEventPropertiesCopy.entrySet().iterator();iter.hasNext();) {
+      Map.Entry entry = (Map.Entry)iter.next();
+      thatLoggingEvent.removeProperty(entry.getKey().toString());
+    }
+
+    for (Iterator iter = theseProperties.entrySet().iterator();iter.hasNext();) {
+      Map.Entry entry = (Map.Entry)iter.next();
+      thatLoggingEvent.setProperty(entry.getKey().toString(), entry.getValue().toString());
+    }
+  }
+
+  public LoggingEvent getLoggingEvent() {
+    return loggingEvent;
+  }
+
+  public void setProperty(String propName, String propValue) {
+    loggingEvent.setProperty(propName, propValue);
+    if (propName.equals(Constants.LOG4J_ID_KEY)) {
+      id = Integer.parseInt(propValue);
+    }
+    if (!propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
+      eventContainer.reFilter();
+    }
+    if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
+      syncWrapper.getLoggingEvent().setProperty(propName, propValue);
+      EventContainer syncWrapperEventContainer = syncWrapper.eventContainer;
+      syncWrapperEventContainer.reFilter();
+    }
+  }
+
+  public Object removeProperty(String propName) {
+    Object result = loggingEvent.removeProperty(propName);
+    if (!propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
+      eventContainer.reFilter();
+    }
+    if (syncWrapper != null && !propName.equals(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE)) {
+      syncWrapper.getLoggingEvent().removeProperty(propName);
+      EventContainer syncWrapperEventContainer = syncWrapper.eventContainer;
+      syncWrapperEventContainer.reFilter();
+    }
+    return result;
+  }
+
+  public Set getPropertyKeySet() {
+    return loggingEvent.getPropertyKeySet();
+  }
+
+  public void updateColorRuleColors(Color backgroundColor, Color foregroundColor) {
+    if (backgroundColor != null && foregroundColor != null) {
+      this.colorRuleBackground = backgroundColor;
+      this.colorRuleForeground = foregroundColor;
+    } else {
+      this.colorRuleBackground = ChainsawConstants.COLOR_DEFAULT_BACKGROUND;
+      this.colorRuleForeground = ChainsawConstants.COLOR_DEFAULT_FOREGROUND;
+    }
+  }
+
+  public void evaluateSearchRule(Rule searchRule) {
+    eventMatches.clear();
+    searchMatch = searchRule != null && searchRule.evaluate(loggingEvent, eventMatches);
+  }
+
+  public Map getSearchMatches() {
+    return eventMatches;
+  }
+
+  public Color getForeground() {
+    return colorRuleForeground;
+  }
+
+  public Color getBackground() {
+    return colorRuleBackground;
+  }
+
+  public Color getColorRuleBackground() {
+    return colorRuleBackground;
+  }
+
+  public Color getColorRuleForeground() {
+    return colorRuleForeground;
+  }
+
+  public boolean isSearchMatch() {
+    return searchMatch;
+  }
+
+  public void setMarkerHeight(int markerHeight) {
+    this.markerHeight = markerHeight;
+  }
+
+  public int getMarkerHeight() {
+    return markerHeight;
+  }
+
+  public void setMsgHeight(int msgHeight) {
+    this.msgHeight = msgHeight;
+  }
+
+  public int getMsgHeight() {
+    return msgHeight;
+  }
+
+  public void setDisplayed(boolean b) {
+    markerHeight = DEFAULT_HEIGHT;
+    msgHeight = DEFAULT_HEIGHT;
+    if (!b) {
+      setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, "");
+    }
+  }
+
+  public void setPreviousDisplayedEventTimestamp(long previousDisplayedEventTimeStamp) {
+    setProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE, String.valueOf(loggingEvent.getTimeStamp() - previousDisplayedEventTimeStamp));
+  }
+
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+
+    LoggingEventWrapper that = (LoggingEventWrapper) o;
+
+    if (id != that.id) {
+      return false;
+    }
+
+    return true;
+  }
+
+  public int hashCode() {
+    return id;
+  }
+
+  public String toString() {
+    return "LoggingEventWrapper - id: " + id + " background: " + getBackground() + ", foreground: " + getForeground() + ", msg: " + loggingEvent.getMessage();
+  }
 }

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/RuleMediator.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/RuleMediator.java?rev=1022406&r1=1022405&r2=1022406&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/RuleMediator.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/RuleMediator.java Thu Oct 14 08:01:36 2010
@@ -30,87 +30,56 @@ import org.apache.log4j.spi.LoggingEvent
  * A mediator class that implements the Rule interface, by combining several 
  * optional rules used by Chainsaw's filtering GUI's into a single Rule.
  *
- * <p>This class is based upon the concept of Inclusion, Exclusion and Refinement.
- * By default, this class accepts all events by returning true as part of the 
- * Rule interface, unless the Inclusion/Exclusion/Refinement sub-rules have been
- * configured.
- *
- * <p>The sub-rules are queried in this order: Inclusion, Refinement, Exclusion.  
- * If any are null, that particular sub-rule is not queried.  If any of the 
- * sub-rules returns false, this mediator returns false immediately, otherwise
- * they are queried in that order to ensure the overall rule evaluates.
- *
- * <p>Setting the individual sub-rules propagates a PropertyChangeEvent as per 
+ * <p>Setting the individual sub-rules propagates a PropertyChangeEvent as per
  * standard Java beans principles.
  *
  * @author Paul Smith <[email protected]>
  * @author Scott Deboy <[email protected]>
  */
-public class RuleMediator extends AbstractRule implements Rule {
-  private Rule inclusionRule;
+public class RuleMediator extends AbstractRule {
   private Rule loggerRule;
-  private Rule refinementRule;
-  private Rule exclusionRule;
-  private final PropertyChangeListener ruleChangerNotifier =
-    new RuleChangerNotifier();
+  private Rule filterRule;
+  private Rule findRule;
+  private final PropertyChangeListener ruleChangerNotifier = new RuleChangerNotifier();
+  private boolean findRuleRequired;
 
+  public RuleMediator(boolean findRuleRequired) {
+    this.findRuleRequired = findRuleRequired;
+  }
   /* (non-Javadoc)
    * @see org.apache.log4j.chainsaw.rule.Rule#evaluate(org.apache.log4j.spi.LoggingEvent)
    */
   public boolean evaluate(LoggingEvent e, Map matches) {
-    boolean accepts = true;
-
-    //no need to have rulemediator build matches
-    if (inclusionRule != null) {
-      accepts = inclusionRule.evaluate(e, null);
+    if (findRuleRequired) {
+      if (findRule == null) {
+        return false;
+      }
+      if (!findRule.evaluate(e, null)) {
+        return false;
+      }
     }
 
-    if (!accepts) {
+    if (loggerRule != null && !loggerRule.evaluate(e, null)) {
       return false;
     }
 
-    if (loggerRule != null) {
-      accepts = loggerRule.evaluate(e, null);
-    }
-
-    if (!accepts) {
+    if (filterRule != null && !filterRule.evaluate(e, null)) {
       return false;
     }
 
-    if (refinementRule != null) {
-      accepts = refinementRule.evaluate(e, null);
-    }
-
-    if (!accepts) {
-      return false;
-    }
-
-    if (exclusionRule != null) {
-      accepts = exclusionRule.evaluate(e, null);
-    }
-
-    return accepts;
+    return true;
   }
 
-  /**
-   * Sets the Inclusion rule to be used, and fires a PropertyChangeEvent to listeners
-   * @param r
-   */
-  public void setInclusionRule(Rule r) {
-    Rule oldRule = this.inclusionRule;
-    this.inclusionRule = r;
-    firePropertyChange("inclusionRule", oldRule, this.inclusionRule);
+  public void setFilterRule(Rule r) {
+    Rule oldFilterRule = this.filterRule;
+    this.filterRule = r;
+    firePropertyChange("filterRule", oldFilterRule, this.filterRule);
   }
 
-  /**
-   * Sets the Refinement rule to be used, and fires a PropertyChangeEvent to listeners
-   * @param r
-   */
-  public void setRefinementRule(Rule r) {
-    Rule oldRefinementRule = this.refinementRule;
-    this.refinementRule = r;
-    firePropertyChange(
-      "refinementRule", oldRefinementRule, this.refinementRule);
+  public void setFindRule(Rule r) {
+    Rule oldFindRule = this.findRule;
+    this.findRule = r;
+    firePropertyChange("findRule", oldFindRule, this.findRule);
   }
 
   public void setLoggerRule(Rule r) {
@@ -124,45 +93,6 @@ public class RuleMediator extends Abstra
   }
 
   /**
-   * Sets the Exclusion rule to be used, and fires a PropertyChangeEvent to listeners.
-   *
-   * @param r
-   */
-  public void setExclusionRule(Rule r) {
-    Rule oldExclusionRule = this.exclusionRule;
-    this.exclusionRule = r;
-    firePropertyChange("exclusionRule", oldExclusionRule, this.exclusionRule);
-  }
-
-  /**
-   * @return exclusion rule
-   */
-  public final Rule getExclusionRule() {
-    return exclusionRule;
-  }
-
-  /**
-   * @return inclusion rule
-   */
-  public final Rule getInclusionRule() {
-    return inclusionRule;
-  }
-
-  /**
-   * @return logger rule
-   */
-  public final Rule getLoggerRule() {
-    return loggerRule;
-  }
-
-  /**
-   * @return refinement rule
-   */
-  public final Rule getRefinementRule() {
-    return refinementRule;
-  }
-
-  /**
    * Helper class that propagates internal Rules propertyChange events
    * to external parties, since an internal rule changing really means
    * this outter rule is going to change too.

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=1022406&r1=1022405&r2=1022406&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java Thu Oct 14 08:01:36 2010
@@ -70,7 +70,6 @@ import org.apache.log4j.chainsaw.color.R
 import org.apache.log4j.chainsaw.icons.LevelIconFactory;
 import org.apache.log4j.helpers.Constants;
 import org.apache.log4j.rule.Rule;
-import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.LoggingEventFieldResolver;
 
 
@@ -97,7 +96,7 @@ public class TableColorizingRenderer ext
   private boolean useRelativeTimesToFixedTime = false;
   private long relativeTimestampBase;
 
-  private static int borderWidth = 2;
+  private static int borderWidth = ChainsawConstants.TABLE_BORDER_WIDTH;
 
   private final Color borderColor;
 
@@ -116,15 +115,18 @@ public class TableColorizingRenderer ext
   private EventContainer eventContainer;
   private LogPanelPreferenceModel logPanelPreferenceModel;
   private SimpleAttributeSet insetAttributeSet;
+  private boolean colorizeSearch;
 
-    /**
+  /**
    * Creates a new TableColorizingRenderer object.
    */
   public TableColorizingRenderer(RuleColorizer colorizer, ApplicationPreferenceModel applicationPreferenceModel,
-                                 EventContainer eventContainer, LogPanelPreferenceModel logPanelPreferenceModel) {
+                                 EventContainer eventContainer, LogPanelPreferenceModel logPanelPreferenceModel,
+                                 boolean colorizeSearch) {
     this.applicationPreferenceModel = applicationPreferenceModel;
     this.logPanelPreferenceModel = logPanelPreferenceModel;
     this.eventContainer = eventContainer;
+    this.colorizeSearch = colorizeSearch;
     multiLinePanel.setLayout(new BoxLayout(multiLinePanel, BoxLayout.Y_AXIS));
     generalPanel.setLayout(new BoxLayout(generalPanel, BoxLayout.Y_AXIS));
     levelPanel.setLayout(new BoxLayout(levelPanel, BoxLayout.Y_AXIS));
@@ -176,27 +178,26 @@ public class TableColorizingRenderer ext
     final JTable table, Object value, boolean isSelected, boolean hasFocus,
     int row, int col) {
     EventContainer container = (EventContainer) table.getModel();
-    ExtendedLoggingEvent loggingEvent = container.getRow(row);
-    value = formatField(value, row, loggingEvent);
+    LoggingEventWrapper loggingEventWrapper = container.getRow(row);
+    value = formatField(value, row, loggingEventWrapper);
     TableColumn tableColumn = table.getColumnModel().getColumn(col);
     int width = tableColumn.getWidth();
-
     JLabel label = (JLabel)super.getTableCellRendererComponent(table, value,
         isSelected, hasFocus, row, col);
     //chainsawcolumns uses one-based indexing
     int colIndex = tableColumn.getModelIndex() + 1;
 
     //no event, use default renderer
-    if (loggingEvent == null) {
+    if (loggingEventWrapper == null) {
         return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
     }
     long delta = 0;
     if (row > 0) {
-        LoggingEvent previous = eventContainer.getRow(row - 1);
-        delta = Math.min(ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX, Math.max(0, (long) ((loggingEvent.getTimeStamp() - previous.getTimeStamp()) * ChainsawConstants.MILLIS_DELTA_RENDERING_FACTOR)));
+        LoggingEventWrapper previous = eventContainer.getRow(row - 1);
+        delta = Math.min(ChainsawConstants.MILLIS_DELTA_RENDERING_HEIGHT_MAX, Math.max(0, (long) ((loggingEventWrapper.getLoggingEvent().getTimeStamp() - previous.getLoggingEvent().getTimeStamp()) * ChainsawConstants.MILLIS_DELTA_RENDERING_FACTOR)));
     }
 
-    Map matches = loggingEvent.getSearchMatches();
+    Map matches = loggingEventWrapper.getSearchMatches();
 
     JComponent component;
     switch (colIndex) {
@@ -329,8 +330,8 @@ public class TableColorizingRenderer ext
               textPane.setBorder(getMiddleBorder(isSelected, 0));
             }
         }
-        int currentMarkerHeight = loggingEvent.getMarkerHeight();
-        int currentMsgHeight = loggingEvent.getMsgHeight();
+        int currentMarkerHeight = loggingEventWrapper.getMarkerHeight();
+        int currentMsgHeight = loggingEventWrapper.getMsgHeight();
         int newRowHeight = ChainsawConstants.DEFAULT_ROW_HEIGHT;
         boolean setHeight = false;
 
@@ -355,15 +356,15 @@ public class TableColorizingRenderer ext
         }
 
         if (colIndex == ChainsawColumns.INDEX_LOG4J_MARKER_COL_NAME) {
-            loggingEvent.setMarkerHeight(newRowHeight);
-            if (newRowHeight != currentMarkerHeight && newRowHeight >= loggingEvent.getMsgHeight()) {
+            loggingEventWrapper.setMarkerHeight(newRowHeight);
+            if (newRowHeight != currentMarkerHeight && newRowHeight >= loggingEventWrapper.getMsgHeight()) {
                 setHeight = true;
             }
         }
 
         if (colIndex == ChainsawColumns.INDEX_MESSAGE_COL_NAME) {
-            loggingEvent.setMsgHeight(newRowHeight);
-            if (newRowHeight != currentMsgHeight && newRowHeight >= loggingEvent.getMarkerHeight()) {
+            loggingEventWrapper.setMsgHeight(newRowHeight);
+            if (newRowHeight != currentMsgHeight && newRowHeight >= loggingEventWrapper.getMarkerHeight()) {
                 setHeight = true;
             }
         }
@@ -398,7 +399,7 @@ public class TableColorizingRenderer ext
 
     //remaining entries are properties
     default:
-        Set propertySet = loggingEvent.getPropertyKeySet();
+        Set propertySet = loggingEventWrapper.getPropertyKeySet();
         String headerName = tableColumn.getHeaderValue().toString().toLowerCase();
         String thisProp = null;
         //find the property in the property set...case-sensitive
@@ -412,7 +413,7 @@ public class TableColorizingRenderer ext
         if (thisProp != null) {
             String propKey = LoggingEventFieldResolver.PROP_FIELD + thisProp.toUpperCase();
             Set propKeyMatches = (Set)matches.get(propKey);
-            singleLineTextPane.setText(loggingEvent.getProperty(thisProp));
+            singleLineTextPane.setText(loggingEventWrapper.getLoggingEvent().getProperty(thisProp));
             setHighlightAttributesInternal(propKeyMatches, (StyledDocument) singleLineTextPane.getDocument());
         } else {
             singleLineTextPane.setText("");
@@ -426,12 +427,17 @@ public class TableColorizingRenderer ext
     Color foreground;
     Rule loggerRule = colorizer.getLoggerRule();
     //use logger colors in table instead of event colors if event passes logger rule
-    if (loggerRule != null && loggerRule.evaluate(loggingEvent, null)) {
+    if (loggerRule != null && loggerRule.evaluate(loggingEventWrapper.getLoggingEvent(), null)) {
         background = applicationPreferenceModel.getSearchBackgroundColor();
         foreground = applicationPreferenceModel.getSearchForegroundColor();
     } else {
-        background = loggingEvent.isSearchMatch()?applicationPreferenceModel.getSearchBackgroundColor():loggingEvent.getBackground();
-        foreground = loggingEvent.isSearchMatch()?applicationPreferenceModel.getSearchForegroundColor():loggingEvent.getForeground();
+        if (colorizeSearch) {
+          background = loggingEventWrapper.isSearchMatch()?applicationPreferenceModel.getSearchBackgroundColor():loggingEventWrapper.getBackground();
+          foreground = loggingEventWrapper.isSearchMatch()?applicationPreferenceModel.getSearchForegroundColor():loggingEventWrapper.getForeground();
+        } else {
+          background = loggingEventWrapper.getBackground();
+          foreground = loggingEventWrapper.getForeground();
+        }
     }
 
     /**
@@ -566,7 +572,7 @@ public class TableColorizingRenderer ext
    * @param renderingRow
    * @return formatted object
    */
-  private Object formatField(Object field, int renderingRow, ExtendedLoggingEvent loggingEvent) {
+  private Object formatField(Object field, int renderingRow, LoggingEventWrapper loggingEventWrapper) {
     if (!(field instanceof Date)) {
       return (field == null ? "" : field);
     }
@@ -576,7 +582,7 @@ public class TableColorizingRenderer ext
         return "" + (((Date)field).getTime() - relativeTimestampBase);
     }
     if (useRelativeTimesToPrevious) {
-        return loggingEvent.getProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
+        return loggingEventWrapper.getLoggingEvent().getProperty(ChainsawConstants.MILLIS_DELTA_COL_NAME_LOWERCASE);
     }
 
     return dateFormatInUse.format((Date) field);

Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java?rev=1022406&r1=1022405&r2=1022406&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java (original)
+++ logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/messages/MessageCenter.java Thu Oct 14 08:01:36 2010
@@ -45,10 +45,10 @@ import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.log4j.TTCCLayout;
 import org.apache.log4j.chainsaw.ChainsawConstants;
+import org.apache.log4j.chainsaw.LoggingEventWrapper;
 import org.apache.log4j.chainsaw.PopupListener;
 import org.apache.log4j.chainsaw.SmallButton;
 import org.apache.log4j.chainsaw.icons.ChainsawIcons;
-import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.varia.ListModelAppender;
 
 
@@ -242,7 +242,7 @@ public class MessageCenter {
     public Component getListCellRendererComponent(
       JList list, Object value, int index, boolean isSelected,
       boolean cellHasFocus) {
-      value = layout.format((LoggingEvent) value);
+      value = layout.format(((LoggingEventWrapper) value).getLoggingEvent());
 
       Component c =
         super.getListCellRendererComponent(

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=1022406&r1=1022405&r2=1022406&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 Thu Oct 14 08:01:36 2010
@@ -303,7 +303,7 @@ public class VFSLogFilePatternReceiver e
     		  }}).start();
       } else {
         String oldURL = getFileURL();
-        if (oldURL != null) {
+        if (oldURL != null && oldURL.indexOf("://") > -1) {
             int index = oldURL.indexOf("://");
             String lastPart = oldURL.substring(index + "://".length());
             int passEndIndex = lastPart.indexOf("@");

Modified: logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html?rev=1022406&r1=1022405&r2=1022406&view=diff
==============================================================================
--- logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html (original)
+++ logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html Thu Oct 14 08:01:36 2010
@@ -14,6 +14,10 @@
 <ul>
 <li>Changed 'Wrap message field' preference default to true</li>
 </ul>
+<h2>13 Oct 2010</h2>
+<ul>
+<li>Added log panel preference to display search results in the detail panel.  When the preference is enabled and a search is performed, the matching rows are displayed in a table in the details panel.  Clicking on a row in that table selects the row in the main event table.</li>
+</ul>
 <h2>15 Sep 2010</h2>
 <ul>
 <li>New feature: Clickable thumbnail bar on the left shows time delta to prior displayed event if the time delta is > 1 second (behaves similarly to the thumbnail bar on the right which shows colors and search matches, but represents the time delta between events).  A bigger delta is represented as a wider line.</li>
@@ -502,4 +506,4 @@ not to provide this, be on the look out 
  <li>The first version we decided we needed to have some release notes in... :)</li>
  <li>Fix for LoggingEvent class - connecting Chainsaw v2 to a remote log4j1.2.x  caused a NullPointerException</li>
 </ul>
-</body></html>
\ No newline at end of file
+</body></html>

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=1022406&r1=1022405&r2=1022406&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 14 08:01:36 2010
@@ -42,4 +42,5 @@ scrollToBottom=true
 logTreePanelVisible=true
 detailPaneVisible=true
 highlightSearchMatchText=true
-wrapMessage=true
\ No newline at end of file
+wrapMessage=true
+searchResultsVisible=true
\ No newline at end of file
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.