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;
{
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.
* <ul>
* <li>None</li>
* <li>Clustal</li>
* <li>...other 'built-in' colours</li>
* <li>...any user-defined colours</li>
- * <li>User Defined..</li>
+ * <li>User Defined..(only for AlignFrame menu)</li>
* </ul>
*
* @param colourMenu
* 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<ColourSchemeI> 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_"
/*
* 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();
}
@Override
public void mouseReleased(MouseEvent evt)
{
- if (evt.isPopupTrigger()) // Windows
+ if (evt.isPopupTrigger() && !radioItem.isSelected()) // Windows
{
offerRemoval();
}
JvOptionPane.YES_NO_OPTION);
if (option == JvOptionPane.YES_OPTION)
{
- UserDefinedColours.removeColourFromDefaults(radioItem
- .getName());
ColourSchemes.getInstance().removeColourScheme(
radioItem.getName());
colourMenu.remove(radioItem);
+ updatePreferences();
}
else
{
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);
+ 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);
+ }
+ });
+ 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
{
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.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");
+ }
}
}