Merge branch 'develop' into spike/JAL-4047/JAL-4048_columns_in_sequenceID
[jalview.git] / src / jalview / gui / AnnotationColourChooser.java
index ad013f5..d898398 100644 (file)
  */
 package jalview.gui;
 
-import jalview.bin.Cache;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.GraphLine;
-import jalview.datamodel.SequenceGroup;
-import jalview.gui.JalviewColourChooser.ColourChooserListener;
-import jalview.schemes.AnnotationColourGradient;
-import jalview.schemes.ColourSchemeI;
-import jalview.util.MessageManager;
-
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Dimension;
@@ -48,6 +39,15 @@ import javax.swing.JInternalFrame;
 import javax.swing.JLayeredPane;
 import javax.swing.JPanel;
 
+import jalview.bin.Cache;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.GraphLine;
+import jalview.datamodel.SequenceGroup;
+import jalview.gui.JalviewColourChooser.ColourChooserListener;
+import jalview.schemes.AnnotationColourGradient;
+import jalview.schemes.ColourSchemeI;
+import jalview.util.MessageManager;
 import net.miginfocom.swing.MigLayout;
 
 @SuppressWarnings("serial")
@@ -73,6 +73,10 @@ public class AnnotationColourChooser extends AnnotationRowFilter
 
   public AnnotationColourChooser(AlignViewport av, final AlignmentPanel ap)
   {
+    this(av,ap,null);
+  }
+  public AnnotationColourChooser(AlignViewport av, final AlignmentPanel ap,AnnotationColourGradient initSettings)
+  {
     super(av, ap);
     oldcs = av.getGlobalColourScheme();
     if (av.getAlignment().getGroups() != null)
@@ -87,6 +91,7 @@ public class AnnotationColourChooser extends AnnotationRowFilter
       }
     }
     frame = new JInternalFrame();
+    frame.setFrameIcon(null);
     frame.setContentPane(this);
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
     Desktop.addInternalFrame(frame,
@@ -105,11 +110,28 @@ public class AnnotationColourChooser extends AnnotationRowFilter
     setDefaultMinMax();
 
     adjusting = true;
-    if (oldcs instanceof AnnotationColourGradient)
+    if (oldcs instanceof AnnotationColourGradient && initSettings==null)
+    {
+      // init from oldcs
+      initialiseFrom((AnnotationColourGradient) oldcs);
+    } else {
+      // use initial colour gradient - if any..
+      initialiseFrom(initSettings);
+    }
+    
+    jbInit();
+    adjusting = false;
+
+    updateView();
+    frame.invalidate();
+    frame.pack();
+  }
+  private void initialiseFrom(AnnotationColourGradient acg)
+  {
+    if (acg!=null)
     {
-      AnnotationColourGradient acg = (AnnotationColourGradient) oldcs;
       useOriginalColours.setSelected(
-              acg.isPredefinedColours() || acg.getBaseColour() != null);
+            acg.isPredefinedColours() || acg.getBaseColour() != null);
       if (!acg.isPredefinedColours() && acg.getBaseColour() == null)
       {
         minColour.setBackground(acg.getMinColour());
@@ -124,10 +146,14 @@ public class AnnotationColourChooser extends AnnotationRowFilter
 
     populateThresholdComboBox(threshold);
 
-    if (oldcs instanceof AnnotationColourGradient)
+    if (acg!=null)
     {
-      AnnotationColourGradient acg = (AnnotationColourGradient) oldcs;
       String label = getAnnotationMenuLabel(acg.getAnnotation());
+      // TODO: workaround below shouldn't be necessary - there's a bug in getAnnotationMenuLabel!
+      if (acg.isSeqAssociated())
+      {
+        label = acg.getAnnotation().label;
+      }
       annotations.setSelectedItem(label);
       switch (acg.getAboveThreshold())
       {
@@ -145,16 +171,8 @@ public class AnnotationColourChooser extends AnnotationRowFilter
                 "error.implementation_error_dont_know_about_threshold_setting"));
       }
       thresholdIsMin.setSelected(acg.isThresholdIsMinMax());
-      thresholdValue
-              .setText(String.valueOf(acg.getAnnotationThreshold()));
+      thresholdValue.setText(String.valueOf(acg.getAnnotationThreshold()));
     }
-
-    jbInit();
-    adjusting = false;
-
-    updateView();
-    frame.invalidate();
-    frame.pack();
   }
 
   @Override
@@ -357,9 +375,11 @@ public class AnnotationColourChooser extends AnnotationRowFilter
       return;
     }
 
+    int selIndex = annotations
+            .getSelectedIndex();
+    int annIndex = annmap[selIndex];
     setCurrentAnnotation(
-            av.getAlignment().getAlignmentAnnotation()[annmap[annotations
-                    .getSelectedIndex()]]);
+            av.getAlignment().getAlignmentAnnotation()[annIndex]);
 
     int selectedThresholdItem = getSelectedThresholdItem(
             getThreshold().getSelectedIndex());
@@ -437,8 +457,7 @@ public class AnnotationColourChooser extends AnnotationRowFilter
         {
           continue;
         }
-        sg.setColourScheme(
-                acg.getInstance(av, sg));
+        sg.setColourScheme(acg.getInstance(av, sg));
       }
     }
   }
@@ -449,4 +468,33 @@ public class AnnotationColourChooser extends AnnotationRowFilter
     super.sliderDragReleased();
     ap.paintAlignment(true, true);
   }
+
+  /**
+   * construct and display a colourchooser for a given annotation row
+   * 
+   * @param av
+   * @param ap
+   * @param alignmentAnnotation
+   * @param perseq - when true, enable per-sequence if alignment annotation is per sequence 
+   */
+  public static void displayFor(AlignViewport av, AlignmentPanel ap,
+          AlignmentAnnotation alignmentAnnotation, boolean perSeq)
+  {
+    ColourSchemeI global = av.getGlobalColourScheme();
+    AnnotationColourGradient newCS = new AnnotationColourGradient(alignmentAnnotation, global, alignmentAnnotation.threshold!=null ? AnnotationColourGradient.ABOVE_THRESHOLD:AnnotationColourGradient.NO_THRESHOLD);
+    if (alignmentAnnotation.sequenceRef!=null)
+    {
+      newCS.setSeqAssociated(perSeq);
+    }
+    for (int i=0;i<alignmentAnnotation.annotations.length;i++)
+    {
+      Annotation ann = alignmentAnnotation.annotations[i];
+      if (ann!=null && ann.colour!=null && !ann.colour.equals(Color.white))
+      {
+        newCS.setPredefinedColours(true);
+        break;
+      }
+    }
+    AnnotationColourChooser achooser = new AnnotationColourChooser(av,ap,newCS);
+  }
 }