JAL-2360 removed UserDefinedColours.userColourSchemes
[jalview.git] / src / jalview / gui / ColourMenuHelper.java
index a5f4355..52abfe1 100644 (file)
@@ -1,5 +1,6 @@
 package jalview.gui;
 
+import jalview.bin.Cache;
 import jalview.datamodel.AnnotatedCollectionI;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemes;
@@ -27,8 +28,9 @@ public class ColourMenuHelper
   /**
    * 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>
@@ -43,28 +45,35 @@ 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
@@ -74,9 +83,14 @@ public class ColourMenuHelper
             .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_"
@@ -123,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
             {
@@ -148,18 +161,28 @@ 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.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;
   }
 
   /**
@@ -216,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");
+    }
+  }
 }