Merge branch 'feature/JAL-3127_seqidChainshading' into merge/JAL-3127
[jalview.git] / src / jalview / schemes / UserColourScheme.java
index 7bf02c1..d77f2f5 100755 (executable)
  */
 package jalview.schemes;
 
+import jalview.api.AlignViewportI;
 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 +55,27 @@ public class UserColourScheme extends ResidueColourScheme
   }
 
   @Override
-  public ColourSchemeI applyTo(AnnotatedCollectionI sg,
-          Map<SequenceI, SequenceCollectionI> hiddenRepSequences)
+  public ColourSchemeI getInstance(AlignViewportI view,
+          AnnotatedCollectionI sg)
   {
-    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[from.lowerCaseColours.length];
+      System.arraycopy(from.lowerCaseColours, 0, lowerCaseColours, 0,
+              from.lowerCaseColours.length);
     }
-    return usc;
   }
 
   /**
@@ -211,7 +221,8 @@ public class UserColourScheme extends ResidueColourScheme
             {
               lowerCaseColours = new Color[colors.length];
             }
-            lowerCaseColours[colIndex] = ColorUtils.parseColourString(colour);
+            lowerCaseColours[colIndex] = ColorUtils
+                    .parseColourString(colour);
           }
           else
           {
@@ -221,42 +232,12 @@ public class UserColourScheme extends ResidueColourScheme
       }
     } catch (Exception ex)
     {
-      System.out.println("Error parsing userDefinedColours:\n" + token
-              + "\n" + ex);
+      System.out.println(
+              "Error parsing userDefinedColours:\n" + token + "\n" + ex);
     }
 
   }
 
-  @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;
@@ -282,8 +263,8 @@ public class UserColourScheme extends ResidueColourScheme
   }
 
   /**
-   * Answers the customised name of the colour scheme, if it has one, else
-   * "User Defined"
+   * Answers the customised name of the colour scheme, if it has one, else "User
+   * Defined"
    */
   @Override
   public String getSchemeName()
@@ -292,7 +273,7 @@ public class UserColourScheme extends ResidueColourScheme
     {
       return schemeName;
     }
-    return JalviewColourScheme.UserDefined.toString();
+    return ResidueColourScheme.USER_DEFINED;
   }
 
   /**
@@ -302,7 +283,10 @@ public class UserColourScheme extends ResidueColourScheme
    */
   public String toAppletParameter()
   {
-    Map<Color, List<String>> colours = new HashMap<Color, List<String>>();
+    /*
+     * step 1: build a map from colours to the symbol(s) that have the colour
+     */
+    Map<Color, List<String>> colours = new HashMap<>();
 
     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<>();
     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,19 @@ 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, ";");
+  }
+
+  @Override
+  public boolean hasGapColour()
+  {
+    return (findColour(' ') != null);
   }
 }