JAL-1925 update source version in license
[jalview.git] / src / jalview / gui / AnnotationColourChooser.java
old mode 100755 (executable)
new mode 100644 (file)
index 1ed9461..5e80cfe
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9.0b2)
+ * Copyright (C) 2015 The Jalview Authors
  * 
- * This program 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 2
- * of the License, or (at your option) any later version.
+ * This file is part of Jalview.
  * 
- * This program 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.
+ * 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 this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.gui;
 
-import java.util.*;
-
-import java.awt.*;
-import java.awt.event.*;
-import javax.swing.*;
-import javax.swing.event.*;
+import jalview.bin.Cache;
+import jalview.datamodel.SequenceGroup;
+import jalview.schemes.AnnotationColourGradient;
+import jalview.schemes.ColourSchemeI;
+import jalview.util.MessageManager;
 
-import jalview.datamodel.*;
-import jalview.schemes.*;
+import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Dimension;
-
-public class AnnotationColourChooser extends JPanel
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.Hashtable;
+
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JColorChooser;
+import javax.swing.JComboBox;
+import javax.swing.JInternalFrame;
+import javax.swing.JLayeredPane;
+import javax.swing.JPanel;
+
+import net.miginfocom.swing.MigLayout;
+
+@SuppressWarnings("serial")
+public class AnnotationColourChooser extends AnnotationRowFilter
 {
-  JInternalFrame frame;
 
-  AlignViewport av;
+  ColourSchemeI oldcs;
 
-  AlignmentPanel ap;
+  Hashtable<SequenceGroup, ColourSchemeI> oldgroupColours;
 
-  ColourSchemeI oldcs;
+  /**
+   * enabled if the user is dragging the slider - try to keep updates to a
+   * minimun
+   */
 
-  Hashtable oldgroupColours;
+  JComboBox<String> annotations;
 
-  jalview.datamodel.AlignmentAnnotation currentAnnotation;
+  JButton defColours = new JButton();
+
+  JPanel jPanel1 = new JPanel();
+
+  JPanel jPanel2 = new JPanel();
+
+  BorderLayout borderLayout1 = new BorderLayout();
 
-  boolean adjusting = false;
+  private JComboBox<String> threshold = new JComboBox<String>();
 
   public AnnotationColourChooser(AlignViewport av, final AlignmentPanel ap)
   {
+    super(av, ap);
     oldcs = av.getGlobalColourScheme();
-    if (av.alignment.getGroups() != null)
+    if (av.getAlignment().getGroups() != null)
     {
-      oldgroupColours = new Hashtable();
-      Vector allGroups = ap.av.alignment.getGroups();
-      SequenceGroup sg;
-      for (int g = 0; g < allGroups.size(); g++)
+      oldgroupColours = new Hashtable<SequenceGroup, ColourSchemeI>();
+      for (SequenceGroup sg : ap.av.getAlignment().getGroups())
       {
-        sg = (SequenceGroup) allGroups.get(g);
         if (sg.cs != null)
         {
           oldgroupColours.put(sg, sg.cs);
         }
       }
     }
-    this.av = av;
-    this.ap = ap;
     frame = new JInternalFrame();
     frame.setContentPane(this);
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
-    Desktop.addInternalFrame(frame, "Colour by Annotation", 480, 145);
+    Desktop.addInternalFrame(frame,
+            MessageManager.getString("label.colour_by_annotation"), 520,
+            215);
 
-    slider.addChangeListener(new ChangeListener()
-    {
-      public void stateChanged(ChangeEvent evt)
-      {
-        if (!adjusting)
-        {
-          thresholdValue.setText(((float) slider.getValue() / 1000f) + "");
-          valueChanged();
-        }
-      }
-    });
-    slider.addMouseListener(new MouseAdapter()
-    {
-      public void mouseReleased(MouseEvent evt)
-      {
-        ap.paintAlignment(true);
-      }
-    });
+    addSliderChangeListener();
+    addSliderMouseListeners();
 
-    if (av.alignment.getAlignmentAnnotation() == null)
+    if (av.getAlignment().getAlignmentAnnotation() == null)
     {
       return;
     }
 
+    // Always get default shading from preferences.
+    setDefaultMinMax();
+
+    adjusting = true;
     if (oldcs instanceof AnnotationColourGradient)
     {
       AnnotationColourGradient acg = (AnnotationColourGradient) oldcs;
-      minColour.setBackground(acg.getMinColour());
-      maxColour.setBackground(acg.getMaxColour());
-    }
-    else
-    {
-      minColour.setBackground(Color.orange);
-      maxColour.setBackground(Color.red);
-    }
+      currentColours.setSelected(acg.isPredefinedColours()
+              || acg.getBaseColour() != null);
+      if (!acg.isPredefinedColours() && acg.getBaseColour() == null)
+      {
+        minColour.setBackground(acg.getMinColour());
+        maxColour.setBackground(acg.getMaxColour());
+      }
+      seqAssociated.setSelected(acg.isSeqAssociated());
 
-    adjusting = true;
-    Vector list = new Vector();
-    int index = 1;
-    for (int i = 0; i < av.alignment.getAlignmentAnnotation().length; i++)
-    {
-      String label = av.alignment.getAlignmentAnnotation()[i].label;
-      if (!list.contains(label))
-        list.addElement(label);
-      else
-        list.addElement(label + "_" + (index++));
     }
+    annotations = new JComboBox<String>(
+            getAnnotationItems(seqAssociated.isSelected()));
 
-    annotations = new JComboBox(list);
+    populateThresholdComboBox(threshold);
 
-    threshold.addItem("No Threshold");
-    threshold.addItem("Above Threshold");
-    threshold.addItem("Below Threshold");
+    if (oldcs instanceof AnnotationColourGradient)
+    {
+      AnnotationColourGradient acg = (AnnotationColourGradient) oldcs;
+      annotations.setSelectedItem(acg.getAnnotation());
+      switch (acg.getAboveThreshold())
+      {
+      case AnnotationColourGradient.NO_THRESHOLD:
+        getThreshold().setSelectedIndex(0);
+        break;
+      case AnnotationColourGradient.ABOVE_THRESHOLD:
+        getThreshold().setSelectedIndex(1);
+        break;
+      case AnnotationColourGradient.BELOW_THRESHOLD:
+        getThreshold().setSelectedIndex(2);
+        break;
+      default:
+        throw new Error(
+                MessageManager
+                        .getString("error.implementation_error_dont_know_about_thereshold_setting"));
+      }
+      thresholdIsMin.setSelected(acg.thresholdIsMinMax);
+      thresholdValue.setText("" + acg.getAnnotationThreshold());
+    }
 
     try
     {
@@ -129,11 +153,11 @@ public class AnnotationColourChooser extends JPanel
     } catch (Exception ex)
     {
     }
-
     adjusting = false;
 
-    changeColour();
-
+    updateView();
+    frame.invalidate();
+    frame.pack();
   }
 
   public AnnotationColourChooser()
@@ -149,12 +173,13 @@ public class AnnotationColourChooser extends JPanel
 
   private void jbInit() throws Exception
   {
-    minColour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
+    minColour.setFont(JvSwingUtils.getLabelFont());
     minColour.setBorder(BorderFactory.createEtchedBorder());
     minColour.setPreferredSize(new Dimension(40, 20));
-    minColour.setToolTipText("Minimum Colour");
+    minColour.setToolTipText(MessageManager.getString("label.min_colour"));
     minColour.addMouseListener(new MouseAdapter()
     {
+      @Override
       public void mousePressed(MouseEvent e)
       {
         if (minColour.isEnabled())
@@ -163,12 +188,13 @@ public class AnnotationColourChooser extends JPanel
         }
       }
     });
-    maxColour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
+    maxColour.setFont(JvSwingUtils.getLabelFont());
     maxColour.setBorder(BorderFactory.createEtchedBorder());
     maxColour.setPreferredSize(new Dimension(40, 20));
-    maxColour.setToolTipText("Maximum Colour");
+    maxColour.setToolTipText(MessageManager.getString("label.max_colour"));
     maxColour.addMouseListener(new MouseAdapter()
     {
+      @Override
       public void mousePressed(MouseEvent e)
       {
         if (maxColour.isEnabled())
@@ -178,44 +204,58 @@ public class AnnotationColourChooser extends JPanel
       }
     });
     ok.setOpaque(false);
-    ok.setText("OK");
+    ok.setText(MessageManager.getString("action.ok"));
     ok.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         ok_actionPerformed(e);
       }
     });
     cancel.setOpaque(false);
-    cancel.setText("Cancel");
+    cancel.setText(MessageManager.getString("action.cancel"));
     cancel.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         cancel_actionPerformed(e);
       }
     });
-    this.setLayout(borderLayout1);
-    jPanel2.setLayout(flowLayout1);
+    defColours.setOpaque(false);
+    defColours.setText(MessageManager.getString("action.set_defaults"));
+    defColours.setToolTipText(MessageManager
+            .getString("label.reset_min_max_colours_to_defaults"));
+    defColours.addActionListener(new ActionListener()
+    {
+
+      @Override
+      public void actionPerformed(ActionEvent arg0)
+      {
+        resetColours_actionPerformed(arg0);
+      }
+    });
+
     annotations.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         annotations_actionPerformed(e);
       }
     });
-    jPanel1.setBackground(Color.white);
-    jPanel2.setBackground(Color.white);
-    threshold.addActionListener(new ActionListener()
+    getThreshold().addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         threshold_actionPerformed(e);
       }
     });
-    jPanel3.setLayout(flowLayout2);
     thresholdValue.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         thresholdValue_actionPerformed(e);
@@ -229,296 +269,216 @@ public class AnnotationColourChooser extends JPanel
     slider.setPreferredSize(new Dimension(100, 32));
     thresholdValue.setEnabled(false);
     thresholdValue.setColumns(7);
-    jPanel3.setBackground(Color.white);
-    currentColours.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));
+    currentColours.setFont(JvSwingUtils.getLabelFont());
     currentColours.setOpaque(false);
-    currentColours.setText("Use Original Colours");
+    currentColours.setText(MessageManager
+            .getString("label.use_original_colours"));
     currentColours.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         currentColours_actionPerformed(e);
       }
     });
     thresholdIsMin.setBackground(Color.white);
-    thresholdIsMin.setText("Threshold is Min/Max");
+    thresholdIsMin.setFont(JvSwingUtils.getLabelFont());
+    thresholdIsMin.setText(MessageManager
+            .getString("label.threshold_minmax"));
     thresholdIsMin.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         thresholdIsMin_actionPerformed(actionEvent);
       }
     });
+    seqAssociated.setBackground(Color.white);
+    seqAssociated.setFont(JvSwingUtils.getLabelFont());
+    seqAssociated.setText(MessageManager
+            .getString("label.per_sequence_only"));
+    seqAssociated.addActionListener(new ActionListener()
+    {
+
+      @Override
+      public void actionPerformed(ActionEvent arg0)
+      {
+        seqAssociated_actionPerformed(arg0, annotations, seqAssociated);
+      }
+    });
+
+    this.setLayout(borderLayout1);
+    jPanel2.setLayout(new MigLayout("", "[left][center][right]", "[][][]"));
+    jPanel1.setBackground(Color.white);
+    jPanel2.setBackground(Color.white);
+
     jPanel1.add(ok);
     jPanel1.add(cancel);
-    jPanel2.add(annotations);
+    jPanel2.add(annotations, "grow, wrap");
+    jPanel2.add(seqAssociated);
     jPanel2.add(currentColours);
-    jPanel2.add(minColour);
-    jPanel2.add(maxColour);
-    this.add(jPanel3, java.awt.BorderLayout.CENTER);
-    jPanel3.add(threshold);
-    jPanel3.add(slider);
-    jPanel3.add(thresholdValue);
-    jPanel3.add(thresholdIsMin);
+    JPanel colpanel = new JPanel(new FlowLayout());
+    colpanel.setBackground(Color.white);
+    colpanel.add(minColour);
+    colpanel.add(maxColour);
+    jPanel2.add(colpanel, "wrap");
+    jPanel2.add(getThreshold());
+    jPanel2.add(defColours, "skip 1, wrap");
+    jPanel2.add(thresholdIsMin);
+    jPanel2.add(slider, "grow");
+    jPanel2.add(thresholdValue, "grow");
     this.add(jPanel1, java.awt.BorderLayout.SOUTH);
-    this.add(jPanel2, java.awt.BorderLayout.NORTH);
+    this.add(jPanel2, java.awt.BorderLayout.CENTER);
+    this.validate();
   }
 
-  JComboBox annotations;
-
-  JPanel minColour = new JPanel();
-
-  JPanel maxColour = new JPanel();
-
-  JButton ok = new JButton();
-
-  JButton cancel = new JButton();
-
-  JPanel jPanel1 = new JPanel();
-
-  JPanel jPanel2 = new JPanel();
-
-  BorderLayout borderLayout1 = new BorderLayout();
-
-  JComboBox threshold = new JComboBox();
-
-  FlowLayout flowLayout1 = new FlowLayout();
-
-  JPanel jPanel3 = new JPanel();
-
-  FlowLayout flowLayout2 = new FlowLayout();
-
-  JSlider slider = new JSlider();
-
-  JTextField thresholdValue = new JTextField(20);
-
-  JCheckBox currentColours = new JCheckBox();
+  protected void resetColours_actionPerformed(ActionEvent arg0)
+  {
+    setDefaultMinMax();
+    updateView();
+  }
 
-  JCheckBox thresholdIsMin = 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()
   {
     Color col = JColorChooser.showDialog(this,
-            "Select Colour for Minimum Value", minColour.getBackground());
+            MessageManager.getString("label.select_colour_minimum_value"),
+            minColour.getBackground());
     if (col != null)
     {
       minColour.setBackground(col);
     }
     minColour.repaint();
-    changeColour();
+    updateView();
   }
 
   public void maxColour_actionPerformed()
   {
     Color col = JColorChooser.showDialog(this,
-            "Select Colour for Maximum Value", maxColour.getBackground());
+            MessageManager.getString("label.select_colour_maximum_value"),
+            maxColour.getBackground());
     if (col != null)
     {
       maxColour.setBackground(col);
     }
     maxColour.repaint();
-    changeColour();
+    updateView();
   }
 
-  void changeColour()
+  public void reset()
   {
-    // Check if combobox is still adjusting
-    if (adjusting)
-    {
-      return;
-    }
-
-    currentAnnotation = av.alignment.getAlignmentAnnotation()[annotations
-            .getSelectedIndex()];
-
-    int aboveThreshold = -1;
-    if (threshold.getSelectedItem().equals("Above Threshold"))
-    {
-      aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;
-    }
-    else if (threshold.getSelectedItem().equals("Below Threshold"))
-    {
-      aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;
-    }
-
-    slider.setEnabled(true);
-    thresholdValue.setEnabled(true);
-
-    if (aboveThreshold == AnnotationColourGradient.NO_THRESHOLD)
-    {
-      slider.setEnabled(false);
-      thresholdValue.setEnabled(false);
-      thresholdValue.setText("");
-    }
-    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);
-    }
-
-    if (currentAnnotation.graphMin == 0f
-            && currentAnnotation.graphMax == 0f)
+    av.setGlobalColourScheme(oldcs);
+    if (av.getAlignment().getGroups() != null)
     {
-      acg.predefinedColours = true;
-    }
-
-    acg.thresholdIsMinMax = thresholdIsMin.isSelected();
 
-    av.setGlobalColourScheme(acg);
-
-    if (av.alignment.getGroups() != null)
-    {
-      Vector allGroups = ap.av.alignment.getGroups();
-      SequenceGroup sg;
-      for (int g = 0; g < allGroups.size(); g++)
+      for (SequenceGroup sg : ap.av.getAlignment().getGroups())
       {
-        sg = (SequenceGroup) allGroups.get(g);
-
-        if (sg.cs == null)
-        {
-          continue;
-        }
-
-        if (currentColours.isSelected())
-        {
-          sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs,
-                  aboveThreshold);
-        }
-        else
-        {
-          sg.cs = new AnnotationColourGradient(currentAnnotation, minColour
-                  .getBackground(), maxColour.getBackground(),
-                  aboveThreshold);
-        }
-
+        sg.cs = oldgroupColours.get(sg);
       }
     }
-
-    ap.paintAlignment(false);
   }
 
-  public void ok_actionPerformed(ActionEvent e)
+  public void valueChanged(boolean updateAllAnnotation)
   {
-    changeColour();
-    try
-    {
-      frame.setClosed(true);
-    } catch (Exception ex)
+    if (slider.isEnabled())
     {
-    }
-  }
-
-  public void cancel_actionPerformed(ActionEvent e)
-  {
-    reset();
-    try
-    {
-      frame.setClosed(true);
-    } catch (Exception ex)
-    {
-    }
-  }
-
-  void reset()
-  {
-    av.setGlobalColourScheme(oldcs);
-    if (av.alignment.getGroups() != null)
-    {
-      Vector allGroups = ap.av.alignment.getGroups();
-      SequenceGroup sg;
-      for (int g = 0; g < allGroups.size(); g++)
+      if (currentColours.isSelected()
+              && !(av.getGlobalColourScheme() instanceof AnnotationColourGradient))
       {
-        sg = (SequenceGroup) allGroups.get(g);
-        sg.cs = (ColourSchemeI) oldgroupColours.get(sg);
+        updateView();
       }
+      getCurrentAnnotation().threshold.value = slider.getValue() / 1000f;
+      propagateSeqAssociatedThreshold(updateAllAnnotation,
+              getCurrentAnnotation());
+      ap.paintAlignment(false);
     }
   }
 
-  public void thresholdCheck_actionPerformed(ActionEvent e)
-  {
-    changeColour();
-  }
-
-  public void annotations_actionPerformed(ActionEvent e)
+  public JComboBox<String> getThreshold()
   {
-    changeColour();
+    return threshold;
   }
 
-  public void threshold_actionPerformed(ActionEvent e)
+  public void setThreshold(JComboBox<String> 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()
+  @Override
+  public void updateView()
   {
-    if (currentColours.isSelected()
-            && !(av.getGlobalColourScheme() instanceof AnnotationColourGradient))
+    // Check if combobox is still adjusting
+    if (adjusting)
     {
-      changeColour();
+      return;
     }
 
-    currentAnnotation.threshold.value = (float) slider.getValue() / 1000f;
-    ap.paintAlignment(false);
-  }
+    setCurrentAnnotation(av.getAlignment().getAlignmentAnnotation()[annmap[annotations
+            .getSelectedIndex()]]);
 
-  public void currentColours_actionPerformed(ActionEvent e)
-  {
-    if (currentColours.isSelected())
+    int selectedThresholdItem = getSelectedThresholdItem(getThreshold()
+            .getSelectedIndex());
+
+    slider.setEnabled(true);
+    thresholdValue.setEnabled(true);
+    thresholdIsMin.setEnabled(true);
+
+    if (selectedThresholdItem == AnnotationColourGradient.NO_THRESHOLD)
     {
-      reset();
+      slider.setEnabled(false);
+      thresholdValue.setEnabled(false);
+      thresholdValue.setText("");
+      thresholdIsMin.setEnabled(false);
+    }
+    else if (selectedThresholdItem != AnnotationColourGradient.NO_THRESHOLD
+            && getCurrentAnnotation().threshold == null)
+    {
+      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);
   }
 
 }