formatting
[jalview.git] / src / jalview / gui / AnnotationColourChooser.java
index 7fb868f..5a942f1 100755 (executable)
@@ -54,11 +54,8 @@ public class AnnotationColourChooser extends JPanel
     if (av.getAlignment().getGroups() != null)
     {
       oldgroupColours = new Hashtable();
-      Vector allGroups = ap.av.getAlignment().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)
         {
           oldgroupColours.put(sg, sg.cs);
@@ -98,31 +95,21 @@ public class AnnotationColourChooser extends JPanel
 
     // Always get default shading from preferences.
     setDefaultMinMax();
-    
+
     if (oldcs instanceof AnnotationColourGradient)
     {
       AnnotationColourGradient acg = (AnnotationColourGradient) oldcs;
       currentColours.setSelected(acg.predefinedColours);
       if (!acg.predefinedColours)
       {
-       minColour.setBackground(acg.getMinColour());
+        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.getAlignment().getAlignmentAnnotation().length; i++)
-    {
-      String label = av.getAlignment().getAlignmentAnnotation()[i].label;
-      if (!list.contains(label))
-        list.addElement(label);
-      else
-        list.addElement(label + "_" + (index++));
-    }
-
-    annotations = new JComboBox(list);
+    annotations = new JComboBox(
+            getAnnotationItems(seqAssociated.isSelected()));
 
     threshold.addItem("No Threshold");
     threshold.addItem("Above Threshold");
@@ -132,21 +119,23 @@ public class AnnotationColourChooser extends JPanel
     {
       AnnotationColourGradient acg = (AnnotationColourGradient) oldcs;
       annotations.setSelectedItem(acg.getAnnotation());
-      switch (acg.getAboveThreshold()) {
+      switch (acg.getAboveThreshold())
+      {
       case AnnotationColourGradient.NO_THRESHOLD:
-          threshold.setSelectedItem("No Threshold");
+        threshold.setSelectedItem("No Threshold");
         break;
       case AnnotationColourGradient.ABOVE_THRESHOLD:
-          threshold.setSelectedItem("Above Threshold");
+        threshold.setSelectedItem("Above Threshold");
         break;
       case AnnotationColourGradient.BELOW_THRESHOLD:
         threshold.setSelectedItem("Below Threshold");
         break;
-        default:
-          throw new Error("Implementation error: don't know about threshold setting for current AnnotationColourGradient.");
+      default:
+        throw new Error(
+                "Implementation error: don't know about threshold setting for current AnnotationColourGradient.");
       }
       thresholdIsMin.setSelected(acg.thresholdIsMinMax);
-      thresholdValue.setText(""+acg.getAnnotationThreshold());
+      thresholdValue.setText("" + acg.getAnnotationThreshold());
     }
 
     try
@@ -159,14 +148,58 @@ public class AnnotationColourChooser extends JPanel
     adjusting = false;
 
     changeColour();
-    validate();
+    frame.invalidate();
+    frame.pack();
+
+  }
+
+  private Vector<String> getAnnotationItems(boolean isSeqAssociated)
+  {
+    Vector<String> list = new Vector<String>();
+    int index = 1;
+    int[] anmap = new int[av.getAlignment().getAlignmentAnnotation().length];
+    boolean enableSeqAss = false;
+    for (int i = 0; i < av.getAlignment().getAlignmentAnnotation().length; i++)
+    {
+      if (av.getAlignment().getAlignmentAnnotation()[i].sequenceRef == null)
+      {
+        if (isSeqAssociated)
+        {
+          continue;
+        }
+      }
+      else
+      {
+        enableSeqAss = true;
+      }
+      String label = av.getAlignment().getAlignmentAnnotation()[i].label;
+      if (!list.contains(label))
+      {
+        anmap[list.size()] = i;
+        list.addElement(label);
 
+      }
+      else
+      {
+        if (!isSeqAssociated)
+        {
+          anmap[list.size()] = i;
+          list.addElement(label + "_" + (index++));
+        }
+      }
+    }
+    seqAssociated.setEnabled(enableSeqAss);
+    annmap = new int[list.size()];
+    System.arraycopy(anmap, 0, annmap, 0, annmap.length);
+    return list;
   }
 
   private void setDefaultMinMax()
   {
-    minColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN", Color.orange));
-    maxColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX", Color.red));
+    minColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MIN",
+            Color.orange));
+    maxColour.setBackground(Cache.getDefaultColour("ANNOTATIONCOLOUR_MAX",
+            Color.red));
   }
 
   public AnnotationColourChooser()
@@ -230,17 +263,18 @@ public class AnnotationColourChooser extends JPanel
     });
     defColours.setOpaque(false);
     defColours.setText("Defaults");
-    defColours.setToolTipText("Reset min and max colours to defaults from user preferences.");
+    defColours
+            .setToolTipText("Reset min and max colours to defaults from user preferences.");
     defColours.addActionListener(new ActionListener()
     {
-      
+
       @Override
       public void actionPerformed(ActionEvent arg0)
       {
         resetColours_actionPerformed(arg0);
       }
     });
-    
+
     annotations.addActionListener(new ActionListener()
     {
       public void actionPerformed(ActionEvent e)
@@ -290,28 +324,71 @@ public class AnnotationColourChooser extends JPanel
         thresholdIsMin_actionPerformed(actionEvent);
       }
     });
+    seqAssociated.setBackground(Color.white);
+    seqAssociated.setFont(JvSwingUtils.getLabelFont());
+    seqAssociated.setText("Per-sequence only");
+    seqAssociated.addActionListener(new ActionListener()
+    {
+
+      @Override
+      public void actionPerformed(ActionEvent arg0)
+      {
+        seqAssociated_actionPerformed(arg0);
+      }
+    });
+
     this.setLayout(borderLayout1);
-    jPanel2.setLayout(new MigLayout("","[left][center][right]","[][][]"));
+    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);
     JPanel colpanel = new JPanel(new FlowLayout());
     colpanel.setBackground(Color.white);
     colpanel.add(minColour);
     colpanel.add(maxColour);
     jPanel2.add(colpanel, "wrap");
-    
     jPanel2.add(threshold);
-    jPanel2.add(defColours,"skip 1, wrap");
+    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.CENTER);
+    this.validate();
+  }
+
+  protected void seqAssociated_actionPerformed(ActionEvent arg0)
+  {
+    adjusting = true;
+    String cursel = (String) annotations.getSelectedItem();
+    boolean isvalid = false, isseqs = seqAssociated.isSelected();
+    this.annotations.removeAllItems();
+    for (String anitem : getAnnotationItems(seqAssociated.isSelected()))
+    {
+      if (anitem.equals(cursel) || (isseqs && cursel.startsWith(anitem)))
+      {
+        isvalid = true;
+        cursel = anitem;
+      }
+      this.annotations.addItem(anitem);
+    }
+    adjusting = false;
+    if (isvalid)
+    {
+      this.annotations.setSelectedItem(cursel);
+    }
+    else
+    {
+      if (annotations.getItemCount() > 0)
+      {
+        annotations.setSelectedIndex(0);
+      }
+    }
   }
 
   protected void resetColours_actionPerformed(ActionEvent arg0)
@@ -322,22 +399,26 @@ public class AnnotationColourChooser extends JPanel
 
   JComboBox annotations;
 
+  int[] annmap;
+
   JPanel minColour = new JPanel();
 
   JPanel maxColour = new JPanel();
+
   JButton defColours = new JButton();
+
   JButton ok = new JButton();
 
   JButton cancel = new JButton();
 
   JPanel jPanel1 = new JPanel();
+
   JPanel jPanel2 = new JPanel();
-  
+
   BorderLayout borderLayout1 = new BorderLayout();
 
   JComboBox threshold = new JComboBox();
 
-
   JSlider slider = new JSlider();
 
   JTextField thresholdValue = new JTextField(20);
@@ -346,6 +427,8 @@ public class AnnotationColourChooser extends JPanel
 
   JCheckBox thresholdIsMin = new JCheckBox();
 
+  JCheckBox seqAssociated = new JCheckBox();
+
   public void minColour_actionPerformed()
   {
     Color col = JColorChooser.showDialog(this,
@@ -378,8 +461,8 @@ public class AnnotationColourChooser extends JPanel
       return;
     }
 
-    currentAnnotation = av.getAlignment().getAlignmentAnnotation()[annotations
-            .getSelectedIndex()];
+    currentAnnotation = av.getAlignment().getAlignmentAnnotation()[annmap[annotations
+            .getSelectedIndex()]];
 
     int aboveThreshold = -1;
     if (threshold.getSelectedItem().equals("Above Threshold"))
@@ -439,6 +522,7 @@ public class AnnotationColourChooser extends JPanel
               minColour.getBackground(), maxColour.getBackground(),
               aboveThreshold);
     }
+    acg.setSeqAssociated(seqAssociated.isSelected());
 
     if (currentAnnotation.graphMin == 0f
             && currentAnnotation.graphMax == 0f)
@@ -452,12 +536,9 @@ public class AnnotationColourChooser extends JPanel
 
     if (av.getAlignment().getGroups() != null)
     {
-      Vector allGroups = ap.av.getAlignment().getGroups();
-      SequenceGroup sg;
-      for (int g = 0; g < allGroups.size(); g++)
-      {
-        sg = (SequenceGroup) allGroups.get(g);
 
+      for (SequenceGroup sg : ap.av.getAlignment().getGroups())
+      {
         if (sg.cs == null)
         {
           continue;
@@ -467,17 +548,24 @@ public class AnnotationColourChooser extends JPanel
         {
           sg.cs = new AnnotationColourGradient(currentAnnotation, sg.cs,
                   aboveThreshold);
+          ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
+                  .isSelected());
+
         }
         else
         {
           sg.cs = new AnnotationColourGradient(currentAnnotation,
                   minColour.getBackground(), maxColour.getBackground(),
                   aboveThreshold);
+          ((AnnotationColourGradient) sg.cs).setSeqAssociated(seqAssociated
+                  .isSelected());
         }
 
       }
     }
-    // ensure all associated views (overviews, structures, etc) are notified of updated colours.
+    ap.alignmentChanged();
+    // ensure all associated views (overviews, structures, etc) are notified of
+    // updated colours.
     ap.paintAlignment(true);
   }
 
@@ -495,7 +583,7 @@ public class AnnotationColourChooser extends JPanel
   public void cancel_actionPerformed(ActionEvent e)
   {
     reset();
-    // ensure all original colouring is propagated to listeners. 
+    // ensure all original colouring is propagated to listeners.
     ap.paintAlignment(true);
     try
     {
@@ -510,11 +598,9 @@ public class AnnotationColourChooser extends JPanel
     av.setGlobalColourScheme(oldcs);
     if (av.getAlignment().getGroups() != null)
     {
-      Vector allGroups = ap.av.getAlignment().getGroups();
-      SequenceGroup sg;
-      for (int g = 0; g < allGroups.size(); g++)
+
+      for (SequenceGroup sg : ap.av.getAlignment().getGroups())
       {
-        sg = (SequenceGroup) allGroups.get(g);
         sg.cs = (ColourSchemeI) oldgroupColours.get(sg);
       }
     }