X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FAnnotationColourChooser.java;h=f4992177c1494dc1c1f6d6c8ae37e7c0b7b69419;hb=7cf75b5b379dd71b3480726419c7dc55d8e01f0e;hp=c3e30fbe036e73ba122e19132aefb81d6b3ebbcb;hpb=0807c11f57a68ab740e9f33a29ec66280065991e;p=jalview.git diff --git a/src/jalview/gui/AnnotationColourChooser.java b/src/jalview/gui/AnnotationColourChooser.java index c3e30fb..f499217 100755 --- a/src/jalview/gui/AnnotationColourChooser.java +++ b/src/jalview/gui/AnnotationColourChooser.java @@ -1,6 +1,6 @@ /* * Jalview - A Sequence Alignment Editor and Viewer -* Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle +* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -19,12 +19,13 @@ package jalview.gui; import javax.swing.*; -import java.awt.event.ActionListener; -import java.awt.event.ActionEvent; -import java.awt.BorderLayout; +import java.awt.event.*; import java.awt.*; import jalview.schemes.*; +import javax.swing.event.*; +import java.util.*; +import jalview.datamodel.SequenceGroup; public class AnnotationColourChooser extends JPanel @@ -33,29 +34,59 @@ public class AnnotationColourChooser AlignViewport av; AlignmentPanel ap; ColourSchemeI oldcs; + Hashtable oldgroupColours; + jalview.datamodel.AlignmentAnnotation currentAnnotation; + boolean adjusting = false; public AnnotationColourChooser(AlignViewport av, AlignmentPanel ap) { oldcs = av.getGlobalColourScheme(); + if (av.alignment.getGroups() != null) + { + oldgroupColours = new Hashtable(); + Vector allGroups = ap.av.alignment.getGroups(); + SequenceGroup sg; + for (int g = 0; g < allGroups.size(); g++) + { + 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, 110, false); + Desktop.addInternalFrame(frame, "Colour by Annotation", 480, 145); - try{ + try + { jbInit(); - }catch(Exception ex){} + } + catch (Exception ex) + {} + + slider.addChangeListener(new ChangeListener() + { + public void stateChanged(ChangeEvent evt) + { + if(!adjusting) + { + thresholdValue.setText( ( (float) slider.getValue() / 1000f) + ""); + valueChanged(); + } + } + }); - if(av.alignment.getAlignmentAnnotation()==null) + if (av.alignment.getAlignmentAnnotation() == null) return; - if(oldcs instanceof AnnotationColourGradient) + if (oldcs instanceof AnnotationColourGradient) { - AnnotationColourGradient acg = (AnnotationColourGradient)oldcs; - minColour.setBackground( acg.getMinColour() ); - maxColour.setBackground( acg.getMaxColour() ); + AnnotationColourGradient acg = (AnnotationColourGradient) oldcs; + minColour.setBackground(acg.getMinColour()); + maxColour.setBackground(acg.getMaxColour()); } else { @@ -63,12 +94,21 @@ public class AnnotationColourChooser maxColour.setBackground(Color.red); } + adjusting = true; for (int i = 0; i < av.alignment.getAlignmentAnnotation().length; i++) { - if(av.alignment.getAlignmentAnnotation()[i].graph>0) + if (av.alignment.getAlignmentAnnotation()[i].graph > 0) annotations.addItem(av.alignment.getAlignmentAnnotation()[i].label); } + threshold.addItem("No Threshold"); + threshold.addItem("Above Threshold"); + threshold.addItem("Below Threshold"); + + adjusting = false; + + changeColour(); + } public AnnotationColourChooser() @@ -86,7 +126,7 @@ public class AnnotationColourChooser private void jbInit() throws Exception { - minColour.setBounds(new Rectangle(145, 5, 85, 25)); + minColour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); minColour.setToolTipText(""); minColour.setMargin(new Insets(2, 2, 2, 2)); minColour.setText("Min Colour"); @@ -97,7 +137,7 @@ public class AnnotationColourChooser minColour_actionPerformed(e); } }); - maxColour.setBounds(new Rectangle(235, 5, 89, 25)); + maxColour.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); maxColour.setMargin(new Insets(2, 2, 2, 2)); maxColour.setText("Max Colour"); maxColour.addActionListener(new ActionListener() @@ -107,19 +147,6 @@ public class AnnotationColourChooser maxColour_actionPerformed(e); } }); - thresholdCheck.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); - thresholdCheck.setOpaque(false); - thresholdCheck.setHorizontalTextPosition(SwingConstants.LEADING); - thresholdCheck.setSelectedIcon(null); - thresholdCheck.setText("Above Threshold"); - thresholdCheck.setBounds(new Rectangle(329, 6, 126, 23)); - thresholdCheck.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent e) - { - thresholdCheck_actionPerformed(e); - } - }); ok.setOpaque(false); ok.setText("OK"); ok.addActionListener(new ActionListener() @@ -139,8 +166,7 @@ public class AnnotationColourChooser } }); this.setLayout(borderLayout1); - jPanel2.setLayout(null); - annotations.setBounds(new Rectangle(5, 7, 135, 21)); + jPanel2.setLayout(flowLayout1); annotations.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) @@ -150,26 +176,69 @@ public class AnnotationColourChooser }); jPanel1.setBackground(Color.white); jPanel2.setBackground(Color.white); + threshold.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + threshold_actionPerformed(e); + } + }); + jPanel3.setLayout(flowLayout2); + thresholdValue.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + thresholdValue_actionPerformed(e); + } + }); + slider.setPaintLabels(false); + slider.setPaintTicks(true); + slider.setBackground(Color.white); + slider.setEnabled(false); + slider.setOpaque(false); + slider.setPreferredSize(new Dimension(150, 32)); + thresholdValue.setEnabled(false); + thresholdValue.setColumns(10); + jPanel3.setBackground(Color.white); + currentColours.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); + currentColours.setOpaque(false); + currentColours.setText("Use Original Colours"); + currentColours.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + currentColours_actionPerformed(e); + } + }); jPanel1.add(ok); jPanel1.add(cancel); jPanel2.add(annotations); + jPanel2.add(currentColours); jPanel2.add(minColour); jPanel2.add(maxColour); - jPanel2.add(thresholdCheck); + this.add(jPanel3, java.awt.BorderLayout.CENTER); + jPanel3.add(threshold); + jPanel3.add(slider); + jPanel3.add(thresholdValue); this.add(jPanel1, java.awt.BorderLayout.SOUTH); - this.add(jPanel2, java.awt.BorderLayout.CENTER); + this.add(jPanel2, java.awt.BorderLayout.NORTH); } JComboBox annotations = new JComboBox(); JButton minColour = new JButton(); JButton maxColour = new JButton(); - JCheckBox thresholdCheck = new JCheckBox(); 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(); public void minColour_actionPerformed(ActionEvent e) { @@ -195,52 +264,148 @@ public class AnnotationColourChooser void changeColour() { + // Check if combobox is still adjusting + if (adjusting) + return; + // We removed the non-graph annotations when filling the combobox // so allow for them again here int nograph = 0, graph = -1; for (int i = 0; i < av.alignment.getAlignmentAnnotation().length; i++) { if (av.alignment.getAlignmentAnnotation()[i].graph == 0) - nograph ++; + nograph++; else - graph ++; + graph++; - if(graph==annotations.getSelectedIndex()) + if (graph == annotations.getSelectedIndex()) break; } - jalview.datamodel.AlignmentAnnotation aa - = av.alignment.getAlignmentAnnotation()[graph+nograph]; + currentAnnotation = av.alignment.getAlignmentAnnotation()[graph + nograph]; + + 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; - AnnotationColourGradient acg = new AnnotationColourGradient(aa, - minColour.getBackground(), - maxColour.getBackground(), - thresholdCheck.isSelected()); + 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; + } - if(thresholdCheck.isSelected() && aa.graphLines==null) - { - aa.addGraphLine(new jalview.datamodel.GraphLine((aa.graphMax-aa.graphMin)/2f, "Threshold", Color.black)); - } + AnnotationColourGradient acg = null; + if (currentColours.isSelected()) + acg = new AnnotationColourGradient( + currentAnnotation, + av.getGlobalColourScheme(), aboveThreshold); + else + acg = + new AnnotationColourGradient( + currentAnnotation, + minColour.getBackground(), + maxColour.getBackground(), + aboveThreshold); - av.setGlobalColourScheme(acg); - ap.repaint(); + av.setGlobalColourScheme(acg); + if (av.alignment.getGroups() != null) + { + Vector allGroups = ap.av.alignment.getGroups(); + SequenceGroup sg; + for (int g = 0; g < allGroups.size(); g++) + { + 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); + + } + } + + ap.repaint(); } public void ok_actionPerformed(ActionEvent e) { changeColour(); - try{ + try + { frame.setClosed(true); - }catch(Exception ex){} + } + catch (Exception ex) + {} } public void cancel_actionPerformed(ActionEvent e) { - av.setGlobalColourScheme(oldcs); - try{ + reset(); + try + { frame.setClosed(true); - }catch(Exception ex){} + } + 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++) + { + sg = (SequenceGroup) allGroups.get(g); + sg.cs = (ColourSchemeI)oldgroupColours.get(sg); + } + } } public void thresholdCheck_actionPerformed(ActionEvent e) @@ -253,4 +418,45 @@ public class AnnotationColourChooser changeColour(); } + public void threshold_actionPerformed(ActionEvent e) + { + changeColour(); + } + + public void thresholdValue_actionPerformed(ActionEvent e) + { + try + { + float f = Float.parseFloat(thresholdValue.getText()); + slider.setValue( (int) (f * 1000)); + } + catch (NumberFormatException ex) + {} + } + + public void valueChanged() + { + if (currentColours.isSelected() + && !(av.getGlobalColourScheme() instanceof AnnotationColourGradient)) + { + changeColour(); + } + + currentAnnotation.threshold.value = (float)slider.getValue()/1000f; + ap.repaint(); + } + + public void currentColours_actionPerformed(ActionEvent e) + { + if(currentColours.isSelected()) + { + reset(); + } + + maxColour.setEnabled(!currentColours.isSelected()); + minColour.setEnabled(!currentColours.isSelected()); + + changeColour(); + } + }