/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ 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 jalview.xml.binding.jalview.JalviewUserColours;
import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
public class ColourSchemeLoader
{
/**
* Loads a user defined colour scheme from file. The file should contain a
* definition of residue colours in XML format as defined in
* JalviewUserColours.xsd.
*
* @param filePath
*
* @return
*/
public static UserColourScheme loadColourScheme(String filePath)
{
UserColourScheme ucs = null;
Color[] newColours = null;
File file = new File(filePath);
try
{
InputStreamReader in = new InputStreamReader(
new FileInputStream(file), "UTF-8");
JAXBContext jc = JAXBContext
.newInstance("jalview.xml.binding.jalview");
javax.xml.bind.Unmarshaller um = jc.createUnmarshaller();
XMLStreamReader streamReader = XMLInputFactory.newInstance()
.createXMLStreamReader(in);
JAXBElement jbe = um.unmarshal(streamReader,
JalviewUserColours.class);
JalviewUserColours jucs = jbe.getValue();
/*
* non-case-sensitive colours are for 20 amino acid codes,
* B, Z, X and Gap
* optionally, lower-case alternatives for all except Gap
*/
newColours = new Color[24];
Color[] lowerCase = new Color[23];
boolean caseSensitive = false;
String name;
int index;
for (int i = 0; i < jucs.getColour().size(); i++)
{
name = jucs.getColour().get(i).getName();
if (ResidueProperties.aa3Hash.containsKey(name))
{
index = ResidueProperties.aa3Hash.get(name).intValue();
}
else
{
index = ResidueProperties.aaIndex[name.charAt(0)];
}
if (index == -1)
{
continue;
}
Color color = new Color(
Integer.parseInt(jucs.getColour().get(i).getRGB(), 16));
if (name.toLowerCase().equals(name))
{
caseSensitive = true;
lowerCase[index] = color;
}
else
{
newColours[index] = color;
}
}
/*
* instantiate the colour scheme
*/
ucs = new UserColourScheme(newColours);
ucs.setName(jucs.getSchemeName());
if (caseSensitive)
{
ucs.setLowerCaseColours(lowerCase);
}
} catch (Exception ex)
{
// used to try to parse a V1 Castor generated colours file
System.err.println("Failed to read colour scheme from " + filePath
+ " : " + ex.toString());
}
return ucs;
}
}