diff --git a/uk/ac/sanger/artemis/components/AlignmentViewer.java b/uk/ac/sanger/artemis/components/AlignmentViewer.java
index 3c306976e0ebe094de3fc394479f503bbd5c0551..f3f8f7c801ea727055ef72dee00063e157d13ae4 100644
--- a/uk/ac/sanger/artemis/components/AlignmentViewer.java
+++ b/uk/ac/sanger/artemis/components/AlignmentViewer.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/AlignmentViewer.java,v 1.5 2004-09-20 08:43:11 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/AlignmentViewer.java,v 1.6 2004-09-20 12:51:11 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -43,7 +43,7 @@ import javax.swing.*;
  *  ComparisonData object.
  *
  *  @author Kim Rutherford
- *  @version $Id: AlignmentViewer.java,v 1.5 2004-09-20 08:43:11 tjc Exp $
+ *  @version $Id: AlignmentViewer.java,v 1.6 2004-09-20 12:51:11 tjc Exp $
  **/
 
 public class AlignmentViewer extends CanvasPanel
@@ -179,7 +179,7 @@ public class AlignmentViewer extends CanvasPanel
   private boolean disable_selection_from_ranges = false;
 
   /** user defined colours */
-  private boolean userColour = false;
+  private boolean reverseMatchColour = false;
   /** colour for reverse matches */
   private Color revMatchColour = Color.blue;
   /** colour for matches         */
@@ -531,10 +531,10 @@ public class AlignmentViewer extends CanvasPanel
     {
       public void actionPerformed(ActionEvent _) 
       {
-        if(getSubjectDisplay ().isRevCompDisplay ()) 
-          getSubjectDisplay ().setRevCompDisplay (false);
+        if(getSubjectDisplay().isRevCompDisplay ()) 
+          getSubjectDisplay().setRevCompDisplay (false);
         else 
-          getSubjectDisplay ().setRevCompDisplay (true);
+          getSubjectDisplay().setRevCompDisplay (true);
       }
     });
 
@@ -656,42 +656,53 @@ public class AlignmentViewer extends CanvasPanel
 
     popup.addSeparator();
 
-    final JCheckBoxMenuItem userDefinedColour = 
-       new JCheckBoxMenuItem("Use Defined Colour",userColour);
-    userDefinedColour.addItemListener(new ItemListener()
+    final JCheckBoxMenuItem sameColour = 
+       new JCheckBoxMenuItem("Colour reverse & forward matches the same",reverseMatchColour);
+    sameColour.addItemListener(new ItemListener()
     {
       public void itemStateChanged(ItemEvent e)
       {
-        userColour = userDefinedColour.getState();
+        reverseMatchColour = sameColour.getState();
         repaintCanvas();
       }
     });
-    popup.add(userDefinedColour);
+    popup.add(sameColour);
 
     JMenuItem colourMatches = new JMenuItem("Colour matches...");
     colourMatches.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent event)
       {
-        matchColour = JColorChooser.showDialog(AlignmentViewer.this, 
-                                     "Colour Matches", matchColour);
-        repaintCanvas();
+        ColorChooserShades shades = createColours("Colour Matches", 
+                                                  red_percent_id_colours[NUMBER_OF_SHADES-1]);
+        if(shades != null)
+        {
+          red_percent_id_colours = shades.getDefinedColour();
+          repaintCanvas();
+        }
       }
     });
     popup.add(colourMatches);
 
-    JMenuItem colourRevMatches = new JMenuItem("Colour reverse matches...");
-    colourRevMatches.addActionListener(new ActionListener()
+    if(!reverseMatchColour)
     {
-      public void actionPerformed(ActionEvent event)
+      JMenuItem colourRevMatches = new JMenuItem("Colour reverse matches...");
+      colourRevMatches.addActionListener(new ActionListener()
       {
-        revMatchColour = JColorChooser.showDialog(AlignmentViewer.this, 
-                                     "Colour Reverse Matches", revMatchColour);
-        repaintCanvas();
-      }
-    });
-    popup.add(colourRevMatches);
-  
+        public void actionPerformed(ActionEvent event)
+        {
+          ColorChooserShades shades = createColours("Colour Reverse Matches",
+                                                   blue_percent_id_colours[NUMBER_OF_SHADES-1]);
+          if(shades != null)
+          {
+            blue_percent_id_colours = shades.getDefinedColour();
+            repaintCanvas();
+          }
+        }
+      });
+      popup.add(colourRevMatches);
+    }
+
     popup.addSeparator();
 
     final JCheckBoxMenuItem offer_to_flip_item =
@@ -728,6 +739,34 @@ public class AlignmentViewer extends CanvasPanel
   }
 
 
+  private ColorChooserShades createColours(String title, Color initialColour) 
+  {
+    //Make sure we have nice window decorations.
+    JFrame.setDefaultLookAndFeelDecorated(true);
+
+    //Create and set up the window.
+    JFrame frame = new JFrame("ColorChooserDemo");
+    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+    //Create and set up the content pane.
+    ColorChooserShades newContentPane = new ColorChooserShades(title,initialColour);
+
+    Object[] possibleValues = { "OK", "CANCEL" };
+    int select = JOptionPane.showOptionDialog(null,
+                                 newContentPane,
+                                 "Colour Selection",
+                                 JOptionPane.DEFAULT_OPTION, 
+                                 JOptionPane.QUESTION_MESSAGE,null,
+                                 possibleValues, possibleValues[0]);
+
+    if(select == 0)
+      return newContentPane;
+
+    return null;
+  }
+
+
+
   /**
    *  Handle a mouse press event on the drawing canvas - select on click,
    *  select and broadcast it on double click.
@@ -1247,7 +1286,7 @@ public class AlignmentViewer extends CanvasPanel
         g.setColor (Color.yellow);
       else 
       {
-        if(percent_id == -1 || userColour) 
+        if(percent_id == -1) 
         {
           if(this_match.isRevMatch())
             g.setColor(revMatchColour);
@@ -1266,7 +1305,8 @@ public class AlignmentViewer extends CanvasPanel
                     (maximum_percent_id - minimum_percent_id));
           }
 
-          if(this_match.isRevMatch()) 
+          if(this_match.isRevMatch() &&
+             !reverseMatchColour) 
             g.setColor(blue_percent_id_colours[colour_index]);
           else
             g.setColor(red_percent_id_colours[colour_index]);
@@ -1702,12 +1742,12 @@ public class AlignmentViewer extends CanvasPanel
    **/
   private void makeColours() 
   {
-    red_percent_id_colours = new Color [NUMBER_OF_SHADES];
-    blue_percent_id_colours = new Color [NUMBER_OF_SHADES];
+    red_percent_id_colours  = new Color[NUMBER_OF_SHADES];
+    blue_percent_id_colours = new Color[NUMBER_OF_SHADES];
 
-    for(int i = 0 ; i < blue_percent_id_colours.length ; ++i) 
+    for(int i = 0; i < blue_percent_id_colours.length; ++i) 
     {
-      final int shade_value = 255 - (int) (256 * 1.0 * i / NUMBER_OF_SHADES);
+      final int shade_value = 255 - (int) (256 * i / NUMBER_OF_SHADES);
       red_percent_id_colours[i] = new Color (255, shade_value, shade_value);
       blue_percent_id_colours[i] = new Color (shade_value, shade_value, 255);
     }
@@ -1721,4 +1761,104 @@ public class AlignmentViewer extends CanvasPanel
     return comparison_data;
   }
 
+  public class ColorChooserShades extends JPanel
+                              implements javax.swing.event.ChangeListener
+  {
+    private JPanel bannerPanel = new JPanel(new BorderLayout());
+    private JColorChooser tcc;
+    private Color definedColour[] = new Color[NUMBER_OF_SHADES];
+    private JLabel banner[]       = new JLabel[NUMBER_OF_SHADES];
+    private JSlider scaleColour;
+    private Box bacross = Box.createHorizontalBox();
+
+    public ColorChooserShades(String title, Color initialColour)
+    {
+      super(new BorderLayout());
+
+      Dimension d  = new Dimension(35, 35);
+      double fract = (maximum_percent_id - minimum_percent_id)/
+                    (NUMBER_OF_SHADES* 0.999);
+
+      for(int i = 0; i < NUMBER_OF_SHADES; ++i)
+      {
+        int percent_id = (int)(i*fract)+minimum_percent_id;
+        banner[i] = new JLabel(" "+percent_id+"  ",JLabel.CENTER);
+        banner[i].setOpaque(true);
+        banner[i].setPreferredSize(d);
+//      banner[i].setMaximumSize(d);
+        bacross.add(banner[i]);
+      }
+
+      //Set up color chooser for setting text color
+      tcc = new JColorChooser(initialColour);
+      tcc.getSelectionModel().addChangeListener(ColorChooserShades.this);
+      tcc.setBorder(BorderFactory.createTitledBorder(title));
+
+      //set scale
+      scaleColour = new JSlider(0,20,3);
+      scaleColour.addChangeListener(ColorChooserShades.this);
+
+      makeColours();
+
+      //Set up the banner at the top of the window
+      colourBox();
+      bannerPanel.add(bacross, BorderLayout.CENTER);
+      bannerPanel.add(scaleColour, BorderLayout.SOUTH);
+      bannerPanel.setBorder(BorderFactory.createTitledBorder("% ID Scale"));
+
+      add(bannerPanel, BorderLayout.CENTER);
+      add(tcc, BorderLayout.SOUTH);
+    }
+
+    public void stateChanged(javax.swing.event.ChangeEvent e) 
+    {
+      makeColours(); 
+      colourBox();
+      bannerPanel.repaint();
+      repaint();
+    } 
+
+    private void colourBox()
+    {
+      Dimension d = new Dimension(20, 35);
+      for(int i = 0; i < NUMBER_OF_SHADES; ++i)
+      {
+        banner[i].setBackground(definedColour[i]);
+        banner[i].repaint();
+      }
+    }
+    
+
+    /**
+     *  Return an array of colours that will be used for colouring the matches
+     *  (depending on score).
+     **/
+    private void makeColours()
+    {
+      Color newColour = tcc.getColor();
+
+      for(int i = 0; i < NUMBER_OF_SHADES; ++i)
+      {
+        int R = newColour.getRed();
+        int G = newColour.getGreen();
+        int B = newColour.getBlue();
+
+        int scale = (NUMBER_OF_SHADES-i)*scaleColour.getValue()*5;
+        if((R+scale) < 255)
+          R += scale;
+        if((G+scale) < 255)
+          G += scale;
+        if((B+scale) < 255)
+          B += scale;
+         
+        definedColour[i] = new Color(R,G,B);
+      }
+    }
+
+    public Color[] getDefinedColour()
+    {
+      return definedColour;
+    }
+  }
+
 }