X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationRowFilter.java;h=c2bf41bc479187990e12fe51f4b930cc59a21399;hb=a38d7808b759178025820c8d220a37d1442a57b3;hp=ed59ef60188711fd1fd5442fd04112ccc88d1705;hpb=c03d2649512cdc491a46dda1d1370273241b5253;p=jalview.git diff --git a/src/jalview/gui/AnnotationRowFilter.java b/src/jalview/gui/AnnotationRowFilter.java index ed59ef6..c2bf41b 100644 --- a/src/jalview/gui/AnnotationRowFilter.java +++ b/src/jalview/gui/AnnotationRowFilter.java @@ -1,22 +1,45 @@ +/* + * 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.api.AnnotationRowFilterI; import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.Annotation; -import jalview.datamodel.AnnotationFilterParameter; -import jalview.datamodel.AnnotationFilterParameter.SearchableAnnotationField; -import jalview.datamodel.ColumnSelection; import jalview.datamodel.GraphLine; -import jalview.datamodel.SequenceGroup; import jalview.schemes.AnnotationColourGradient; import jalview.util.MessageManager; +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.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import java.util.Vector; +import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JInternalFrame; @@ -27,8 +50,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @SuppressWarnings("serial") -public abstract class AnnotationRowFilter extends JPanel implements - AnnotationRowFilterI +public abstract class AnnotationRowFilter extends JPanel { protected AlignViewport av; @@ -36,33 +58,58 @@ public abstract class AnnotationRowFilter extends JPanel implements protected int[] annmap; - protected boolean enableSeqAss = false; - - private jalview.datamodel.AlignmentAnnotation currentAnnotation; - protected boolean adjusting = false; - protected JCheckBox currentColours = new JCheckBox(); - - protected JPanel minColour = new JPanel(); - - protected JPanel maxColour = new JPanel(); - protected JCheckBox seqAssociated = new JCheckBox(); - protected JCheckBox thresholdIsMin = new JCheckBox(); - protected JSlider slider = new JSlider(); protected JTextField thresholdValue = new JTextField(20); protected JInternalFrame frame; + + protected JButton ok = new JButton(); + + protected JButton cancel = new JButton(); + /** * enabled if the user is dragging the slider - try to keep updates to a * minimun */ protected boolean sliderDragging = false; + protected JComboBox threshold = new JComboBox(); + + protected JComboBox annotations; + + /* + * map from annotation to its menu item display label + * - so we know which item to pre-select on restore + */ + private Map annotationLabels; + + private AlignmentAnnotation currentAnnotation; + + /** + * Constructor + * + * @param viewport + * @param alignPanel + */ + public AnnotationRowFilter(AlignViewport viewport, final AlignmentPanel alignPanel) + { + this.av = viewport; + this.ap = alignPanel; + thresholdValue.addFocusListener(new FocusAdapter() + { + @Override + public void focusLost(FocusEvent e) + { + thresholdValue_actionPerformed(); + } + }); + } + protected void addSliderChangeListener() { @@ -112,27 +159,27 @@ public abstract class AnnotationRowFilter extends JPanel implements }); } - - public AnnotationRowFilter(AlignViewport av, final AlignmentPanel ap) - { - this.av = av; - this.ap = ap; - } - - public AnnotationRowFilter() - { - - } - - @Override +/** + * Builds and returns a list of menu items (display text) for choice of + * annotation. Also builds maps between annotations, their positions in the + * list, and their display labels in the list. + * + * @param isSeqAssociated + * @return + */ public Vector getAnnotationItems(boolean isSeqAssociated) { + annotationLabels = new HashMap(); + Vector list = new Vector(); int index = 1; int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length]; + seqAssociated.setEnabled(false); for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++) { - if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null) + AlignmentAnnotation annotation = av.getAlignment() + .getAlignmentAnnotation()[i]; + if (annotation.sequenceRef == null) { if (isSeqAssociated) { @@ -141,21 +188,29 @@ public abstract class AnnotationRowFilter extends JPanel implements } else { - enableSeqAss = true; + seqAssociated.setEnabled(true); + } + String label = annotation.label; + // add associated sequence ID if available + if (!isSeqAssociated && annotation.sequenceRef != null) + { + label = label + "_" + annotation.sequenceRef.getName(); } - String label = av.getAlignment().getAlignmentAnnotation()[i].label; + // make label unique if (!list.contains(label)) { anmap[list.size()] = i; list.add(label); - + annotationLabels.put(annotation, label); } else { if (!isSeqAssociated) { anmap[list.size()] = i; - list.add(label + "_" + (index++)); + label = label + "_" + (index++); + list.add(label); + annotationLabels.put(annotation, label); } } } @@ -178,14 +233,8 @@ public abstract class AnnotationRowFilter extends JPanel implements return selectedThresholdItem; } - public void modelChanged() + public void ok_actionPerformed() { - seqAssociated.setEnabled(enableSeqAss); - } - - public void ok_actionPerformed(ActionEvent e) - { - updateView(); try { frame.setClosed(true); @@ -194,7 +243,7 @@ public abstract class AnnotationRowFilter extends JPanel implements } } - public void cancel_actionPerformed(ActionEvent e) + public void cancel_actionPerformed() { reset(); ap.paintAlignment(true); @@ -206,22 +255,22 @@ public abstract class AnnotationRowFilter extends JPanel implements } } - public void thresholdCheck_actionPerformed(ActionEvent e) + protected void thresholdCheck_actionPerformed() { updateView(); } - public void annotations_actionPerformed(ActionEvent e) + protected void selectedAnnotationChanged() { updateView(); } - public void threshold_actionPerformed(ActionEvent e) + protected void threshold_actionPerformed() { updateView(); } - public void thresholdValue_actionPerformed(ActionEvent e) + protected void thresholdValue_actionPerformed() { try { @@ -233,28 +282,34 @@ public abstract class AnnotationRowFilter extends JPanel implements } } - public void thresholdIsMin_actionPerformed(ActionEvent actionEvent) + protected void thresholdIsMin_actionPerformed() { updateView(); } - protected void populateThresholdComboBox(JComboBox threshold) + protected void populateThresholdComboBox(JComboBox thresh) { - threshold.addItem(MessageManager - .getString("label.threshold_feature_no_thereshold")); - threshold.addItem(MessageManager - .getString("label.threshold_feature_above_thereshold")); - threshold.addItem(MessageManager - .getString("label.threshold_feature_below_thereshold")); + thresh.addItem(MessageManager + .getString("label.threshold_feature_no_threshold")); + thresh.addItem(MessageManager + .getString("label.threshold_feature_above_threshold")); + thresh.addItem(MessageManager + .getString("label.threshold_feature_below_threshold")); } - protected void seqAssociated_actionPerformed(ActionEvent arg0, - JComboBox annotations, JCheckBox seqAssociated) + /** + * Rebuilds the drop-down list of annotations to choose from when the 'per + * sequence only' checkbox is checked or unchecked. + * + * @param anns + */ + protected void seqAssociated_actionPerformed(JComboBox anns) { adjusting = true; - String cursel = (String) annotations.getSelectedItem(); - boolean isvalid = false, isseqs = seqAssociated.isSelected(); - annotations.removeAllItems(); + String cursel = (String) anns.getSelectedItem(); + boolean isvalid = false; + boolean isseqs = seqAssociated.isSelected(); + anns.removeAllItems(); for (String anitem : getAnnotationItems(seqAssociated.isSelected())) { if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem))) @@ -262,20 +317,22 @@ public abstract class AnnotationRowFilter extends JPanel implements isvalid = true; cursel = anitem; } - annotations.addItem(anitem); + anns.addItem(anitem); } - adjusting = false; if (isvalid) { - annotations.setSelectedItem(cursel); + anns.setSelectedItem(cursel); } else { - if (annotations.getItemCount() > 0) + if (anns.getItemCount() > 0) { - annotations.setSelectedIndex(0); + anns.setSelectedIndex(0); } } + adjusting = false; + + updateView(); } protected void propagateSeqAssociatedThreshold(boolean allAnnotation, @@ -306,158 +363,107 @@ public abstract class AnnotationRowFilter extends JPanel implements } } - protected boolean colorAlignmContaining( - AlignmentAnnotation currentAnnotation, int selectedThresholdItem) + public AlignmentAnnotation getCurrentAnnotation() { + return currentAnnotation; + } - AnnotationColourGradient acg = null; - if (currentColours.isSelected()) - { - acg = new AnnotationColourGradient(currentAnnotation, - av.getGlobalColourScheme(), selectedThresholdItem); - } - else - { - acg = new AnnotationColourGradient(currentAnnotation, - minColour.getBackground(), maxColour.getBackground(), - selectedThresholdItem); - } - acg.setSeqAssociated(seqAssociated.isSelected()); - - if (currentAnnotation.graphMin == 0f - && currentAnnotation.graphMax == 0f) - { - acg.setPredefinedColours(true); - } - - acg.thresholdIsMinMax = thresholdIsMin.isSelected(); - - av.setGlobalColourScheme(acg); - - if (av.getAlignment().getGroups() != null) - { + protected void setCurrentAnnotation(AlignmentAnnotation annotation) + { + this.currentAnnotation = annotation; + } - for (SequenceGroup sg : ap.av.getAlignment().getGroups()) - { - if (sg.cs == null) - { - continue; - } + protected abstract void valueChanged(boolean updateAllAnnotation); - if (currentColours.isSelected()) - { - sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs, - selectedThresholdItem); - ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated - .isSelected()); + protected abstract void updateView(); - } - else - { - sg.cs = new AnnotationColourGradient(currentAnnotation, - minColour.getBackground(), maxColour.getBackground(), - selectedThresholdItem); - ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated - .isSelected()); - } + protected abstract void reset(); - } - } - return false; + protected String getAnnotationMenuLabel(AlignmentAnnotation ann) + { + return annotationLabels.get(ann); } - protected boolean filterAnnotations(Annotation[] annotations, - AnnotationFilterParameter filterParams, ColumnSelection cs) + protected void jbInit() { - av.showAllHiddenColumns(); - cs.clear(); - int count = 0; - do + ok.setOpaque(false); + ok.setText(MessageManager.getString("action.ok")); + ok.addActionListener(new ActionListener() { - if (annotations[count] != null) + @Override + public void actionPerformed(ActionEvent e) { + ok_actionPerformed(); + } + }); - boolean itemMatched = false; - - if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.ABOVE_THRESHOLD - && annotations[count].value > currentAnnotation.threshold.value) - { - itemMatched = true; - } - if (filterParams.getThresholdType() == AnnotationFilterParameter.ThresholdType.BELOW_THRESHOLD - && annotations[count].value < currentAnnotation.threshold.value) - { - itemMatched = true; - } + cancel.setOpaque(false); + cancel.setText(MessageManager.getString("action.cancel")); + cancel.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + cancel_actionPerformed(); + } + }); - if (filterParams.isFilterAlphaHelix() - && annotations[count].secondaryStructure == 'H') - { - itemMatched = true; - } + annotations.addItemListener(new ItemListener() + { + @Override + public void itemStateChanged(ItemEvent e) + { + selectedAnnotationChanged(); + } + }); + annotations.setToolTipText(MessageManager + .getString("info.select_annotation_row")); - if (filterParams.isFilterBetaSheet() - && annotations[count].secondaryStructure == 'E') - { - itemMatched = true; - } + threshold.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + threshold_actionPerformed(); + } + }); - if (filterParams.isFilterTurn() - && annotations[count].secondaryStructure == 'S') - { - itemMatched = true; - } + thresholdValue.setEnabled(false); + thresholdValue.setColumns(7); + thresholdValue.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + thresholdValue_actionPerformed(); + } + }); - String regexSearchString = filterParams.getRegexString(); - if (regexSearchString != null - && !filterParams.getRegexSearchFields().isEmpty()) - { - List fields = filterParams - .getRegexSearchFields(); - try - { - if (fields.contains(SearchableAnnotationField.DISPLAY_STRING) - && annotations[count].displayCharacter - .matches(regexSearchString)) - { - itemMatched = true; - } - } catch (java.util.regex.PatternSyntaxException pse) - { - if (annotations[count].displayCharacter - .equals(regexSearchString)) - { - itemMatched = true; - } - } - if (fields.contains(SearchableAnnotationField.DESCRIPTION) - && annotations[count].description != null - && annotations[count].description - .matches(regexSearchString)) - { - itemMatched = true; - } - } + slider.setPaintLabels(false); + slider.setPaintTicks(true); + slider.setBackground(Color.white); + slider.setEnabled(false); + slider.setOpaque(false); + slider.setPreferredSize(new Dimension(100, 32)); + } - if (itemMatched) - { - cs.addElement(count); - } - } - count++; - } while (count < annotations.length); - return false; + public JComboBox getThreshold() + { + return threshold; } - public jalview.datamodel.AlignmentAnnotation getCurrentAnnotation() + public void setThreshold(JComboBox thresh) { - return currentAnnotation; + this.threshold = thresh; } - public void setCurrentAnnotation( - jalview.datamodel.AlignmentAnnotation currentAnnotation) + public JComboBox getAnnotations() { - this.currentAnnotation = currentAnnotation; + return annotations; } + public void setAnnotations(JComboBox anns) + { + this.annotations = anns; + } }