*/
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"),
- true, MY_WIDTH, MY_HEIGHT, true, true);
+ 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.getComponent().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.
if (doFindAll)
{
// then we report the matches that were found
- String message = (idMatch.size() > 0) ? "" + idMatch.size() + " IDs"
- : "";
+ StringBuilder message = new StringBuilder();
+ if (idMatch.size() > 0)
+ {
+ message.append(idMatch.size()).append(" IDs");
+ }
if (searchResults != null)
{
if (idMatch.size() > 0 && searchResults.getCount() > 0)
{
- message += " and ";
+ message.append(" ").append(
+ MessageManager.getString("label.and").toLowerCase())
+ .append(" ");
}
- message += searchResults.getCount()
- + " subsequence matches found.";
+ message.append(MessageManager.formatMessage(
+ "label.subsequence_matches_found",
+ searchResults.getCount()));
}
- JvOptionPane.showInternalMessageDialog(this, message, null,
- JvOptionPane.PLAIN_MESSAGE);
+ JvOptionPane.showInternalMessageDialog(this, message.toString(),
+ null, JvOptionPane.INFORMATION_MESSAGE);
}
}
}
ap.alignFrame.requestFocus();
}
}
-
- @Override
- protected void paintComponent(Graphics g)
- {
- /*
- * enable 'hidden regions' option only if
- * 'top' viewport has hidden columns
- */
- getFocusedViewport();
- super.paintComponent(g);
- }
}