Author: sdeboy
Date: Mon May 3 06:05:42 2010
New Revision: 940375
URL: http://svn.apache.org/viewvc?rev=940375&view=rev
Log:
Marker field now wraps if multi-line is enabled
Fixed a number of visual glitches
- variable-height rows will cause Swing to throw a number of exceptions if fireTableRowsDeleted is called (calling fireTableDataChanged in that case instead)
- updated scrollToBottom logic to work better if variable height rows are enabled
- don't reuse the textarea in the renderer (prevents the textarea from causing other rows to have the incorrect height)
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/LogPanelPreferencePanel.java
logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/TableColorizingRenderer.java
logging/chainsaw/trunk/src/main/resources/org/apache/log4j/chainsaw/help/release-notes.html
Modified: logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
URL: http://svn.apache.org/viewvc/logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java?rev=940375&r1=940374&r2=940375&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 May 3 06:05:42 2010
@@ -145,7 +145,8 @@ class ChainsawCyclicBufferTableModel ext
} else if (previousSize > filteredList.size()) {
//less now..update and delete difference
fireTableRowsUpdated(0, filteredList.size() - 1);
- fireTableRowsDeleted(filteredList.size(), previousSize);
+ //swing bug exposed by variable height rows when calling fireTableRowsDeleted..use tabledatacchanged
+ fireTableDataChanged();
} else if (previousSize < filteredList.size()) {
//more now..update and insert difference
if (previousSize > 0) {
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=940375&r1=940374&r2=940375&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 May 3 06:05:42 2010
@@ -22,6 +22,7 @@ import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
+import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
@@ -1547,7 +1548,14 @@ public class LogPanel extends DockablePa
}
private void scrollToBottom() {
- table.scrollToRow(tableModel.getRowCount() - 1);
+ final int scrollRow = tableModel.getRowCount() - 1;
+ EventQueue.invokeLater(new Runnable()
+ {
+ public void run()
+ {
+ table.scrollToRow(scrollRow);
+ }
+ });
}
public void scrollToTop()
@@ -1636,9 +1644,7 @@ public class LogPanel extends DockablePa
detailPaneUpdater.setSelectedRow(table.getSelectedRow());
}
- if (isScrollToBottom()) {
- scrollToBottom();
- } else if (selectedEvent != null) {
+ if (!isScrollToBottom() && selectedEvent != null) {
final int newIndex = tableModel.getRowIndex(selectedEvent);
if (newIndex >= 0) {
// Don't scroll, just maintain selection...
@@ -3164,6 +3170,9 @@ public class LogPanel extends DockablePa
}
invalidate();
repaint();
+ if (isScrollToBottom()) {
+ scrollToBottom();
+ }
}
});
}
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=940375&r1=940374&r2=940375&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 Mon May 3 06:05:42 2010
@@ -243,7 +243,7 @@ public class LogPanelPreferencePanel ext
private final JTextField timeZone = new JTextField(10);
private final JRadioButton rdLevelIcons = new JRadioButton("Icons");
private final JRadioButton rdLevelText = new JRadioButton("Text");
- private final JCheckBox wrapMessage = new JCheckBox("Display entire message field in the table (multi-line rows)");
+ private final JCheckBox wrapMessage = new JCheckBox("Display entire message and marker text in the table (multi-line rows)");
private JRadioButton rdLast;
//~ Constructors ==========================================================
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=940375&r1=940374&r2=940375&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 May 3 06:05:42 2010
@@ -69,7 +69,7 @@ public class TableColorizingRenderer ext
private static final Map iconMap = LevelIconFactory.getInstance().getLevelToIconMap();
private RuleColorizer colorizer;
private boolean levelUseIcons = false;
- private boolean wrapMsg = false;
+ private boolean wrap = false;
private DateFormat dateFormatInUse = DATE_FORMATTER;
private int loggerPrecision = 0;
private boolean toolTipsVisible;
@@ -88,22 +88,21 @@ public class TableColorizingRenderer ext
private static final Border MIDDLE_EMPTY_BORDER = BorderFactory.createEmptyBorder(borderWidth, 0, borderWidth, 0);
private static final Border RIGHT_EMPTY_BORDER = BorderFactory.createEmptyBorder(borderWidth, 0, borderWidth, borderWidth);
- private final JTextArea msgTextArea = new JTextArea();
private final JLabel levelLabel = new JLabel();
private final JLabel generalLabel = new JLabel();
- private final JPanel msgPanel = new JPanel();
+ private final JPanel multiLinePanel = new JPanel();
private final JPanel generalPanel = new JPanel();
private final JPanel levelPanel = new JPanel();
/**
* Creates a new TableColorizingRenderer object.
*/
public TableColorizingRenderer(RuleColorizer colorizer) {
- msgPanel.setLayout(new BoxLayout(msgPanel, BoxLayout.Y_AXIS));
+ multiLinePanel.setLayout(new BoxLayout(multiLinePanel, BoxLayout.Y_AXIS));
generalPanel.setLayout(new BoxLayout(generalPanel, BoxLayout.Y_AXIS));
levelPanel.setLayout(new BoxLayout(levelPanel, BoxLayout.Y_AXIS));
- msgPanel.setAlignmentX(TOP_ALIGNMENT);
+ multiLinePanel.setAlignmentX(TOP_ALIGNMENT);
generalPanel.setAlignmentX(TOP_ALIGNMENT);
levelPanel.setAlignmentX(TOP_ALIGNMENT);
@@ -112,10 +111,6 @@ public class TableColorizingRenderer ext
levelLabel.setOpaque(true);
levelLabel.setText("");
- msgTextArea.setMargin(null);
- msgTextArea.setEditable(false);
-
- msgPanel.add(msgTextArea);
generalPanel.add(generalLabel);
levelPanel.add(levelLabel);
@@ -130,10 +125,12 @@ public class TableColorizingRenderer ext
final JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int col) {
value = formatField(value);
+ TableColumn tableColumn = table.getColumnModel().getColumn(col);
+ //null unless needed
+ JTextArea multiLineTextArea = null;
JLabel label = (JLabel)super.getTableCellRendererComponent(table, value,
isSelected, hasFocus, row, col);
- TableColumn tableColumn = table.getColumnModel().getColumn(col);
//chainsawcolumns uses one-based indexing
int colIndex = tableColumn.getModelIndex() + 1;
@@ -168,7 +165,6 @@ public class TableColorizingRenderer ext
component = generalPanel;
break;
case ChainsawColumns.INDEX_ID_COL_NAME:
- case ChainsawColumns.INDEX_LOG4J_MARKER_COL_NAME:
case ChainsawColumns.INDEX_CLASS_COL_NAME:
case ChainsawColumns.INDEX_FILE_COL_NAME:
case ChainsawColumns.INDEX_LINE_COL_NAME:
@@ -180,25 +176,35 @@ public class TableColorizingRenderer ext
component = generalPanel;
break;
+ case ChainsawColumns.INDEX_LOG4J_MARKER_COL_NAME:
case ChainsawColumns.INDEX_MESSAGE_COL_NAME:
- String string = value.toString().trim();
int width = tableColumn.getWidth();
- msgTextArea.setLineWrap(wrapMsg);
- msgTextArea.setWrapStyleWord(wrapMsg);
- msgTextArea.setFont(label.getFont());
- msgTextArea.setText(string);
+
+ String thisString = value.toString().trim();
int tableRowHeight = table.getRowHeight(row);
- if (wrapMsg) {
+ multiLineTextArea = new JTextArea();
+ multiLineTextArea.setMargin(null);
+ multiLineTextArea.setEditable(false);
+ multiLineTextArea.setLineWrap(wrap);
+ multiLineTextArea.setWrapStyleWord(wrap);
+ multiLineTextArea.setFont(label.getFont());
+ multiLineTextArea.setText(thisString);
+ multiLinePanel.removeAll();
+ multiLinePanel.add(multiLineTextArea);
+ if (wrap) {
Map paramMap = new HashMap();
- paramMap.put(TextAttribute.FONT, msgTextArea.getFont());
- int calculatedHeight = calculateHeight(string, width, paramMap);
- msgTextArea.setSize(new Dimension(width, calculatedHeight));
- int msgPanelPrefHeight = msgPanel.getPreferredSize().height;
- if(tableRowHeight < msgPanelPrefHeight/* && calculatedHeight > tableRowHeight*/) {
- table.setRowHeight(row, Math.max(ChainsawConstants.DEFAULT_ROW_HEIGHT, msgPanelPrefHeight));
+ paramMap.put(TextAttribute.FONT, multiLineTextArea.getFont());
+
+ int calculatedHeight = calculateHeight(thisString, width, paramMap);
+ //set preferred size to default height
+ multiLineTextArea.setSize(new Dimension(width, calculatedHeight));
+
+ int multiLinePanelPrefHeight = multiLinePanel.getPreferredSize().height;
+ if(tableRowHeight < multiLinePanelPrefHeight) {
+ table.setRowHeight(row, Math.max(ChainsawConstants.DEFAULT_ROW_HEIGHT, multiLinePanelPrefHeight));
}
}
- component = msgPanel;
+ component = multiLinePanel;
break;
case ChainsawColumns.INDEX_LEVEL_COL_NAME:
if (levelUseIcons) {
@@ -274,8 +280,11 @@ public class TableColorizingRenderer ext
component.setForeground(foreground);
//set the colors of the components inside 'component'
- msgTextArea.setBackground(background);
- msgTextArea.setForeground(foreground);
+ if (multiLineTextArea != null)
+ {
+ multiLineTextArea.setBackground(background);
+ multiLineTextArea.setForeground(foreground);
+ }
levelLabel.setBackground(background);
levelLabel.setForeground(foreground);
generalLabel.setBackground(background);
@@ -352,7 +361,7 @@ public class TableColorizingRenderer ext
* @param wrapMsg
*/
public void setWrapMessage(boolean wrapMsg) {
- this.wrapMsg = wrapMsg;
+ this.wrap = wrapMsg;
}
/**
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=940375&r1=940374&r2=940375&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 Mon May 3 06:05:42 2010
@@ -10,6 +10,10 @@
<b>NOTE:</b> The mechanism and format used to persist settings in Chainsaw is subject to change. If you are experiencing problems displaying events in Chainsaw, please delete everything in the $user.dir/.chainsaw directory and restart Chainsaw.
<br>
<h1>1.99.99</h1>
+<h2>2 May 2010</h2>
+<ul>
+<li>Added preference to line wrap the marker field in the table (multi-line rows)</li>
+</ul>
<h2>16 Apr 2010</h2>
<ul>
<li>Added preference to line wrap the message field in the table (multi-line rows)</li>
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.