From 9b1c962f206a68347e02f6138767185478e4c426 Mon Sep 17 00:00:00 2001 From: gmungoc Date: Sun, 29 Nov 2020 17:55:15 +0000 Subject: [PATCH] JAL-3774 fixed focus Finder from split frame --- resources/lang/Messages.properties | 1 + resources/lang/Messages_es.properties | 1 + src/jalview/gui/AlignFrame.java | 2 +- src/jalview/gui/Finder.java | 98 +++++++++++++++++++-------------- src/jalview/gui/SplitFrame.java | 30 +++++----- 5 files changed, 78 insertions(+), 54 deletions(-) diff --git a/resources/lang/Messages.properties b/resources/lang/Messages.properties index 496fad0..a71268b 100644 --- a/resources/lang/Messages.properties +++ b/resources/lang/Messages.properties @@ -1164,6 +1164,7 @@ label.add_annotations_for = Add annotations for action.choose_annotations = Choose Annotations... label.choose_annotations = Choose Annotations label.find = Find +label.in = in label.invalid_search = Search string invalid error.invalid_regex = Invalid regular expression label.ignore_gaps_consensus = Ignore Gaps In Consensus diff --git a/resources/lang/Messages_es.properties b/resources/lang/Messages_es.properties index 6364f5e..4b46255 100644 --- a/resources/lang/Messages_es.properties +++ b/resources/lang/Messages_es.properties @@ -1151,6 +1151,7 @@ action.set_as_reference=Marcar como Referencia action.unmark_as_reference=Desmarcar como Referencia label.chimera_failed=Error al abrir Chimera - está instalado?\nCompruebe ruta en Preferencias, Estructura label.find=Buscar +label.in = en label.select_pdb_file=Seleccionar Fichero PDB label.structures_filter=Filtro de Estructuras label.scale_protein_to_cdna=Adaptar proteína a cDNA diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index b1efed6..bf4a4f3 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -2743,7 +2743,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener, @Override public void findMenuItem_actionPerformed(ActionEvent e) { - new Finder(alignPanel); + new Finder(alignPanel, false, null); } /** diff --git a/src/jalview/gui/Finder.java b/src/jalview/gui/Finder.java index 537c323..430485a 100755 --- a/src/jalview/gui/Finder.java +++ b/src/jalview/gui/Finder.java @@ -20,18 +20,10 @@ */ 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; @@ -48,6 +40,15 @@ import javax.swing.KeyStroke; 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 @@ -82,33 +83,61 @@ public class Finder extends GFinder 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(); } @@ -157,17 +186,18 @@ public class Finder extends GFinder /** * 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. @@ -211,9 +241,8 @@ 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, @@ -378,15 +407,4 @@ public class Finder extends GFinder ap.alignFrame.requestFocus(); } } - - @Override - protected void paintComponent(Graphics g) - { - /* - * enable 'hidden regions' option only if - * 'top' viewport has hidden columns - */ - getFocusedViewport(); - super.paintComponent(g); - } } diff --git a/src/jalview/gui/SplitFrame.java b/src/jalview/gui/SplitFrame.java index f7c93db..31bc244 100644 --- a/src/jalview/gui/SplitFrame.java +++ b/src/jalview/gui/SplitFrame.java @@ -20,18 +20,6 @@ */ 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; @@ -61,6 +49,18 @@ import javax.swing.event.ChangeListener; 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 @@ -814,7 +814,11 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI 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); } } }; -- 1.7.10.2