X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FColourMenuHelper.java;h=6eab07dc677bfb9c74e90a4a54026f4756084484;hb=e0f2d3774e2392feed462fa1707d0fb10602a1e1;hp=a5f43554ba9ea91476d563b36df5b826678907ba;hpb=92bd4313e2f23a65df1eb965e836d178c1eacdd1;p=jalview.git diff --git a/src/jalview/gui/ColourMenuHelper.java b/src/jalview/gui/ColourMenuHelper.java index a5f4355..6eab07d 100644 --- a/src/jalview/gui/ColourMenuHelper.java +++ b/src/jalview/gui/ColourMenuHelper.java @@ -1,7 +1,29 @@ +/* + * 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.gui; +import jalview.bin.Cache; import jalview.datamodel.AnnotatedCollectionI; import jalview.schemes.ColourSchemeI; +import jalview.schemes.ColourSchemeLoader; import jalview.schemes.ColourSchemes; import jalview.schemes.ResidueColourScheme; import jalview.schemes.UserColourScheme; @@ -21,20 +43,27 @@ public class ColourMenuHelper { public interface ColourChangeListener { + /** + * Change colour scheme to the selected scheme + * + * @param name + * the registered (unique) name of a colour scheme + */ void changeColour_actionPerformed(String name); } /** * Adds items to the colour menu, as mutually exclusive members of a button * group. The callback handler is responsible for the action on selecting any - * of these options. It is returned the name of the selected colour, or "None" - * or "User Defined". + * of these options. The callback method receives the name of the selected + * colour, or "None" or "User Defined". This method returns the ButtonGroup to + * which items were added. * * * @param colourMenu @@ -43,45 +72,58 @@ public class ColourMenuHelper * a callback to handle menu selection * @param coll * the data the menu is being built for + * @param simpleOnly + * if true, only simple per-residue colour schemes are included */ - public static void addMenuItems(final JMenu colourMenu, - final ColourChangeListener client, AnnotatedCollectionI coll) + public static ButtonGroup addMenuItems(final JMenu colourMenu, + final ColourChangeListener client, AnnotatedCollectionI coll, + boolean simpleOnly) { /* * ButtonGroup groups those items whose * selection is mutually exclusive */ ButtonGroup colours = new ButtonGroup(); - JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem( - MessageManager.getString("label.none")); - noColourmenuItem.setName(ResidueColourScheme.NONE); - noColourmenuItem.addActionListener(new ActionListener() + + if (!simpleOnly) { - @Override - public void actionPerformed(ActionEvent e) + JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem( + MessageManager.getString("label.none")); + noColourmenuItem.setName(ResidueColourScheme.NONE); + noColourmenuItem.addActionListener(new ActionListener() { - client.changeColour_actionPerformed(ResidueColourScheme.NONE); - } - }); - colourMenu.add(noColourmenuItem); - colours.add(noColourmenuItem); + @Override + public void actionPerformed(ActionEvent e) + { + client.changeColour_actionPerformed(ResidueColourScheme.NONE); + } + }); + colourMenu.add(noColourmenuItem); + colours.add(noColourmenuItem); + } /* - * scan registered colour schemes (built-in or user-defined - * and add them to the menu (in the order they were added) + * scan registered colour schemes (built-in or user-defined) + * and add them to the menu (in the order they were registered) */ Iterable colourSchemes = ColourSchemes.getInstance() .getColourSchemes(); for (ColourSchemeI scheme : colourSchemes) { + if (simpleOnly && !scheme.isSimple()) + { + continue; + } + /* * button text is i18n'd but the name is the canonical name of - * the colour scheme (inspected in changeColour_actionPerformed) + * the colour scheme (inspected in setColourSelected()) */ final String name = scheme.getSchemeName(); - String label = MessageManager.getStringOrReturn("label.colourScheme_" - + name.toLowerCase().replace(" ", "_"), name); - final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(label); + String label = MessageManager.getStringOrReturn( + "label.colourScheme_", name); + final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem( + label); radioItem.setName(name); radioItem.setEnabled(scheme.isApplicableTo(coll)); if (scheme instanceof UserColourScheme) @@ -89,14 +131,14 @@ public class ColourMenuHelper /* * user-defined colour scheme loaded on startup or during the * Jalview session; right-click on this offers the option to - * remove it as a colour choice + * remove it as a colour choice (unless currently selected) */ radioItem.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent evt) { - if (evt.isPopupTrigger()) // Mac + if (evt.isPopupTrigger() && !radioItem.isSelected()) // Mac { offerRemoval(); } @@ -105,7 +147,7 @@ public class ColourMenuHelper @Override public void mouseReleased(MouseEvent evt) { - if (evt.isPopupTrigger()) // Windows + if (evt.isPopupTrigger() && !radioItem.isSelected()) // Windows { offerRemoval(); } @@ -116,18 +158,18 @@ public class ColourMenuHelper ActionListener al = radioItem.getActionListeners()[0]; radioItem.removeActionListener(al); int option = JvOptionPane.showInternalConfirmDialog( - Desktop.desktop, MessageManager + Desktop.desktop, + MessageManager .getString("label.remove_from_default_list"), MessageManager .getString("label.remove_user_defined_colour"), JvOptionPane.YES_NO_OPTION); if (option == JvOptionPane.YES_OPTION) { - UserDefinedColours.removeColourFromDefaults(radioItem - .getName()); - ColourSchemes.getInstance().removeColourScheme( - radioItem.getName()); + ColourSchemes.getInstance() + .removeColourScheme(radioItem.getName()); colourMenu.remove(radioItem); + updatePreferences(); } else { @@ -148,35 +190,49 @@ public class ColourMenuHelper colours.add(radioItem); } - final String label = MessageManager.getString("action.user_defined"); - JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem(label); - userDefinedColour.addActionListener(new ActionListener() + /* + * only add the option to load/configure a user-defined colour + * to the AlignFrame colour menu + */ + if (client instanceof AlignFrame) { - @Override - public void actionPerformed(ActionEvent e) + final String label = MessageManager.getString("action.user_defined"); + JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem( + label); + userDefinedColour.setName(ResidueColourScheme.USER_DEFINED_MENU); + userDefinedColour.addActionListener(new ActionListener() { - client.changeColour_actionPerformed(ResidueColourScheme.USER_DEFINED); - } - }); - colourMenu.add(userDefinedColour); - colours.add(userDefinedColour); + @Override + public void actionPerformed(ActionEvent e) + { + client.changeColour_actionPerformed( + ResidueColourScheme.USER_DEFINED_MENU); + } + }); + colourMenu.add(userDefinedColour); + colours.add(userDefinedColour); + } + + return colours; } /** - * Marks as selected the colour menu item matching the given name, or the - * first item ('None') if no match is found + * Marks as selected the colour menu item matching the given colour scheme, or + * the first item ('None') if no match is found. If the colour scheme is a + * user defined scheme, but not in the menu (this arises if a new scheme is + * defined and applied but not saved to file), then menu option "User + * Defined.." is selected. * * @param colourMenu - * @param colourName + * @param cs */ - public static void setColourSelected(JMenu colourMenu, String colourName) + public static void setColourSelected(JMenu colourMenu, ColourSchemeI cs) { - if (colourName == null) - { - return; - } + String colourName = cs == null ? ResidueColourScheme.NONE + : cs.getSchemeName(); JRadioButtonMenuItem none = null; + JRadioButtonMenuItem userDefined = null; /* * select the radio button whose name matches the colour name @@ -186,34 +242,79 @@ public class ColourMenuHelper { if (menuItem instanceof JRadioButtonMenuItem) { - String buttonName = ((JRadioButtonMenuItem) menuItem).getName(); - if (colourName.equals(buttonName)) + JRadioButtonMenuItem radioButton = (JRadioButtonMenuItem) menuItem; + String buttonName = radioButton.getName(); + if (buttonName.equals(colourName)) { - ((JRadioButtonMenuItem) menuItem).setSelected(true); + radioButton.setSelected(true); return; } if (ResidueColourScheme.NONE.equals(buttonName)) { - none = (JRadioButtonMenuItem) menuItem; + none = radioButton; + } + if (ResidueColourScheme.USER_DEFINED_MENU.equals(buttonName)) + { + userDefined = radioButton; } } } - if (none != null) + + /* + * no match by name; select User Defined.. if current scheme is a + * user defined one, else select None + */ + if (cs instanceof UserColourScheme && userDefined != null) + { + userDefined.setSelected(true); + } + else if (none != null) { none.setSelected(true); } } /** - * Marks as selected the colour menu item matching the given colour scheme, or - * the first item ('None') if no match is found - * - * @param colourMenu - * @param cs + * Updates the USER_DEFINE_COLOURS preference to remove any de-registered + * colour scheme */ - public static void setColourSelected(JMenu colourMenu, ColourSchemeI cs) + static void updatePreferences() { - setColourSelected(colourMenu, cs == null ? ResidueColourScheme.NONE - : cs.getSchemeName()); + 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 = ColourSchemeLoader.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"); + } } }