X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationColourChooser.java;h=699b560471bb8a4fe8e72b0cd3826f5af81dc20c;hb=ead72caff9aef9b7103dbb15907aeae777200832;hp=b8996b639f8aa9cc4d5ba6e1f49e420b8f94d0fe;hpb=3a261a3e4451bb5c04af9e6f7da496951a569a18;p=jalview.git diff --git a/src/jalview/gui/AnnotationColourChooser.java b/src/jalview/gui/AnnotationColourChooser.java index b8996b6..699b560 100644 --- a/src/jalview/gui/AnnotationColourChooser.java +++ b/src/jalview/gui/AnnotationColourChooser.java @@ -21,8 +21,6 @@ package jalview.gui; import jalview.bin.Cache; -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.GraphLine; import jalview.datamodel.SequenceGroup; import jalview.schemes.AnnotationColourGradient; import jalview.schemes.ColourSchemeI; @@ -37,51 +35,53 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Hashtable; -import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; -import javax.swing.JCheckBox; import javax.swing.JColorChooser; import javax.swing.JComboBox; import javax.swing.JInternalFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; -import javax.swing.JSlider; -import javax.swing.JTextField; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import net.miginfocom.swing.MigLayout; -public class AnnotationColourChooser extends JPanel +@SuppressWarnings("serial") +public class AnnotationColourChooser extends AnnotationRowFilter { - JInternalFrame frame; - - AlignViewport av; - - AlignmentPanel ap; ColourSchemeI oldcs; - Hashtable oldgroupColours; - - jalview.datamodel.AlignmentAnnotation currentAnnotation; - - boolean adjusting = false; + Hashtable oldgroupColours; /** * enabled if the user is dragging the slider - try to keep updates to a * minimun */ - boolean sliderDragging = false; + + JComboBox annotations; + + JButton defColours = new JButton(); + + JButton ok = new JButton(); + + JButton cancel = new JButton(); + + JPanel jPanel1 = new JPanel(); + + JPanel jPanel2 = new JPanel(); + + BorderLayout borderLayout1 = new BorderLayout(); + + private JComboBox threshold = new JComboBox(); public AnnotationColourChooser(AlignViewport av, final AlignmentPanel ap) { + super(av, ap); oldcs = av.getGlobalColourScheme(); if (av.getAlignment().getGroups() != null) { - oldgroupColours = new Hashtable(); + oldgroupColours = new Hashtable(); for (SequenceGroup sg : ap.av.getAlignment().getGroups()) { if (sg.cs != null) @@ -90,8 +90,6 @@ public class AnnotationColourChooser extends JPanel } } } - this.av = av; - this.ap = ap; frame = new JInternalFrame(); frame.setContentPane(this); frame.setLayer(JLayeredPane.PALETTE_LAYER); @@ -99,45 +97,8 @@ public class AnnotationColourChooser extends JPanel MessageManager.getString("label.colour_by_annotation"), 520, 215); - slider.addChangeListener(new ChangeListener() - { - @Override - public void stateChanged(ChangeEvent evt) - { - if (!adjusting) - { - thresholdValue.setText((slider.getValue() / 1000f) + ""); - valueChanged(!sliderDragging); - } - } - }); - slider.addMouseListener(new MouseAdapter() - { - @Override - public void mousePressed(MouseEvent e) - { - sliderDragging = true; - super.mousePressed(e); - } - - @Override - public void mouseDragged(MouseEvent e) - { - sliderDragging = true; - super.mouseDragged(e); - } - - @Override - public void mouseReleased(MouseEvent evt) - { - if (sliderDragging) - { - sliderDragging = false; - valueChanged(true); - } - ap.paintAlignment(true); - } - }); + addSliderChangeListener(); + addSliderMouseListeners(); if (av.getAlignment().getAlignmentAnnotation() == null) { @@ -161,15 +122,10 @@ public class AnnotationColourChooser extends JPanel seqAssociated.setSelected(acg.isSeqAssociated()); } - annotations = new JComboBox( + annotations = new JComboBox( getAnnotationItems(seqAssociated.isSelected())); - 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")); + populateThresholdComboBox(threshold); if (oldcs instanceof AnnotationColourGradient) { @@ -178,13 +134,13 @@ public class AnnotationColourChooser extends JPanel switch (acg.getAboveThreshold()) { case AnnotationColourGradient.NO_THRESHOLD: - threshold.setSelectedIndex(0); + getThreshold().setSelectedIndex(0); break; case AnnotationColourGradient.ABOVE_THRESHOLD: - threshold.setSelectedIndex(1); + getThreshold().setSelectedIndex(1); break; case AnnotationColourGradient.BELOW_THRESHOLD: - threshold.setSelectedIndex(2); + getThreshold().setSelectedIndex(2); break; default: throw new Error(MessageManager.getString("error.implementation_error_dont_know_about_thereshold_setting")); @@ -199,62 +155,11 @@ public class AnnotationColourChooser extends JPanel } catch (Exception ex) { } - adjusting = false; - changeColour(); + updateView(); frame.invalidate(); frame.pack(); - - } - - private Vector getAnnotationItems(boolean isSeqAssociated) - { - Vector list = new Vector(); - int index = 1; - int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length]; - boolean enableSeqAss = false; - for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++) - { - if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null) - { - if (isSeqAssociated) - { - continue; - } - } - else - { - enableSeqAss = true; - } - String label = av.getAlignment().getAlignmentAnnotation()[i].label; - if (!list.contains(label)) - { - anmap[list.size()] = i; - list.add(label); - - } - else - { - if (!isSeqAssociated) - { - anmap[list.size()] = i; - list.add(label + "_" + (index++)); - } - } - } - seqAssociated.setEnabled(enableSeqAss); - this.annmap = new int[list.size()]; - System.arraycopy(anmap, 0, this.annmap, 0, this.annmap.length); - return list; - } - - private void setDefaultMinMax() - { - minColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", - Color.orange)); - maxColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", - Color.red)); } public AnnotationColourChooser() @@ -342,7 +247,7 @@ public class AnnotationColourChooser extends JPanel annotations_actionPerformed(e); } }); - threshold.addActionListener(new ActionListener() + getThreshold().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) @@ -400,7 +305,7 @@ public class AnnotationColourChooser extends JPanel @Override public void actionPerformed(ActionEvent arg0) { - seqAssociated_actionPerformed(arg0); + seqAssociated_actionPerformed(arg0, annotations, seqAssociated); } }); @@ -419,7 +324,7 @@ public class AnnotationColourChooser extends JPanel colpanel.add(minColour); colpanel.add(maxColour); jPanel2.add(colpanel, "wrap"); - jPanel2.add(threshold); + jPanel2.add(getThreshold()); jPanel2.add(defColours, "skip 1, wrap"); jPanel2.add(thresholdIsMin); jPanel2.add(slider, "grow"); @@ -429,72 +334,19 @@ public class AnnotationColourChooser extends JPanel this.validate(); } - protected void seqAssociated_actionPerformed(ActionEvent arg0) - { - adjusting = true; - String cursel = (String) annotations.getSelectedItem(); - boolean isvalid = false, isseqs = seqAssociated.isSelected(); - this.annotations.removeAllItems(); - for (String anitem : getAnnotationItems(seqAssociated.isSelected())) - { - if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem))) - { - isvalid = true; - cursel = anitem; - } - this.annotations.addItem(anitem); - } - adjusting = false; - if (isvalid) - { - this.annotations.setSelectedItem(cursel); - } - else - { - if (annotations.getItemCount() > 0) - { - annotations.setSelectedIndex(0); - } - } - } - protected void resetColours_actionPerformed(ActionEvent arg0) { setDefaultMinMax(); - changeColour(); + updateView(); } - JComboBox annotations; - - int[] annmap; - - JPanel minColour = new JPanel(); - - JPanel maxColour = new JPanel(); - - JButton defColours = new JButton(); - - JButton ok = new JButton(); - - JButton cancel = new JButton(); - - JPanel jPanel1 = new JPanel(); - - JPanel jPanel2 = new JPanel(); - - BorderLayout borderLayout1 = new BorderLayout(); - - JComboBox threshold = new JComboBox(); - - JSlider slider = new JSlider(); - - JTextField thresholdValue = new JTextField(20); - - JCheckBox currentColours = new JCheckBox(); - - JCheckBox thresholdIsMin = new JCheckBox(); - - JCheckBox seqAssociated = new JCheckBox(); + private void setDefaultMinMax() + { + minColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", + Color.orange)); + maxColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", + Color.red)); + } public void minColour_actionPerformed() { @@ -505,7 +357,7 @@ public class AnnotationColourChooser extends JPanel minColour.setBackground(col); } minColour.repaint(); - changeColour(); + updateView(); } public void maxColour_actionPerformed() @@ -517,247 +369,116 @@ public class AnnotationColourChooser extends JPanel maxColour.setBackground(col); } maxColour.repaint(); - changeColour(); + updateView(); } - void changeColour() + public void reset() { - // Check if combobox is still adjusting - if (adjusting) - { - return; - } - - currentAnnotation = av.getAlignment().getAlignmentAnnotation()[annmap[annotations - .getSelectedIndex()]]; - - int aboveThreshold = -1; - if (threshold.getSelectedIndex() == 1) - { - aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD; - } - else if (threshold.getSelectedIndex() == 2) - { - aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD; - } - - slider.setEnabled(true); - thresholdValue.setEnabled(true); - thresholdIsMin.setEnabled(true); - - if (aboveThreshold == AnnotationColourGradient.NO_THRESHOLD) - { - slider.setEnabled(false); - thresholdValue.setEnabled(false); - thresholdValue.setText(""); - thresholdIsMin.setEnabled(false); - } - else if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD - && currentAnnotation.threshold == null) - { - currentAnnotation - .setThreshold(new jalview.datamodel.GraphLine( - (currentAnnotation.graphMax - currentAnnotation.graphMin) / 2f, - "Threshold", Color.black)); - } - - if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD) - { - adjusting = true; - float range = currentAnnotation.graphMax * 1000 - - currentAnnotation.graphMin * 1000; - - slider.setMinimum((int) (currentAnnotation.graphMin * 1000)); - slider.setMaximum((int) (currentAnnotation.graphMax * 1000)); - slider.setValue((int) (currentAnnotation.threshold.value * 1000)); - thresholdValue.setText(currentAnnotation.threshold.value + ""); - slider.setMajorTickSpacing((int) (range / 10f)); - slider.setEnabled(true); - thresholdValue.setEnabled(true); - adjusting = false; - } - - AnnotationColourGradient acg = null; - if (currentColours.isSelected()) - { - acg = new AnnotationColourGradient(currentAnnotation, - av.getGlobalColourScheme(), aboveThreshold); - } - else - { - acg = new AnnotationColourGradient(currentAnnotation, - minColour.getBackground(), maxColour.getBackground(), - aboveThreshold); - } - acg.setSeqAssociated(seqAssociated.isSelected()); - - if (currentAnnotation.graphMin == 0f - && currentAnnotation.graphMax == 0f) - { - acg.setPredefinedColours(true); - } - - acg.thresholdIsMinMax = thresholdIsMin.isSelected(); - - av.setGlobalColourScheme(acg); - + av.setGlobalColourScheme(oldcs); if (av.getAlignment().getGroups() != null) { for (SequenceGroup sg : ap.av.getAlignment().getGroups()) { - if (sg.cs == null) - { - continue; - } - - if (currentColours.isSelected()) - { - sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs, - aboveThreshold); - ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated - .isSelected()); - - } - else - { - sg.cs = new AnnotationColourGradient(currentAnnotation, - minColour.getBackground(), maxColour.getBackground(), - aboveThreshold); - ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated - .isSelected()); - } - + sg.cs = oldgroupColours.get(sg); } } - ap.alignmentChanged(); - // ensure all associated views (overviews, structures, etc) are notified of - // updated colours. - ap.paintAlignment(true); - } - - public void ok_actionPerformed(ActionEvent e) - { - changeColour(); - try - { - frame.setClosed(true); - } catch (Exception ex) - { - } } - public void cancel_actionPerformed(ActionEvent e) + public void valueChanged(boolean updateAllAnnotation) { - reset(); - // ensure all original colouring is propagated to listeners. - ap.paintAlignment(true); - try - { - frame.setClosed(true); - } catch (Exception ex) + if (currentColours.isSelected() + && !(av.getGlobalColourScheme() instanceof AnnotationColourGradient)) { + updateView(); } + getCurrentAnnotation().threshold.value = slider.getValue() / 1000f; + propagateSeqAssociatedThreshold(updateAllAnnotation, + getCurrentAnnotation()); + ap.paintAlignment(false); } - void reset() - { - av.setGlobalColourScheme(oldcs); - if (av.getAlignment().getGroups() != null) - { - - for (SequenceGroup sg : ap.av.getAlignment().getGroups()) - { - sg.cs = (ColourSchemeI) oldgroupColours.get(sg); - } - } - } - - public void thresholdCheck_actionPerformed(ActionEvent e) - { - changeColour(); - } - - public void annotations_actionPerformed(ActionEvent e) + public JComboBox getThreshold() { - changeColour(); + return threshold; } - public void threshold_actionPerformed(ActionEvent e) + public void setThreshold(JComboBox threshold) { - changeColour(); + this.threshold = threshold; } - public void thresholdValue_actionPerformed(ActionEvent e) + public void currentColours_actionPerformed(ActionEvent e) { - try - { - float f = Float.parseFloat(thresholdValue.getText()); - slider.setValue((int) (f * 1000)); - } catch (NumberFormatException ex) + if (currentColours.isSelected()) { + reset(); } + maxColour.setEnabled(!currentColours.isSelected()); + minColour.setEnabled(!currentColours.isSelected()); + updateView(); } - public void valueChanged(boolean updateAllAnnotation) + @Override + public void updateView() { - if (currentColours.isSelected() - && !(av.getGlobalColourScheme() instanceof AnnotationColourGradient)) - { - changeColour(); - } - currentAnnotation.threshold.value = slider.getValue() / 1000f; - propagateSeqAssociatedThreshold(updateAllAnnotation); - ap.paintAlignment(false); + changeColour(); } - - private void propagateSeqAssociatedThreshold(boolean allAnnotation) + void changeColour() { - if (currentAnnotation.sequenceRef == null - || currentAnnotation.threshold == null) + // Check if combobox is still adjusting + if (adjusting) { return; } - // TODO: JAL-1327 only update visible annotation thresholds if allAnnotation - // is false, since we only need to provide a quick visual indicator - float thr = currentAnnotation.threshold.value; - for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++) + setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[annmap[annotations + .getSelectedIndex()]]); + + int selectedThresholdItem = getSelectedThresholdItem(getThreshold() + .getSelectedIndex()); + + slider.setEnabled(true); + thresholdValue.setEnabled(true); + thresholdIsMin.setEnabled(true); + + if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD) { - AlignmentAnnotation aa = av.getAlignment().getAlignmentAnnotation()[i]; - if (aa.label.equals(currentAnnotation.label) - && (currentAnnotation.getCalcId() == null ? aa.getCalcId() == null - : currentAnnotation.getCalcId() - .equals(aa.getCalcId()))) - { - if (aa.threshold == null) - { - aa.threshold = new GraphLine(currentAnnotation.threshold); - } - else - { - aa.threshold.value = thr; - } - } + slider.setEnabled(false); + thresholdValue.setEnabled(false); + thresholdValue.setText(""); + thresholdIsMin.setEnabled(false); } - } - - public void currentColours_actionPerformed(ActionEvent e) - { - if (currentColours.isSelected()) + else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD + && getCurrentAnnotation().threshold == null) { - reset(); + getCurrentAnnotation() + .setThreshold(new jalview.datamodel.GraphLine( + (getCurrentAnnotation().graphMax - getCurrentAnnotation().graphMin) / 2f, + "Threshold", Color.black)); } - maxColour.setEnabled(!currentColours.isSelected()); - minColour.setEnabled(!currentColours.isSelected()); + if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD) + { + adjusting = true; + float range = getCurrentAnnotation().graphMax * 1000 + - getCurrentAnnotation().graphMin * 1000; - changeColour(); - } + 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; + } + colorAlignmContaining(getCurrentAnnotation(), selectedThresholdItem); - public void thresholdIsMin_actionPerformed(ActionEvent actionEvent) - { - changeColour(); + ap.alignmentChanged(); + // ensure all associated views (overviews, structures, etc) are notified of + // updated colours. + ap.paintAlignment(true); } }