X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationColumnChooser.java;h=f1f78fa1d4fa450e9e7956f9e9ddeb5ad0f7c9fe;hb=HEAD;hp=3db148da094e2a99b852c264c73c64d40a018b25;hpb=c03d2649512cdc491a46dda1d1370273241b5253;p=jalview.git diff --git a/src/jalview/gui/AnnotationColumnChooser.java b/src/jalview/gui/AnnotationColumnChooser.java index 3db148d..f1f78fa 100644 --- a/src/jalview/gui/AnnotationColumnChooser.java +++ b/src/jalview/gui/AnnotationColumnChooser.java @@ -1,13 +1,25 @@ -package jalview.gui; +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.AnnotationFilterParameter; -import jalview.datamodel.ColumnSelection; -import jalview.jbgui.FurtherActionPanel; -import jalview.jbgui.SearchPanel; -import jalview.jbgui.StructureFilterPanel; -import jalview.schemes.AnnotationColourGradient; -import jalview.util.MessageManager; +package jalview.gui; import java.awt.BorderLayout; import java.awt.CardLayout; @@ -15,61 +27,45 @@ 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.JButton; +import javax.swing.ButtonGroup; +import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JInternalFrame; -import javax.swing.JLabel; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.border.TitledBorder; +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()); - private ColumnSelection oldColumnSelection; - - private JComboBox annotations; - - JButton ok = new JButton(); + private JPanel annotationComboBoxPanel = new JPanel(); - JButton cancel = new JButton(); + private StructureFilterPanel gStructureFilterPanel; - JPanel actionPanel = new JPanel(); - - JPanel thresholdPanel = new JPanel(); - - JPanel switchableViewsPanel = new JPanel(new CardLayout()); - - CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel - .getLayout()); - - JPanel noGraphFilterView = new JPanel(); - - JPanel graphFilterView = new JPanel(); - - JPanel annotationComboBoxPanel = new JPanel(); - - StructureFilterPanel gStructureFilterPanel; - - StructureFilterPanel ngStructureFilterPanel; + private StructureFilterPanel ngStructureFilterPanel; private StructureFilterPanel currentStructureFilterPanel; - JLabel annotationLabel = new JLabel(); - - BorderLayout borderLayout1 = new BorderLayout(); - - private JComboBox threshold = new JComboBox(); - private SearchPanel currentSearchPanel; private SearchPanel gSearchPanel; @@ -92,15 +88,30 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements private int actionOption = ACTION_OPTION_SELECT; + 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(); @@ -109,26 +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); - - // restore the Object state from the previous session if one exists - if (av.getAnnotationColumnSelectionState() != null) + AnnotationColumnChooser lastChooser = av + .getAnnotationColumnSelectionState(); + // restore Object state from the previous session if one exists + 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 @@ -144,85 +167,33 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements frame.pack(); } - public AnnotationColumnChooser() - { - try - { - jbInit(); - } catch (Exception ex) - { - ex.printStackTrace(); - } - } - - private void jbInit() throws Exception + @Override + protected void jbInit() { - ok.setOpaque(false); - ok.setText(MessageManager.getString("action.ok")); - ok.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - ok_actionPerformed(e); - } - }); - cancel.setOpaque(false); - cancel.setText(MessageManager.getString("action.cancel")); - cancel.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - cancel_actionPerformed(e); - } - }); + super.jbInit(); - getAnnotations().addItemListener(this); - getThreshold().addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - threshold_actionPerformed(e); - } - }); - - thresholdValue.addActionListener(new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - thresholdValue_actionPerformed(e); - } - }); - slider.setPaintLabels(false); - slider.setPaintTicks(true); - slider.setBackground(Color.white); - slider.setEnabled(false); - slider.setOpaque(false); - slider.setPreferredSize(new Dimension(100, 32)); - thresholdValue.setEnabled(false); - thresholdValue.setColumns(7); - - annotationLabel.setBackground(Color.white); - annotationLabel.setFont(JvSwingUtils.getLabelFont()); - annotationLabel.setText("Select Annotation : "); - - thresholdPanel.setBorder(new TitledBorder("Threshold Filter")); + JPanel thresholdPanel = new JPanel(); + thresholdPanel.setBorder(new TitledBorder( + MessageManager.getString("label.threshold_filter"))); thresholdPanel.setBackground(Color.white); thresholdPanel.setFont(JvSwingUtils.getLabelFont()); thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]")); + percentThreshold.setBackground(Color.white); + percentThreshold.setFont(JvSwingUtils.getLabelFont()); + + JPanel actionPanel = new JPanel(); actionPanel.setBackground(Color.white); actionPanel.setFont(JvSwingUtils.getLabelFont()); - this.setLayout(borderLayout1); + JPanel graphFilterView = new JPanel(); graphFilterView.setLayout(new MigLayout("", "[left][right]", "[][]")); graphFilterView.setBackground(Color.white); + JPanel noGraphFilterView = new JPanel(); noGraphFilterView.setLayout(new MigLayout("", "[left][right]", "[][]")); noGraphFilterView.setBackground(Color.white); + annotationComboBoxPanel.setBackground(Color.white); annotationComboBoxPanel.setFont(JvSwingUtils.getLabelFont()); @@ -233,10 +204,10 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements gStructureFilterPanel = new StructureFilterPanel(this); ngStructureFilterPanel = new StructureFilterPanel(this); - thresholdPanel.add(getThreshold()); - thresholdPanel.add(thresholdValue, "wrap"); - thresholdPanel.add(slider, "grow, span, wrap"); + thresholdPanel.add(percentThreshold, "wrap"); + thresholdPanel.add(slider, "grow"); + thresholdPanel.add(thresholdValue, "span, wrap"); actionPanel.add(ok); actionPanel.add(cancel); @@ -255,77 +226,63 @@ 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); this.add(actionPanel, java.awt.BorderLayout.SOUTH); selectedAnnotationChanged(); + updateThresholdPanelToolTip(); this.validate(); } - @SuppressWarnings("unchecked") - public void reset() + protected void updateThresholdPanelToolTip() + { + thresholdValue.setToolTipText(""); + slider.setToolTipText(""); + + String defaultTtip = MessageManager + .getString("info.change_threshold_mode_to_enable"); + + String thresh = getThreshold().getSelectedItem().toString(); + if (thresh.equalsIgnoreCase("No Threshold")) + { + thresholdValue.setToolTipText(defaultTtip); + slider.setToolTipText(defaultTtip); + } + } + + @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.alignmentChanged(); - ap.paintAlignment(true); + av.sendSelection(); + ap.paintAlignment(true, true); } - } + @Override public void valueChanged(boolean updateAllAnnotation) { if (slider.isEnabled()) { - getCurrentAnnotation().threshold.value = slider.getValue() / 1000f; + getCurrentAnnotation().threshold.value = getSliderValue(); updateView(); propagateSeqAssociatedThreshold(updateAllAnnotation, getCurrentAnnotation()); - ap.paintAlignment(false); + ap.paintAlignment(false, false); } } - public JComboBox getThreshold() - { - return threshold; - } - - public void setThreshold(JComboBox threshold) - { - this.threshold = threshold; - } - - public JComboBox getAnnotations() - { - return annotations; - } - - public void setAnnotations(JComboBox annotations) - { - this.annotations = annotations; - } - @Override public void updateView() { @@ -337,76 +294,79 @@ 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); thresholdValue.setEnabled(false); thresholdValue.setText(""); + percentThreshold.setEnabled(false); // build filter params } 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)); - 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(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); } } } + updateThresholdPanelToolTip(); if (currentStructureFilterPanel != null) { - if (currentStructureFilterPanel.getAlphaHelix().isSelected()) + if (currentStructureFilterPanel.alphaHelix.isSelected()) { filterParams.setFilterAlphaHelix(true); } - if (currentStructureFilterPanel.getBetaStrand().isSelected()) + if (currentStructureFilterPanel.betaStrand.isSelected()) { filterParams.setFilterBetaSheet(true); } - if (currentStructureFilterPanel.getTurn().isSelected()) + if (currentStructureFilterPanel.turn.isSelected()) { filterParams.setFilterTurn(true); } @@ -414,56 +374,97 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements if (currentSearchPanel != null) { - if (!currentSearchPanel.getSearchString().isEmpty()) + if (!currentSearchPanel.searchBox.getUserInput().isEmpty()) { - currentSearchPanel.getDescription().setEnabled(true); - currentSearchPanel.getDisplayName().setEnabled(true); - filterParams.setRegexString(currentSearchPanel.getSearchString()); - if (currentSearchPanel.isDisplayNameChecked()) + filterParams.setRegexString( + currentSearchPanel.searchBox.getUserInput()); + if (currentSearchPanel.displayName.isSelected()) { - filterParams - .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING); + filterParams.addRegexSearchField( + AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING); } - if (currentSearchPanel.isDescriptionChecked()) + if (currentSearchPanel.description.isSelected()) { - filterParams - .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION); + filterParams.addRegexSearchField( + AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION); } } - else - { - currentSearchPanel.getDescription().setEnabled(false); - currentSearchPanel.getDisplayName().setEnabled(false); - } } - filterAnnotations(getCurrentAnnotation().annotations, filterParams, - av.getColumnSelection()); - + // 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); } } + public FurtherActionPanel getCurrentFutherActionPanel() + { + return currentFurtherActionPanel; + } + + public void setCurrentFutherActionPanel( + FurtherActionPanel currentFutherActionPanel) + { + this.currentFurtherActionPanel = currentFutherActionPanel; + } + + public SearchPanel getCurrentSearchPanel() + { + return currentSearchPanel; + } + + public void setCurrentSearchPanel(SearchPanel currentSearchPanel) + { + this.currentSearchPanel = currentSearchPanel; + } + + public int getActionOption() + { + return actionOption; + } + + public void setActionOption(int actionOption) + { + this.actionOption = actionOption; + } + + public StructureFilterPanel getCurrentStructureFilterPanel() + { + return currentStructureFilterPanel; + } + + public void setCurrentStructureFilterPanel( + StructureFilterPanel currentStructureFilterPanel) + { + this.currentStructureFilterPanel = currentStructureFilterPanel; + } public void select_action(ActionEvent actionEvent) { @@ -485,80 +486,394 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } } - @Override public void itemStateChanged(ItemEvent e) { selectedAnnotationChanged(); } + @Override public void selectedAnnotationChanged() { String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW; if (av.getAlignment().getAlignmentAnnotation()[annmap[getAnnotations() - .getSelectedIndex()]].graph != AlignmentAnnotation.NO_GRAPH) + .getSelectedIndex()]].isQuantitative()) { currentView = AnnotationColumnChooser.GRAPH_VIEW; } - // else{ - // threshold.setSelectedIndex(AlignmentAnnotation.NO_GRAPH); - // } - + saveCache(); gSearchPanel.syncState(); gFurtherActionPanel.syncState(); - gFurtherActionPanel.syncState(); - gFurtherActionPanel.syncState(); + gStructureFilterPanel.syncState(); ngSearchPanel.syncState(); ngFurtherActionPanel.syncState(); ngStructureFilterPanel.syncState(); - ngFurtherActionPanel.syncState(); + CardLayout switchableViewsLayout = (CardLayout) switchableViewsPanel + .getLayout(); switchableViewsLayout.show(switchableViewsPanel, currentView); updateView(); } - - public FurtherActionPanel getCurrentFutherActionPanel() + public class FurtherActionPanel extends JPanel { - return currentFurtherActionPanel; - } + private AnnotationColumnChooser aColChooser; - public void setCurrentFutherActionPanel( - FurtherActionPanel currentFutherActionPanel) - { - this.currentFurtherActionPanel = currentFutherActionPanel; + private JRadioButton hideOption = new JRadioButton(); + + private JRadioButton selectOption = new JRadioButton(); + + private ButtonGroup optionsGroup = new ButtonGroup(); + + public FurtherActionPanel(AnnotationColumnChooser aColChooser) + { + this.aColChooser = aColChooser; + JvSwingUtils.jvInitComponent(selectOption, "action.select"); + selectOption.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + selectRadioAction(actionEvent); + } + }); + + JvSwingUtils.jvInitComponent(hideOption, "action.hide"); + hideOption.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + hideRadioAction(actionEvent); + } + }); + + optionsGroup.add(selectOption); + optionsGroup.add(hideOption); + optionsGroup.setSelected(selectOption.getModel(), true); + + JvSwingUtils.jvInitComponent(this); + syncState(); + + this.add(selectOption); + this.add(hideOption); + } + + public void selectRadioAction(ActionEvent actionEvent) + { + aColChooser.setCurrentFutherActionPanel(this); + aColChooser.select_action(actionEvent); + } + + public void hideRadioAction(ActionEvent actionEvent) + { + aColChooser.setCurrentFutherActionPanel(this); + aColChooser.hide_action(actionEvent); + } + + public void syncState() + { + if (aColChooser + .getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE) + { + this.optionsGroup.setSelected(this.hideOption.getModel(), true); + } + else + { + this.optionsGroup.setSelected(this.selectOption.getModel(), true); + } + } } - public SearchPanel getCurrentSearchPanel() + public class StructureFilterPanel extends JPanel { - return currentSearchPanel; + private AnnotationColumnChooser aColChooser; + + private JCheckBox alphaHelix = new JCheckBox(); + + private JCheckBox betaStrand = new JCheckBox(); + + private JCheckBox turn = new JCheckBox(); + + private JCheckBox all = new JCheckBox(); + + public StructureFilterPanel(AnnotationColumnChooser aColChooser) + { + this.aColChooser = aColChooser; + + JvSwingUtils.jvInitComponent(alphaHelix, "label.alpha_helix"); + alphaHelix.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + alphaHelix_actionPerformed(); + } + }); + + JvSwingUtils.jvInitComponent(betaStrand, "label.beta_strand"); + betaStrand.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + betaStrand_actionPerformed(); + } + }); + + JvSwingUtils.jvInitComponent(turn, "label.turn"); + turn.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + turn_actionPerformed(); + } + }); + + JvSwingUtils.jvInitComponent(all, "label.select_all"); + all.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + all_actionPerformed(); + } + }); + + this.setBorder(new TitledBorder( + MessageManager.getString("label.structures_filter"))); + JvSwingUtils.jvInitComponent(this); + + this.add(all); + this.add(alphaHelix); + this.add(betaStrand); + this.add(turn); + } + + public void alphaHelix_actionPerformed() + { + updateSelectAllState(); + aColChooser.setCurrentStructureFilterPanel(this); + aColChooser.updateView(); + } + + public void betaStrand_actionPerformed() + { + updateSelectAllState(); + aColChooser.setCurrentStructureFilterPanel(this); + aColChooser.updateView(); + } + + public void turn_actionPerformed() + { + updateSelectAllState(); + aColChooser.setCurrentStructureFilterPanel(this); + aColChooser.updateView(); + } + + public void all_actionPerformed() + { + if (all.isSelected()) + { + alphaHelix.setSelected(true); + betaStrand.setSelected(true); + turn.setSelected(true); + } + else + { + alphaHelix.setSelected(false); + betaStrand.setSelected(false); + turn.setSelected(false); + } + aColChooser.setCurrentStructureFilterPanel(this); + aColChooser.updateView(); + } + + public void updateSelectAllState() + { + if (alphaHelix.isSelected() && betaStrand.isSelected() + && turn.isSelected()) + { + all.setSelected(true); + } + else + { + all.setSelected(false); + } + } + + public void syncState() + { + StructureFilterPanel sfp = aColChooser + .getCurrentStructureFilterPanel(); + if (sfp != null) + { + alphaHelix.setSelected(sfp.alphaHelix.isSelected()); + betaStrand.setSelected(sfp.betaStrand.isSelected()); + turn.setSelected(sfp.turn.isSelected()); + if (sfp.all.isSelected()) + { + all.setSelected(true); + alphaHelix.setSelected(true); + betaStrand.setSelected(true); + turn.setSelected(true); + } + } + + } } - public void setCurrentSearchPanel(SearchPanel currentSearchPanel) + public class SearchPanel extends JPanel { - this.currentSearchPanel = currentSearchPanel; + private AnnotationColumnChooser aColChooser; + + private JCheckBox displayName = new JCheckBox(); + + private JCheckBox description = new JCheckBox(); + + 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"))); + + searchBox.getComponent().setToolTipText( + MessageManager.getString("info.enter_search_text_here")); + searchBox.addKeyListener(new java.awt.event.KeyAdapter() + { + @Override + public void keyPressed(KeyEvent e) + { + if (e.getKeyCode() == KeyEvent.VK_ENTER) + { + e.consume(); + searchStringAction(); + } + } + }); + searchBox.addFocusListener(new FocusAdapter() + { + @Override + public void focusLost(FocusEvent e) + { + searchStringAction(); + } + }); + + JvSwingUtils.jvInitComponent(displayName, "label.label"); + displayName.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + displayNameCheckboxAction(); + } + }); + + JvSwingUtils.jvInitComponent(description, "label.description"); + description.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + descriptionCheckboxAction(); + } + }); + + syncState(); + this.add(searchBox.getComponent()); + this.add(displayName); + this.add(description); + } + + public void displayNameCheckboxAction() + { + aColChooser.setCurrentSearchPanel(this); + aColChooser.updateView(); + } + + public void descriptionCheckboxAction() + { + aColChooser.setCurrentSearchPanel(this); + aColChooser.updateView(); + } + + public void searchStringAction() + { + aColChooser.setCurrentSearchPanel(this); + aColChooser.updateView(); + updateSearchPanelToolTips(); + searchBox.updateCache(); + } + + public void syncState() + { + SearchPanel sp = aColChooser.getCurrentSearchPanel(); + if (sp != null) + { + description.setEnabled(sp.description.isEnabled()); + description.setSelected(sp.description.isSelected()); + + displayName.setEnabled(sp.displayName.isEnabled()); + displayName.setSelected(sp.displayName.isSelected()); + + searchBox.setSelectedItem(sp.searchBox.getUserInput()); + } + updateSearchPanelToolTips(); + } + + public void updateSearchPanelToolTips() + { + String defaultTtip = MessageManager + .getString("info.enter_search_text_to_enable"); + String labelTtip = MessageManager.formatMessage( + "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); + } } - public int getActionOption() + @Override + public void ok_actionPerformed() { - return actionOption; + saveCache(); + super.ok_actionPerformed(); } - public void setActionOption(int actionOption) + @Override + public void cancel_actionPerformed() { - this.actionOption = actionOption; + saveCache(); + super.cancel_actionPerformed(); } - public StructureFilterPanel getCurrentStructureFilterPanel() + private void saveCache() { - return currentStructureFilterPanel; + gSearchPanel.searchBox.persistCache(); + ngSearchPanel.searchBox.persistCache(); + gSearchPanel.searchBox.updateCache(); + ngSearchPanel.searchBox.updateCache(); } - public void setCurrentStructureFilterPanel( - StructureFilterPanel currentStructureFilterPanel) + public static void displayFor(AlignViewport av, AlignmentPanel ap, + AlignmentAnnotation alignmentAnnotation) { - this.currentStructureFilterPanel = currentStructureFilterPanel; + AnnotationColumnChooser colchooser = new AnnotationColumnChooser(av, ap, + alignmentAnnotation); } - }