package jalview.gui; import jalview.api.analysis.AnnotationFilterParameter; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.ColumnSelection; import jalview.schemes.AnnotationColourGradient; import jalview.util.MessageManager; 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.ItemEvent; import java.awt.event.ItemListener; import java.util.Iterator; import javax.swing.ButtonGroup; import javax.swing.JButton; 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; @SuppressWarnings("serial") public class AnnotationColumnChooser extends AnnotationRowFilter implements ItemListener { private JComboBox annotations; private JButton ok = new JButton(); private JButton cancel = new JButton(); private JPanel actionPanel = new JPanel(); private JPanel thresholdPanel = new JPanel(); private JPanel switchableViewsPanel = new JPanel(new CardLayout()); private CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel .getLayout()); private JPanel noGraphFilterView = new JPanel(); private JPanel graphFilterView = new JPanel(); private JPanel annotationComboBoxPanel = new JPanel(); private JLabel annotationLabel = new JLabel(); private BorderLayout borderLayout1 = new BorderLayout(); private JComboBox threshold = new JComboBox(); private StructureFilterPanel gStructureFilterPanel; private StructureFilterPanel ngStructureFilterPanel; private StructureFilterPanel currentStructureFilterPanel; private SearchPanel currentSearchPanel; private SearchPanel gSearchPanel; private SearchPanel ngSearchPanel; private FurtherActionPanel currentFurtherActionPanel; private FurtherActionPanel gFurtherActionPanel; private FurtherActionPanel ngFurtherActionPanel; public static final int ACTION_OPTION_SELECT = 1; public static int ACTION_OPTION_HIDE = 2; public static String NO_GRAPH_VIEW = "0"; public static String GRAPH_VIEW = "1"; 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); frame = new JInternalFrame(); frame.setContentPane(this); frame.setLayer(JLayeredPane.PALETTE_LAYER); Desktop.addInternalFrame(frame, MessageManager.getString("label.select_by_annotation"), 520, 215); addSliderChangeListener(); addSliderMouseListeners(); if (av.getAlignment().getAlignmentAnnotation() == null) { return; } setOldColumnSelection(av.getColumnSelection()); adjusting = true; setAnnotations(new JComboBox(getAnnotationItems(false))); populateThresholdComboBox(threshold); // restore Object state from the previous session if one exists if (av.getAnnotationColumnSelectionState() != null) { currentSearchPanel = av.getAnnotationColumnSelectionState() .getCurrentSearchPanel(); currentStructureFilterPanel = av.getAnnotationColumnSelectionState() .getCurrentStructureFilterPanel(); annotations.setSelectedIndex(av.getAnnotationColumnSelectionState() .getAnnotations().getSelectedIndex()); threshold.setSelectedIndex(av.getAnnotationColumnSelectionState() .getThreshold().getSelectedIndex()); actionOption = av.getAnnotationColumnSelectionState() .getActionOption(); } try { jbInit(); } catch (Exception ex) { } adjusting = false; updateView(); frame.invalidate(); frame.pack(); } private void jbInit() throws Exception { 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); } }); annotations.addItemListener(this); threshold.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { threshold_actionPerformed(e); } }); thresholdValue.setEnabled(false); thresholdValue.setColumns(7); 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)); annotationLabel.setBackground(Color.white); annotationLabel.setFont(JvSwingUtils.getLabelFont()); annotationLabel.setText("Select Annotation : "); thresholdPanel.setBorder(new TitledBorder("Threshold Filter")); thresholdPanel.setBackground(Color.white); thresholdPanel.setFont(JvSwingUtils.getLabelFont()); thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]")); actionPanel.setBackground(Color.white); actionPanel.setFont(JvSwingUtils.getLabelFont()); 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()); gSearchPanel = new SearchPanel(this); ngSearchPanel = new SearchPanel(this); gFurtherActionPanel = new FurtherActionPanel(this); ngFurtherActionPanel = new FurtherActionPanel(this); gStructureFilterPanel = new StructureFilterPanel(this); ngStructureFilterPanel = new StructureFilterPanel(this); thresholdPanel.add(getThreshold()); thresholdPanel.add(thresholdValue, "wrap"); thresholdPanel.add(slider, "grow, span, wrap"); actionPanel.add(ok); actionPanel.add(cancel); graphFilterView.add(gSearchPanel, "grow, span, wrap"); graphFilterView.add(gStructureFilterPanel, "grow, span, wrap"); graphFilterView.add(thresholdPanel, "grow, span, wrap"); graphFilterView.add(gFurtherActionPanel); noGraphFilterView.add(ngSearchPanel, "grow, span, wrap"); noGraphFilterView.add(ngStructureFilterPanel, "grow, span, wrap"); noGraphFilterView.add(ngFurtherActionPanel); annotationComboBoxPanel.add(getAnnotations()); switchableViewsPanel.add(noGraphFilterView, AnnotationColumnChooser.NO_GRAPH_VIEW); 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(); this.validate(); } @SuppressWarnings("unchecked") public void reset() { if (this.getOldColumnSelection() != 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); } ap.paintAlignment(true); } } public void valueChanged(boolean updateAllAnnotation) { if (slider.isEnabled()) { getCurrentAnnotation().threshold.value = slider.getValue() / 1000f; updateView(); propagateSeqAssociatedThreshold(updateAllAnnotation, getCurrentAnnotation()); ap.paintAlignment(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() { // Check if combobox is still adjusting if (adjusting) { return; } AnnotationFilterParameter filterParams = new AnnotationFilterParameter(); setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[annmap[getAnnotations() .getSelectedIndex()]]); int selectedThresholdItem = getSelectedThresholdItem(getThreshold() .getSelectedIndex()); slider.setEnabled(true); thresholdValue.setEnabled(true); if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD) { slider.setEnabled(false); thresholdValue.setEnabled(false); thresholdValue.setText(""); // build filter params } else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD) { if (getCurrentAnnotation().threshold == null) { getCurrentAnnotation() .setThreshold( new jalview.datamodel.GraphLine( (getCurrentAnnotation().graphMax - getCurrentAnnotation().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)); slider.setEnabled(true); thresholdValue.setEnabled(true); adjusting = false; // build filter params filterParams .setThresholdType(AnnotationFilterParameter.ThresholdType.NO_THRESHOLD); if (getCurrentAnnotation().graph != AlignmentAnnotation.NO_GRAPH) { if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD) { filterParams .setThresholdType(AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD); } else if (selectedThresholdItem == AnnotationColourGradient.BELOW_THRESHOLD) { filterParams .setThresholdType(AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD); } } } if (currentStructureFilterPanel != null) { if (currentStructureFilterPanel.getAlphaHelix().isSelected()) { filterParams.setFilterAlphaHelix(true); } if (currentStructureFilterPanel.getBetaStrand().isSelected()) { filterParams.setFilterBetaSheet(true); } if (currentStructureFilterPanel.getTurn().isSelected()) { filterParams.setFilterTurn(true); } } if (currentSearchPanel != null) { if (!currentSearchPanel.getSearchString().isEmpty()) { currentSearchPanel.getDescription().setEnabled(true); currentSearchPanel.getDisplayName().setEnabled(true); filterParams.setRegexString(currentSearchPanel.getSearchString()); if (currentSearchPanel.isDisplayNameChecked()) { filterParams .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING); } if (currentSearchPanel.isDescriptionChecked()) { filterParams .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION); } } else { currentSearchPanel.getDescription().setEnabled(false); currentSearchPanel.getDisplayName().setEnabled(false); } } filterAnnotations(getCurrentAnnotation().annotations, filterParams, av.getColumnSelection()); av.showAllHiddenColumns(); if (getActionOption() == ACTION_OPTION_HIDE) { av.hideSelectedColumns(); } filterParams = null; av.setAnnotationColumnSelectionState(this); ap.paintAlignment(true); } public ColumnSelection getOldColumnSelection() { return oldColumnSelection; } public void setOldColumnSelection(ColumnSelection currentColumnSelection) { if (currentColumnSelection != null) { this.oldColumnSelection = new ColumnSelection(currentColumnSelection); } } public void select_action(ActionEvent actionEvent) { JRadioButton radioButton = (JRadioButton) actionEvent.getSource(); if (radioButton.isSelected()) { setActionOption(ACTION_OPTION_SELECT); updateView(); } } public void hide_action(ActionEvent actionEvent) { JRadioButton radioButton = (JRadioButton) actionEvent.getSource(); if (radioButton.isSelected()) { setActionOption(ACTION_OPTION_HIDE); updateView(); } } @Override public void itemStateChanged(ItemEvent e) { selectedAnnotationChanged(); } public void selectedAnnotationChanged() { String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW; if (av.getAlignment().getAlignmentAnnotation()[annmap[getAnnotations() .getSelectedIndex()]].graph != AlignmentAnnotation.NO_GRAPH) { currentView = AnnotationColumnChooser.GRAPH_VIEW; } gSearchPanel.syncState(); gFurtherActionPanel.syncState(); gStructureFilterPanel.syncState(); ngSearchPanel.syncState(); ngFurtherActionPanel.syncState(); ngStructureFilterPanel.syncState(); switchableViewsLayout.show(switchableViewsPanel, currentView); updateView(); } 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 class FurtherActionPanel extends JPanel { private AnnotationColumnChooser aColChooser; private JRadioButton hideOption = new JRadioButton(); private JRadioButton selectOption = new JRadioButton(); private ButtonGroup optionsGroup = new ButtonGroup(); public FurtherActionPanel(AnnotationColumnChooser aColChooser) { this.aColChooser = aColChooser; getSelectOption().setBackground(Color.white); getSelectOption().setFont(JvSwingUtils.getLabelFont()); getSelectOption().setText("Select"); getSelectOption().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { selectRadioAction(actionEvent); } }); getHideOption().setBackground(Color.white); getHideOption().setFont(JvSwingUtils.getLabelFont()); getHideOption().setText("Hide"); getHideOption().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { hideRadioAction(actionEvent); } }); getOptionsGroup().add(getSelectOption()); getOptionsGroup().add(getHideOption()); getOptionsGroup().setSelected(getSelectOption().getModel(), true); this.setBackground(Color.white); this.setFont(JvSwingUtils.getLabelFont()); syncState(); this.add(getSelectOption()); this.add(getHideOption()); } 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 JRadioButton getHideOption() { return hideOption; } public void setHideOption(JRadioButton hideOption) { this.hideOption = hideOption; } public JRadioButton getSelectOption() { return selectOption; } public void setSelectOption(JRadioButton selectOption) { this.selectOption = selectOption; } public ButtonGroup getOptionsGroup() { return optionsGroup; } public void setOptionsGroup(ButtonGroup optionsGroup) { this.optionsGroup = optionsGroup; } public void syncState() { if (aColChooser.getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE) { this.getOptionsGroup().setSelected(this.getHideOption().getModel(), true); } else { this.getOptionsGroup().setSelected( this.getSelectOption().getModel(), true); } } } public class StructureFilterPanel extends JPanel { 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; alphaHelix.setBackground(Color.white); alphaHelix.setFont(JvSwingUtils.getLabelFont()); alphaHelix.setText("Alpha Helix"); alphaHelix.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { alphaHelix_actionPerformed(); } }); betaStrand.setBackground(Color.white); betaStrand.setFont(JvSwingUtils.getLabelFont()); betaStrand.setText("Beta Strand"); betaStrand.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { betaStrand_actionPerformed(); } }); turn.setBackground(Color.white); turn.setFont(JvSwingUtils.getLabelFont()); turn.setText("Turn"); turn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { turn_actionPerformed(); } }); all.setBackground(Color.white); all.setFont(JvSwingUtils.getLabelFont()); all.setText("Select all"); all.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { all_actionPerformed(); } }); this.setBorder(new TitledBorder("Structures Filter")); this.setBackground(Color.white); this.setFont(JvSwingUtils.getLabelFont()); 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.getAlphaHelix().isSelected()); betaStrand.setSelected(sfp.getBetaStrand().isSelected()); turn.setSelected(sfp.getTurn().isSelected()); if (sfp.getAll().isSelected()) { all.setSelected(true); alphaHelix.setSelected(true); betaStrand.setSelected(true); turn.setSelected(true); } } } public JCheckBox getAlphaHelix() { return alphaHelix; } public void setAlphaHelix(JCheckBox alphaHelix) { this.alphaHelix = alphaHelix; } public JCheckBox getBetaStrand() { return betaStrand; } public void setBetaStrand(JCheckBox betaStrand) { this.betaStrand = betaStrand; } public JCheckBox getTurn() { return turn; } public void setTurn(JCheckBox turn) { this.turn = turn; } public JCheckBox getAll() { return all; } public void setAll(JCheckBox all) { this.all = all; } } public class SearchPanel extends JPanel { private AnnotationColumnChooser aColChooser; private JCheckBox displayName = new JCheckBox(); private JCheckBox description = new JCheckBox(); private JTextField searchBox = new JTextField(10); private JCheckBox structuresFilter = new JCheckBox(); public SearchPanel(AnnotationColumnChooser aColChooser) { this.aColChooser = aColChooser; this.setBorder(new TitledBorder("Search Filter")); this.setBackground(Color.white); this.setFont(JvSwingUtils.getLabelFont()); getSearchBox().setBackground(Color.white); getSearchBox().setFont(JvSwingUtils.getLabelFont()); getSearchBox().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(); } }); getDisplayName().setBackground(Color.white); getDisplayName().setFont(JvSwingUtils.getLabelFont()); getDisplayName().setText("Display Name"); getDisplayName().setEnabled(false); getDisplayName().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { displayNameCheckboxAction(); } }); getDescription().setBackground(Color.white); getDescription().setFont(JvSwingUtils.getLabelFont()); getDescription().setText("Description"); getDescription().setEnabled(false); getDescription().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { discriptionCheckboxAction(); } }); syncState(); this.add(getSearchBox()); this.add(getDisplayName()); this.add(getDescription()); } public boolean isDescriptionChecked() { return getDescription().isSelected(); } public boolean isDisplayNameChecked() { return getDisplayName().isSelected(); } public String getSearchString() { return getSearchBox().getText(); } public void displayNameCheckboxAction() { aColChooser.setCurrentSearchPanel(this); aColChooser.updateView(); } public void discriptionCheckboxAction() { aColChooser.setCurrentSearchPanel(this); aColChooser.updateView(); } public void searchStringAction() { aColChooser.setCurrentSearchPanel(this); aColChooser.updateView(); } public JCheckBox getDisplayName() { return displayName; } public void setDisplayName(JCheckBox displayName) { this.displayName = displayName; } public JCheckBox getDescription() { return description; } public void setDescription(JCheckBox description) { this.description = description; } public JTextField getSearchBox() { return searchBox; } public void setSearchBox(JTextField searchBox) { this.searchBox = searchBox; } public JCheckBox getStructuresFilter() { return structuresFilter; } public void setStructuresFilter(JCheckBox structuresFilter) { this.structuresFilter = structuresFilter; } public void syncState() { SearchPanel sp = aColChooser.getCurrentSearchPanel(); if (sp != null) { description.setEnabled(sp.getDescription().isEnabled()); description.setSelected(sp.getDescription().isSelected()); displayName.setEnabled(sp.getDisplayName().isEnabled()); displayName.setSelected(sp.getDisplayName().isSelected()); searchBox.setText(sp.getSearchBox().getText()); } } } }