You are viewing a plain text version of this content. The canonical link for it is here.
Posted to general@logging.apache.org by sd...@apache.org on 2010/08/04 09:29:03 UTC

svn commit: r982145 - in /logging/chainsaw/trunk/src/main/java/org/apache/log4j/chainsaw: ChainsawCyclicBufferTableModel.java LogPanel.java

Author: sdeboy
Date: Wed Aug  4 07:29:03 2010
New Revision: 982145

URL: http://svn.apache.org/viewvc?rev=982145&view=rev
Log:
Now reselecting the previously selected row after a refilter operation
Also updated code to ensure requested row in a call to scrollToRow is determined on the EDT

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

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=982145&r1=982144&r2=982145&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 Wed Aug  4 07:29:03 2010
@@ -17,6 +17,7 @@
 
 package org.apache.log4j.chainsaw;
 
+import java.awt.EventQueue;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
@@ -128,6 +129,8 @@ class ChainsawCyclicBufferTableModel ext
     final int previousSize;
     final int newSize;
           synchronized (mutex) {
+            //post refilter with newValue of TRUE (filtering is about to begin)
+            propertySupport.firePropertyChange("refilter", Boolean.FALSE, Boolean.TRUE);
             previousSize = filteredList.size();
             filteredList.clear();
             if (displayRule == null) {
@@ -175,6 +178,12 @@ class ChainsawCyclicBufferTableModel ext
       				fireTableDataChanged();
       			}
 	      	notifyCountListeners();
+            //post refilter with newValue of FALSE (filtering is complete) (enqueue on EDT, don't run now)
+            EventQueue.invokeLater(new Runnable() {
+                public void run() {
+                    propertySupport.firePropertyChange("refilter", Boolean.TRUE, Boolean.FALSE);
+                }
+            });
       	}});
   }
 

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=982145&r1=982144&r2=982145&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 Wed Aug  4 07:29:03 2010
@@ -987,6 +987,42 @@ public class LogPanel extends DockablePa
         }
       });
 
+    //if the table is refiltered, try to reselect the last selected row
+    //refilter with a newValue of TRUE means refiltering is about to begin
+    //refilter with a newValue of FALSE means refiltering is complete
+    tableModel.addPropertyChangeListener("refilter", new PropertyChangeListener() {
+        private LoggingEvent currentEvent;
+        public void propertyChange(PropertyChangeEvent evt) {
+            //if new value is true, filtering is about to begin
+            //if new value is false, filtering is complete
+            if (evt.getNewValue().equals(Boolean.TRUE)) {
+                currentEvent = tableModel.getRow(table.getSelectedRow());
+            } else {
+                //events are still coming in..wait until all events are added before resetting current row
+                new Thread(new Runnable() {
+                    public void run() {
+                        try
+                        {
+                            Thread.sleep(500);
+                        }
+                        catch (InterruptedException e)
+                        {
+                            e.printStackTrace();
+                        }
+                        EventQueue.invokeLater(new Runnable() {
+                            public void run() {
+                                //refilter is about to begin...get current selected row
+                                if (currentEvent != null) {
+                                    table.scrollToRow(tableModel.getRowIndex(currentEvent));
+                                }
+                            }
+                        });
+                    }
+                }).start();
+            }
+        }
+    });
+
     table.getTableHeader().addMouseListener(
       new MouseAdapter() {
         public void mouseClicked(MouseEvent e) {
@@ -1716,11 +1752,11 @@ public class LogPanel extends DockablePa
   }
   
   private void scrollToBottom() {
-    final int scrollRow = tableModel.getRowCount() - 1;
     EventQueue.invokeLater(new Runnable()
     {
         public void run()
         {
+            int scrollRow = tableModel.getRowCount() - 1;
             table.scrollToRow(scrollRow);
         }
     });
@@ -1728,9 +1764,13 @@ public class LogPanel extends DockablePa
 
   public void scrollToTop()
   {
-    if (tableModel.getRowCount() > 1) {
-        table.scrollToRow(0);
-    }
+      EventQueue.invokeLater(new Runnable() {
+          public void run() {
+              if (tableModel.getRowCount() > 1) {
+                  table.scrollToRow(0);
+              }
+          }
+      });
   }
 
   /**
@@ -2096,7 +2136,7 @@ public class LogPanel extends DockablePa
    * and placing it inside it's own JFrame.
    */
   void undock() {
-  	int row = table.getSelectedRow();
+  	final int row = table.getSelectedRow();
     setDocked(false);
     externalPanel.removeAll();
     findPanel.removeAll();
@@ -2121,7 +2161,11 @@ public class LogPanel extends DockablePa
     dockingAction.putValue(Action.NAME, "Dock");
     dockingAction.putValue(Action.SMALL_ICON, ChainsawIcons.ICON_DOCK);
     if (row > -1) {
-    	table.scrollToRow(row);
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                table.scrollToRow(row);
+            }
+        });
     }
   }
 
@@ -2578,17 +2622,25 @@ public class LogPanel extends DockablePa
   }
 
   public void findNextColorizedEvent() {
-    int nextRow = tableModel.findColoredRow(table.getSelectedRow() + 1, true);        
-    if (nextRow > -1) {
-      table.scrollToRow(nextRow);
-    }
+    EventQueue.invokeLater(new Runnable() {
+        public void run() {
+            final int nextRow = tableModel.findColoredRow(table.getSelectedRow() + 1, true);
+            if (nextRow > -1) {
+                table.scrollToRow(nextRow);
+            }
+        }
+    });
   }
 
   public void findPreviousColorizedEvent() {
-    int previousRow = tableModel.findColoredRow(table.getSelectedRow() - 1, false);
-    if (previousRow > -1) {
-      table.scrollToRow(previousRow);
-    }
+    EventQueue.invokeLater(new Runnable() {
+        public void run() {
+            final int previousRow = tableModel.findColoredRow(table.getSelectedRow() - 1, false);
+            if (previousRow > -1) {
+                table.scrollToRow(previousRow);
+            }
+        }
+    });
   }
 
   /**
@@ -2600,23 +2652,27 @@ public class LogPanel extends DockablePa
     updateFindRule(findField.getText());
 
     if (findRule != null) {
-      try {
-        int filteredEventsSize = getFilteredEvents().size();
-        int startRow = table.getSelectedRow() + 1;
-          if (startRow > filteredEventsSize - 1) {
-              startRow = 0;
-          }
-        //no selected row would return -1, so we'd start at row zero
-        int nextRow = tableModel.locate(findRule, startRow, true);
-
-        if (nextRow > -1) {
-          table.scrollToRow(nextRow);
-          findField.setToolTipText("Enter an expression");
-        }
-      } catch (IllegalArgumentException iae) {
-        findField.setToolTipText(iae.getMessage());
-        colorizer.setFindRule(null);
-      }
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                try {
+                  int filteredEventsSize = getFilteredEvents().size();
+                  int startRow = table.getSelectedRow() + 1;
+                    if (startRow > filteredEventsSize - 1) {
+                        startRow = 0;
+                    }
+                  //no selected row would return -1, so we'd start at row zero
+                  final int nextRow = tableModel.locate(findRule, startRow, true);
+
+                  if (nextRow > -1) {
+                    table.scrollToRow(nextRow);
+                    findField.setToolTipText("Enter an expression");
+                  }
+                } catch (IllegalArgumentException iae) {
+                  findField.setToolTipText(iae.getMessage());
+                  colorizer.setFindRule(null);
+                }
+            }
+        });
     }
   }
 
@@ -2629,21 +2685,25 @@ public class LogPanel extends DockablePa
     updateFindRule(findField.getText());
 
     if (findRule != null) {
-      try {
-        int startRow = table.getSelectedRow() - 1;
-        int filteredEventsSize = getFilteredEvents().size();
-        if (startRow < 0) {
-            startRow = filteredEventsSize - 1;
-        }
-        final int previousRow = tableModel.locate(findRule, startRow, false);
-
-        if (previousRow > -1) {
-          table.scrollToRow(previousRow);
-          findField.setToolTipText("Enter an expression");
-        }
-      } catch (IllegalArgumentException iae) {
-        findField.setToolTipText(iae.getMessage());
-      }
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                try {
+                    int startRow = table.getSelectedRow() - 1;
+                    int filteredEventsSize = getFilteredEvents().size();
+                    if (startRow < 0) {
+                        startRow = filteredEventsSize - 1;
+                    }
+                    final int previousRow = tableModel.locate(findRule, startRow, false);
+
+                    if (previousRow > -1) {
+                        table.scrollToRow(previousRow);
+                        findField.setToolTipText("Enter an expression");
+                    }
+                } catch (IllegalArgumentException iae) {
+                  findField.setToolTipText(iae.getMessage());
+                }
+            }
+        });
     }
   }
 
@@ -2653,7 +2713,7 @@ public class LogPanel extends DockablePa
    */
   private void dock() {
   	
-  	int row = table.getSelectedRow();
+  	final int row = table.getSelectedRow();
     setDocked(true);
     undockedFrame.setVisible(false);
     removeAll();
@@ -2663,7 +2723,11 @@ public class LogPanel extends DockablePa
     dockingAction.putValue(Action.NAME, "Undock");
     dockingAction.putValue(Action.SMALL_ICON, ChainsawIcons.ICON_UNDOCK);
     if (row > -1) {
-    	table.scrollToRow(row);
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                table.scrollToRow(row);
+            }
+        });
     }
   }
 
@@ -2797,29 +2861,37 @@ public class LogPanel extends DockablePa
   }
 
     public void findNextMarker() {
-      int startRow = table.getSelectedRow() + 1;
-      int filteredEventsSize = getFilteredEvents().size();
-      if (startRow > filteredEventsSize - 1) {
-          startRow = 0;
-      }
-      final int nextRow = tableModel.locate(findMarkerRule, startRow, true);
+      EventQueue.invokeLater(new Runnable() {
+          public void run() {
+              int startRow = table.getSelectedRow() + 1;
+              int filteredEventsSize = getFilteredEvents().size();
+              if (startRow > filteredEventsSize - 1) {
+                  startRow = 0;
+              }
+              final int nextRow = tableModel.locate(findMarkerRule, startRow, true);
 
-      if (nextRow > -1) {
-        table.scrollToRow(nextRow);
-      }
+              if (nextRow > -1) {
+                  table.scrollToRow(nextRow);
+              }
+          }
+      });
     }
 
     public void findPreviousMarker() {
-        int startRow = table.getSelectedRow() - 1;
-        int filteredEventsSize = getFilteredEvents().size();
-        if (startRow < 0) {
-            startRow = filteredEventsSize - 1;
-        }
-        final int previousRow = tableModel.locate(findMarkerRule, startRow, false);
+        EventQueue.invokeLater(new Runnable() {
+            public void run() {
+                int startRow = table.getSelectedRow() - 1;
+                int filteredEventsSize = getFilteredEvents().size();
+                if (startRow < 0) {
+                    startRow = filteredEventsSize - 1;
+                }
+                final int previousRow = tableModel.locate(findMarkerRule, startRow, false);
 
-        if (previousRow > -1) {
-          table.scrollToRow(previousRow);
-        }
+                if (previousRow > -1) {
+                    table.scrollToRow(previousRow);
+                }
+            }
+        });
     }
 
     public void clearAllMarkers() {