2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.appletgui;
23 import jalview.datamodel.AlignmentAnnotation;
24 import jalview.datamodel.HiddenColumns;
25 import jalview.schemes.AnnotationColourGradient;
26 import jalview.util.MessageManager;
27 import jalview.viewmodel.annotationfilter.AnnotationFilterParameter;
29 import java.awt.BorderLayout;
30 import java.awt.CardLayout;
31 import java.awt.Checkbox;
32 import java.awt.Choice;
33 import java.awt.Color;
34 import java.awt.Dimension;
35 import java.awt.Frame;
36 import java.awt.Panel;
37 import java.awt.TextField;
38 import java.awt.event.ActionEvent;
39 import java.awt.event.ActionListener;
40 import java.awt.event.AdjustmentEvent;
41 import java.awt.event.AdjustmentListener;
42 import java.awt.event.ItemEvent;
43 import java.awt.event.ItemListener;
44 import java.awt.event.MouseAdapter;
45 import java.awt.event.MouseEvent;
46 import java.awt.event.MouseListener;
47 import java.awt.event.TextEvent;
48 import java.awt.event.TextListener;
49 import java.util.ArrayList;
50 import java.util.Vector;
52 //import javax.swing.JPanel;
54 //import net.miginfocom.swing.MigLayout;
56 public class AnnotationColumnChooser extends AnnotationRowFilter implements
57 ActionListener, AdjustmentListener, ItemListener, MouseListener
60 private Choice annotations = new Choice();
62 private Panel actionPanel = new Panel();
64 private TitledPanel thresholdPanel = new TitledPanel();
66 private Panel switchableViewsPanel = new Panel(new CardLayout());
68 private CardLayout switchableViewsLayout = (CardLayout) (switchableViewsPanel
71 private Panel noGraphFilterView = new Panel();
73 private Panel graphFilterView = new Panel();
75 private Panel annotationComboBoxPanel = new Panel();
77 private BorderLayout borderLayout1 = new BorderLayout();
79 private BorderLayout gBorderLayout = new BorderLayout();
81 private BorderLayout ngBorderLayout = new BorderLayout();
83 private Choice threshold = new Choice();
85 private StructureFilterPanel gStructureFilterPanel;
87 private StructureFilterPanel ngStructureFilterPanel;
89 private StructureFilterPanel currentStructureFilterPanel;
91 private SearchPanel currentSearchPanel;
93 private SearchPanel gSearchPanel;
95 private SearchPanel ngSearchPanel;
97 private FurtherActionPanel currentFurtherActionPanel;
99 private FurtherActionPanel gFurtherActionPanel;
101 private FurtherActionPanel ngFurtherActionPanel;
103 public static final int ACTION_OPTION_SELECT = 1;
105 public static int ACTION_OPTION_HIDE = 2;
107 public static String NO_GRAPH_VIEW = "0";
109 public static String GRAPH_VIEW = "1";
111 private int actionOption = ACTION_OPTION_SELECT;
113 private HiddenColumns oldHiddenColumns;
115 public AnnotationColumnChooser()
120 } catch (Exception ex)
122 ex.printStackTrace();
126 public AnnotationColumnChooser(AlignViewport av, final AlignmentPanel ap)
131 jalview.bin.JalviewLite.addFrame(frame,
132 MessageManager.getString("label.select_by_annotation"), 520,
135 slider.addAdjustmentListener(this);
136 slider.addMouseListener(this);
138 AlignmentAnnotation[] anns = av.getAlignment().getAlignmentAnnotation();
143 setOldHiddenColumns(av.getAlignment().getHiddenColumns());
145 Vector<String> list = new Vector<>();
147 for (int i = 0; i < anns.length; i++)
149 String label = anns[i].label;
150 if (anns[i].sequenceRef != null)
152 label = label + "_" + anns[i].sequenceRef.getName();
154 if (!list.contains(label))
156 list.addElement(label);
160 list.addElement(label + "_" + (index++));
164 for (int i = 0; i < list.size(); i++)
166 annotations.addItem(list.elementAt(i).toString());
169 populateThresholdComboBox(threshold);
170 AnnotationColumnChooser lastChooser = av
171 .getAnnotationColumnSelectionState();
172 // restore Object state from the previous session if one exists
173 if (lastChooser != null)
175 currentSearchPanel = lastChooser
176 .getCurrentSearchPanel();
177 currentStructureFilterPanel = lastChooser
178 .getCurrentStructureFilterPanel();
179 annotations.select(lastChooser
180 .getAnnotations().getSelectedIndex());
181 threshold.select(lastChooser
182 .getThreshold().getSelectedIndex());
183 actionOption = lastChooser
185 percentThreshold.setState(lastChooser.percentThreshold.getState());
191 } catch (Exception ex)
201 private void jbInit() throws Exception
203 ok.setLabel(MessageManager.getString("action.ok"));
205 cancel.setLabel(MessageManager.getString("action.cancel"));
207 thresholdValue.setEnabled(false);
208 thresholdValue.setColumns(7);
209 thresholdValue.setCaretPosition(0);
211 ok.addActionListener(this);
212 cancel.addActionListener(this);
213 annotations.addItemListener(this);
214 thresholdValue.addActionListener(this);
215 threshold.addItemListener(this);
217 slider.setBackground(Color.white);
218 slider.setEnabled(false);
219 slider.setPreferredSize(new Dimension(100, 32));
221 thresholdPanel.setBackground(Color.white);
222 // thresholdPanel.setFont(JvSwingUtils.getLabelFont());
223 // thresholdPanel.setLayout(new MigLayout("", "[left][right]", "[][]"));
225 percentThreshold.setLabel("As percentage");
226 percentThreshold.addItemListener(this);
228 actionPanel.setBackground(Color.white);
229 // actionPanel.setFont(JvSwingUtils.getLabelFont());
231 graphFilterView.setLayout(gBorderLayout);
232 graphFilterView.setBackground(Color.white);
234 noGraphFilterView.setLayout(ngBorderLayout);
235 noGraphFilterView.setBackground(Color.white);
237 annotationComboBoxPanel.setBackground(Color.white);
238 // annotationComboBoxPanel.setFont(JvSwingUtils.getLabelFont());
240 gSearchPanel = new SearchPanel(this);
241 ngSearchPanel = new SearchPanel(this);
242 gFurtherActionPanel = new FurtherActionPanel(this);
243 ngFurtherActionPanel = new FurtherActionPanel(this);
244 gStructureFilterPanel = new StructureFilterPanel(this);
245 ngStructureFilterPanel = new StructureFilterPanel(this);
247 thresholdPanel.setTitle("Threshold Filter");
248 thresholdPanel.add(getThreshold());
249 thresholdPanel.add(slider);
250 thresholdPanel.add(thresholdValue);
251 thresholdPanel.add(percentThreshold);
254 actionPanel.add(cancel);
256 Panel staticPanel = new Panel();
257 staticPanel.setLayout(new BorderLayout());
258 staticPanel.setBackground(Color.white);
260 staticPanel.add(gSearchPanel, java.awt.BorderLayout.NORTH);
261 staticPanel.add(gStructureFilterPanel, java.awt.BorderLayout.SOUTH);
263 graphFilterView.add(staticPanel, java.awt.BorderLayout.NORTH);
264 graphFilterView.add(thresholdPanel, java.awt.BorderLayout.CENTER);
265 graphFilterView.add(gFurtherActionPanel, java.awt.BorderLayout.SOUTH);
267 noGraphFilterView.add(ngSearchPanel, java.awt.BorderLayout.PAGE_START);
268 noGraphFilterView.add(ngStructureFilterPanel,
269 java.awt.BorderLayout.CENTER);
270 noGraphFilterView.add(ngFurtherActionPanel,
271 java.awt.BorderLayout.CENTER);
273 annotationComboBoxPanel.add(getAnnotations());
274 switchableViewsPanel.add(noGraphFilterView,
275 AnnotationColumnChooser.NO_GRAPH_VIEW);
276 switchableViewsPanel.add(graphFilterView,
277 AnnotationColumnChooser.GRAPH_VIEW);
279 this.setLayout(borderLayout1);
280 this.add(annotationComboBoxPanel, java.awt.BorderLayout.PAGE_START);
281 this.add(switchableViewsPanel, java.awt.BorderLayout.CENTER);
282 this.add(actionPanel, java.awt.BorderLayout.SOUTH);
284 selectedAnnotationChanged();
289 @SuppressWarnings("unchecked")
292 if (this.getOldHiddenColumns() != null)
294 av.getColumnSelection().clear();
296 if (av.getAnnotationColumnSelectionState() != null)
298 HiddenColumns oldHidden = av
299 .getAnnotationColumnSelectionState()
300 .getOldHiddenColumns();
301 if (oldHidden != null)
303 ArrayList<int[]> regions = oldHidden.getHiddenColumnsCopy();
304 for (int[] positions : regions)
306 av.hideColumns(positions[0], positions[1]);
309 // TODO not clear why we need to hide all the columns (above) if we are
310 // going to copy the hidden columns over wholesale anyway
311 av.getAlignment().setHiddenColumns(oldHidden);
314 ap.paintAlignment(true);
320 public void adjustmentValueChanged(AdjustmentEvent evt)
324 setThresholdValueText();
325 valueChanged(!sliderDragging);
329 protected void addSliderMouseListeners()
332 slider.addMouseListener(new MouseAdapter()
335 public void mousePressed(MouseEvent e)
337 sliderDragging = true;
338 super.mousePressed(e);
342 public void mouseDragged(MouseEvent e)
344 sliderDragging = true;
345 super.mouseDragged(e);
349 public void mouseReleased(MouseEvent evt)
353 sliderDragging = false;
356 ap.paintAlignment(true);
362 public void valueChanged(boolean updateAllAnnotation)
364 if (slider.isEnabled())
366 getCurrentAnnotation().threshold.value = slider.getValue() / 1000f;
368 ap.paintAlignment(false);
372 public Choice getThreshold()
377 public void setThreshold(Choice threshold)
379 this.threshold = threshold;
382 public Choice getAnnotations()
387 public void setAnnotations(Choice annotations)
389 this.annotations = annotations;
393 public void updateView()
395 // Check if combobox is still adjusting
401 AnnotationFilterParameter filterParams = new AnnotationFilterParameter();
402 setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[getAnnotations()
403 .getSelectedIndex()]);
405 int selectedThresholdItem = getSelectedThresholdItem(getThreshold()
406 .getSelectedIndex());
408 slider.setEnabled(true);
409 thresholdValue.setEnabled(true);
410 percentThreshold.setEnabled(true);
412 if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD)
414 slider.setEnabled(false);
415 thresholdValue.setEnabled(false);
416 thresholdValue.setText("");
417 percentThreshold.setEnabled(false);
418 // build filter params
420 else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD)
422 if (getCurrentAnnotation().threshold == null)
424 getCurrentAnnotation()
426 new jalview.datamodel.GraphLine(
427 (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin) / 2f,
428 "Threshold", Color.black));
432 // float range = getCurrentAnnotation().graphMax * 1000
433 // - getCurrentAnnotation().graphMin * 1000;
435 slider.setMinimum((int) (getCurrentAnnotation().graphMin * 1000));
436 slider.setMaximum((int) (getCurrentAnnotation().graphMax * 1000));
437 slider.setValue((int) (getCurrentAnnotation().threshold.value * 1000));
438 setThresholdValueText();
439 // slider.setMajorTickSpacing((int) (range / 10f));
440 slider.setEnabled(true);
441 thresholdValue.setEnabled(true);
442 percentThreshold.setEnabled(true);
445 // build filter params
447 .setThresholdType(AnnotationFilterParameter.ThresholdType.NO_THRESHOLD);
448 if (getCurrentAnnotation().isQuantitative())
451 .setThresholdValue(getCurrentAnnotation().threshold.value);
453 if (selectedThresholdItem == AnnotationColourGradient.ABOVE_THRESHOLD)
456 .setThresholdType(AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD);
458 else if (selectedThresholdItem == AnnotationColourGradient.BELOW_THRESHOLD)
461 .setThresholdType(AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD);
466 if (currentStructureFilterPanel != null)
468 if (currentStructureFilterPanel.alphaHelix.getState())
470 filterParams.setFilterAlphaHelix(true);
472 if (currentStructureFilterPanel.betaStrand.getState())
474 filterParams.setFilterBetaSheet(true);
476 if (currentStructureFilterPanel.turn.getState())
478 filterParams.setFilterTurn(true);
482 if (currentSearchPanel != null)
485 if (!currentSearchPanel.searchBox.getText().isEmpty())
487 currentSearchPanel.description.setEnabled(true);
488 currentSearchPanel.displayName.setEnabled(true);
489 filterParams.setRegexString(currentSearchPanel.searchBox.getText());
490 if (currentSearchPanel.displayName.getState())
493 .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DISPLAY_STRING);
495 if (currentSearchPanel.description.getState())
498 .addRegexSearchField(AnnotationFilterParameter.SearchableAnnotationField.DESCRIPTION);
503 currentSearchPanel.description.setEnabled(false);
504 currentSearchPanel.displayName.setEnabled(false);
508 // show hidden columns here, before changing the column selection in
509 // filterAnnotations, because showing hidden columns has the side effect of
510 // adding them to the selection
511 av.showAllHiddenColumns();
512 av.getColumnSelection().filterAnnotations(
513 getCurrentAnnotation().annotations, filterParams);
515 if (getActionOption() == ACTION_OPTION_HIDE)
517 av.hideSelectedColumns();
521 av.setAnnotationColumnSelectionState(this);
523 ap.paintAlignment(true);
526 public HiddenColumns getOldHiddenColumns()
528 return oldHiddenColumns;
531 public void setOldHiddenColumns(HiddenColumns currentHiddenColumns)
533 if (currentHiddenColumns != null)
535 this.oldHiddenColumns = new HiddenColumns(currentHiddenColumns);
539 public FurtherActionPanel getCurrentFutherActionPanel()
541 return currentFurtherActionPanel;
544 public void setCurrentFutherActionPanel(
545 FurtherActionPanel currentFutherActionPanel)
547 this.currentFurtherActionPanel = currentFutherActionPanel;
550 public SearchPanel getCurrentSearchPanel()
552 return currentSearchPanel;
555 public void setCurrentSearchPanel(SearchPanel currentSearchPanel)
557 this.currentSearchPanel = currentSearchPanel;
560 public int getActionOption()
565 public void setActionOption(int actionOption)
567 this.actionOption = actionOption;
570 public StructureFilterPanel getCurrentStructureFilterPanel()
572 return currentStructureFilterPanel;
575 public void setCurrentStructureFilterPanel(
576 StructureFilterPanel currentStructureFilterPanel)
578 this.currentStructureFilterPanel = currentStructureFilterPanel;
582 public void itemStateChanged(ItemEvent e)
584 if (e.getSource() == annotations)
586 selectedAnnotationChanged();
588 else if (e.getSource() == threshold)
590 threshold_actionPerformed(null);
592 else if (e.getSource() == percentThreshold)
596 percentageValue_actionPerformed();
602 public void selectedAnnotationChanged()
604 String currentView = AnnotationColumnChooser.NO_GRAPH_VIEW;
605 if (av.getAlignment().getAlignmentAnnotation()[getAnnotations()
606 .getSelectedIndex()].isQuantitative())
608 currentView = AnnotationColumnChooser.GRAPH_VIEW;
611 gSearchPanel.syncState();
612 gFurtherActionPanel.syncState();
613 gStructureFilterPanel.syncState();
615 ngSearchPanel.syncState();
616 ngFurtherActionPanel.syncState();
617 ngStructureFilterPanel.syncState();
619 switchableViewsLayout.show(switchableViewsPanel, currentView);
623 public class FurtherActionPanel extends Panel implements ItemListener
625 private AnnotationColumnChooser aColChooser;
627 private Choice furtherAction = new Choice();
629 public FurtherActionPanel(AnnotationColumnChooser aColChooser)
631 this.aColChooser = aColChooser;
632 furtherAction.addItem("Select");
633 furtherAction.addItem("Hide");
634 furtherAction.addItemListener(this);
637 // this.setTitle("Filter Actions");
638 // this.setFont(JvSwingUtils.getLabelFont());
640 this.add(furtherAction);
643 public void syncState()
645 if (aColChooser.getActionOption() == AnnotationColumnChooser.ACTION_OPTION_HIDE)
647 furtherAction.select("Hide");
651 furtherAction.select("Select");
656 public void itemStateChanged(ItemEvent e)
658 aColChooser.setCurrentFutherActionPanel(this);
659 if (furtherAction.getSelectedItem().equalsIgnoreCase("Select"))
661 setActionOption(ACTION_OPTION_SELECT);
666 setActionOption(ACTION_OPTION_HIDE);
673 public class StructureFilterPanel extends TitledPanel implements
676 private AnnotationColumnChooser aColChooser;
678 private Checkbox alphaHelix = new Checkbox();
680 private Checkbox betaStrand = new Checkbox();
682 private Checkbox turn = new Checkbox();
684 private Checkbox all = new Checkbox();
686 public StructureFilterPanel(AnnotationColumnChooser aColChooser)
688 this.aColChooser = aColChooser;
690 alphaHelix.setLabel(MessageManager.getString("label.alpha_helix"));
691 alphaHelix.setBackground(Color.white);
693 alphaHelix.addItemListener(this);
695 betaStrand.setLabel(MessageManager.getString("label.beta_strand"));
696 betaStrand.setBackground(Color.white);
697 betaStrand.addItemListener(this);
699 turn.setLabel(MessageManager.getString("label.turn"));
700 turn.setBackground(Color.white);
701 turn.addItemListener(this);
703 all.setLabel(MessageManager.getString("label.select_all"));
704 all.setBackground(Color.white);
705 all.addItemListener(this);
707 this.setBackground(Color.white);
708 this.setTitle("Structure Filter");
709 // this.setFont(JvSwingUtils.getLabelFont());
712 this.add(alphaHelix);
713 this.add(betaStrand);
717 public void alphaHelix_actionPerformed()
719 updateSelectAllState();
720 aColChooser.setCurrentStructureFilterPanel(this);
721 aColChooser.updateView();
724 public void betaStrand_actionPerformed()
726 updateSelectAllState();
727 aColChooser.setCurrentStructureFilterPanel(this);
728 aColChooser.updateView();
731 public void turn_actionPerformed()
733 updateSelectAllState();
734 aColChooser.setCurrentStructureFilterPanel(this);
735 aColChooser.updateView();
738 public void all_actionPerformed()
742 alphaHelix.setState(true);
743 betaStrand.setState(true);
748 alphaHelix.setState(false);
749 betaStrand.setState(false);
750 turn.setState(false);
752 aColChooser.setCurrentStructureFilterPanel(this);
753 aColChooser.updateView();
756 public void updateSelectAllState()
758 if (alphaHelix.getState() && betaStrand.getState() && turn.getState())
768 public void syncState()
770 StructureFilterPanel sfp = aColChooser
771 .getCurrentStructureFilterPanel();
774 alphaHelix.setState(sfp.alphaHelix.getState());
775 betaStrand.setState(sfp.betaStrand.getState());
776 turn.setState(sfp.turn.getState());
777 if (sfp.all.getState())
780 alphaHelix.setState(true);
781 betaStrand.setState(true);
789 public void itemStateChanged(ItemEvent e)
791 if (e.getSource() == alphaHelix)
793 alphaHelix_actionPerformed();
795 else if (e.getSource() == betaStrand)
797 betaStrand_actionPerformed();
799 else if (e.getSource() == turn)
801 turn_actionPerformed();
803 else if (e.getSource() == all)
805 all_actionPerformed();
810 public class SearchPanel extends TitledPanel implements ItemListener
812 private AnnotationColumnChooser aColChooser;
814 private Checkbox displayName = new Checkbox();
816 private Checkbox description = new Checkbox();
818 private TextField searchBox = new TextField(10);
820 public SearchPanel(AnnotationColumnChooser aColChooser)
823 this.aColChooser = aColChooser;
824 searchBox.addTextListener(new TextListener()
828 public void textValueChanged(TextEvent e)
830 searchStringAction();
836 displayName.setLabel(MessageManager.getString("label.label"));
837 displayName.setEnabled(false);
838 displayName.addItemListener(this);
840 description.setLabel(MessageManager.getString("label.description"));
841 description.setEnabled(false);
842 description.addItemListener(this);
843 this.setTitle("Search Filter");
844 // this.setFont(JvSwingUtils.getLabelFont());
848 this.add(displayName);
849 this.add(description);
852 public void displayNameCheckboxAction()
854 aColChooser.setCurrentSearchPanel(this);
855 aColChooser.updateView();
858 public void discriptionCheckboxAction()
860 aColChooser.setCurrentSearchPanel(this);
861 aColChooser.updateView();
864 public void searchStringAction()
866 aColChooser.setCurrentSearchPanel(this);
867 aColChooser.updateView();
870 public void syncState()
872 SearchPanel sp = aColChooser.getCurrentSearchPanel();
875 description.setEnabled(sp.description.isEnabled());
876 description.setState(sp.description.getState());
878 displayName.setEnabled(sp.displayName.isEnabled());
879 displayName.setState(sp.displayName.getState());
881 searchBox.setText(sp.searchBox.getText());
886 public void itemStateChanged(ItemEvent e)
888 if (e.getSource() == displayName)
890 displayNameCheckboxAction();
892 else if (e.getSource() == description)
894 discriptionCheckboxAction();
901 public void actionPerformed(ActionEvent evt)
904 if (evt.getSource() == ok)
906 ok_actionPerformed(null);
908 else if (evt.getSource() == cancel)
910 cancel_actionPerformed(null);
912 else if (evt.getSource() == thresholdValue)
914 thresholdValue_actionPerformed(null);
923 public void mouseClicked(MouseEvent e)
925 // TODO Auto-generated method stub
930 public void mousePressed(MouseEvent e)
932 if (e.getSource() == slider)
940 public void mouseReleased(MouseEvent e)
942 if (e.getSource() == slider)
949 public void mouseEntered(MouseEvent e)
951 if (e.getSource() == slider)
958 public void mouseExited(MouseEvent e)
960 if (e.getSource() == slider)