JAL-2360 ColourMenuHelper now builds and selects items in colour menu
[jalview.git] / src / jalview / gui / AlignFrame.java
index 5127342..29a160c 100644 (file)
@@ -59,6 +59,7 @@ import jalview.datamodel.SeqCigar;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.gui.ColourMenuHelper.ColourChangeListener;
 import jalview.gui.ViewSelectionMenu.ViewSetProvider;
 import jalview.io.AlignmentProperties;
 import jalview.io.AnnotationFile;
@@ -78,12 +79,10 @@ import jalview.io.NewickFile;
 import jalview.io.TCoffeeScoreFile;
 import jalview.jbgui.GAlignFrame;
 import jalview.schemes.ColourSchemeI;
-import jalview.schemes.ColourSchemeProperty;
 import jalview.schemes.ColourSchemes;
 import jalview.schemes.ResidueColourScheme;
 import jalview.schemes.ResidueProperties;
 import jalview.schemes.TCoffeeColourScheme;
-import jalview.schemes.UserColourScheme;
 import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.ws.DBRefFetcher;
@@ -114,7 +113,6 @@ import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.print.PageFormat;
 import java.awt.print.PrinterJob;
@@ -129,14 +127,12 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Vector;
 
-import javax.swing.ButtonGroup;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JEditorPane;
 import javax.swing.JInternalFrame;
 import javax.swing.JLayeredPane;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
-import javax.swing.JRadioButtonMenuItem;
 import javax.swing.JScrollPane;
 import javax.swing.SwingUtilities;
 
@@ -147,7 +143,7 @@ import javax.swing.SwingUtilities;
  * @version $Revision$
  */
 public class AlignFrame extends GAlignFrame implements DropTargetListener,
-        IProgressIndicator, AlignViewControllerGuiI
+        IProgressIndicator, AlignViewControllerGuiI, ColourChangeListener
 {
 
   public static final int DEFAULT_WIDTH = 700;
@@ -839,7 +835,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   public void setGUINucleotide()
   {
-    boolean nucleotide = viewport.getAlignment().isNucleotide();
+    AlignmentI al = getViewport().getAlignment();
+    boolean nucleotide = al.isNucleotide();
 
     showTranslation.setVisible(nucleotide);
     showReverse.setVisible(nucleotide);
@@ -848,37 +845,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     modifyConservation.setEnabled(!nucleotide);
     showGroupConservation.setEnabled(!nucleotide);
 
-    AlignmentI al = getViewport().getAlignment();
-
-    /*
-     * enable / disable colour schemes by querying whether they
-     * are applicable to the alignment data (for example, peptide or
-     * nucleotide specific, or require certain annotation present)
-     */
-    for (Component menuItem : colourMenu.getMenuComponents())
-    {
-      if (menuItem instanceof JRadioButtonMenuItem)
-      {
-        String colourName = ((JRadioButtonMenuItem) menuItem).getName();
-        ColourSchemeI cs = ColourSchemes.getInstance().getColourScheme(
-                colourName, viewport);
-        if (cs != null)
-        {
-          ((JRadioButtonMenuItem) menuItem).setEnabled(cs
-                  .isApplicableTo(al));
-        }
-      }
-    }
-
     showComplementMenuItem.setText(nucleotide ? MessageManager
             .getString("label.protein") : MessageManager
             .getString("label.nucleotide"));
-
-    String selectedColourScheme = Cache.getDefault(
-            nucleotide ? Preferences.DEFAULT_COLOUR_NUC
-                    : Preferences.DEFAULT_COLOUR_PROT,
-            ResidueColourScheme.NONE);
-    setColourSelected(selectedColourScheme);
   }
 
   /**
@@ -930,8 +899,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     showSequenceLogo.setSelected(av.isShowSequenceLogo());
     normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo());
 
-    setColourSelected(ColourSchemeProperty.getColourName(av
-            .getGlobalColourScheme()));
+    ColourMenuHelper.setColourSelected(colourMenu,
+            av.getGlobalColourScheme());
 
     showSeqFeatures.setSelected(av.isShowSequenceFeatures());
     hiddenMarkers.setState(av.getShowHiddenMarkers());
@@ -3315,18 +3284,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     new TextColourChooser().chooseColour(alignPanel, null);
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
-   */
-  @Override
-  protected void noColourmenuItem_actionPerformed()
-  {
-    changeColour(null);
-  }
-
   /*
    * public void covariationColour_actionPerformed() {
    * changeColour(new
@@ -3363,10 +3320,24 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    * @param name
    *          the name (not the menu item label!) of the colour scheme
    */
+  @Override
   public void changeColour_actionPerformed(String name)
   {
+    /*
+     * 'User Defined' opens a panel to configure or load a
+     * user-defined colour scheme
+     */
+    if (ResidueColourScheme.USER_DEFINED.equals(name))
+    {
+      new UserDefinedColours(alignPanel, null);
+      return;
+    }
+
+    /*
+     * otherwise set the chosen colour scheme (or null for 'None')
+     */
     ColourSchemeI cs = ColourSchemes.getInstance().getColourScheme(name,
-            viewport);
+            viewport.getAlignment(), viewport.getHiddenRepSequences());
     changeColour(cs);
   }
 
@@ -3381,7 +3352,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     // TODO: pull up to controller method
     if (cs != null)
     {
-      setColourSelected(cs.getSchemeName());
+      ColourMenuHelper.setColourSelected(colourMenu, cs.getSchemeName());
       // Make sure viewport is up to date w.r.t. any sliders
       if (viewport.getAbovePIDThreshold())
       {
@@ -3477,18 +3448,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   /**
-   * Action on the user selecting the option "User Defined" to create or load a
-   * new colour scheme
-   * 
-   * @param e
-   */
-  @Override
-  public void userDefinedColour_actionPerformed(ActionEvent e)
-  {
-    new UserDefinedColours(alignPanel, null);
-  }
-
-  /**
    * DOCUMENT ME!
    * 
    * @param e
@@ -4787,17 +4746,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           {
             if (tcf.annotateAlignment(viewport.getAlignment(), true))
             {
-              // tcoffeeColour.setEnabled(true);
-              // tcoffeeColour.setSelected(true);
-              for (Component menuItem : colourMenu.getMenuComponents())
-              {
-                if (menuItem instanceof JRadioButtonMenuItem
-                        && ((JRadioButtonMenuItem) menuItem).getText()
-                                .equals("T-Coffee Scores"))
-                {
-                  ((JRadioButtonMenuItem) menuItem).setSelected(true);
-                }
-              }
               buildColourMenu();
               changeColour(new TCoffeeColourScheme(viewport.getAlignment()));
               isAnnotation = true;
@@ -5737,101 +5685,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     colourMenu.removeAll();
 
-    /*
-     * ButtonGroup groups those items whose 
-     * selection is mutually exclusive
-     */
-    ButtonGroup colours = new ButtonGroup();
-
     colourMenu.add(applyToAllGroups);
     colourMenu.add(textColour);
     colourMenu.addSeparator();
-    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)
-     */
-    Iterable<ColourSchemeI> colourSchemes = ColourSchemes.getInstance()
-            .getColourSchemes();
-    for (ColourSchemeI scheme : colourSchemes)
-    {
-      /*
-       * button text is i18n'd but the name is the canonical name of
-       * the colour scheme (inspected in changeColour_actionPerformed)
-       */
-      final String name = scheme.getSchemeName();
-      String label = MessageManager.getStringOrReturn("label.colourScheme_"
-              + name.toLowerCase().replace(" ", "_"), name);
-      final JRadioButtonMenuItem radioItem = new JRadioButtonMenuItem(label);
-      radioItem.setName(name);
-      if (scheme instanceof UserColourScheme)
-      {
-        /*
-         * 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
-         */
-        radioItem.addMouseListener(new MouseAdapter()
-        {
-          @Override
-          public void mousePressed(MouseEvent evt)
-          {
-            if (evt.isPopupTrigger()) // Mac
-            {
-              offerRemoval();
-            }
-          }
 
-          @Override
-          public void mouseReleased(MouseEvent evt)
-          {
-            if (evt.isPopupTrigger()) // Windows
-            {
-              offerRemoval();
-            }
-          }
-
-          void offerRemoval()
-          {
-            ActionListener al = radioItem.getActionListeners()[0];
-            radioItem.removeActionListener(al);
-            int option = JvOptionPane.showInternalConfirmDialog(
-                    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());
-              colourMenu.remove(radioItem);
-            }
-            else
-            {
-              radioItem.addActionListener(al);
-            }
-          }
-        });
-      }
-      radioItem.addActionListener(new ActionListener()
-      {
-        @Override
-        public void actionPerformed(ActionEvent evt)
-        {
-          changeColour_actionPerformed(name);
-        }
-      });
-      colourMenu.add(radioItem);
-      colours.add(radioItem);
-    }
-
-    colourMenu.add(userDefinedColour);
-    colours.add(userDefinedColour);
+    ColourMenuHelper
+            .addMenuItems(colourMenu, this, viewport.getAlignment());
 
     colourMenu.addSeparator();
     colourMenu.add(conservationMenuItem);
@@ -5840,10 +5699,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     colourMenu.add(modifyPID);
     colourMenu.add(annotationColour);
 
-    setColourSelected(Cache.getDefault(Preferences.DEFAULT_COLOUR,
-            ResidueColourScheme.NONE));
+    /*
+     * select the default colour for the alignment (this may be
+     * overridden later)
+     */
+    boolean nucleotide = viewport.getAlignment().isNucleotide();
+    String defaultColourScheme = Cache.getDefault(
+            nucleotide ? Preferences.DEFAULT_COLOUR_NUC
+                    : Preferences.DEFAULT_COLOUR_PROT,
+            ResidueColourScheme.NONE);
 
-    setGUINucleotide();
+    ColourMenuHelper.setColourSelected(colourMenu, defaultColourScheme);
   }
 }