psmith      2003/12/13 18:40:18

  Modified:    src/java/org/apache/log4j/chainsaw LogPanel.java
  Log:
  Modified the way the LogPanel updates the filter when the user types
  something in the Refine focus text box.
  
  By using a background thread to delay the filtering until the user has
  stopped typing, this defers costly filtering unnecessarily.
  
  Revision  Changes    Path
  1.32      +81 -26    jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java
  
  Index: LogPanel.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/LogPanel.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- LogPanel.java     13 Dec 2003 02:57:23 -0000      1.31
  +++ LogPanel.java     14 Dec 2003 02:40:18 -0000      1.32
  @@ -548,32 +548,7 @@
         });
   
       filterText.getDocument().addDocumentListener(
  -      new DocumentListener() {
  -        public void insertUpdate(DocumentEvent e) {
  -          setFilter();
  -        }
  -
  -        public void removeUpdate(DocumentEvent e) {
  -          setFilter();
  -        }
  -
  -        public void changedUpdate(DocumentEvent e) {
  -          setFilter();
  -        }
  -
  -        public void setFilter() {
  -          if (filterText.getText().equals("")) {
  -            ruleMediator.setRefinementRule(null);
  -          } else {
  -              try {
  -                
ruleMediator.setRefinementRule(ExpressionRule.getRule(filterText.getText()));
  -                filterText.setToolTipText("Enter expression");
  -              } catch (IllegalArgumentException iae) {
  -                  filterText.setToolTipText(iae.getMessage());
  -              }
  -          }
  -        }
  -      });
  +      new DelayedFilterTextDocumentListener(filterText, ruleMediator));
   
       upperPanel.add(filterText, BorderLayout.CENTER);
       upperPanel.add(upperLeftPanel, BorderLayout.WEST);
  @@ -1901,6 +1876,86 @@
      */
     public final LogPanelPreferenceModel getPreferenceModel() {
       return preferenceModel;
  +  }
  +
  +  /**
  +   * This class receives notification when the Refine focus text field is 
  +   * updated, where a backgrounh thread periodically wakes up and
  +   * checks if they have stopped typing yet.
  +   * 
  +   * This ensures that the filtering of the model is not done 
  +   * for every single character typed.
  +   * 
  +   * @author Paul Smith <[EMAIL PROTECTED]>
  +   *
  +   */
  +  private final class DelayedFilterTextDocumentListener implements DocumentListener 
{
  +    private final JTextField filterText;
  +    private final RuleMediator ruleMediator;
  +    private long lastTimeStamp = System.currentTimeMillis();
  +    private final Thread delayThread;
  +    private final long CHECK_PERIOD = 1000;
  +    private DelayedFilterTextDocumentListener(JTextField filterText, RuleMediator 
ruleMediator) {
  +      super();
  +      this.filterText = filterText;
  +      this.ruleMediator = ruleMediator;
  +      
  +      this.delayThread = new Thread(new Runnable() {
  +
  +        public void run() {
  +            while (true) {
  +              try {
  +                Thread.sleep(CHECK_PERIOD);
  +              } catch (InterruptedException e) {
  +              }
  +              if ((System.currentTimeMillis() - lastTimeStamp)
  +                < CHECK_PERIOD) {
  +                // They typed something since the last check. we ignor
  +                // this for a sample period
  +//                LogLog.debug("Typed something since the last check");
  +              } else if (
  +                (System.currentTimeMillis() - lastTimeStamp)
  +                  < (2 * CHECK_PERIOD)) {
  +                // they stopped typing recently, but have stopped for at least
  +                // 1 sample period. lets apply the filter
  +//                LogLog.debug("Typed something recently applying filter");
  +                setFilter();
  +              } else {
  +                // they stopped typing a while ago, let's forget about it
  +//                LogLog.debug(
  +//                  "They stoppped typing a while ago, assuming filter has been 
applied");
  +              }
  +            }
  +        }});
  +      
  +      delayThread.setPriority(Thread.MIN_PRIORITY);
  +      delayThread.start();
  +    }
  +    public void insertUpdate(DocumentEvent e) {
  +      notifyChange();
  +    }
  +    public void removeUpdate(DocumentEvent e) {
  +      notifyChange();
  +    }
  +    public void changedUpdate(DocumentEvent e) {
  +      notifyChange();
  +    }
  +    private void notifyChange() {
  +      this.lastTimeStamp = System.currentTimeMillis();
  +      
  +    }
  +    public void setFilter() {
  +      if (filterText.getText().equals("")) {
  +        ruleMediator.setRefinementRule(null);
  +      } else {
  +          try {
  +            
ruleMediator.setRefinementRule(ExpressionRule.getRule(filterText.getText()));
  +            filterText.setToolTipText("Enter expression");
  +          } catch (IllegalArgumentException iae) {
  +              filterText.setToolTipText(iae.getMessage());
  +          }
  +      }
  +    }
     }
   
     private final class TableColumnDetailMouseListener extends MouseMotionAdapter
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to