package jalview.appletgui;
import jalview.api.AlignViewportI;
+import jalview.api.FinderI;
import jalview.datamodel.SearchResultMatchI;
import jalview.datamodel.SearchResultsI;
import jalview.datamodel.SequenceFeature;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Vector;
public class Finder extends Panel implements ActionListener
{
private SearchResultsI searchResults;
/*
- * sequence index and residue position of last match,
- * for current search and per viewport
+ * Finder agent per viewport searched
*/
- private int seqIndex = 0;
-
- private int resIndex = -1;
-
- Map<AlignViewportI, Integer> seqIndices;
-
- Map<AlignViewportI, Integer> resIndices;
+ Map<AlignViewportI, FinderI> finders;
public Finder(final AlignmentPanel ap)
{
- seqIndices = new HashMap<>();
- resIndices = new HashMap<>();
+ finders = new HashMap<>();
try
{
else if (evt.getSource() == findAll)
{
- resIndex = -1;
- seqIndex = 0;
doSearch(true);
}
else if (evt.getSource() == createFeatures)
{
ap = ap.av.applet.currentAlignFrame.alignPanel;
av = ap.av;
- seqIndex = 0;
- resIndex = -1;
- if (seqIndices.containsKey(av))
- {
- seqIndex = seqIndices.get(av).intValue();
- }
- if (resIndices.containsKey(av))
- {
- resIndex = resIndices.get(av).intValue();
- }
}
createFeatures.setEnabled(false);
- jalview.analysis.Finder finder = new jalview.analysis.Finder(
- av.getAlignment(), av.getSelectionGroup(), seqIndex, resIndex);
- 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);
+ }
+ else
+ {
+ finder.findNext(searchString, isCaseSensitive, doSearchDescription);
+ }
- finder.find(searchString);
-
- seqIndex = finder.getSeqIndex();
- resIndex = finder.getResIndex();
- seqIndices.put(av, seqIndex);
- resIndices.put(av, resIndex);
searchResults = finder.getSearchResults();
- Vector<SequenceI> idMatch = finder.getIdMatch();
- ap.idPanel.highlightSearchResults(idMatch);
+ List<SequenceI> idMatches = finder.getIdMatches();
+ ap.idPanel.highlightSearchResults(idMatches);
if (searchResults.isEmpty())
{
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"));
- resIndex = -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
+ if (idMatches.size() > 0 && searchResults != null
&& searchResults.getSize() > 0)
{
message += " and ";