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]