*/
package jalview.gui;
+import jalview.api.AlignViewportI;
import jalview.datamodel.SearchResultMatchI;
import jalview.datamodel.SearchResultsI;
import jalview.datamodel.SequenceFeature;
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;
*/
public class Finder extends GFinder
{
+ private static final int MIN_WIDTH = 350;
+
+ private static final int MIN_HEIGHT = 120;
+
private static final int MY_HEIGHT = 120;
private static final int MY_WIDTH = 400;
- AlignmentViewport av;
+ private AlignViewportI av;
- AlignmentPanel ap;
+ private AlignmentPanel ap;
- private static final int MIN_WIDTH = 350;
+ private JInternalFrame frame;
- private static final int MIN_HEIGHT = 120;
+ /*
+ * sequence and column position of the last match,
+ * as currently used, and saved for each viewport
+ */
+ private int seqIndex = 0;
- JInternalFrame frame;
+ private int resIndex = -1;
- int seqIndex = 0;
+ Map<AlignViewportI, Integer> seqIndices;
- int resIndex = -1;
+ Map<AlignViewportI, Integer> resIndices;
- SearchResultsI searchResults;
+ private SearchResultsI searchResults;
/**
* Creates a new Finder object with no associated viewport or panel.
{
av = viewport;
ap = alignPanel;
+ seqIndices = new HashMap<>();
+ resIndices = new HashMap<>();
focusfixed = true;
frame = new JInternalFrame();
frame.setContentPane(this);
for (int f = 0; f < frames.length; f++)
{
JInternalFrame alignFrame = frames[f];
- if (alignFrame != null && alignFrame instanceof AlignFrame)
+ if (alignFrame != null && alignFrame instanceof AlignFrame
+ && !alignFrame.isIcon())
{
av = ((AlignFrame) alignFrame).viewport;
ap = ((AlignFrame) alignFrame).alignPanel;
+
+ /*
+ * restore search position if switching to a
+ * panel where we have previously searched
+ */
+ seqIndex = 0;
+ resIndex = -1;
+ if (seqIndices.containsKey(av))
+ {
+ seqIndex = seqIndices.get(av).intValue();
+ }
+ if (resIndices.containsKey(av))
+ {
+ resIndex = resIndices.get(av).intValue();
+ }
return true;
}
}
@Override
public void createFeatures_actionPerformed()
{
- List<SequenceI> seqs = new ArrayList<SequenceI>();
- List<SequenceFeature> features = new ArrayList<SequenceFeature>();
+ List<SequenceI> seqs = new ArrayList<>();
+ List<SequenceFeature> features = new ArrayList<>();
String searchString = searchBox.getEditor().getItem().toString().trim();
String desc = "Search Results";
finder.setFindAll(doFindAll);
- finder.find(searchString); // returns true if anything was actually found
+ finder.find(searchString);
seqIndex = finder.getSeqIndex();
resIndex = finder.getResIndex();
+ seqIndices.put(av, seqIndex);
+ resIndices.put(av, resIndex);
- searchResults = finder.getSearchResults(); // find(regex,
- // caseSensitive.isSelected(), )
+ searchResults = finder.getSearchResults();
Vector<SequenceI> idMatch = finder.getIdMatch();
- boolean haveResults = false;
- // set or reset the GUI
- if ((idMatch.size() > 0))
- {
- haveResults = true;
- ap.getIdPanel().highlightSearchResults(idMatch);
- }
- else
- {
- ap.getIdPanel().highlightSearchResults(null);
- }
+ ap.getIdPanel().highlightSearchResults(idMatch);
- if (searchResults.getSize() > 0)
+ if (searchResults.isEmpty())
{
- haveResults = true;
- createFeatures.setEnabled(true);
+ searchResults = null;
}
else
{
- searchResults = null;
+ createFeatures.setEnabled(true);
}
- // if allResults is null, this effectively switches displaySearch flag in
- // seqCanvas
ap.highlightSearchResults(searchResults);
// TODO: add enablers for 'SelectSequences' or 'SelectColumns' or
// 'SelectRegion' selection
- if (!haveResults)
+ if (idMatch.isEmpty() && searchResults == null)
{
JvOptionPane.showInternalMessageDialog(this,
MessageManager.getString("label.finished_searching"), null,