JAL-2361 select colour menu item by matching its name to colour scheme
[jalview.git] / src / jalview / gui / PopupMenu.java
index 5825382..ebcb062 100644 (file)
@@ -38,18 +38,23 @@ import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
+import jalview.io.FileFormat;
+import jalview.io.FileFormatI;
 import jalview.io.FormatAdapter;
 import jalview.io.SequenceAnnotationReport;
 import jalview.schemes.AnnotationColourGradient;
 import jalview.schemes.Blosum62ColourScheme;
 import jalview.schemes.BuriedColourScheme;
 import jalview.schemes.ClustalxColourScheme;
+import jalview.schemes.ColourSchemeI;
 import jalview.schemes.HelixColourScheme;
 import jalview.schemes.HydrophobicColourScheme;
+import jalview.schemes.JalviewColourScheme;
 import jalview.schemes.NucleotideColourScheme;
 import jalview.schemes.PIDColourScheme;
 import jalview.schemes.PurinePyrimidineColourScheme;
 import jalview.schemes.StrandColourScheme;
+import jalview.schemes.TCoffeeColourScheme;
 import jalview.schemes.TaylorColourScheme;
 import jalview.schemes.TurnColourScheme;
 import jalview.schemes.UserColourScheme;
@@ -60,6 +65,7 @@ import jalview.util.MessageManager;
 import jalview.util.UrlLink;
 
 import java.awt.Color;
+import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Arrays;
@@ -69,6 +75,7 @@ import java.util.Hashtable;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.SortedMap;
 import java.util.TreeMap;
 import java.util.Vector;
 
@@ -77,7 +84,6 @@ import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JColorChooser;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
 import javax.swing.JPopupMenu;
 import javax.swing.JRadioButtonMenuItem;
 
@@ -117,9 +123,13 @@ public class PopupMenu extends JPopupMenu
 
   protected JRadioButtonMenuItem BLOSUM62Colour = new JRadioButtonMenuItem();
 
+  JRadioButtonMenuItem nucleotideColour = new JRadioButtonMenuItem();
+
   protected JRadioButtonMenuItem purinePyrimidineColour = new JRadioButtonMenuItem();
 
-  protected JRadioButtonMenuItem RNAInteractionColour = new JRadioButtonMenuItem();
+  protected JRadioButtonMenuItem tcoffeeColour = new JRadioButtonMenuItem();
+
+  // protected JRadioButtonMenuItem RNAInteractionColour;
 
   JRadioButtonMenuItem noColourmenuItem = new JRadioButtonMenuItem();
 
@@ -147,8 +157,6 @@ public class PopupMenu extends JPopupMenu
 
   JMenuItem outline = new JMenuItem();
 
-  JRadioButtonMenuItem nucleotideMenuItem = new JRadioButtonMenuItem();
-
   JMenu colourMenu = new JMenu();
 
   JCheckBoxMenuItem showBoxes = new JCheckBoxMenuItem();
@@ -237,29 +245,11 @@ public class PopupMenu extends JPopupMenu
     this.ap = ap;
     sequence = seq;
 
-    ButtonGroup colours = new ButtonGroup();
-    colours.add(noColourmenuItem);
-    colours.add(clustalColour);
-    colours.add(zappoColour);
-    colours.add(taylorColour);
-    colours.add(hydrophobicityColour);
-    colours.add(helixColour);
-    colours.add(strandColour);
-    colours.add(turnColour);
-    colours.add(buriedColour);
-    colours.add(abovePIDColour);
-    colours.add(userDefinedColour);
-    colours.add(PIDColour);
-    colours.add(BLOSUM62Colour);
-    colours.add(purinePyrimidineColour);
-    colours.add(RNAInteractionColour);
-
-    for (int i = 0; i < jalview.io.FormatAdapter.WRITEABLE_FORMATS.length; i++)
+    for (String ff : FileFormat.getWritableFormats(true))
     {
-      JMenuItem item = new JMenuItem(
-              jalview.io.FormatAdapter.WRITEABLE_FORMATS[i]);
+      JMenuItem item = new JMenuItem(ff);
 
-      item.addActionListener(new java.awt.event.ActionListener()
+      item.addActionListener(new ActionListener()
       {
         @Override
         public void actionPerformed(ActionEvent e)
@@ -343,7 +333,7 @@ public class PopupMenu extends JPopupMenu
               menuItem.setText(MessageManager.formatMessage(
                       "label.2d_rna_structure_line",
                       new Object[] { aa.label }));
-              menuItem.addActionListener(new java.awt.event.ActionListener()
+              menuItem.addActionListener(new ActionListener()
               {
                 @Override
                 public void actionPerformed(ActionEvent e)
@@ -371,7 +361,7 @@ public class PopupMenu extends JPopupMenu
               menuItem.setText(MessageManager.formatMessage(
                       "label.2d_rna_sequence_name",
                       new Object[] { seq.getName() }));
-              menuItem.addActionListener(new java.awt.event.ActionListener()
+              menuItem.addActionListener(new ActionListener()
               {
                 @Override
                 public void actionPerformed(ActionEvent e)
@@ -392,7 +382,7 @@ public class PopupMenu extends JPopupMenu
 
       menuItem = new JMenuItem(
               MessageManager.getString("action.hide_sequences"));
-      menuItem.addActionListener(new java.awt.event.ActionListener()
+      menuItem.addActionListener(new ActionListener()
       {
         @Override
         public void actionPerformed(ActionEvent e)
@@ -408,7 +398,7 @@ public class PopupMenu extends JPopupMenu
         menuItem = new JMenuItem(MessageManager.formatMessage(
                 "label.represent_group_with",
                 new Object[] { seq.getName() }));
-        menuItem.addActionListener(new java.awt.event.ActionListener()
+        menuItem.addActionListener(new ActionListener()
         {
           @Override
           public void actionPerformed(ActionEvent e)
@@ -477,63 +467,7 @@ public class PopupMenu extends JPopupMenu
       groupName.setText(MessageManager
               .getString("label.edit_name_and_description_current_group"));
 
-      if (sg.cs instanceof ZappoColourScheme)
-      {
-        zappoColour.setSelected(true);
-      }
-      else if (sg.cs instanceof TaylorColourScheme)
-      {
-        taylorColour.setSelected(true);
-      }
-      else if (sg.cs instanceof PIDColourScheme)
-      {
-        PIDColour.setSelected(true);
-      }
-      else if (sg.cs instanceof Blosum62ColourScheme)
-      {
-        BLOSUM62Colour.setSelected(true);
-      }
-      else if (sg.cs instanceof UserColourScheme)
-      {
-        userDefinedColour.setSelected(true);
-      }
-      else if (sg.cs instanceof HydrophobicColourScheme)
-      {
-        hydrophobicityColour.setSelected(true);
-      }
-      else if (sg.cs instanceof HelixColourScheme)
-      {
-        helixColour.setSelected(true);
-      }
-      else if (sg.cs instanceof StrandColourScheme)
-      {
-        strandColour.setSelected(true);
-      }
-      else if (sg.cs instanceof TurnColourScheme)
-      {
-        turnColour.setSelected(true);
-      }
-      else if (sg.cs instanceof BuriedColourScheme)
-      {
-        buriedColour.setSelected(true);
-      }
-      else if (sg.cs instanceof ClustalxColourScheme)
-      {
-        clustalColour.setSelected(true);
-      }
-      else if (sg.cs instanceof PurinePyrimidineColourScheme)
-      {
-        purinePyrimidineColour.setSelected(true);
-      }
-
-      /*
-       * else if (sg.cs instanceof CovariationColourScheme) {
-       * covariationColour.setSelected(true); }
-       */
-      else
-      {
-        noColourmenuItem.setSelected(true);
-      }
+      setColourSelected(sg.cs);
 
       if (sg.cs != null && sg.cs.conservationApplied())
       {
@@ -779,7 +713,7 @@ public class PopupMenu extends JPopupMenu
     label = label.substring(1, label.length() - 1); // a, b, c
     final JMenuItem item = new JMenuItem(label);
     item.setToolTipText(calcId);
-    item.addActionListener(new java.awt.event.ActionListener()
+    item.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -961,7 +895,7 @@ public class PopupMenu extends JPopupMenu
     JMenuItem item = new JMenuItem(label);
     item.setToolTipText(MessageManager.formatMessage(
             "label.open_url_param", new Object[] { url }));
-    item.addActionListener(new java.awt.event.ActionListener()
+    item.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1038,7 +972,7 @@ public class PopupMenu extends JPopupMenu
   {
     groupMenu.setText(MessageManager.getString("label.selection"));
     groupName.setText(MessageManager.getString("label.name"));
-    groupName.addActionListener(new java.awt.event.ActionListener()
+    groupName.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1049,7 +983,7 @@ public class PopupMenu extends JPopupMenu
     sequenceMenu.setText(MessageManager.getString("label.sequence"));
     sequenceName.setText(MessageManager
             .getString("label.edit_name_description"));
-    sequenceName.addActionListener(new java.awt.event.ActionListener()
+    sequenceName.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1059,7 +993,7 @@ public class PopupMenu extends JPopupMenu
     });
     chooseAnnotations.setText(MessageManager
             .getString("action.choose_annotations"));
-    chooseAnnotations.addActionListener(new java.awt.event.ActionListener()
+    chooseAnnotations.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1069,7 +1003,7 @@ public class PopupMenu extends JPopupMenu
     });
     sequenceDetails.setText(MessageManager
             .getString("label.sequence_details"));
-    sequenceDetails.addActionListener(new java.awt.event.ActionListener()
+    sequenceDetails.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1080,7 +1014,7 @@ public class PopupMenu extends JPopupMenu
     sequenceSelDetails.setText(MessageManager
             .getString("label.sequence_details"));
     sequenceSelDetails
-            .addActionListener(new java.awt.event.ActionListener()
+.addActionListener(new ActionListener()
             {
               @Override
               public void actionPerformed(ActionEvent e)
@@ -1091,7 +1025,7 @@ public class PopupMenu extends JPopupMenu
     PIDColour.setFocusPainted(false);
     unGroupMenuItem
             .setText(MessageManager.getString("action.remove_group"));
-    unGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
+    unGroupMenuItem.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1102,7 +1036,7 @@ public class PopupMenu extends JPopupMenu
     createGroupMenuItem.setText(MessageManager
             .getString("action.create_group"));
     createGroupMenuItem
-            .addActionListener(new java.awt.event.ActionListener()
+.addActionListener(new ActionListener()
             {
               @Override
               public void actionPerformed(ActionEvent e)
@@ -1112,7 +1046,7 @@ public class PopupMenu extends JPopupMenu
             });
 
     outline.setText(MessageManager.getString("action.border_colour"));
-    outline.addActionListener(new java.awt.event.ActionListener()
+    outline.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1120,17 +1054,6 @@ public class PopupMenu extends JPopupMenu
         outline_actionPerformed();
       }
     });
-    nucleotideMenuItem
-            .setText(MessageManager.getString("label.nucleotide"));
-    nucleotideMenuItem.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        nucleotideMenuItem_actionPerformed();
-      }
-    });
-    colourMenu.setText(MessageManager.getString("label.group_colour"));
     showBoxes.setText(MessageManager.getString("action.boxes"));
     showBoxes.setState(true);
     showBoxes.addActionListener(new ActionListener()
@@ -1161,7 +1084,7 @@ public class PopupMenu extends JPopupMenu
       }
     });
     displayNonconserved.setText(MessageManager
-            .getString("label.show_non_conversed"));
+            .getString("label.show_non_conserved"));
     displayNonconserved.setState(true);
     displayNonconserved.addActionListener(new ActionListener()
     {
@@ -1237,15 +1160,6 @@ public class PopupMenu extends JPopupMenu
         sequenceFeature_actionPerformed();
       }
     });
-    textColour.setText(MessageManager.getString("label.text_colour"));
-    textColour.addActionListener(new ActionListener()
-    {
-      @Override
-      public void actionPerformed(ActionEvent e)
-      {
-        textColour_actionPerformed();
-      }
-    });
     jMenu1.setText(MessageManager.getString("label.group"));
     pdbStructureDialog.setText(MessageManager
             .getString("label.show_pdbstruct_dialog"));
@@ -1337,49 +1251,9 @@ public class PopupMenu extends JPopupMenu
     sequenceMenu.add(sequenceName);
     sequenceMenu.add(sequenceDetails);
     sequenceMenu.add(makeReferenceSeq);
-    colourMenu.add(textColour);
-    colourMenu.add(noColourmenuItem);
-    colourMenu.add(clustalColour);
-    colourMenu.add(BLOSUM62Colour);
-    colourMenu.add(PIDColour);
-    colourMenu.add(zappoColour);
-    colourMenu.add(taylorColour);
-    colourMenu.add(hydrophobicityColour);
-    colourMenu.add(helixColour);
-    colourMenu.add(strandColour);
-    colourMenu.add(turnColour);
-    colourMenu.add(buriedColour);
-    colourMenu.add(nucleotideMenuItem);
-    if (ap.getAlignment().isNucleotide())
-    {
-      // JBPNote - commented since the colourscheme isn't functional
-      colourMenu.add(purinePyrimidineColour);
-    }
-    colourMenu.add(userDefinedColour);
 
-    if (jalview.gui.UserDefinedColours.getUserColourSchemes() != null)
-    {
-      java.util.Enumeration userColours = jalview.gui.UserDefinedColours
-              .getUserColourSchemes().keys();
+    buildColourMenu();
 
-      while (userColours.hasMoreElements())
-      {
-        JMenuItem item = new JMenuItem(userColours.nextElement().toString());
-        item.addActionListener(new ActionListener()
-        {
-          @Override
-          public void actionPerformed(ActionEvent evt)
-          {
-            userDefinedColour_actionPerformed(evt);
-          }
-        });
-        colourMenu.add(item);
-      }
-    }
-
-    colourMenu.addSeparator();
-    colourMenu.add(abovePIDColour);
-    colourMenu.add(conservationMenuItem);
     editMenu.add(copy);
     editMenu.add(cut);
     editMenu.add(editSequence);
@@ -1397,8 +1271,27 @@ public class PopupMenu extends JPopupMenu
     jMenu1.add(showColourText);
     jMenu1.add(outline);
     jMenu1.add(displayNonconserved);
+
+    initColourMenu();
+  }
+
+  /**
+   * Constructs the entries for the colour menu
+   */
+  protected void initColourMenu()
+  {
+    colourMenu.setText(MessageManager.getString("label.group_colour"));
+    textColour.setText(MessageManager.getString("label.text_colour"));
+    textColour.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        textColour_actionPerformed();
+      }
+    });
     noColourmenuItem.setText(MessageManager.getString("label.none"));
-    noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
+    noColourmenuItem.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1407,9 +1300,9 @@ public class PopupMenu extends JPopupMenu
       }
     });
 
-    clustalColour.setText(MessageManager
-            .getString("label.clustalx_colours"));
-    clustalColour.addActionListener(new java.awt.event.ActionListener()
+    clustalColour.setText(MessageManager.getString("label.clustalx"));
+    clustalColour.setName(JalviewColourScheme.Clustal.toString());
+    clustalColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1418,7 +1311,8 @@ public class PopupMenu extends JPopupMenu
       }
     });
     zappoColour.setText(MessageManager.getString("label.zappo"));
-    zappoColour.addActionListener(new java.awt.event.ActionListener()
+    zappoColour.setName(JalviewColourScheme.Zappo.toString());
+    zappoColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1427,7 +1321,8 @@ public class PopupMenu extends JPopupMenu
       }
     });
     taylorColour.setText(MessageManager.getString("label.taylor"));
-    taylorColour.addActionListener(new java.awt.event.ActionListener()
+    taylorColour.setName(JalviewColourScheme.Taylor.toString());
+    taylorColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1438,16 +1333,18 @@ public class PopupMenu extends JPopupMenu
     hydrophobicityColour.setText(MessageManager
             .getString("label.hydrophobicity"));
     hydrophobicityColour
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                hydrophobicityColour_actionPerformed();
-              }
-            });
+            .setName(JalviewColourScheme.Hydrophobic.toString());
+    hydrophobicityColour.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        hydrophobicityColour_actionPerformed();
+      }
+    });
     helixColour.setText(MessageManager.getString("label.helix_propensity"));
-    helixColour.addActionListener(new java.awt.event.ActionListener()
+    helixColour.setName(JalviewColourScheme.Helix.toString());
+    helixColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1457,7 +1354,8 @@ public class PopupMenu extends JPopupMenu
     });
     strandColour.setText(MessageManager
             .getString("label.strand_propensity"));
-    strandColour.addActionListener(new java.awt.event.ActionListener()
+    strandColour.setName(JalviewColourScheme.Strand.toString());
+    strandColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1466,7 +1364,8 @@ public class PopupMenu extends JPopupMenu
       }
     });
     turnColour.setText(MessageManager.getString("label.turn_propensity"));
-    turnColour.addActionListener(new java.awt.event.ActionListener()
+    turnColour.setName(JalviewColourScheme.Turn.toString());
+    turnColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1475,7 +1374,8 @@ public class PopupMenu extends JPopupMenu
       }
     });
     buriedColour.setText(MessageManager.getString("label.buried_index"));
-    buriedColour.addActionListener(new java.awt.event.ActionListener()
+    buriedColour.setName(JalviewColourScheme.Buried.toString());
+    buriedColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1484,8 +1384,8 @@ public class PopupMenu extends JPopupMenu
       }
     });
     abovePIDColour.setText(MessageManager
-            .getString("label.above_identity_percentage"));
-    abovePIDColour.addActionListener(new java.awt.event.ActionListener()
+            .getString("label.above_identity_threshold"));
+    abovePIDColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1495,7 +1395,8 @@ public class PopupMenu extends JPopupMenu
     });
     userDefinedColour.setText(MessageManager
             .getString("action.user_defined"));
-    userDefinedColour.addActionListener(new java.awt.event.ActionListener()
+    userDefinedColour.setName(JalviewColourScheme.UserDefined.toString());
+    userDefinedColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1505,7 +1406,8 @@ public class PopupMenu extends JPopupMenu
     });
     PIDColour
             .setText(MessageManager.getString("label.percentage_identity"));
-    PIDColour.addActionListener(new java.awt.event.ActionListener()
+    PIDColour.setName(JalviewColourScheme.PID.toString());
+    PIDColour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1513,8 +1415,10 @@ public class PopupMenu extends JPopupMenu
         PIDColour_actionPerformed();
       }
     });
-    BLOSUM62Colour.setText(MessageManager.getString("label.blosum62"));
-    BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
+    BLOSUM62Colour
+            .setText(MessageManager.getString("label.blosum62_score"));
+    BLOSUM62Colour.setName(JalviewColourScheme.Blosum62.toString());
+    BLOSUM62Colour.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
@@ -1522,38 +1426,160 @@ public class PopupMenu extends JPopupMenu
         BLOSUM62Colour_actionPerformed();
       }
     });
+    nucleotideColour.setText(MessageManager.getString("label.nucleotide"));
+    nucleotideColour.setName(JalviewColourScheme.Nucleotide.toString());
+    nucleotideColour.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        nucleotideMenuItem_actionPerformed();
+      }
+    });
     purinePyrimidineColour.setText(MessageManager
             .getString("label.purine_pyrimidine"));
-    purinePyrimidineColour
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                purinePyrimidineColour_actionPerformed();
-              }
-            });
+    purinePyrimidineColour.setName(JalviewColourScheme.PurinePyrimidine
+            .toString());
+    purinePyrimidineColour.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        purinePyrimidineColour_actionPerformed();
+      }
+    });
+
+    tcoffeeColour.setText(MessageManager.getString("label.tcoffee_scores"));
+    tcoffeeColour.setName(JalviewColourScheme.TCoffee.toString());
+    tcoffeeColour.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        tcoffeeColorScheme_actionPerformed();
+      }
+    });
 
     /*
-     * covariationColour.addActionListener(new java.awt.event.ActionListener() {
+     * covariationColour.addActionListener(new ActionListener() {
      * public void actionPerformed(ActionEvent e) {
      * covariationColour_actionPerformed(); } });
      */
 
     conservationMenuItem.setText(MessageManager
-            .getString("label.conservation"));
-    conservationMenuItem
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              @Override
-              public void actionPerformed(ActionEvent e)
-              {
-                conservationMenuItem_actionPerformed();
+            .getString("action.by_conservation"));
+    conservationMenuItem.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        conservationMenuItem_actionPerformed();
               }
             });
   }
 
   /**
+   * Builds the group colour sub-menu, including any user-defined colours which
+   * were loaded at startup or during the Jalview session
+   */
+  protected void buildColourMenu()
+  {
+    SequenceGroup sg = getGroup();
+    colourMenu.removeAll();
+    colourMenu.add(textColour);
+    colourMenu.addSeparator();
+    colourMenu.add(noColourmenuItem);
+    colourMenu.add(clustalColour);
+    // in Java 8, isApplicableTo can be a static method on the interface
+    clustalColour.setEnabled(new ClustalxColourScheme(sg, null)
+            .isApplicableTo(sg));
+    colourMenu.add(BLOSUM62Colour);
+    BLOSUM62Colour
+            .setEnabled(new Blosum62ColourScheme().isApplicableTo(sg));
+    colourMenu.add(PIDColour);
+    PIDColour.setEnabled(new PIDColourScheme().isApplicableTo(sg));
+    colourMenu.add(zappoColour);
+    zappoColour.setEnabled(new ZappoColourScheme().isApplicableTo(sg));
+    colourMenu.add(taylorColour);
+    taylorColour.setEnabled(new TaylorColourScheme().isApplicableTo(sg));
+    colourMenu.add(hydrophobicityColour);
+    hydrophobicityColour.setEnabled(new HydrophobicColourScheme()
+            .isApplicableTo(sg));
+    colourMenu.add(helixColour);
+    helixColour.setEnabled(new HelixColourScheme().isApplicableTo(sg));
+    colourMenu.add(strandColour);
+    strandColour.setEnabled(new StrandColourScheme().isApplicableTo(sg));
+    colourMenu.add(turnColour);
+    turnColour.setEnabled(new TurnColourScheme().isApplicableTo(sg));
+    colourMenu.add(buriedColour);
+    buriedColour.setEnabled(new BuriedColourScheme().isApplicableTo(sg));
+    colourMenu.add(nucleotideColour);
+    nucleotideColour.setEnabled(new NucleotideColourScheme()
+            .isApplicableTo(sg));
+    colourMenu.add(purinePyrimidineColour);
+    purinePyrimidineColour.setEnabled(new PurinePyrimidineColourScheme()
+            .isApplicableTo(sg));
+    colourMenu.add(tcoffeeColour);
+    tcoffeeColour
+            .setEnabled(new TCoffeeColourScheme(sg).isApplicableTo(sg));
+
+    /*
+     * add some of these items to a ButtonGroup so their
+     * selection is mutually exclusive
+     */
+    ButtonGroup colours = new ButtonGroup();
+
+    /*
+     * add any user-defined colours loaded on startup or
+     * during the application session
+     */
+    SortedMap<String, UserColourScheme> userColourSchemes = UserDefinedColours
+            .getUserColourSchemes();
+    if (userColourSchemes != null)
+    {
+      for (String userColour : userColourSchemes.keySet())
+      {
+        JRadioButtonMenuItem item = new JRadioButtonMenuItem(userColour);
+        item.setName(userColour); // button name identifies selected colour
+        item.addActionListener(new ActionListener()
+        {
+          @Override
+          public void actionPerformed(ActionEvent evt)
+          {
+            userDefinedColour_actionPerformed(evt);
+          }
+        });
+        colourMenu.add(item);
+        colours.add(item);
+      }
+    }
+    colourMenu.add(userDefinedColour);
+
+    colourMenu.addSeparator();
+    colourMenu.add(conservationMenuItem);
+    colourMenu.add(abovePIDColour);
+
+    colours.add(noColourmenuItem);
+    colours.add(clustalColour);
+    colours.add(BLOSUM62Colour);
+    colours.add(PIDColour);
+    colours.add(zappoColour);
+    colours.add(taylorColour);
+    colours.add(hydrophobicityColour);
+    colours.add(helixColour);
+    colours.add(strandColour);
+    colours.add(turnColour);
+    colours.add(buriedColour);
+    colours.add(purinePyrimidineColour);
+    colours.add(tcoffeeColour);
+    colours.add(nucleotideColour);
+    colours.add(userDefinedColour);
+    colours.add(abovePIDColour);
+    // colours.add(RNAInteractionColour);
+
+  }
+
+  /**
    * Check for any annotations on the underlying dataset sequences (for the
    * current selection group) which are not 'on the alignment'.If any are found,
    * enable the option to add them to the alignment. The criteria for 'on the
@@ -1575,7 +1601,7 @@ public class PopupMenu extends JPopupMenu
      * Temporary store to hold distinct calcId / type pairs for the tooltip.
      * Using TreeMap means calcIds are shown in alphabetical order.
      */
-    Map<String, String> tipEntries = new TreeMap<String, String>();
+    SortedMap<String, String> tipEntries = new TreeMap<String, String>();
     final Map<SequenceI, List<AlignmentAnnotation>> candidates = new LinkedHashMap<SequenceI, List<AlignmentAnnotation>>();
     AlignmentI al = this.ap.av.getAlignment();
     AlignmentUtils.findAddableReferenceAnnotations(forSequences,
@@ -1839,6 +1865,12 @@ public class PopupMenu extends JPopupMenu
     refresh();
   }
 
+  protected void tcoffeeColorScheme_actionPerformed()
+  {
+    getGroup().cs = new TCoffeeColourScheme(getGroup());
+    refresh();
+  }
+
   /*
    * protected void covariationColour_actionPerformed() { getGroup().cs = new
    * CovariationColourScheme(sequence.getAnnotation()[0]); refresh(); }
@@ -1895,7 +1927,7 @@ public class PopupMenu extends JPopupMenu
     }
     else
     {
-      UserColourScheme udc = (UserColourScheme) UserDefinedColours
+      UserColourScheme udc = UserDefinedColours
               .getUserColourSchemes().get(e.getActionCommand());
 
       sg.cs = udc;
@@ -2088,14 +2120,14 @@ public class PopupMenu extends JPopupMenu
     {
       if (dialog.getName().indexOf(" ") > -1)
       {
-        JOptionPane
+        JvOptionPane
                 .showMessageDialog(
                         ap,
                         MessageManager
                                 .getString("label.spaces_converted_to_backslashes"),
                         MessageManager
                                 .getString("label.no_spaces_allowed_sequence_name"),
-                        JOptionPane.WARNING_MESSAGE);
+                        JvOptionPane.WARNING_MESSAGE);
       }
 
       sequence.setName(dialog.getName().replace(' ', '_'));
@@ -2194,10 +2226,10 @@ public class PopupMenu extends JPopupMenu
       jalview.util.BrowserLauncher.openURL(url);
     } catch (Exception ex)
     {
-      JOptionPane.showInternalMessageDialog(Desktop.desktop,
+      JvOptionPane.showInternalMessageDialog(Desktop.desktop,
               MessageManager.getString("label.web_browser_not_found_unix"),
               MessageManager.getString("label.web_browser_not_found"),
-              JOptionPane.WARNING_MESSAGE);
+              JvOptionPane.WARNING_MESSAGE);
 
       ex.printStackTrace();
     }
@@ -2273,8 +2305,8 @@ public class PopupMenu extends JPopupMenu
     // or we simply trust the user wants
     // wysiwig behaviour
 
-    cap.setText(new FormatAdapter(ap).formatSequences(e.getActionCommand(),
-            ap, true));
+    FileFormatI fileFormat = FileFormat.forName(e.getActionCommand());
+    cap.setText(new FormatAdapter(ap).formatSequences(fileFormat, ap, true));
   }
 
   public void sequenceFeature_actionPerformed()
@@ -2378,4 +2410,36 @@ public class PopupMenu extends JPopupMenu
     }
   }
 
+  /**
+   * Marks as selected the colour menu item matching the given name, or the
+   * first item ('None') if no match is found
+   * 
+   * @param cs
+   */
+  protected void setColourSelected(ColourSchemeI cs)
+  {
+    noColourmenuItem.setSelected(true);
+    if (cs == null)
+    {
+      return;
+    }
+  
+    String schemeName = cs.getSchemeName();
+    /*
+     * look for a radio button with a name that matches the colour name
+     * (note the button text may not as it may be internationalised)
+     */
+    for (Component menuItem : colourMenu.getMenuComponents())
+    {
+      if (menuItem instanceof JRadioButtonMenuItem)
+      {
+        if (schemeName.equals(((JRadioButtonMenuItem) menuItem).getName()))
+        {
+          ((JRadioButtonMenuItem) menuItem).setSelected(true);
+          return;
+        }
+      }
+    }
+  }
+
 }