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; + } + } + }