/*
* Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
* Copyright (C) 2014 The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.schemes;
import java.awt.Color;
import java.util.Map;
import java.util.StringTokenizer;
import jalview.datamodel.AnnotatedCollectionI;
import jalview.datamodel.SequenceCollectionI;
import jalview.datamodel.SequenceI;
public class UserColourScheme extends ResidueColourScheme
{
Color[] lowerCaseColours;
protected String schemeName;
public UserColourScheme()
{
super(ResidueProperties.aaIndex);
}
public UserColourScheme(Color[] newColors)
{
super(ResidueProperties.aaIndex);
colors = newColors;
}
@Override
public ColourSchemeI applyTo(AnnotatedCollectionI sg,
Map hiddenRepSequences)
{
UserColourScheme usc = new UserColourScheme(colors);
if (lowerCaseColours != null)
{
usc.schemeName = new String(schemeName);
usc.lowerCaseColours = new Color[lowerCaseColours.length];
System.arraycopy(lowerCaseColours, 0, usc.lowerCaseColours, 0,
lowerCaseColours.length);
}
return usc;
}
public UserColourScheme(String colour)
{
super(ResidueProperties.aaIndex);
Color col = getColourFromString(colour);
if (col == null)
{
System.out.println("Unknown colour!! " + colour);
col = createColourFromName(colour);
}
colors = new Color[24];
for (int i = 0; i < 24; i++)
{
colors[i] = col;
}
schemeName = colour;
}
public Color[] getColours()
{
return colors;
}
public Color[] getLowerCaseColours()
{
return lowerCaseColours;
}
public void setName(String name)
{
schemeName = name;
}
public String getName()
{
return schemeName;
}
public Color getColourFromString(String colour)
{
colour = colour.trim();
Color col = null;
try
{
int value = Integer.parseInt(colour, 16);
col = new Color(value);
} catch (NumberFormatException ex)
{
}
if (col == null)
{
col = ColourSchemeProperty.getAWTColorFromName(colour);
}
if (col == null)
{
try
{
java.util.StringTokenizer st = new java.util.StringTokenizer(
colour, ",");
int r = Integer.parseInt(st.nextToken());
int g = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
col = new Color(r, g, b);
} catch (Exception ex)
{
}
}
return col;
}
public Color createColourFromName(String name)
{
int r, g, b;
int lsize = name.length();
int start = 0, end = lsize / 3;
int rgbOffset = Math.abs(name.hashCode() % 10) * 15;
r = Math.abs(name.substring(start, end).hashCode() + rgbOffset) % 210 + 20;
start = end;
end += lsize / 3;
if (end > lsize)
{
end = lsize;
}
g = Math.abs(name.substring(start, end).hashCode() + rgbOffset) % 210 + 20;
b = Math.abs(name.substring(end).hashCode() + rgbOffset) % 210 + 20;
Color color = new Color(r, g, b);
return color;
}
public void parseAppletParameter(String paramValue)
{
// TODO: need a function to generate appletParameter colour string from a
// UCS
StringTokenizer st = new StringTokenizer(paramValue, ";");
StringTokenizer st2;
String token = null, colour, residues;
try
{
while (st.hasMoreElements())
{
token = st.nextToken().trim();
residues = token.substring(0, token.indexOf("="));
colour = token.substring(token.indexOf("=") + 1);
st2 = new StringTokenizer(residues, " ,");
while (st2.hasMoreTokens())
{
token = st2.nextToken();
if (ResidueProperties.aaIndex[token.charAt(0)] == -1)
{
continue;
}
int colIndex = ResidueProperties.aaIndex[token.charAt(0)];
if (token.equalsIgnoreCase("lowerCase"))
{
if (lowerCaseColours == null)
{
lowerCaseColours = new Color[23];
}
for (int i = 0; i < 23; i++)
{
if (lowerCaseColours[i] == null)
{
lowerCaseColours[i] = getColourFromString(colour);
}
}
continue;
}
if (token.equals(token.toLowerCase()))
{
if (lowerCaseColours == null)
{
lowerCaseColours = new Color[23];
}
lowerCaseColours[colIndex] = getColourFromString(colour);
}
else
{
colors[colIndex] = getColourFromString(colour);
}
}
}
} catch (Exception 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;
}
}