JAL-2361 simplify constructors, select unsaved but applied user defined
[jalview.git] / src / jalview / gui / ColourMenuHelper.java
index 801615c..b2b9574 100644 (file)
@@ -23,6 +23,12 @@ 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);
   }
 
@@ -37,7 +43,7 @@ public class ColourMenuHelper
    * <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
@@ -77,7 +83,7 @@ public class ColourMenuHelper
     }
 
     /*
-     * scan registered colour schemes (built-in or user-defined
+     * 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()
@@ -171,6 +177,7 @@ public class ColourMenuHelper
       final String label = MessageManager.getString("action.user_defined");
       JRadioButtonMenuItem userDefinedColour = new JRadioButtonMenuItem(
               label);
+      userDefinedColour.setName(ResidueColourScheme.USER_DEFINED);
       userDefinedColour.addActionListener(new ActionListener()
       {
         @Override
@@ -187,20 +194,22 @@ public class ColourMenuHelper
   }
 
   /**
-   * 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
@@ -210,38 +219,39 @@ 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.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
-   */
-  public static void setColourSelected(JMenu colourMenu, ColourSchemeI cs)
-  {
-    setColourSelected(colourMenu, cs == null ? ResidueColourScheme.NONE
-            : cs.getSchemeName());
-  }
-
-  /**
    * Updates the USER_DEFINE_COLOURS preference to remove any de-registered
    * colour scheme
    */