Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / schemes / ResidueColourScheme.java
index fc8b1b1..03ab536 100755 (executable)
@@ -20,9 +20,9 @@
  */
 package jalview.schemes;
 
-import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AnnotatedCollectionI;
 import jalview.datamodel.SequenceCollectionI;
+import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 
 import java.awt.Color;
@@ -35,9 +35,23 @@ public abstract class ResidueColourScheme implements ColourSchemeI
 {
   public static final String NONE = "None";
 
+  /*
+   * default display name for a user defined colour scheme
+   */
   public static final String USER_DEFINED = "User Defined";
 
   /*
+   * name for (new) "User Defined.." colour scheme menu item
+   */
+  public static final String USER_DEFINED_MENU = "*User Defined*";
+
+  /*
+   * the canonical name of the annotation colour scheme 
+   * (may be used to identify it in menu items)
+   */
+  public static final String ANNOTATION_COLOUR = "Annotation";
+
+  /*
    * lookup up by character value e.g. 'G' to the colors array index
    * e.g. if symbolIndex['K'] = 11 then colors[11] is the colour for K
    */
@@ -54,8 +68,9 @@ public abstract class ResidueColourScheme implements ColourSchemeI
   /**
    * Creates a new ResidueColourScheme object.
    * 
-   * @param final int[] index table into colors (ResidueProperties.naIndex or
-   *        ResidueProperties.aaIndex)
+   * @param final
+   *          int[] index table into colors (ResidueProperties.naIndex or
+   *          ResidueProperties.aaIndex)
    * @param colors
    *          colours for symbols in sequences
    */
@@ -86,10 +101,17 @@ public abstract class ResidueColourScheme implements ColourSchemeI
   /**
    * Find a colour without an index in a sequence
    */
-  @Override
   public Color findColour(char c)
   {
-    return colors == null ? Color.white : colors[symbolIndex[c]];
+    Color colour = Color.white;
+
+    if (colors != null && symbolIndex != null && c < symbolIndex.length
+            && symbolIndex[c] < colors.length)
+    {
+      colour = colors[symbolIndex[c]];
+    }
+
+    return colour;
   }
 
   /**
@@ -104,18 +126,19 @@ public abstract class ResidueColourScheme implements ColourSchemeI
     return findColour(c, j, seq);
   }
 
+  /**
+   * Default implementation looks up the residue colour in a fixed scheme, or
+   * returns White if not found. Override this method for a colour scheme that
+   * depends on the column position or sequence.
+   * 
+   * @param c
+   * @param j
+   * @param seq
+   * @return
+   */
   protected Color findColour(char c, int j, SequenceI seq)
   {
-    Color colour = Color.white;
-
-    if (colors != null && symbolIndex != null && c < symbolIndex.length
-            && symbolIndex[c] < colors.length)
-    {
-      colour = colors[symbolIndex[c]];
-    }
-    // colour = adjustColour(c, j, colour);
-
-    return colour;
+    return findColour(c);
   }
 
   @Override
@@ -136,30 +159,26 @@ public abstract class ResidueColourScheme implements ColourSchemeI
     {
       return true;
     }
-
-    /*
-     * inspect the data context (alignment) for residue type
-     */
-    boolean nucleotide = false;
-    if (ac instanceof AlignmentI)
+    if (ac == null)
     {
-      nucleotide = ((AlignmentI) ac).isNucleotide();
+      return true;
     }
-    else
+    /*
+     * pop-up menu on selection group before group created
+     * (no alignment context)
+     */
+    // TODO: add nucleotide flag to SequenceGroup?
+    if (ac instanceof SequenceGroup && ac.getContext() == null)
     {
-      AnnotatedCollectionI context = ac.getContext();
-      if (context instanceof AlignmentI)
-      {
-        nucleotide = ((AlignmentI) context).isNucleotide();
-      }
-      else
-      {
-        // not sure what's going on, play safe
-        return true;
-      }
+      return true;
     }
 
     /*
+     * inspect the data context (alignment) for residue type
+     */
+    boolean nucleotide = ac.isNucleotide();
+
+    /*
      * does data type match colour scheme type?
      */
     return (nucleotide && isNucleotideSpecific())
@@ -195,4 +214,14 @@ public abstract class ResidueColourScheme implements ColourSchemeI
   {
     return true;
   }
+
+  /**
+   * Default method returns false. Override this to return true in colour
+   * schemes that have a colour associated with gap residues.
+   */
+  @Override
+  public boolean hasGapColour()
+  {
+    return false;
+  }
 }