JAL-3210 Barebones gradle/buildship/eclipse. See README
[jalview.git] / src / jalview / gui / Finder.java
index c5b25bf..a1693f7 100755 (executable)
@@ -21,6 +21,7 @@
 package jalview.gui;
 
 import jalview.api.AlignViewportI;
+import jalview.api.FinderI;
 import jalview.datamodel.SearchResultMatchI;
 import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.SequenceFeature;
@@ -29,14 +30,12 @@ import jalview.jbgui.GFinder;
 import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
 
-import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Vector;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
@@ -76,16 +75,9 @@ public class Finder extends GFinder
   private JInternalFrame frame;
 
   /*
-   * sequence and column position of the last match,
-   * as currently used, and saved for each viewport
+   * Finder agent per viewport searched
    */
-  private int seqIndex = 0;
-
-  private int colIndex = -1;
-
-  private Map<AlignViewportI, Integer> seqIndices;
-
-  private Map<AlignViewportI, Integer> colIndices;
+  private Map<AlignViewportI, FinderI> finders;
 
   private SearchResultsI searchResults;
 
@@ -114,8 +106,7 @@ public class Finder extends GFinder
   {
     av = viewport;
     ap = alignPanel;
-    seqIndices = new HashMap<>();
-    colIndices = new HashMap<>();
+    finders = new HashMap<>();
     focusfixed = viewport != null;
     frame = new JInternalFrame();
     frame.setContentPane(this);
@@ -131,9 +122,8 @@ public class Finder extends GFinder
             });
     addEscapeHandler();
     Desktop.addInternalFrame(frame, MessageManager.getString("label.find"),
-            MY_WIDTH, MY_HEIGHT);
-    frame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT));
-    searchBox.requestFocus();
+            true, MY_WIDTH, MY_HEIGHT, true, true);
+    searchBox.getComponent().requestFocus();
   }
 
   /**
@@ -173,8 +163,6 @@ public class Finder extends GFinder
   {
     if (getFocusedViewport())
     {
-      colIndex = -1;
-      seqIndex = 0;
       doSearch(true);
     }
   }
@@ -208,21 +196,6 @@ public class Finder extends GFinder
       {
         av = ((AlignFrame) alignFrame).viewport;
         ap = ((AlignFrame) alignFrame).alignPanel;
-
-        /*
-         * restore search position if switching to a 
-         * panel where we have previously searched
-         */
-        seqIndex = 0;
-        colIndex = -1;
-        if (seqIndices.containsKey(av))
-        {
-          seqIndex = seqIndices.get(av).intValue();
-        }
-        if (colIndices.containsKey(av))
-        {
-          colIndex = colIndices.get(av).intValue();
-        }
         return true;
       }
     }
@@ -231,15 +204,19 @@ public class Finder extends GFinder
 
   /**
    * Opens a dialog that allows the user to create sequence features for the
-   * find match results.
+   * find match results
    */
   @Override
   public void createFeatures_actionPerformed()
   {
+    if (searchResults.isEmpty())
+    {
+      return; // shouldn't happen
+    }
     List<SequenceI> seqs = new ArrayList<>();
     List<SequenceFeature> features = new ArrayList<>();
 
-    String searchString = searchBox.getEditor().getItem().toString().trim();
+    String searchString = searchBox.getUserInput();
     String desc = "Search Results";
 
     /*
@@ -249,22 +226,11 @@ public class Finder extends GFinder
     for (SearchResultMatchI match : searchResults.getResults())
     {
       seqs.add(match.getSequence().getDatasetSequence());
-      features.add(new SequenceFeature(searchString, desc,
-              match
-              .getStart(), match.getEnd(), desc));
+      features.add(new SequenceFeature(searchString, desc, match.getStart(),
+              match.getEnd(), desc));
     }
 
-    if (ap.getSeqPanel().seqCanvas.getFeatureRenderer().amendFeatures(seqs,
-            features, true, ap))
-    {
-      /*
-       * ensure feature display is turned on to show the new features,
-       * and remove them as highlighted regions
-       */
-      ap.alignFrame.showSeqFeatures.setSelected(true);
-      av.setShowSequenceFeatures(true);
-      ap.highlightSearchResults(null);
-    }
+    new FeatureEditor(ap, seqs, features, true).showDialog();
   }
 
   /**
@@ -277,7 +243,7 @@ public class Finder extends GFinder
   {
     createFeatures.setEnabled(false);
 
-    String searchString = searchBox.getUserInput().trim();
+    String searchString = searchBox.getUserInput();
 
     if (isInvalidSearchString(searchString))
     {
@@ -287,22 +253,29 @@ public class Finder extends GFinder
     // other stuff
     // TODO: add switches to control what is searched - sequences, IDS,
     // descriptions, features
-    jalview.analysis.Finder finder = new jalview.analysis.Finder(
-            av.getAlignment(), av.getSelectionGroup(), seqIndex, colIndex);
-    finder.setCaseSensitive(caseSensitive.isSelected());
-    finder.setIncludeDescription(searchDescription.isSelected());
-
-    finder.setFindAll(doFindAll);
-
-    finder.find(searchString);
+    FinderI finder = finders.get(av);
+    if (finder == null)
+    {
+      /*
+       * first time we've searched this viewport
+       */
+      finder = new jalview.analysis.Finder(av);
+      finders.put(av, finder);
+    }
 
-    seqIndex = finder.getSequenceIndex();
-    colIndex = finder.getColumnIndex();
-    seqIndices.put(av, seqIndex);
-    colIndices.put(av, colIndex);
+    boolean isCaseSensitive = caseSensitive.isSelected();
+    boolean doSearchDescription = searchDescription.isSelected();
+    if (doFindAll)
+    {
+      finder.findAll(searchString, isCaseSensitive, doSearchDescription);
+    }
+    else
+    {
+      finder.findNext(searchString, isCaseSensitive, doSearchDescription);
+    }
 
     searchResults = finder.getSearchResults();
-    Vector<SequenceI> idMatch = finder.getIdMatch();
+    List<SequenceI> idMatch = finder.getIdMatches();
     ap.getIdPanel().highlightSearchResults(idMatch);
 
     if (searchResults.isEmpty())
@@ -314,6 +287,8 @@ public class Finder extends GFinder
       createFeatures.setEnabled(true);
     }
 
+    searchBox.updateCache();
+
     ap.highlightSearchResults(searchResults);
     // TODO: add enablers for 'SelectSequences' or 'SelectColumns' or
     // 'SelectRegion' selection
@@ -321,9 +296,7 @@ public class Finder extends GFinder
     {
       JvOptionPane.showInternalMessageDialog(this,
               MessageManager.getString("label.finished_searching"), null,
-              JvOptionPane.INFORMATION_MESSAGE);
-      colIndex = -1;
-      seqIndex = 0;
+              JvOptionPane.PLAIN_MESSAGE);
     }
     else
     {
@@ -342,12 +315,9 @@ public class Finder extends GFinder
                   + " subsequence matches found.";
         }
         JvOptionPane.showInternalMessageDialog(this, message, null,
-                JvOptionPane.INFORMATION_MESSAGE);
-        colIndex = -1;
-        seqIndex = 0;
+                JvOptionPane.PLAIN_MESSAGE);
       }
     }
-    searchBox.updateCache();
   }
 
   /**