aligned boxes
[jalview.git] / src / jalview / appletgui / AnnotationColourChooser.java
index ab3b379..2db2bd0 100755 (executable)
@@ -1,32 +1,35 @@
 /*\r
-* Jalview - A Sequence Alignment Editor and Viewer\r
-* Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
-*\r
-* This program is free software; you can redistribute it and/or\r
-* modify it under the terms of the GNU General Public License\r
-* as published by the Free Software Foundation; either version 2\r
-* of the License, or (at your option) any later version.\r
-*\r
-* This program is distributed in the hope that it will be useful,\r
-* but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-* GNU General Public License for more details.\r
-*\r
-* You should have received a copy of the GNU General Public License\r
-* along with this program; if not, write to the Free Software\r
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
-*/\r
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
+ */\r
 package jalview.appletgui;\r
 \r
-import java.awt.event.*;\r
+import java.util.*;\r
+\r
 import java.awt.*;\r
+import java.awt.event.*;\r
 \r
+import jalview.datamodel.*;\r
 import jalview.schemes.*;\r
-import java.util.*;\r
-import jalview.datamodel.SequenceGroup;\r
+import java.awt.Rectangle;\r
 \r
-public class AnnotationColourChooser extends Panel implements ActionListener,\r
-    AdjustmentListener, ItemListener\r
+public class AnnotationColourChooser\r
+    extends Panel implements ActionListener,\r
+    AdjustmentListener, ItemListener, MouseListener\r
 {\r
   Frame frame;\r
   AlignViewport av;\r
@@ -61,9 +64,12 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
     this.ap = ap;\r
 \r
     slider.addAdjustmentListener(this);\r
+    slider.addMouseListener(this);\r
 \r
     if (av.alignment.getAlignmentAnnotation() == null)\r
+    {\r
       return;\r
+    }\r
 \r
     if (oldcs instanceof AnnotationColourGradient)\r
     {\r
@@ -78,10 +84,21 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
     }\r
 \r
     adjusting = true;\r
+\r
+    Vector list = new Vector();\r
+    int index = 1;\r
     for (int i = 0; i < av.alignment.getAlignmentAnnotation().length; i++)\r
     {\r
-      if (av.alignment.getAlignmentAnnotation()[i].graph > 0)\r
-        annotations.addItem(av.alignment.getAlignmentAnnotation()[i].label);\r
+      String label = av.alignment.getAlignmentAnnotation()[i].label;\r
+      if (!list.contains(label))\r
+        list.addElement(label);\r
+      else\r
+        list.addElement(label+"_"+(index++));\r
+    }\r
+\r
+    for (int i = 0; i < list.size(); i++)\r
+    {\r
+        annotations.addItem(list.elementAt(i).toString());\r
     }\r
 \r
     threshold.addItem("No Threshold");\r
@@ -121,6 +138,7 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
     maxColour.setLabel("Max Colour");\r
     maxColour.addActionListener(this);\r
 \r
+    thresholdIsMin.addItemListener(this);\r
     ok.setLabel("OK");\r
     ok.addActionListener(this);\r
 \r
@@ -139,16 +157,19 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
 \r
     slider.setBackground(Color.white);\r
     slider.setEnabled(false);\r
-    slider.setBounds(new Rectangle(172, 7, 120, 16));\r
+    slider.setBounds(new Rectangle(153, 3, 93, 21));\r
     thresholdValue.setEnabled(false);\r
-    thresholdValue.setBounds(new Rectangle(295, 4, 83, 22));\r
-    thresholdValue.setColumns(10);\r
+    thresholdValue.setBounds(new Rectangle(248, 2, 79, 22));\r
+    thresholdValue.setColumns(5);\r
     jPanel3.setBackground(Color.white);\r
     currentColours.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11));\r
     currentColours.setLabel("Use Original Colours");\r
     currentColours.addItemListener(this);\r
 \r
-    threshold.setBounds(new Rectangle(19, 4, 141, 22));\r
+    threshold.setBounds(new Rectangle(11, 3, 139, 22));\r
+    thresholdIsMin.setBackground(Color.white);\r
+    thresholdIsMin.setLabel("Threshold is min/max");\r
+    thresholdIsMin.setBounds(new Rectangle(328, 3, 135, 23));\r
     jPanel1.add(ok);\r
     jPanel1.add(cancel);\r
     jPanel2.add(annotations);\r
@@ -158,6 +179,7 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
     jPanel3.add(threshold);\r
     jPanel3.add(slider);\r
     jPanel3.add(thresholdValue);\r
+    jPanel3.add(thresholdIsMin);\r
     this.add(jPanel2, java.awt.BorderLayout.NORTH);\r
     this.add(jPanel3, java.awt.BorderLayout.CENTER);\r
     this.add(jPanel1, java.awt.BorderLayout.SOUTH);\r
@@ -177,11 +199,11 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
   TextField thresholdValue = new TextField(20);\r
   Checkbox currentColours = new Checkbox();\r
   BorderLayout borderLayout1 = new BorderLayout();\r
-\r
+  Checkbox thresholdIsMin = new Checkbox();\r
 \r
   public void actionPerformed(ActionEvent evt)\r
   {\r
-    if(evt.getSource() == thresholdValue)\r
+    if (evt.getSource() == thresholdValue)\r
     {\r
       try\r
       {\r
@@ -193,9 +215,13 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
       {}\r
     }\r
     else if (evt.getSource() == minColour)\r
+    {\r
       minColour_actionPerformed(null);\r
+    }\r
     else if (evt.getSource() == maxColour)\r
+    {\r
       maxColour_actionPerformed(null);\r
+    }\r
 \r
     else if (evt.getSource() == ok)\r
     {\r
@@ -205,15 +231,16 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
     else if (evt.getSource() == cancel)\r
     {\r
       reset();\r
-      ap.repaint();\r
+      ap.paintAlignment(true);\r
       frame.setVisible(false);\r
     }\r
 \r
     else\r
+    {\r
       changeColour();\r
+    }\r
   }\r
 \r
-\r
   public void itemStateChanged(ItemEvent evt)\r
   {\r
     if (evt.getSource() == currentColours)\r
@@ -243,7 +270,7 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
       }\r
 \r
       currentAnnotation.threshold.value = (float) slider.getValue() / 1000f;\r
-      ap.repaint();\r
+      ap.paintAlignment(false);\r
     }\r
   }\r
 \r
@@ -256,8 +283,10 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
       changeColour();\r
     }\r
     else\r
+    {\r
       new UserDefinedColours(this, "Min Colour",\r
-                              minColour.getBackground());\r
+                             minColour.getBackground());\r
+    }\r
 \r
   }\r
 \r
@@ -270,38 +299,33 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
       changeColour();\r
     }\r
     else\r
+    {\r
       new UserDefinedColours(this, "Max Colour",\r
-                              maxColour.getBackground());\r
+                             maxColour.getBackground());\r
+    }\r
   }\r
 \r
-\r
   void changeColour()\r
   {\r
     // Check if combobox is still adjusting\r
     if (adjusting)\r
-      return;\r
-\r
-    // We removed the non-graph annotations when filling the combobox\r
-    // so allow for them again here\r
-    int nograph = 0, graph = -1;\r
-    for (int i = 0; i < av.alignment.getAlignmentAnnotation().length; i++)\r
     {\r
-      if (av.alignment.getAlignmentAnnotation()[i].graph == 0)\r
-        nograph++;\r
-      else\r
-        graph++;\r
-\r
-      if (graph == annotations.getSelectedIndex())\r
-        break;\r
+      return;\r
     }\r
 \r
-    currentAnnotation = av.alignment.getAlignmentAnnotation()[graph + nograph];\r
+\r
+    currentAnnotation = av.alignment.getAlignmentAnnotation()\r
+        [annotations.getSelectedIndex()];\r
 \r
     int aboveThreshold = -1;\r
     if (threshold.getSelectedItem().equals("Above Threshold"))\r
+    {\r
       aboveThreshold = AnnotationColourGradient.ABOVE_THRESHOLD;\r
+    }\r
     else if (threshold.getSelectedItem().equals("Below Threshold"))\r
+    {\r
       aboveThreshold = AnnotationColourGradient.BELOW_THRESHOLD;\r
+    }\r
 \r
     slider.setEnabled(true);\r
     thresholdValue.setEnabled(true);\r
@@ -322,7 +346,7 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
                                       Color.black));\r
     }\r
 \r
-    if(aboveThreshold != AnnotationColourGradient.NO_THRESHOLD)\r
+    if (aboveThreshold != AnnotationColourGradient.NO_THRESHOLD)\r
     {\r
       adjusting = true;\r
 \r
@@ -337,16 +361,27 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
 \r
     AnnotationColourGradient acg = null;\r
     if (currentColours.getState())\r
+    {\r
       acg = new AnnotationColourGradient(\r
           currentAnnotation,\r
           av.getGlobalColourScheme(), aboveThreshold);\r
+    }\r
     else\r
+    {\r
       acg =\r
           new AnnotationColourGradient(\r
               currentAnnotation,\r
               minColour.getBackground(),\r
               maxColour.getBackground(),\r
               aboveThreshold);\r
+    }\r
+\r
+    if (currentAnnotation.graphMin == 0f && currentAnnotation.graphMax == 0f)\r
+    {\r
+      acg.predefinedColours = true;\r
+    }\r
+\r
+    acg.thresholdIsMinMax = thresholdIsMin.getState();\r
 \r
     av.setGlobalColourScheme(acg);\r
 \r
@@ -364,23 +399,26 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
         }\r
 \r
         if (currentColours.getState())\r
+        {\r
           sg.cs = new AnnotationColourGradient(\r
               currentAnnotation,\r
               sg.cs, aboveThreshold);\r
+        }\r
         else\r
+        {\r
           sg.cs = new AnnotationColourGradient(\r
               currentAnnotation,\r
               minColour.getBackground(),\r
               maxColour.getBackground(),\r
               aboveThreshold);\r
+        }\r
 \r
       }\r
     }\r
 \r
-    ap.repaint();\r
+    ap.paintAlignment(false);\r
   }\r
 \r
-\r
   void reset()\r
   {\r
     av.setGlobalColourScheme(oldcs);\r
@@ -391,13 +429,18 @@ public class AnnotationColourChooser extends Panel implements ActionListener,
       for (int g = 0; g < allGroups.size(); g++)\r
       {\r
         sg = (SequenceGroup) allGroups.elementAt(g);\r
-        sg.cs = (ColourSchemeI)oldgroupColours.get(sg);\r
+        sg.cs = (ColourSchemeI) oldgroupColours.get(sg);\r
       }\r
     }\r
-    ap.repaint();\r
+    ap.paintAlignment(true);\r
 \r
   }\r
 \r
+  public void mouseClicked(MouseEvent evt){}\r
+  public void mousePressed(MouseEvent evt){}\r
+  public void mouseReleased(MouseEvent evt){ ap.paintAlignment(true);}\r
+  public void mouseEntered(MouseEvent evt){}\r
+  public void mouseExited(MouseEvent evt){}\r
 \r
 \r
 }\r