JAL-2071 improvement to reduce webservice requests to Free Text Search (FTS) services...
[jalview.git] / src / jalview / fts / core / GFTSPanel.java
index 67983a1..cae271d 100644 (file)
@@ -35,6 +35,8 @@ import java.awt.CardLayout;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
@@ -57,6 +59,7 @@ import javax.swing.JScrollPane;
 import javax.swing.JTabbedPane;
 import javax.swing.JTable;
 import javax.swing.JTextField;
+import javax.swing.Timer;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 import javax.swing.event.DocumentEvent;
@@ -354,24 +357,29 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI
       }
     });
 
-    txt_search.getDocument().addDocumentListener(new DocumentListener()
+    final DeferredTextInputListener listener = new DeferredTextInputListener(
+            500,
+            new ActionListener()
+            {
+              @Override
+              public void actionPerformed(ActionEvent e)
+              {
+                searchAction();
+              }
+            }, false);
+    txt_search.getDocument().addDocumentListener(listener);
+    txt_search.addFocusListener(new FocusListener()
     {
       @Override
-      public void insertUpdate(DocumentEvent e)
+      public void focusGained(FocusEvent e)
       {
-        searchAction();
-      }
-
-      @Override
-      public void removeUpdate(DocumentEvent e)
-      {
-        searchAction();
+        listener.start();
       }
 
       @Override
-      public void changedUpdate(DocumentEvent e)
+      public void focusLost(FocusEvent e)
       {
-        searchAction();
+        listener.stop();
       }
     });
 
@@ -444,6 +452,47 @@ public abstract class GFTSPanel extends JPanel implements GFTSPanelI
     Desktop.addInternalFrame(mainFrame, getFTSFrameTitle(), 800, 400);
   }
 
+  public class DeferredTextInputListener implements DocumentListener
+  {
+    private final Timer swingTimer;
+
+    public DeferredTextInputListener(int timeOut, ActionListener listener,
+            boolean repeats)
+    {
+      swingTimer = new Timer(timeOut, listener);
+      swingTimer.setRepeats(repeats);
+    }
+
+    public void start()
+    {
+      swingTimer.start();
+    }
+
+    public void stop()
+    {
+      swingTimer.stop();
+    }
+
+    @Override
+    public void insertUpdate(DocumentEvent e)
+    {
+      swingTimer.restart();
+    }
+
+    @Override
+    public void removeUpdate(DocumentEvent e)
+    {
+      swingTimer.restart();
+    }
+
+    @Override
+    public void changedUpdate(DocumentEvent e)
+    {
+      swingTimer.restart();
+    }
+
+  }
+
   public boolean wantedFieldsUpdated()
   {
     if (previousWantedFields == null)