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]

Reply via email to