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 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.JButton; 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 net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") 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(); 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 currentStructureFilterPanel; JLabel annotationLabel = new JLabel(); BorderLayout borderLayout1 = new BorderLayout(); private JComboBox threshold = new JComboBox(); 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; 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 the 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(); } public AnnotationColumnChooser() { try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } } 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); } }); 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")); thresholdPanel.setBackground(Color.white); thresholdPanel.setFont(JvSwingUtils.getLabelFont()); thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]")); 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()); 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.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.alignmentChanged(); 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; } // else{ // threshold.setSelectedIndex(AlignmentAnnotation.NO_GRAPH); // } gSearchPanel.syncState(); gFurtherActionPanel.syncState(); gFurtherActionPanel.syncState(); gFurtherActionPanel.syncState(); ngSearchPanel.syncState(); ngFurtherActionPanel.syncState(); ngStructureFilterPanel.syncState(); ngFurtherActionPanel.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; } }