X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fschemes%2FColourSchemes.java;h=817fb0136767e4106fd656db2d554faea0e0c58a;hb=09d9063e70931a6cb75d16b230f5cd0665f0f340;hp=21faa2a43e8165817df5be5d1468c530931eadc3;hpb=94379c810f9115b8564ee7bac46ed119218d5fd2;p=jalview.git diff --git a/src/jalview/schemes/ColourSchemes.java b/src/jalview/schemes/ColourSchemes.java index 21faa2a..817fb01 100644 --- a/src/jalview/schemes/ColourSchemes.java +++ b/src/jalview/schemes/ColourSchemes.java @@ -1,8 +1,14 @@ package jalview.schemes; -import jalview.api.AlignViewportI; +import jalview.binding.JalviewUserColours; import jalview.datamodel.AnnotatedCollectionI; +import jalview.datamodel.SequenceCollectionI; +import jalview.datamodel.SequenceI; +import java.awt.Color; +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStreamReader; import java.util.LinkedHashMap; import java.util.Map; @@ -102,33 +108,39 @@ public class ColourSchemes * * @param name * name of the colour scheme - * @param viewport + * @param forData + * the data to be coloured + * @param optional + * map from hidden representative sequences to the sequences they + * represent * @return */ - public ColourSchemeI getColourScheme(String name, AlignViewportI viewport) + public ColourSchemeI getColourScheme(String name, + AnnotatedCollectionI forData, + Map hiddenRepSequences) { if (name == null) { return null; } ColourSchemeI cs = schemes.get(name.toLowerCase()); - return cs == null ? null : cs.getInstance(viewport.getAlignment(), - viewport.getHiddenRepSequences()); + return cs == null ? null : cs.getInstance(forData, hiddenRepSequences); } /** - * Returns an instance of the colour scheme with which the given data may be + * Returns an instance of the colour scheme with which the given view may be * coloured * * @param name + * name of the colour scheme * @param forData + * the data to be coloured * @return */ public ColourSchemeI getColourScheme(String name, AnnotatedCollectionI forData) { - ColourSchemeI cs = schemes.get(name.toLowerCase()); - return cs == null ? null : cs.getInstance(forData, null); + return getColourScheme(name, forData, null); } /** @@ -141,4 +153,138 @@ public class ColourSchemes { return schemes.values(); } + + /** + * Answers true if there is a scheme with the given name, else false. The test + * is not case-sensitive. + * + * @param name + * @return + */ + public boolean nameExists(String name) + { + if (name == null) + { + return false; + } + name = name.toLowerCase(); + for (ColourSchemeI scheme : getColourSchemes()) + { + if (name.equals(scheme.getSchemeName().toLowerCase())) + { + return true; + } + } + return false; + } + + /** + * 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"); + + jalview.schemabinding.version2.JalviewUserColours jucs = new jalview.schemabinding.version2.JalviewUserColours(); + + org.exolab.castor.xml.Unmarshaller unmar = new org.exolab.castor.xml.Unmarshaller( + jucs); + jucs = (jalview.schemabinding.version2.JalviewUserColours) unmar + .unmarshal(in); + + /* + * 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.getColourCount(); i++) + { + name = jucs.getColour(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(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) + { + // Could be old Jalview Archive format + try + { + InputStreamReader in = new InputStreamReader(new FileInputStream( + file), "UTF-8"); + + jalview.binding.JalviewUserColours jucs = new jalview.binding.JalviewUserColours(); + + jucs = JalviewUserColours.unmarshal(in); + + newColours = new Color[jucs.getColourCount()]; + + for (int i = 0; i < 24; i++) + { + newColours[i] = new Color(Integer.parseInt(jucs.getColour(i) + .getRGB(), 16)); + } + ucs = new UserColourScheme(newColours); + ucs.setName(jucs.getSchemeName()); + } catch (Exception ex2) + { + ex2.printStackTrace(); + } + + if (newColours == null) + { + System.out.println("Error loading User ColourFile\n" + ex); + } + } + + return ucs; + } }