From dfb3daaf3d75deda32e7622713ffb759aaadd18c Mon Sep 17 00:00:00 2001 From: gmungoc Date: Fri, 23 Dec 2016 13:48:01 +0000 Subject: [PATCH] JAL-2360 removed UserDefinedColours.userColourSchemes --- src/jalview/bin/Cache.java | 56 +++++- src/jalview/gui/ColourMenuHelper.java | 48 ++++- src/jalview/gui/UserDefinedColours.java | 251 ++------------------------- src/jalview/schemes/ColourSchemes.java | 137 +++++++++++++++ test/jalview/schemes/ColourSchemesTest.java | 18 ++ 5 files changed, 269 insertions(+), 241 deletions(-) diff --git a/src/jalview/bin/Cache.java b/src/jalview/bin/Cache.java index 6b1aef9..9363c23 100755 --- a/src/jalview/bin/Cache.java +++ b/src/jalview/bin/Cache.java @@ -21,6 +21,9 @@ package jalview.bin; import jalview.datamodel.PDBEntry; +import jalview.gui.UserDefinedColours; +import jalview.schemes.ColourSchemes; +import jalview.schemes.UserColourScheme; import jalview.structure.StructureImportSettings; import jalview.util.ColorUtils; import jalview.ws.dbsources.das.api.DasSourceRegistryI; @@ -41,6 +44,7 @@ import java.util.Date; import java.util.Enumeration; import java.util.Locale; import java.util.Properties; +import java.util.StringTokenizer; import java.util.TreeSet; import org.apache.log4j.ConsoleAppender; @@ -527,7 +531,7 @@ public class Cache setProperty("VERSION", codeVersion); // LOAD USERDEFINED COLOURS - jalview.gui.UserDefinedColours + jalview.bin.Cache .initUserColourSchemes(getProperty("USER_DEFINED_COLOURS")); jalview.io.PIRFile.useModellerOutput = Cache.getDefault("PIR_MODELLER", false); @@ -990,4 +994,54 @@ public class Cache Cache.applicationProperties.setProperty(propName, value); } } + + /** + * Loads in user colour schemes from files. + * + * @param files + * a '|'-delimited list of file paths + */ + public static void initUserColourSchemes(String files) + { + if (files == null || files.length() == 0) + { + return; + } + + // In case colours can't be loaded, we'll remove them + // from the default list here. + StringBuffer coloursFound = new StringBuffer(); + StringTokenizer st = new StringTokenizer(files, "|"); + while (st.hasMoreElements()) + { + String file = st.nextToken(); + try + { + UserColourScheme ucs = ColourSchemes.loadColourScheme(file); + if (ucs != null) + { + if (coloursFound.length() > 0) + { + coloursFound.append("|"); + } + coloursFound.append(file); + ColourSchemes.getInstance().registerColourScheme(ucs); + } + } catch (Exception ex) + { + System.out.println("Error loading User ColourFile\n" + ex); + } + } + if (!files.equals(coloursFound.toString())) + { + if (coloursFound.toString().length() > 1) + { + setProperty(UserDefinedColours.USER_DEFINED_COLOURS, coloursFound.toString()); + } + else + { + applicationProperties.remove(UserDefinedColours.USER_DEFINED_COLOURS); + } + } + } } diff --git a/src/jalview/gui/ColourMenuHelper.java b/src/jalview/gui/ColourMenuHelper.java index 8e0765b..52abfe1 100644 --- a/src/jalview/gui/ColourMenuHelper.java +++ b/src/jalview/gui/ColourMenuHelper.java @@ -1,5 +1,6 @@ package jalview.gui; +import jalview.bin.Cache; import jalview.datamodel.AnnotatedCollectionI; import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemes; @@ -136,11 +137,10 @@ public class ColourMenuHelper JvOptionPane.YES_NO_OPTION); if (option == JvOptionPane.YES_OPTION) { - UserDefinedColours.removeColourFromDefaults(radioItem - .getName()); ColourSchemes.getInstance().removeColourScheme( radioItem.getName()); colourMenu.remove(radioItem); + updatePreferences(); } else { @@ -239,4 +239,48 @@ public class ColourMenuHelper setColourSelected(colourMenu, cs == null ? ResidueColourScheme.NONE : cs.getSchemeName()); } + + /** + * Updates the USER_DEFINE_COLOURS preference to remove any de-registered + * colour scheme + */ + static void updatePreferences() + { + StringBuilder coloursFound = new StringBuilder(); + String[] files = Cache.getProperty("USER_DEFINED_COLOURS").split("\\|"); + + /* + * the property does not include the scheme name, it is in the file; + * so just load the colour schemes and discard any whose name is not + * registered + */ + for (String file : files) + { + try + { + UserColourScheme ucs = ColourSchemes.loadColourScheme(file); + if (ucs != null + && ColourSchemes.getInstance().nameExists(ucs.getName())) + { + if (coloursFound.length() > 0) + { + coloursFound.append("|"); + } + coloursFound.append(file); + } + } catch (Exception ex) + { + System.out.println("Error loading User ColourFile\n" + ex); + } + } + + if (coloursFound.toString().length() > 1) + { + Cache.setProperty("USER_DEFINED_COLOURS", coloursFound.toString()); + } + else + { + Cache.applicationProperties.remove("USER_DEFINED_COLOURS"); + } + } } diff --git a/src/jalview/gui/UserDefinedColours.java b/src/jalview/gui/UserDefinedColours.java index 9c9290f..b182c28 100755 --- a/src/jalview/gui/UserDefinedColours.java +++ b/src/jalview/gui/UserDefinedColours.java @@ -43,16 +43,11 @@ import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; -import java.util.SortedMap; -import java.util.StringTokenizer; -import java.util.TreeMap; import javax.swing.JButton; import javax.swing.JInternalFrame; @@ -71,7 +66,7 @@ public class UserDefinedColours extends GUserDefinedColours implements { private static final Font VERDANA_BOLD_10 = new Font("Verdana", Font.BOLD, 10); - private static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS"; + public static final String USER_DEFINED_COLOURS = "USER_DEFINED_COLOURS"; private static final String LAST_DIRECTORY = "LAST_DIRECTORY"; @@ -81,8 +76,6 @@ public class UserDefinedColours extends GUserDefinedColours implements private static final int MY_FRAME_WIDTH_CASE_SENSITIVE = 970; - static SortedMap userColourSchemes; - AlignmentPanel ap; SequenceGroup seqGroup; @@ -631,7 +624,7 @@ public class UserDefinedColours extends GUserDefinedColours implements File choice = chooser.getSelectedFile(); Cache.setProperty(LAST_DIRECTORY, choice.getParent()); - UserColourScheme ucs = loadColours(choice.getAbsolutePath()); + UserColourScheme ucs = ColourSchemes.loadColourScheme(choice.getAbsolutePath()); Color[] colors = ucs.getColours(); schemeName.setText(ucs.getSchemeName()); @@ -663,9 +656,10 @@ public class UserDefinedColours extends GUserDefinedColours implements } /** - * DOCUMENT ME! + * Loads the user-defined colour scheme from the first file listed in property + * "USER_DEFINED_COLOURS". If this fails, returns an all-white colour scheme. * - * @return DOCUMENT ME! + * @return */ public static UserColourScheme loadDefaultColours() { @@ -678,18 +672,12 @@ public class UserDefinedColours extends GUserDefinedColours implements { colours = colours.substring(0, colours.indexOf("|")); } - - ret = loadColours(colours); + ret = ColourSchemes.loadColourScheme(colours); } if (ret == null) { - Color[] newColours = new Color[24]; - for (int i = 0; i < 24; i++) - { - newColours[i] = Color.white; - } - ret = new UserColourScheme(newColours); + ret = new UserColourScheme("white"); } return ret; @@ -698,125 +686,14 @@ public class UserDefinedColours extends GUserDefinedColours implements /** * DOCUMENT ME! * - * @param file - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - static UserColourScheme loadColours(String file) - { - UserColourScheme ucs = null; - Color[] newColours = null; - 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); - - newColours = new Color[24]; - - Color[] lowerCase = null; - 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; - } - - if (name.toLowerCase().equals(name)) - { - if (lowerCase == null) - { - lowerCase = new Color[23]; - } - caseSensitive = true; - lowerCase[index] = new Color(Integer.parseInt(jucs.getColour(i) - .getRGB(), 16)); - } - else - { - newColours[index] = new Color(Integer.parseInt(jucs.getColour(i) - .getRGB(), 16)); - } - } - - if (newColours != null) - { - ucs = new UserColourScheme(newColours); - ucs.setName(jucs.getSchemeName()); - if (caseSensitive) - { - ucs.setLowerCaseColours(lowerCase); - } - } - - } catch (Exception ex) - { - // Could be Archive Jalview format - try - { - InputStreamReader in = new InputStreamReader(new FileInputStream( - file), "UTF-8"); - - jalview.binding.JalviewUserColours jucs = new jalview.binding.JalviewUserColours(); - - jucs = jucs.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)); - } - if (newColours != null) - { - 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; - } - - /** - * DOCUMENT ME! - * * @param e * DOCUMENT ME! */ @Override protected void savebutton_actionPerformed(ActionEvent e) { - if (schemeName.getText().trim().length() < 1) + String name = schemeName.getText().trim(); + if (name.length() < 1) { JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager .getString("label.user_colour_scheme_must_have_name"), @@ -825,21 +702,19 @@ public class UserDefinedColours extends GUserDefinedColours implements return; } - if (userColourSchemes != null - && userColourSchemes.containsKey(schemeName.getText())) + if (ColourSchemes.getInstance().nameExists(name)) { int reply = JvOptionPane.showInternalConfirmDialog(Desktop.desktop, MessageManager.formatMessage( "label.colour_scheme_exists_overwrite", new Object[] { - schemeName.getText(), schemeName.getText() }), + name, name }), MessageManager.getString("label.duplicate_scheme_name"), JvOptionPane.YES_NO_OPTION); if (reply != JvOptionPane.YES_OPTION) { return; } - - userColourSchemes.remove(schemeName.getText()); + ColourSchemes.getInstance().removeColourScheme(name); } JalviewFileChooser chooser = new JalviewFileChooser( Cache.getProperty(LAST_DIRECTORY), "jc", @@ -887,12 +762,9 @@ public class UserDefinedColours extends GUserDefinedColours implements Cache.setProperty(USER_DEFINED_COLOURS, defaultColours); /* - * add to the cache in this object + * construct and register the colour scheme */ UserColourScheme ucs = getSchemeFromButtons(); - String name = schemeName.getText(); - userColourSchemes.put(name, ucs); - ColourSchemes.getInstance().registerColourScheme(ucs); /* @@ -972,103 +844,6 @@ public class UserDefinedColours extends GUserDefinedColours implements } } - public static SortedMap getUserColourSchemes() - { - return userColourSchemes; - } - - public static void initUserColourSchemes(String files) - { - userColourSchemes = new TreeMap(); - - if (files == null || files.length() == 0) - { - return; - } - - // In case colours can't be loaded, we'll remove them - // from the default list here. - StringBuffer coloursFound = new StringBuffer(); - StringTokenizer st = new StringTokenizer(files, "|"); - while (st.hasMoreElements()) - { - String file = st.nextToken(); - try - { - UserColourScheme ucs = loadColours(file); - if (ucs != null) - { - if (coloursFound.length() > 0) - { - coloursFound.append("|"); - } - coloursFound.append(file); - String name = ucs.getName(); - userColourSchemes.put(name, ucs); - ColourSchemes.getInstance().registerColourScheme(ucs); - } - } catch (Exception ex) - { - System.out.println("Error loading User ColourFile\n" + ex); - } - } - if (!files.equals(coloursFound.toString())) - { - if (coloursFound.toString().length() > 1) - { - Cache.setProperty(USER_DEFINED_COLOURS, coloursFound.toString()); - } - else - { - Cache.applicationProperties.remove(USER_DEFINED_COLOURS); - } - } - } - - public static void removeColourFromDefaults(String target) - { - // The only way to find colours by name is to load them in - // In case colours can't be loaded, we'll remove them - // from the default list here. - - userColourSchemes = new TreeMap(); - - StringBuffer coloursFound = new StringBuffer(); - StringTokenizer st = new StringTokenizer( - Cache.getProperty(USER_DEFINED_COLOURS), "|"); - - while (st.hasMoreElements()) - { - String file = st.nextToken(); - try - { - UserColourScheme ucs = loadColours(file); - if (ucs != null && !ucs.getSchemeName().equals(target)) - { - if (coloursFound.length() > 0) - { - coloursFound.append("|"); - } - coloursFound.append(file); - userColourSchemes.put(ucs.getSchemeName(), ucs); - } - } catch (Exception ex) - { - System.out.println("Error loading User ColourFile\n" + ex); - } - } - - if (coloursFound.toString().length() > 1) - { - Cache.setProperty(USER_DEFINED_COLOURS, coloursFound.toString()); - } - else - { - Cache.applicationProperties.remove(USER_DEFINED_COLOURS); - } - - } - @Override public void caseSensitive_actionPerformed(ActionEvent e) { diff --git a/src/jalview/schemes/ColourSchemes.java b/src/jalview/schemes/ColourSchemes.java index 33ec966..5707876 100644 --- a/src/jalview/schemes/ColourSchemes.java +++ b/src/jalview/schemes/ColourSchemes.java @@ -1,9 +1,13 @@ package jalview.schemes; +import jalview.binding.JalviewUserColours; import jalview.datamodel.AnnotatedCollectionI; import jalview.datamodel.SequenceCollectionI; import jalview.datamodel.SequenceI; +import java.awt.Color; +import java.io.FileInputStream; +import java.io.InputStreamReader; import java.util.LinkedHashMap; import java.util.Map; @@ -148,4 +152,137 @@ 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 file + * + * @return + */ + public static UserColourScheme loadColourScheme(String file) + { + UserColourScheme ucs = null; + Color[] newColours = null; + 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; + } } diff --git a/test/jalview/schemes/ColourSchemesTest.java b/test/jalview/schemes/ColourSchemesTest.java index f7f0a0c..6527756 100644 --- a/test/jalview/schemes/ColourSchemesTest.java +++ b/test/jalview/schemes/ColourSchemesTest.java @@ -1,6 +1,7 @@ package jalview.schemes; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import jalview.bin.Cache; @@ -337,4 +338,21 @@ public class ColourSchemesTest assertEquals(myclustal2, Color.BLUE); assertEquals(myclustal3, Color.ORANGE); } + + /** + * Tests for check if scheme name exists. Built-in scheme names are the + * toString() values of enum JalviewColourScheme. + */ + @Test(groups = "Functional") + public void testNameExists() + { + ColourSchemes cs = ColourSchemes.getInstance(); + assertFalse(cs.nameExists(null)); + assertFalse(cs.nameExists("")); + assertTrue(cs.nameExists("Clustal")); + assertTrue(cs.nameExists("CLUSTAL")); + assertFalse(cs.nameExists("CLUSTAL ")); + assertTrue(cs.nameExists("% Identity")); + assertFalse(cs.nameExists("PID")); + } } -- 1.7.10.2