*/
package jalview.gui;
-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.jbgui.GFinder;
-import jalview.util.MessageManager;
-
import java.awt.Dimension;
-import java.awt.Graphics;
import java.awt.event.ActionEvent;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
+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.jbgui.GFinder;
+import jalview.util.MessageManager;
+
/**
* Performs the menu option for searching the alignment, for the next or all
* matches. If matches are found, they are highlighted, and the user has the
private SearchResultsI searchResults;
+ /*
+ * true if Finder always acts on the same alignment,
+ * false if it acts on the alignment with focus
+ */
+ private boolean focusFixed;
+
/**
* Constructor given an associated alignment panel. Constructs and displays an
- * internal frame where the user can enter a search string.
+ * internal frame where the user can enter a search string. The Finder may
+ * have 'fixed focus' (always act the panel for which it is constructed), or
+ * not (acts on the alignment that has focus). An optional 'scope' may be
+ * added to be shown in the title of the Finder frame.
*
* @param alignPanel
+ * @param fixedFocus
+ * @param scope
*/
- public Finder(AlignmentPanel alignPanel)
+ public Finder(AlignmentPanel alignPanel, boolean fixedFocus, String scope)
{
av = alignPanel.getAlignViewport();
ap = alignPanel;
+ focusFixed = fixedFocus;
finders = new HashMap<>();
frame = new JInternalFrame();
frame.setContentPane(this);
frame.setLayer(JLayeredPane.PALETTE_LAYER);
- frame.addInternalFrameListener(
- new InternalFrameAdapter()
- {
- @Override
- public void internalFrameClosing(InternalFrameEvent e)
- {
- closeAction();
- }
- });
+ frame.addInternalFrameListener(new InternalFrameAdapter()
+ {
+ @Override
+ public void internalFrameClosing(InternalFrameEvent e)
+ {
+ closeAction();
+ }
+ });
+ frame.addFocusListener(new FocusAdapter()
+ {
+ @Override
+ public void focusGained(FocusEvent e)
+ {
+ /*
+ * ensure 'ignore hidden columns' is only enabled
+ * if the alignment with focus has hidden columns
+ */
+ getFocusedViewport();
+ }
+ });
+
addEscapeHandler();
- Desktop.addInternalFrame(frame, MessageManager.getString("label.find"),
- MY_WIDTH, MY_HEIGHT);
+ String title = MessageManager.getString("label.find");
+ if (scope != null)
+ {
+ title += " " + scope;
+ }
+ Desktop.addInternalFrame(frame, title, MY_WIDTH, MY_HEIGHT);
frame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT));
searchBox.requestFocus();
}
/**
* if !focusfixed and not in a desktop environment, checks that av and ap are
* valid. Otherwise, gets the topmost alignment window and sets av and ap
- * accordingly. Also sets the 'ignore hidden' checkbox disabled if the viewport
- * has no hidden columns.
+ * accordingly. Also sets the 'ignore hidden' checkbox disabled if the
+ * viewport has no hidden columns.
*
* @return false if no alignment window was found
*/
boolean getFocusedViewport()
{
- if (Desktop.desktop == null)
+ if (focusFixed || Desktop.desktop == null)
{
if (ap != null && av != null)
{
+ ignoreHidden.setEnabled(av.hasHiddenColumns());
return true;
}
// we aren't in a desktop environment, so give up now.
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,
ap.alignFrame.requestFocus();
}
}
-
- @Override
- protected void paintComponent(Graphics g)
- {
- /*
- * enable 'hidden regions' option only if
- * 'top' viewport has hidden columns
- */
- getFocusedViewport();
- super.paintComponent(g);
- }
}
*/
package jalview.gui;
-import jalview.api.AlignViewControllerGuiI;
-import jalview.api.FeatureSettingsControllerI;
-import jalview.api.SplitContainerI;
-import jalview.controller.FeatureSettingsControllerGuiI;
-import jalview.datamodel.AlignmentI;
-import jalview.jbgui.GAlignFrame;
-import jalview.jbgui.GSplitFrame;
-import jalview.structure.StructureSelectionManager;
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-import jalview.viewmodel.AlignmentViewport;
-
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
+import jalview.api.AlignViewControllerGuiI;
+import jalview.api.FeatureSettingsControllerI;
+import jalview.api.SplitContainerI;
+import jalview.controller.FeatureSettingsControllerGuiI;
+import jalview.datamodel.AlignmentI;
+import jalview.jbgui.GAlignFrame;
+import jalview.jbgui.GSplitFrame;
+import jalview.structure.StructureSelectionManager;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.viewmodel.AlignmentViewport;
+
/**
* An internal frame on the desktop that hosts a horizontally split view of
* linked DNA and Protein alignments. Additional views can be created in linked
if (c != null && c instanceof AlignFrame)
{
AlignFrame af = (AlignFrame) c;
- new Finder(af.alignPanel);
+ boolean dna = af.getViewport().getAlignment().isNucleotide();
+ String scope = MessageManager.getString("label.in") + " "
+ + (dna ? MessageManager.getString("label.nucleotide")
+ : MessageManager.getString("label.protein"));
+ new Finder(af.alignPanel, true, scope);
}
}
};