sdeboy 2004/07/28 23:05:58
Modified: src/java/org/apache/log4j/chainsaw
ChainsawCyclicBufferTableModel.java LogPanel.java
Log:
- Modified detail pane update implementation in an attempt to improve swing thread
safety.
- Notifying table model listeners from inside swing thread
Revision Changes Path
1.34 +30 -16
logging-log4j/src/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java
Index: ChainsawCyclicBufferTableModel.java
===================================================================
RCS file:
/home/cvs/logging-log4j/src/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- ChainsawCyclicBufferTableModel.java 28 Jul 2004 08:02:17 -0000 1.33
+++ ChainsawCyclicBufferTableModel.java 29 Jul 2004 06:05:58 -0000 1.34
@@ -134,17 +134,19 @@
} finally {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
- if (previousSize == filteredList.size()) {
- //same - update all
- fireTableRowsUpdated(0, filteredList.size() -
1);
- } else if (previousSize > filteredList.size()) {
- //less now..update and delete difference
- fireTableRowsUpdated(0, filteredList.size() -
1);
- fireTableRowsDeleted(filteredList.size(),
previousSize);
- } else if (previousSize < filteredList.size()) {
- //more now..update and insert difference
- fireTableRowsUpdated(0, previousSize - 1);
- fireTableRowsInserted(previousSize,
filteredList.size() - 1);
+ if (filteredList.size() > 0) {
+ if (previousSize == filteredList.size()) {
+ //same - update all
+ fireTableRowsUpdated(0, filteredList.size() -
1);
+ } else if (previousSize > filteredList.size()) {
+ //less now..update and delete difference
+ fireTableRowsUpdated(0, filteredList.size() -
1);
+ fireTableRowsDeleted(filteredList.size(),
previousSize);
+ } else if (previousSize < filteredList.size() &&
previousSize > 0) {
+ //more now..update and insert difference
+ fireTableRowsUpdated(0, previousSize - 1);
+ fireTableRowsInserted(previousSize,
filteredList.size() - 1);
+ }
}
notifyCountListeners();
}});
@@ -245,7 +247,7 @@
* @see org.apache.log4j.chainsaw.EventContainer#sort()
*/
public void sort() {
- if (sortEnabled) {
+ if (sortEnabled && filteredList.size() > 0) {
synchronized (filteredList) {
Collections.sort(
filteredList,
@@ -254,7 +256,11 @@
currentSortAscending));
}
- fireTableRowsUpdated(0, Math.max(filteredList.size() - 1, 0));
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ fireTableRowsUpdated(0, Math.max(filteredList.size() -
1, 0));
+ }
+ });
}
}
@@ -283,7 +289,12 @@
uniqueRow = 0;
}
- fireTableDataChanged();
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ fireTableDataChanged();
+ }
+ });
+
notifyCountListeners();
}
@@ -342,7 +353,7 @@
LoggingEvent event = null;
synchronized (filteredList) {
- if (rowIndex < filteredList.size()) {
+ if (rowIndex < filteredList.size() && rowIndex > -1) {
event = (LoggingEvent) filteredList.get(rowIndex);
}
}
@@ -497,7 +508,9 @@
return last;
}
- public void fireTableEvent(int begin, int end, int count) {
+ public void fireTableEvent(final int begin, final int end, final int count) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
if (cyclic) {
if (!reachedCapacity) {
//if we didn't loop and it's the 1st time, insert
@@ -515,6 +528,7 @@
} else {
fireTableRowsInserted(begin, end);
}
+ }});
}
/**
1.87 +38 -31 logging-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java
Index: LogPanel.java
===================================================================
RCS file: /home/cvs/logging-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -r1.86 -r1.87
--- LogPanel.java 28 Jul 2004 08:02:17 -0000 1.86
+++ LogPanel.java 29 Jul 2004 06:05:58 -0000 1.87
@@ -50,6 +50,7 @@
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
+import java.io.StringReader;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.NumberFormat;
@@ -107,6 +108,7 @@
import javax.swing.event.TableModelListener;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
+import javax.swing.text.Document;
import org.apache.log4j.Layout;
import org.apache.log4j.PatternLayout;
@@ -2672,8 +2674,6 @@
* Update detail pane
*/
private void updateDetailPane() {
- String text = null;
-
/*
* Don't bother doing anything if it's not visible
*/
@@ -2681,35 +2681,42 @@
return;
}
- if (selectedRow != -1) {
- LoggingEvent event = tableModel.getRow(selectedRow);
-
- if (event != null) {
- StringBuffer buf = new StringBuffer();
- buf.append(detailLayout.getHeader())
- .append(detailLayout.format(event)).append(
- detailLayout.getFooter());
- text = buf.toString();
- }
- }
-
- if (!((text != null) && !text.equals(""))) {
- text = "<html>Nothing selected</html>";
- }
-
- final String text2 = text;
- SwingUtilities.invokeLater(
- new Runnable() {
- public void run() {
- try {
- detail.setText(text2);
- detail.validate();
- if (text2.length() > 0) {
- detail.setCaretPosition(0);
- }
- } catch (Exception e){} //ignore
- }
- });
+ LoggingEvent event = null;
+ if (selectedRow != -1) {
+ event = tableModel.getRow(selectedRow);
+
+ if (event != null) {
+ final StringBuffer buf = new StringBuffer();
+ buf.append(detailLayout.getHeader())
+ .append(detailLayout.format(event)).append(
+ detailLayout.getFooter());
+ if (buf.length() > 0) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ Document doc =
detail.getEditorKit().createDefaultDocument();
+ detail.getEditorKit().read(new
StringReader(buf.toString()), doc, 0);
+ detail.setDocument(doc);
+ detail.setCaretPosition(0);
+ } catch (Exception e) {}
+ }
+ });
+ }
+ }
+ }
+
+ if (event == null) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ Document doc =
detail.getEditorKit().createDefaultDocument();
+ detail.getEditorKit().read(new
StringReader("<html>Nothing selected</html>"), doc, 0);
+ detail.setDocument(doc);
+ detail.setCaretPosition(0);
+ } catch (Exception e) {}
+ }
+ });
+ }
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]