X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationColumnChooser.java;h=c0d7084d2c932cf5006eee562a7f9b4e37e0b04e;hb=4d7f98a6dd54d9863ba449ec79dcd95d25ed863d;hp=3db148da094e2a99b852c264c73c64d40a018b25;hpb=c03d2649512cdc491a46dda1d1370273241b5253;p=jalview.git diff --git a/src/jalview/gui/AnnotationColumnChooser.java b/src/jalview/gui/AnnotationColumnChooser.java index 3db148d..c0d7084 100644 --- a/src/jalview/gui/AnnotationColumnChooser.java +++ b/src/jalview/gui/AnnotationColumnChooser.java @@ -1,13 +1,31 @@ +/* + * 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. + */ + package jalview.gui; 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; +import jalview.viewmodel.annotationfilter.AnnotationFilterParameter; import java.awt.BorderLayout; import java.awt.CardLayout; @@ -19,14 +37,17 @@ import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.Iterator; -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.JTextField; import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import net.miginfocom.swing.MigLayout; @@ -35,40 +56,32 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements ItemListener { - private ColumnSelection oldColumnSelection; - private JComboBox annotations; - JButton ok = new JButton(); - - JButton cancel = new JButton(); - - JPanel actionPanel = new JPanel(); + private JPanel actionPanel = new JPanel(); - JPanel thresholdPanel = new JPanel(); + private JPanel thresholdPanel = new JPanel(); - JPanel switchableViewsPanel = new JPanel(new CardLayout()); + private JPanel switchableViewsPanel = new JPanel(new CardLayout()); - CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel + private CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel .getLayout()); - JPanel noGraphFilterView = new JPanel(); + private JPanel noGraphFilterView = new JPanel(); - JPanel graphFilterView = new JPanel(); + private JPanel graphFilterView = new JPanel(); - JPanel annotationComboBoxPanel = new JPanel(); + private JPanel annotationComboBoxPanel = new JPanel(); - StructureFilterPanel gStructureFilterPanel; + private BorderLayout borderLayout1 = new BorderLayout(); - StructureFilterPanel ngStructureFilterPanel; - - private StructureFilterPanel currentStructureFilterPanel; + private JComboBox threshold = new JComboBox(); - JLabel annotationLabel = new JLabel(); + private StructureFilterPanel gStructureFilterPanel; - BorderLayout borderLayout1 = new BorderLayout(); + private StructureFilterPanel ngStructureFilterPanel; - private JComboBox threshold = new JComboBox(); + private StructureFilterPanel currentStructureFilterPanel; private SearchPanel currentSearchPanel; @@ -92,6 +105,19 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements private int actionOption = ACTION_OPTION_SELECT; + private ColumnSelection oldColumnSelection; + + public AnnotationColumnChooser() + { + try + { + jbInit(); + } catch (Exception ex) + { + ex.printStackTrace(); + } + } + public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap) { super(av, ap); @@ -115,7 +141,7 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements setAnnotations(new JComboBox(getAnnotationItems(false))); populateThresholdComboBox(threshold); - // restore the Object state from the previous session if one exists + // restore Object state from the previous session if one exists if (av.getAnnotationColumnSelectionState() != null) { currentSearchPanel = av.getAnnotationColumnSelectionState() @@ -128,7 +154,6 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements .getThreshold().getSelectedIndex()); actionOption = av.getAnnotationColumnSelectionState() .getActionOption(); - } try @@ -144,17 +169,6 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements frame.pack(); } - public AnnotationColumnChooser() - { - try - { - jbInit(); - } catch (Exception ex) - { - ex.printStackTrace(); - } - } - private void jbInit() throws Exception { ok.setOpaque(false); @@ -167,6 +181,7 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements ok_actionPerformed(e); } }); + cancel.setOpaque(false); cancel.setText(MessageManager.getString("action.cancel")); cancel.addActionListener(new ActionListener() @@ -178,8 +193,10 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } }); - getAnnotations().addItemListener(this); - getThreshold().addActionListener(new ActionListener() + annotations.addItemListener(this); + annotations.setToolTipText(MessageManager + .getString("info.select_annotation_row")); + threshold.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) @@ -188,6 +205,8 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } }); + thresholdValue.setEnabled(false); + thresholdValue.setColumns(7); thresholdValue.addActionListener(new ActionListener() { @Override @@ -196,20 +215,16 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements 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")); + thresholdPanel.setBorder(new TitledBorder(MessageManager + .getString("label.threshold_filter"))); thresholdPanel.setBackground(Color.white); thresholdPanel.setFont(JvSwingUtils.getLabelFont()); thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]")); @@ -217,12 +232,12 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements actionPanel.setBackground(Color.white); actionPanel.setFont(JvSwingUtils.getLabelFont()); - this.setLayout(borderLayout1); graphFilterView.setLayout(new MigLayout("", "[left][right]", "[][]")); graphFilterView.setBackground(Color.white); noGraphFilterView.setLayout(new MigLayout("", "[left][right]", "[][]")); noGraphFilterView.setBackground(Color.white); + annotationComboBoxPanel.setBackground(Color.white); annotationComboBoxPanel.setFont(JvSwingUtils.getLabelFont()); @@ -233,7 +248,6 @@ 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"); @@ -256,15 +270,32 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements switchableViewsPanel.add(graphFilterView, AnnotationColumnChooser.GRAPH_VIEW); + this.setLayout(borderLayout1); 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 updateThresholdPanelToolTip() + { + thresholdValue.setToolTipText(""); + slider.setToolTipText(""); + + String defaultTtip = MessageManager + .getString("info.change_threshold_mode_to_enable"); + + String threshold = getThreshold().getSelectedItem().toString(); + if (threshold.equalsIgnoreCase("No Threshold")) + { + thresholdValue.setToolTipText(defaultTtip); + slider.setToolTipText(defaultTtip); + } + } + public void reset() { if (this.getOldColumnSelection() != null) @@ -288,7 +319,6 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } av.setColumnSelection(oldSelection); } - // ap.alignmentChanged(); ap.paintAlignment(true); } @@ -382,6 +412,8 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements .setThresholdType(AnnotationFilterParameter.ThresholdType.NO_THRESHOLD); if (getCurrentAnnotation().graph != AlignmentAnnotation.NO_GRAPH) { + filterParams + .setThresholdValue(getCurrentAnnotation().threshold.value); if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD) { @@ -396,17 +428,18 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } } + 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,17 +447,18 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements if (currentSearchPanel != null) { - if (!currentSearchPanel.getSearchString().isEmpty()) + + if (!currentSearchPanel.searchBox.getText().isEmpty()) { - currentSearchPanel.getDescription().setEnabled(true); - currentSearchPanel.getDisplayName().setEnabled(true); - filterParams.setRegexString(currentSearchPanel.getSearchString()); - if (currentSearchPanel.isDisplayNameChecked()) + currentSearchPanel.description.setEnabled(true); + currentSearchPanel.displayName.setEnabled(true); + filterParams.setRegexString(currentSearchPanel.searchBox.getText()); + if (currentSearchPanel.displayName.isSelected()) { filterParams .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING); } - if (currentSearchPanel.isDescriptionChecked()) + if (currentSearchPanel.description.isSelected()) { filterParams .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION); @@ -432,13 +466,13 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } else { - currentSearchPanel.getDescription().setEnabled(false); - currentSearchPanel.getDisplayName().setEnabled(false); + currentSearchPanel.description.setEnabled(false); + currentSearchPanel.displayName.setEnabled(false); } } - filterAnnotations(getCurrentAnnotation().annotations, filterParams, - av.getColumnSelection()); + av.getColumnSelection().filterAnnotations( + getCurrentAnnotation().annotations, filterParams); av.showAllHiddenColumns(); if (getActionOption() == ACTION_OPTION_HIDE) @@ -464,6 +498,47 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } } + 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,7 +560,6 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements } } - @Override public void itemStateChanged(ItemEvent e) { @@ -500,65 +574,347 @@ public class AnnotationColumnChooser extends AnnotationRowFilter implements { currentView = AnnotationColumnChooser.GRAPH_VIEW; } - // else{ - // threshold.setSelectedIndex(AlignmentAnnotation.NO_GRAPH); - // } - + gSearchPanel.syncState(); gFurtherActionPanel.syncState(); - gFurtherActionPanel.syncState(); - gFurtherActionPanel.syncState(); + gStructureFilterPanel.syncState(); ngSearchPanel.syncState(); ngFurtherActionPanel.syncState(); ngStructureFilterPanel.syncState(); - ngFurtherActionPanel.syncState(); 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(); - public SearchPanel getCurrentSearchPanel() - { - return currentSearchPanel; - } + private JRadioButton selectOption = new JRadioButton(); - public void setCurrentSearchPanel(SearchPanel currentSearchPanel) - { - this.currentSearchPanel = currentSearchPanel; - } + private ButtonGroup optionsGroup = new ButtonGroup(); - public int getActionOption() - { - return actionOption; - } + public FurtherActionPanel(AnnotationColumnChooser aColChooser) + { + this.aColChooser = aColChooser; + JvSwingUtils.jvInitComponent(selectOption, "action.select"); + selectOption.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + selectRadioAction(actionEvent); + } + }); - public void setActionOption(int actionOption) - { - this.actionOption = actionOption; + 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 StructureFilterPanel getCurrentStructureFilterPanel() + public class StructureFilterPanel extends JPanel { - return currentStructureFilterPanel; + 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 setCurrentStructureFilterPanel( - StructureFilterPanel currentStructureFilterPanel) + public class SearchPanel extends JPanel { - this.currentStructureFilterPanel = currentStructureFilterPanel; + private AnnotationColumnChooser aColChooser; + + private JCheckBox displayName = new JCheckBox(); + + private JCheckBox description = new JCheckBox(); + + private JTextField searchBox = new JTextField(10); + + public SearchPanel(AnnotationColumnChooser aColChooser) + { + + this.aColChooser = aColChooser; + JvSwingUtils.jvInitComponent(this); + 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() + { + @Override + public void insertUpdate(DocumentEvent e) + { + searchStringAction(); + } + + @Override + public void removeUpdate(DocumentEvent e) + { + searchStringAction(); + } + + @Override + public void changedUpdate(DocumentEvent e) + { + searchStringAction(); + } + }); + + JvSwingUtils.jvInitComponent(displayName, "label.label"); + displayName.setEnabled(false); + displayName.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + displayNameCheckboxAction(); + } + }); + + JvSwingUtils.jvInitComponent(description, "label.description"); + description.setEnabled(false); + description.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent actionEvent) + { + discriptionCheckboxAction(); + } + }); + + syncState(); + this.add(searchBox); + this.add(displayName); + this.add(description); + } + + public void displayNameCheckboxAction() + { + aColChooser.setCurrentSearchPanel(this); + aColChooser.updateView(); + } + + public void discriptionCheckboxAction() + { + aColChooser.setCurrentSearchPanel(this); + aColChooser.updateView(); + } + + public void searchStringAction() + { + aColChooser.setCurrentSearchPanel(this); + aColChooser.updateView(); + updateSearchPanelToolTips(); + } + + 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.setText(sp.searchBox.getText()); + } + 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); + } } }