Author: sdeboy
Date: Sat Jul 17 07:51:38 2010
New Revision: 965026
URL: http://svn.apache.org/viewvc?rev=965026&view=rev
Log:
Chainsaw rendering fixes and performance improvements
- previously if you expanded a row by shrinking its width (with wrap enabled), the row would never shrink in height - now it will
- commented out use of an expensive cell height calculation method - no longer calculating the height, letting Swing calculate it for us
- LoggerNameTreePanel implemented Rule, but triggered propertychange events caused by Swing, which were triggering rule re-evaluation...panel no longer implements Rule - no longer unnecessarily re-running rule evaluation
Modified:
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ExtendedLoggingEvent.java
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LogPanel.java
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/LoggerNameTreePanel.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=965026&r1=965025&r2=965026&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 Jul 17 07:51:38 2010
@@ -131,15 +131,22 @@ class ChainsawCyclicBufferTableModel ext
previousSize = filteredList.size();
filteredList.clear();
if (displayRule == null) {
- filteredList.addAll(unfilteredList);
+ for (Iterator iter = unfilteredList.iterator();iter.hasNext();) {
+ ExtendedLoggingEvent e = (ExtendedLoggingEvent)iter.next();
+ e.setDisplayed(true);
+ filteredList.add(e);
+ }
} else {
Iterator iter = unfilteredList.iterator();
while (iter.hasNext()) {
- LoggingEvent e = (LoggingEvent) iter.next();
+ ExtendedLoggingEvent e = (ExtendedLoggingEvent) iter.next();
if (displayRule.evaluate(e, null)) {
+ e.setDisplayed(true);
filteredList.add(e);
+ } else {
+ e.setDisplayed(false);
}
}
}
@@ -290,6 +297,11 @@ class ChainsawCyclicBufferTableModel ext
filteredListSize = filteredList.size();
sort = (sortEnabled && filteredListSize > 0);
if (sort) {
+ //reset display (used to ensure row height is updated)
+ for (Iterator iter = filteredList.iterator();iter.hasNext();) {
+ ExtendedLoggingEvent e = (ExtendedLoggingEvent)iter.next();
+ e.setDisplayed(true);
+ }
Collections.sort(
filteredList,
new ColumnComparator(
@@ -595,8 +607,11 @@ class ChainsawCyclicBufferTableModel ext
}
unfilteredList.add(e);
if ((displayRule == null) || (displayRule.evaluate(e, null))) {
+ e.setDisplayed(true);
filteredList.add(e);
rowAdded = true;
+ } else {
+ e.setDisplayed(false);
}
}
Modified: 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/ExtendedLoggingEvent.java?rev=965026&r1=965025&r2=965026&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/ExtendedLoggingEvent.java Sat Jul 17 07:51:38 2010
@@ -26,8 +26,12 @@ 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)
@@ -77,7 +81,30 @@ public class ExtendedLoggingEvent extend
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;
+ }
+
public String toString() {
return "ExtendedLoggingEvent - id: " + getProperty("log4jid") + " background: " + getBackground() + ", foreground: " + getForeground() + ", msg: " + getMessage();
}
+
}
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=965026&r1=965025&r2=965026&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 Jul 17 07:51:38 2010
@@ -715,33 +715,25 @@ public class LogPanel extends DockablePa
*/
LogPanelLoggerTreeModel logTreeModel = new LogPanelLoggerTreeModel();
logTreePanel = new LoggerNameTreePanel(logTreeModel, preferenceModel, this, colorizer, filterModel);
- logTreePanel.addPropertyChangeListener("searchExpression", new PropertyChangeListener()
+ logTreePanel.getLoggerVisibilityRule().addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent evt)
{
- findField.setText(evt.getNewValue().toString());
- findNext();
+ if (evt.getPropertyName().equals("searchExpression")) {
+ findField.setText(evt.getNewValue().toString());
+ findNext();
+ }
}
});
tableModel.addLoggerNameListener(logTreeModel);
- ruleMediator.addPropertyChangeListener(new PropertyChangeListener()
- {
- public void propertyChange(PropertyChangeEvent evt)
- {
- //reset row height to default - logger rule or refinement rule changed the displayed rows - when in multiline row mode,
- //the table rows may not be the correct height (the row's height may be larger than the preferred height)..
- //updating all rows to the default height resolves this issue
- table.setRowHeight(ChainsawConstants.DEFAULT_ROW_HEIGHT);
- }
- });
/**
* Set the LoggerRule to be the LoggerTreePanel, as this visual component
* is a rule itself, and the RuleMediator will automatically listen when
* it's rule state changes.
*/
- ruleMediator.setLoggerRule(logTreePanel);
+ ruleMediator.setLoggerRule(logTreePanel.getLoggerVisibilityRule());
colorizer.setLoggerRule(logTreePanel.getLoggerColorRule());
/*
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=965026&r1=965025&r2=965026&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 Sat Jul 17 07:51:38 2010
@@ -101,7 +101,7 @@ import org.apache.log4j.spi.LoggingEvent
*
* @author Paul Smith <[email protected]>
*/
-final class LoggerNameTreePanel extends JPanel implements Rule
+final class LoggerNameTreePanel extends JPanel
{
//~ Static fields/initializers ==============================================
@@ -151,7 +151,7 @@ final class LoggerNameTreePanel extends
private final LogPanelLoggerTreeModel logTreeModel;
private final PopupListener popupListener;
private final LoggerTreePopupMenu popupMenu;
- private final Rule ruleDelegate;
+ private final VisibilityRuleDelegate visibilityRuleDelegate;
private Rule colorRuleDelegate;
private final JScrollPane scrollTree;
private final JToolBar toolbar = new JToolBar();
@@ -180,28 +180,8 @@ final class LoggerNameTreePanel extends
ignoreExpressionEntryField.setPreferredSize(new Dimension(300, 150));
JTextComponentFormatter.applySystemFontAndSize(ignoreExpressionEntryField);
- ruleDelegate = new AbstractRule() {
- public boolean evaluate(LoggingEvent e, Map matches)
- {
- String currentlySelectedLoggerName = getCurrentlySelectedLoggerName();
- boolean hiddenLogger = e.getLoggerName() != null && isHiddenLogger(e.getLoggerName());
- boolean hiddenExpression = (ignoreExpressionRule != null && ignoreExpressionRule.evaluate(e, null));
- boolean hidden = hiddenLogger || hiddenExpression;
- if (currentlySelectedLoggerName == null) {
- //if there is no selected logger, pass if not hidden
- return !hidden;
- }
- boolean result = (e.getLoggerName() != null) && !hidden;
-
- if (result && isFocusOnSelected())
- {
- result = (e.getLoggerName() != null && (e.getLoggerName().startsWith(currentlySelectedLoggerName+".") || e.getLoggerName().endsWith(currentlySelectedLoggerName)));
- }
- return result;
- }
- };
-
+ visibilityRuleDelegate = new VisibilityRuleDelegate();
colorRuleDelegate =
new AbstractRule()
{
@@ -439,7 +419,7 @@ final class LoggerNameTreePanel extends
} else {
ignoreExpressionRule = null;
}
- firePropertyChange("hiddenSet", null, null);
+ visibilityRuleDelegate.firePropertyChange("hiddenSet", null, null);
updateAllIgnoreStuff();
ignoreExpressionEntryField.setBackground(UIManager.getColor("TextField.background"));
@@ -464,27 +444,14 @@ final class LoggerNameTreePanel extends
listenerList.add(ChangeListener.class, l);
}
- /* (non-Javadoc)
- * @see org.apache.log4j.chainsaw.rule.Rule#evaluate(org.apache.log4j.spi.LoggingEvent)
- */
- /**
- * DOCUMENT ME!
- *
- * @param e DOCUMENT ME!
- *
- * @param matches
- * @return DOCUMENT ME!
- */
- public boolean evaluate(LoggingEvent e, Map matches)
- {
- //no need for logger to build matches
- return ruleDelegate.evaluate(e, null);
- }
-
public Rule getLoggerColorRule() {
return colorRuleDelegate;
}
+ public Rule getLoggerVisibilityRule() {
+ return visibilityRuleDelegate;
+ }
+
/**
* DOCUMENT ME!
*
@@ -548,7 +515,7 @@ final class LoggerNameTreePanel extends
hiddenSet.remove(logger);
}
- firePropertyChange("hiddenSet", (Object) null, (Object) null);
+ visibilityRuleDelegate.firePropertyChange("hiddenSet", (Object) null, (Object) null);
}
/**
@@ -611,7 +578,7 @@ final class LoggerNameTreePanel extends
void ignore(Collection fqnLoggersToIgnore)
{
hiddenSet.addAll(fqnLoggersToIgnore);
- firePropertyChange("hiddenSet", null, null);
+ visibilityRuleDelegate.firePropertyChange("hiddenSet", null, null);
fireChangeEvent();
}
@@ -1142,12 +1109,12 @@ final class LoggerNameTreePanel extends
{
return;
}
- firePropertyChange("searchExpression", null, "logger like '^" + selectedLogger + ".*'");
+ visibilityRuleDelegate.firePropertyChange("searchExpression", null, "logger like '^" + selectedLogger + ".*'");
}
private void clearFindNext()
{
- firePropertyChange("searchExpression", null, "");
+ visibilityRuleDelegate.firePropertyChange("searchExpression", null, "");
}
private void clearRefineFocus()
@@ -1417,16 +1384,18 @@ final class LoggerNameTreePanel extends
{
public void stateChanged(ChangeEvent evt)
{
- firePropertyChange("rule", null, null);
+ visibilityRuleDelegate.firePropertyChange("rule", null, null);
updateAllIgnoreStuff();
}
});
- addPropertyChangeListener("hiddenSet", new PropertyChangeListener()
+ visibilityRuleDelegate.addPropertyChangeListener(new PropertyChangeListener()
{
- public void propertyChange(PropertyChangeEvent arg0)
+ public void propertyChange(PropertyChangeEvent event)
{
- updateAllIgnoreStuff();
+ if (event.getPropertyName().equals("hiddenSet")) {
+ updateAllIgnoreStuff();
+ }
}
});
}
@@ -1768,4 +1737,37 @@ final class LoggerNameTreePanel extends
}
}
}
+
+ class VisibilityRuleDelegate extends AbstractRule {
+ public boolean evaluate(LoggingEvent e, Map matches)
+ {
+ String currentlySelectedLoggerName = getCurrentlySelectedLoggerName();
+ boolean hiddenLogger = e.getLoggerName() != null && isHiddenLogger(e.getLoggerName());
+ boolean hiddenExpression = (ignoreExpressionRule != null && ignoreExpressionRule.evaluate(e, null));
+ boolean hidden = hiddenLogger || hiddenExpression;
+ if (currentlySelectedLoggerName == null) {
+ //if there is no selected logger, pass if not hidden
+ return !hidden;
+ }
+ boolean result = (e.getLoggerName() != null) && !hidden;
+
+ if (result && isFocusOnSelected())
+ {
+ result = (e.getLoggerName() != null && (e.getLoggerName().startsWith(currentlySelectedLoggerName+".") || e.getLoggerName().endsWith(currentlySelectedLoggerName)));
+ }
+
+ return result;
+ }
+
+ public void firePropertyChange(String propertyName, Object oldVal, Object newVal)
+ {
+ super.firePropertyChange(propertyName, oldVal, newVal);
+ }
+
+ public void firePropertyChange(PropertyChangeEvent evt)
+ {
+ super.firePropertyChange(evt);
+ }
+ }
+
}
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=965026&r1=965025&r2=965026&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 Jul 17 07:51:38 2010
@@ -21,6 +21,7 @@ import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
+import java.awt.Toolkit;
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextAttribute;
@@ -118,6 +119,7 @@ public class TableColorizingRenderer ext
private JTextPane multiLineTextPane;
private MutableAttributeSet boldAttributeSet;
private TabSet tabs;
+ private int maxHeight;
/**
* Creates a new TableColorizingRenderer object.
@@ -127,6 +129,7 @@ public class TableColorizingRenderer ext
multiLinePanel.setLayout(new BoxLayout(multiLinePanel, BoxLayout.Y_AXIS));
generalPanel.setLayout(new BoxLayout(generalPanel, BoxLayout.Y_AXIS));
levelPanel.setLayout(new BoxLayout(levelPanel, BoxLayout.Y_AXIS));
+ maxHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
//define the 'bold' attributeset
boldAttributeSet = new SimpleAttributeSet();
@@ -276,22 +279,42 @@ public class TableColorizingRenderer ext
} else {
setHighlightAttributesInternal(matches.get(LoggingEventFieldResolver.MSG_FIELD), (StyledDocument) multiLineTextPane.getDocument());
}
- int tableRowHeight = table.getRowHeight(row);
multiLinePanel.removeAll();
multiLinePanel.add(multiLineTextPane);
if (wrap) {
+ /*
+ calculating the height -would- be the correct thing to do, but setting the size to screen size works as well and
+ doesn't incur massive overhead, like calculateHeight does
Map paramMap = new HashMap();
paramMap.put(TextAttribute.FONT, multiLineTextPane.getFont());
int calculatedHeight = calculateHeight(thisString, width, paramMap);
- //set preferred size to default height
- multiLineTextPane.setSize(new Dimension(width, calculatedHeight));
-
+ */
+ //instead, set size to max height
+ multiLineTextPane.setSize(new Dimension(width, maxHeight));
+ boolean setHeight = false;
int multiLinePanelPrefHeight = multiLinePanel.getPreferredSize().height;
- if(tableRowHeight < multiLinePanelPrefHeight) {
- table.setRowHeight(row, Math.max(ChainsawConstants.DEFAULT_ROW_HEIGHT, multiLinePanelPrefHeight));
+ int newRowHeight = Math.max(ChainsawConstants.DEFAULT_ROW_HEIGHT, multiLinePanelPrefHeight);
+ if (colIndex == ChainsawColumns.INDEX_LOG4J_MARKER_COL_NAME) {
+ int currentMarkerHeight = loggingEvent.getMarkerHeight();
+ loggingEvent.setMarkerHeight(newRowHeight);
+ if (newRowHeight != currentMarkerHeight && newRowHeight >= loggingEvent.getMsgHeight()) {
+ setHeight = true;
+ }
}
+
+ if (colIndex == ChainsawColumns.INDEX_MESSAGE_COL_NAME) {
+ int currentMsgHeight = loggingEvent.getMsgHeight();
+ loggingEvent.setMsgHeight(newRowHeight);
+ if (newRowHeight != currentMsgHeight && newRowHeight >= loggingEvent.getMarkerHeight()) {
+ setHeight = true;
+ }
+ }
+ if (setHeight) {
+ table.setRowHeight(row, newRowHeight);
+ }
+
}
component = multiLinePanel;
break;
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.