JAL-4061 JAL-4062 button in Find dialog to copy highlighted regions to clipboard
[jalview.git] / src / jalview / appletgui / Finder.java
index 286cd5f..167d899 100644 (file)
  */
 package jalview.appletgui;
 
-import jalview.api.AlignViewportI;
-import jalview.datamodel.SearchResultMatchI;
-import jalview.datamodel.SearchResultsI;
-import jalview.datamodel.SequenceFeature;
-import jalview.datamodel.SequenceI;
-import jalview.util.MessageManager;
-
 import java.awt.Button;
 import java.awt.Checkbox;
 import java.awt.Font;
@@ -45,7 +38,14 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Vector;
+
+import jalview.api.AlignViewportI;
+import jalview.api.FinderI;
+import jalview.datamodel.SearchResultMatchI;
+import jalview.datamodel.SearchResultsI;
+import jalview.datamodel.SequenceFeature;
+import jalview.datamodel.SequenceI;
+import jalview.util.MessageManager;
 
 public class Finder extends Panel implements ActionListener
 {
@@ -68,21 +68,13 @@ public class Finder extends Panel implements ActionListener
   private SearchResultsI searchResults;
 
   /*
-   * sequence index and column position of last match,
-   * for current search and per viewport
+   * Finder agent per viewport searched
    */
-  private int seqIndex = 0;
-
-  private int colIndex = -1;
-
-  Map<AlignViewportI, Integer> seqIndices;
-
-  Map<AlignViewportI, Integer> colIndices;
+  Map<AlignViewportI, FinderI> finders;
 
   public Finder(final AlignmentPanel ap)
   {
-    seqIndices = new HashMap<>();
-    colIndices = new HashMap<>();
+    finders = new HashMap<>();
 
     try
     {
@@ -126,8 +118,6 @@ public class Finder extends Panel implements ActionListener
 
     else if (evt.getSource() == findAll)
     {
-      colIndex = -1;
-      seqIndex = 0;
       doSearch(true);
     }
     else if (evt.getSource() == createFeatures)
@@ -164,36 +154,36 @@ public class Finder extends Panel implements ActionListener
     {
       ap = ap.av.applet.currentAlignFrame.alignPanel;
       av = ap.av;
-      seqIndex = 0;
-      colIndex = -1;
-      if (seqIndices.containsKey(av))
-      {
-        seqIndex = seqIndices.get(av).intValue();
-      }
-      if (colIndices.containsKey(av))
-      {
-        colIndex = colIndices.get(av).intValue();
-      }
     }
     createFeatures.setEnabled(false);
-    jalview.analysis.Finder finder = new jalview.analysis.Finder(
-            av.getAlignment(), av.getSelectionGroup(), seqIndex, colIndex);
-    finder.setCaseSensitive(caseSensitive.getState());
-    finder.setIncludeDescription(searchDescription.getState());
-    finder.setFindAll(doFindAll);
+    FinderI finder = finders.get(av);
+    if (finder == null)
+    {
+      /*
+       * first time we searched this viewport
+       */
+      finder = new jalview.analysis.Finder(av);
+      finders.put(av, finder);
+    }
 
     String searchString = textfield.getText();
+    boolean isCaseSensitive = caseSensitive.getState();
+    boolean doSearchDescription = searchDescription.getState();
+    if (doFindAll)
+    {
+      finder.findAll(searchString, isCaseSensitive, doSearchDescription,
+              false, false);
+    }
+    else
+    {
+      finder.findNext(searchString, isCaseSensitive, doSearchDescription,
+              false, false);
+    }
 
-    finder.find(searchString);
-
-    seqIndex = finder.getSequenceIndex();
-    colIndex = finder.getColumnIndex();
-    seqIndices.put(av, seqIndex);
-    colIndices.put(av, colIndex);
     searchResults = finder.getSearchResults();
 
-    Vector<SequenceI> idMatch = finder.getIdMatch();
-    ap.idPanel.highlightSearchResults(idMatch);
+    List<SequenceI> idMatches = finder.getIdMatches();
+    ap.idPanel.highlightSearchResults(idMatches);
 
     if (searchResults.isEmpty())
     {
@@ -209,27 +199,26 @@ public class Finder extends Panel implements ActionListener
     ap.highlightSearchResults(searchResults);
     // TODO: add enablers for 'SelectSequences' or 'SelectColumns' or
     // 'SelectRegion' selection
-    if (idMatch.isEmpty() && searchResults == null)
+    if (idMatches.isEmpty() && searchResults == null)
     {
       ap.alignFrame.statusBar.setText(
               MessageManager.getString("label.finished_searching"));
-      colIndex = -1;
-      seqIndex = 0;
     }
     else
     {
       if (doFindAll)
       {
-        String message = (idMatch.size() > 0) ? "" + idMatch.size() + " IDs"
+        String message = (idMatches.size() > 0)
+                ? "" + idMatches.size() + " IDs"
                 : "";
-        if (idMatch.size() > 0 && searchResults != null
-                && searchResults.getSize() > 0)
+        if (idMatches.size() > 0 && searchResults != null
+                && searchResults.getCount() > 0)
         {
           message += " and ";
         }
         if (searchResults != null)
         {
-          message += searchResults.getSize() + " subsequence matches.";
+          message += searchResults.getCount() + " subsequence matches.";
         }
         ap.alignFrame.statusBar.setText(MessageManager
                 .formatMessage("label.search_results", new String[]