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
