X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationColumnChooser.java;h=f1f78fa1d4fa450e9e7956f9e9ddeb5ad0f7c9fe;hb=HEAD;hp=c321e5950b9388bac03c6a4f7c97587d4ac97204;hpb=ad69997e7967bae13b30470ca6d1ab74e0bb3046;p=jalview.git diff --git a/src/jalview/gui/AnnotationColumnChooser.java b/src/jalview/gui/AnnotationColumnChooser.java index c321e59..f1f78fa 100644 --- a/src/jalview/gui/AnnotationColumnChooser.java +++ b/src/jalview/gui/AnnotationColumnChooser.java @@ -21,20 +21,17 @@ package jalview.gui; -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.ColumnSelection; -import jalview.schemes.AnnotationColourGradient; -import jalview.util.MessageManager; -import jalview.viewmodel.annotationfilter.AnnotationFilterParameter; - import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; +import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.util.Iterator; +import java.awt.event.KeyEvent; import javax.swing.ButtonGroup; import javax.swing.JCheckBox; @@ -43,16 +40,21 @@ import javax.swing.JInternalFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.JRadioButton; -import javax.swing.JTextField; import javax.swing.border.TitledBorder; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; +import jalview.bin.Console; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.HiddenColumns; +import jalview.io.cache.JvCacheableInputBox; +import jalview.schemes.AnnotationColourGradient; +import jalview.util.MessageManager; +import jalview.util.Platform; +import jalview.viewmodel.annotationfilter.AnnotationFilterParameter; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") -public class AnnotationColumnChooser extends AnnotationRowFilter implements - ItemListener +public class AnnotationColumnChooser extends AnnotationRowFilter + implements ItemListener { private JPanel switchableViewsPanel = new JPanel(new CardLayout()); @@ -86,17 +88,30 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements private int actionOption = ACTION_OPTION_SELECT; - private ColumnSelection oldColumnSelection; + private HiddenColumns oldHiddenColumns; + + protected static int MIN_WIDTH = (Platform.isJS() ? 370 : 420); + + protected static int MIN_HEIGHT = (Platform.isJS() ? 370 : 430); public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap) { + this(av, ap, null); + } + + public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap, + AlignmentAnnotation selectedAnnotation) + { super(av, ap); frame = new JInternalFrame(); + frame.setFrameIcon(null); frame.setContentPane(this); frame.setLayer(JLayeredPane.PALETTE_LAYER); Desktop.addInternalFrame(frame, - MessageManager.getString("label.select_by_annotation"), 520, - 215); + MessageManager.getString("label.select_by_annotation"), 0, 0); + // BH note: MIGLayout ignores this completely, + // possibly creating a frame smaller than specified: + frame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT)); addSliderChangeListener(); addSliderMouseListeners(); @@ -105,25 +120,38 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements { return; } - setOldColumnSelection(av.getColumnSelection()); + setOldHiddenColumns(av.getAlignment().getHiddenColumns()); adjusting = true; - setAnnotations(new JComboBox(getAnnotationItems(false))); + setAnnotations(new JComboBox<>(getAnnotationItems(false))); populateThresholdComboBox(threshold); - + AnnotationColumnChooser lastChooser = av + .getAnnotationColumnSelectionState(); // restore Object state from the previous session if one exists - if (av.getAnnotationColumnSelectionState() != null) + if (lastChooser != null) { - currentSearchPanel = av.getAnnotationColumnSelectionState() - .getCurrentSearchPanel(); - currentStructureFilterPanel = av.getAnnotationColumnSelectionState() + currentSearchPanel = lastChooser.getCurrentSearchPanel(); + currentStructureFilterPanel = lastChooser .getCurrentStructureFilterPanel(); - annotations.setSelectedIndex(av.getAnnotationColumnSelectionState() - .getAnnotations().getSelectedIndex()); - threshold.setSelectedIndex(av.getAnnotationColumnSelectionState() - .getThreshold().getSelectedIndex()); - actionOption = av.getAnnotationColumnSelectionState() - .getActionOption(); + annotations.setSelectedIndex( + lastChooser.getAnnotations().getSelectedIndex()); + threshold.setSelectedIndex( + lastChooser.getThreshold().getSelectedIndex()); + actionOption = lastChooser.getActionOption(); + percentThreshold + .setSelected(lastChooser.percentThreshold.isSelected()); + } + if (selectedAnnotation != null) + { + try + { + setCurrentAnnotation(selectedAnnotation); + annotations.setSelectedItem( + getAnnotationMenuLabel(selectedAnnotation)); + } catch (Exception x) + { + Console.error("Couldn't select annotation in column chooser", x); + } } try @@ -145,8 +173,8 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements super.jbInit(); JPanel thresholdPanel = new JPanel(); - thresholdPanel.setBorder(new TitledBorder(MessageManager - .getString("label.threshold_filter"))); + thresholdPanel.setBorder(new TitledBorder( + MessageManager.getString("label.threshold_filter"))); thresholdPanel.setBackground(Color.white); thresholdPanel.setFont(JvSwingUtils.getLabelFont()); thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]")); @@ -198,7 +226,6 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements AnnotationColumnChooser.NO_GRAPH_VIEW); switchableViewsPanel.add(graphFilterView, AnnotationColumnChooser.GRAPH_VIEW); - this.setLayout(new BorderLayout()); this.add(annotationComboBoxPanel, java.awt.BorderLayout.PAGE_START); this.add(switchableViewsPanel, java.awt.BorderLayout.CENTER); @@ -228,30 +255,19 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements @Override protected void reset() { - if (this.getOldColumnSelection() != null) + if (this.getOldHiddenColumns() != null) { av.getColumnSelection().clear(); if (av.getAnnotationColumnSelectionState() != null) { - ColumnSelection oldSelection = av - .getAnnotationColumnSelectionState() - .getOldColumnSelection(); - if (oldSelection != null && oldSelection.getHiddenColumns() != null - && !oldSelection.getHiddenColumns().isEmpty()) - { - for (Iterator itr = oldSelection.getHiddenColumns() - .iterator(); itr.hasNext();) - { - int positions[] = itr.next(); - av.hideColumns(positions[0], positions[1]); - } - } - av.setColumnSelection(oldSelection); + HiddenColumns oldHidden = av.getAnnotationColumnSelectionState() + .getOldHiddenColumns(); + av.getAlignment().setHiddenColumns(oldHidden); } - ap.paintAlignment(true); + av.sendSelection(); + ap.paintAlignment(true, true); } - } @Override @@ -259,11 +275,11 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements { if (slider.isEnabled()) { - getCurrentAnnotation().threshold.value = slider.getValue() / 1000f; + getCurrentAnnotation().threshold.value = getSliderValue(); updateView(); propagateSeqAssociatedThreshold(updateAllAnnotation, getCurrentAnnotation()); - ap.paintAlignment(false); + ap.paintAlignment(false, false); } } @@ -278,16 +294,18 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements AnnotationFilterParameter filterParams = new AnnotationFilterParameter(); - setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[annmap[getAnnotations() - .getSelectedIndex()]]); + setCurrentAnnotation(av.getAlignment() + .getAlignmentAnnotation()[annmap[getAnnotations() + .getSelectedIndex()]]); - int selectedThresholdItem = getSelectedThresholdItem(getThreshold() - .getSelectedIndex()); + int selectedThresholdItem = getSelectedThresholdItem( + getThreshold().getSelectedIndex()); slider.setEnabled(true); thresholdValue.setEnabled(true); percentThreshold.setEnabled(true); + final AlignmentAnnotation currentAnnotation = getCurrentAnnotation(); if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD) { slider.setEnabled(false); @@ -298,56 +316,41 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD) { - if (getCurrentAnnotation().threshold == null) + if (currentAnnotation.threshold == null) { - getCurrentAnnotation() - .setThreshold( - new jalview.datamodel.GraphLine( - (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin) / 2f, - "Threshold", Color.black)); + currentAnnotation.setThreshold(new jalview.datamodel.GraphLine( + (currentAnnotation.graphMax - currentAnnotation.graphMin) + / 2f, + "Threshold", Color.black)); } adjusting = true; - float range = getCurrentAnnotation().graphMax * 1000 - - getCurrentAnnotation().graphMin * 1000; - - slider.setMinimum((int) (getCurrentAnnotation().graphMin * 1000)); - slider.setMaximum((int) (getCurrentAnnotation().graphMax * 1000)); - slider.setValue((int) (getCurrentAnnotation().threshold.value * 1000)); - - if (percentThreshold.isSelected()) - { - thresholdValue - .setText("" - + ((getCurrentAnnotation().threshold.value - getCurrentAnnotation().graphMin) * 100f / (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin))); - } - else - { - thresholdValue.setText(getCurrentAnnotation().threshold.value + ""); - } - slider.setMajorTickSpacing((int) (range / 10f)); + setSliderModel(currentAnnotation.graphMin, currentAnnotation.graphMax, + currentAnnotation.threshold.value); + + setThresholdValueText(); + slider.setEnabled(true); thresholdValue.setEnabled(true); adjusting = false; // build filter params - filterParams - .setThresholdType(AnnotationFilterParameter.ThresholdType.NO_THRESHOLD); - if (getCurrentAnnotation().graph != AlignmentAnnotation.NO_GRAPH) + filterParams.setThresholdType( + AnnotationFilterParameter.ThresholdType.NO_THRESHOLD); + if (currentAnnotation.isQuantitative()) { - filterParams - .setThresholdValue(getCurrentAnnotation().threshold.value); + filterParams.setThresholdValue(currentAnnotation.threshold.value); if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD) { - filterParams - .setThresholdType(AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD); + filterParams.setThresholdType( + AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD); } else if (selectedThresholdItem == AnnotationColourGradient.BELOW_THRESHOLD) { - filterParams - .setThresholdType(AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD); + filterParams.setThresholdType( + AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD); } } } @@ -371,55 +374,53 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements if (currentSearchPanel != null) { - - if (!currentSearchPanel.searchBox.getText().isEmpty()) + if (!currentSearchPanel.searchBox.getUserInput().isEmpty()) { - currentSearchPanel.description.setEnabled(true); - currentSearchPanel.displayName.setEnabled(true); - filterParams.setRegexString(currentSearchPanel.searchBox.getText()); + filterParams.setRegexString( + currentSearchPanel.searchBox.getUserInput()); if (currentSearchPanel.displayName.isSelected()) { - filterParams - .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING); + filterParams.addRegexSearchField( + AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING); } if (currentSearchPanel.description.isSelected()) { - filterParams - .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION); + filterParams.addRegexSearchField( + AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION); } } - else - { - currentSearchPanel.description.setEnabled(false); - currentSearchPanel.displayName.setEnabled(false); - } } - av.getColumnSelection().filterAnnotations( - getCurrentAnnotation().annotations, filterParams); - + // show hidden columns here, before changing the column selection in + // filterAnnotations, because showing hidden columns has the side effect of + // adding them to the selection av.showAllHiddenColumns(); - if (getActionOption() == ACTION_OPTION_HIDE) + av.getColumnSelection().filterAnnotations(currentAnnotation, + filterParams); + + boolean hideCols = getActionOption() == ACTION_OPTION_HIDE; + if (hideCols) { av.hideSelectedColumns(); } + av.sendSelection(); filterParams = null; av.setAnnotationColumnSelectionState(this); - ap.paintAlignment(true); + // only update overview and structures if columns were hidden + ap.paintAlignment(hideCols, hideCols); } - - public ColumnSelection getOldColumnSelection() + public HiddenColumns getOldHiddenColumns() { - return oldColumnSelection; + return oldHiddenColumns; } - public void setOldColumnSelection(ColumnSelection currentColumnSelection) + public void setOldHiddenColumns(HiddenColumns currentHiddenColumns) { - if (currentColumnSelection != null) + if (currentHiddenColumns != null) { - this.oldColumnSelection = new ColumnSelection(currentColumnSelection); + this.oldHiddenColumns = new HiddenColumns(currentHiddenColumns); } } @@ -496,11 +497,11 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements { String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW; if (av.getAlignment().getAlignmentAnnotation()[annmap[getAnnotations() - .getSelectedIndex()]].graph != AlignmentAnnotation.NO_GRAPH) + .getSelectedIndex()]].isQuantitative()) { currentView = AnnotationColumnChooser.GRAPH_VIEW; } - + saveCache(); gSearchPanel.syncState(); gFurtherActionPanel.syncState(); gStructureFilterPanel.syncState(); @@ -573,7 +574,8 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements public void syncState() { - if (aColChooser.getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE) + if (aColChooser + .getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE) { this.optionsGroup.setSelected(this.hideOption.getModel(), true); } @@ -640,8 +642,8 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } }); - this.setBorder(new TitledBorder(MessageManager - .getString("label.structures_filter"))); + this.setBorder(new TitledBorder( + MessageManager.getString("label.structures_filter"))); JvSwingUtils.jvInitComponent(this); this.add(all); @@ -731,42 +733,43 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements private JCheckBox description = new JCheckBox(); - private JTextField searchBox = new JTextField(10); + private static final String FILTER_BY_ANN_CACHE_KEY = "CACHE.SELECT_FILTER_BY_ANNOT"; + + public JvCacheableInputBox searchBox = new JvCacheableInputBox<>( + FILTER_BY_ANN_CACHE_KEY, 23); public SearchPanel(AnnotationColumnChooser aColChooser) { this.aColChooser = aColChooser; JvSwingUtils.jvInitComponent(this); - this.setBorder(new TitledBorder(MessageManager - .getString("label.search_filter"))); + this.setBorder(new TitledBorder( + MessageManager.getString("label.search_filter"))); - JvSwingUtils.jvInitComponent(searchBox); - searchBox.setToolTipText(MessageManager - .getString("info.enter_search_text_here")); - searchBox.getDocument().addDocumentListener(new DocumentListener() + searchBox.getComponent().setToolTipText( + MessageManager.getString("info.enter_search_text_here")); + searchBox.addKeyListener(new java.awt.event.KeyAdapter() { @Override - public void insertUpdate(DocumentEvent e) + public void keyPressed(KeyEvent e) { - searchStringAction(); - } - - @Override - public void removeUpdate(DocumentEvent e) - { - searchStringAction(); + if (e.getKeyCode() == KeyEvent.VK_ENTER) + { + e.consume(); + searchStringAction(); + } } - + }); + searchBox.addFocusListener(new FocusAdapter() + { @Override - public void changedUpdate(DocumentEvent e) + public void focusLost(FocusEvent e) { searchStringAction(); } }); JvSwingUtils.jvInitComponent(displayName, "label.label"); - displayName.setEnabled(false); displayName.addActionListener(new ActionListener() { @Override @@ -777,18 +780,17 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements }); JvSwingUtils.jvInitComponent(description, "label.description"); - description.setEnabled(false); description.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { - discriptionCheckboxAction(); + descriptionCheckboxAction(); } }); syncState(); - this.add(searchBox); + this.add(searchBox.getComponent()); this.add(displayName); this.add(description); } @@ -799,7 +801,7 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements aColChooser.updateView(); } - public void discriptionCheckboxAction() + public void descriptionCheckboxAction() { aColChooser.setCurrentSearchPanel(this); aColChooser.updateView(); @@ -810,6 +812,7 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements aColChooser.setCurrentSearchPanel(this); aColChooser.updateView(); updateSearchPanelToolTips(); + searchBox.updateCache(); } public void syncState() @@ -823,7 +826,7 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements displayName.setEnabled(sp.displayName.isEnabled()); displayName.setSelected(sp.displayName.isSelected()); - searchBox.setText(sp.searchBox.getText()); + searchBox.setSelectedItem(sp.searchBox.getUserInput()); } updateSearchPanelToolTips(); } @@ -833,16 +836,44 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements String defaultTtip = MessageManager .getString("info.enter_search_text_to_enable"); String labelTtip = MessageManager.formatMessage( - "info.search_in_annotation_label", annotations - .getSelectedItem().toString()); + "info.search_in_annotation_label", + annotations.getSelectedItem().toString()); String descTtip = MessageManager.formatMessage( - "info.search_in_annotation_description", annotations - .getSelectedItem().toString()); - displayName.setToolTipText(displayName.isEnabled() ? labelTtip - : defaultTtip); - description.setToolTipText(description.isEnabled() ? descTtip - : defaultTtip); + "info.search_in_annotation_description", + annotations.getSelectedItem().toString()); + displayName.setToolTipText( + displayName.isEnabled() ? labelTtip : defaultTtip); + description.setToolTipText( + description.isEnabled() ? descTtip : defaultTtip); } } + @Override + public void ok_actionPerformed() + { + saveCache(); + super.ok_actionPerformed(); + } + + @Override + public void cancel_actionPerformed() + { + saveCache(); + super.cancel_actionPerformed(); + } + + private void saveCache() + { + gSearchPanel.searchBox.persistCache(); + ngSearchPanel.searchBox.persistCache(); + gSearchPanel.searchBox.updateCache(); + ngSearchPanel.searchBox.updateCache(); + } + + public static void displayFor(AlignViewport av, AlignmentPanel ap, + AlignmentAnnotation alignmentAnnotation) + { + AnnotationColumnChooser colchooser = new AnnotationColumnChooser(av, ap, + alignmentAnnotation); + } }