Merge branch 'features/JAL-2360colourSchemeApplicability' into features/JAL-2371colle...
[jalview.git] / src / jalview / schemes / UserColourScheme.java
index 7bf02c1..85bf54e 100755 (executable)
@@ -24,9 +24,11 @@ import jalview.datamodel.AnnotatedCollectionI;
 import jalview.datamodel.SequenceCollectionI;
 import jalview.datamodel.SequenceI;
 import jalview.util.ColorUtils;
+import jalview.util.StringUtils;
 
 import java.awt.Color;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -54,18 +56,27 @@ public class UserColourScheme extends ResidueColourScheme
   }
 
   @Override
-  public ColourSchemeI applyTo(AnnotatedCollectionI sg,
+  public ColourSchemeI getInstance(AnnotatedCollectionI sg,
           Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
   {
-    UserColourScheme usc = new UserColourScheme(colors);
-    if (lowerCaseColours != null)
+    return new UserColourScheme(this);
+  }
+
+  /**
+   * Copy constructor
+   * 
+   * @return
+   */
+  protected UserColourScheme(UserColourScheme from)
+  {
+    this(from.colors);
+    schemeName = from.schemeName;
+    if (from.lowerCaseColours != null)
     {
-      usc.schemeName = schemeName;
-      usc.lowerCaseColours = new Color[lowerCaseColours.length];
-      System.arraycopy(lowerCaseColours, 0, usc.lowerCaseColours, 0,
-              lowerCaseColours.length);
+      lowerCaseColours = new Color[lowerCaseColours.length];
+      System.arraycopy(from.lowerCaseColours, 0, lowerCaseColours, 0,
+              from.lowerCaseColours.length);
     }
-    return usc;
   }
 
   /**
@@ -227,36 +238,6 @@ public class UserColourScheme extends ResidueColourScheme
 
   }
 
-  @Override
-  public Color findColour(char c, int j, SequenceI seq)
-  {
-    Color currentColour;
-    int index = ResidueProperties.aaIndex[c];
-
-    if ((threshold == 0) || aboveThreshold(c, j))
-    {
-      if (lowerCaseColours != null && 'a' <= c && c <= 'z')
-      {
-        currentColour = lowerCaseColours[index];
-      }
-      else
-      {
-        currentColour = colors[index];
-      }
-    }
-    else
-    {
-      currentColour = Color.white;
-    }
-
-    if (conservationColouring)
-    {
-      currentColour = applyConservation(currentColour, j);
-    }
-
-    return currentColour;
-  }
-
   public void setLowerCaseColours(Color[] lcolours)
   {
     lowerCaseColours = lcolours;
@@ -292,7 +273,7 @@ public class UserColourScheme extends ResidueColourScheme
     {
       return schemeName;
     }
-    return JalviewColourScheme.UserDefined.toString();
+    return "User Defined";
   }
 
   /**
@@ -302,6 +283,9 @@ public class UserColourScheme extends ResidueColourScheme
    */
   public String toAppletParameter()
   {
+    /*
+     * step 1: build a map from colours to the symbol(s) that have the colour
+     */
     Map<Color, List<String>> colours = new HashMap<Color, List<String>>();
 
     for (char symbol = 'A'; symbol <= 'Z'; symbol++)
@@ -331,14 +315,15 @@ public class UserColourScheme extends ResidueColourScheme
         }
       }
     }
-    StringBuilder sb = new StringBuilder();
+
+    /*
+     * step 2: make a list of { A,G,R=12f9d6 } residues/colour specs
+     */
+    List<String> residueColours = new ArrayList<String>();
     for (Entry<Color, List<String>> cols : colours.entrySet())
     {
-      if (sb.length() > 0)
-      {
-        sb.append(";");
-      }
       boolean first = true;
+      StringBuilder sb = new StringBuilder();
       for (String residue : cols.getValue())
       {
         if (!first)
@@ -355,8 +340,13 @@ public class UserColourScheme extends ResidueColourScheme
       String hexString = Integer.toHexString(cols.getKey().getRGB())
               .substring(2);
       sb.append(hexString);
+      residueColours.add(sb.toString());
     }
 
-    return sb.toString();
+    /*
+     * sort and output
+     */
+    Collections.sort(residueColours);
+    return StringUtils.listToDelimitedString(residueColours, ";");
   }
 }