Merge branch 'develop' into features/JAL-2360colourSchemeApplicability
[jalview.git] / src / jalview / appletgui / APopupMenu.java
index bf985d7..863d625 100644 (file)
@@ -42,10 +42,13 @@ import jalview.io.SequenceAnnotationReport;
 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.TaylorColourScheme;
 import jalview.schemes.TurnColourScheme;
@@ -67,6 +70,7 @@ import java.util.Collections;
 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,46 +81,50 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
   MenuItem editGroupName = new MenuItem();
 
-  protected MenuItem clustalColour = new MenuItem();
+  CheckboxMenuItem noColour = new CheckboxMenuItem();
 
-  protected MenuItem zappoColour = new MenuItem();
+  protected CheckboxMenuItem clustalColour = new CheckboxMenuItem();
 
-  protected MenuItem taylorColour = new MenuItem();
+  protected CheckboxMenuItem zappoColour = new CheckboxMenuItem();
 
-  protected MenuItem hydrophobicityColour = new MenuItem();
+  protected CheckboxMenuItem taylorColour = new CheckboxMenuItem();
 
-  protected MenuItem helixColour = new MenuItem();
+  protected CheckboxMenuItem hydrophobicityColour = new CheckboxMenuItem();
 
-  protected MenuItem strandColour = new MenuItem();
+  protected CheckboxMenuItem helixColour = new CheckboxMenuItem();
 
-  protected MenuItem turnColour = new MenuItem();
+  protected CheckboxMenuItem strandColour = new CheckboxMenuItem();
 
-  protected MenuItem buriedColour = new MenuItem();
+  protected CheckboxMenuItem turnColour = new CheckboxMenuItem();
 
-  protected MenuItem userDefinedColour = new MenuItem();
+  protected CheckboxMenuItem buriedColour = new CheckboxMenuItem();
 
-  protected MenuItem PIDColour = new MenuItem();
+  protected CheckboxMenuItem PIDColour = new CheckboxMenuItem();
 
-  protected MenuItem BLOSUM62Colour = new MenuItem();
+  protected CheckboxMenuItem BLOSUM62Colour = new CheckboxMenuItem();
 
-  MenuItem noColourmenuItem = new MenuItem();
+  CheckboxMenuItem nucleotideColour = new CheckboxMenuItem();
+
+  CheckboxMenuItem purinePyrimidineColour = new CheckboxMenuItem();
+
+  protected MenuItem userDefinedColour = new MenuItem();
 
   protected CheckboxMenuItem abovePIDColour = new CheckboxMenuItem();
 
   MenuItem modifyPID = new MenuItem();
 
-  protected CheckboxMenuItem conservationMenuItem = new CheckboxMenuItem();
+  protected CheckboxMenuItem conservationColour = new CheckboxMenuItem();
 
   MenuItem modifyConservation = new MenuItem();
 
+  MenuItem noColourmenuItem = new MenuItem();
+
   final AlignmentPanel ap;
 
   MenuItem unGroupMenuItem = new MenuItem();
 
   MenuItem createGroupMenuItem = new MenuItem();
 
-  MenuItem nucleotideMenuItem = new MenuItem();
-
   Menu colourMenu = new Menu();
 
   CheckboxMenuItem showBoxes = new CheckboxMenuItem();
@@ -252,11 +260,12 @@ public class APopupMenu extends java.awt.PopupMenu implements
         if (sg.cs != null)
         {
           abovePIDColour.setState(sg.cs.getThreshold() > 0);
+          conservationColour.setState(sg.cs.conservationApplied());
           modifyPID.setEnabled(abovePIDColour.getState());
-          conservationMenuItem.setState(sg.cs.conservationApplied());
-          modifyConservation.setEnabled(conservationMenuItem.getState());
+          modifyConservation.setEnabled(conservationColour.getState());
         }
       }
+      setSelectedColour(sg.cs);
     }
     else
     {
@@ -314,6 +323,35 @@ public class APopupMenu extends java.awt.PopupMenu implements
   }
 
   /**
+   * Select the menu item (if any) matching the current colour scheme. This
+   * works by matching the menu item name (not display text) to the canonical
+   * name of the colour scheme.
+   * 
+   * @param cs
+   */
+  protected void setSelectedColour(ColourSchemeI cs)
+  {
+    if (cs == null)
+    {
+      noColour.setState(true);
+    }
+    else
+    {
+      for (int i = 0; i < colourMenu.getItemCount(); i++)
+      {
+        MenuItem item = colourMenu.getItem(i);
+        if (item instanceof CheckboxMenuItem)
+        {
+          if (cs.getSchemeName().equals(item.getName()))
+          {
+            ((CheckboxMenuItem) item).setState(true);
+          }
+        }
+      }
+    }
+  }
+
+  /**
    * Adds a 'Link' menu item with a sub-menu item for each hyperlink provided.
    * 
    * @param seq
@@ -423,7 +461,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
      * 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,
@@ -508,43 +546,28 @@ public class APopupMenu extends java.awt.PopupMenu implements
     linkMenu.add(item);
   }
 
+  /**
+   * Actions on selecting / unselecting a checkbox menu item
+   */
   @Override
   public void itemStateChanged(ItemEvent evt)
   {
     Object source = evt.getSource();
-    if (source == abovePIDColour)
+    if (source == noColour)
     {
-      abovePIDColour_itemStateChanged();
-    }
-    else if (source == conservationMenuItem)
-    {
-      conservationMenuItem_itemStateChanged();
-    }
-    else if (source == showColourText)
-    {
-      showColourText_itemStateChanged();
+      noColourmenuItem_actionPerformed();
     }
-    else if (source == showText)
+    else if (source == clustalColour)
     {
-      showText_itemStateChanged();
-    }
-    else if (source == showBoxes)
-    {
-      showBoxes_itemStateChanged();
+      clustalColour_actionPerformed();
     }
-    else if (source == displayNonconserved)
+    else if (source == BLOSUM62Colour)
     {
-      this.showNonconserved_itemStateChanged();
+      BLOSUM62Colour_actionPerformed();
     }
-  }
-
-  @Override
-  public void actionPerformed(ActionEvent evt)
-  {
-    Object source = evt.getSource();
-    if (source == clustalColour)
+    else if (source == PIDColour)
     {
-      clustalColour_actionPerformed();
+      PIDColour_actionPerformed();
     }
     else if (source == zappoColour)
     {
@@ -574,26 +597,50 @@ public class APopupMenu extends java.awt.PopupMenu implements
     {
       buriedColour_actionPerformed();
     }
-    else if (source == nucleotideMenuItem)
+    else if (source == nucleotideColour)
     {
       nucleotideMenuItem_actionPerformed();
     }
-
-    else if (source == userDefinedColour)
+    else if (source == purinePyrimidineColour)
     {
-      userDefinedColour_actionPerformed();
+      purinePyrimidineColour_actionPerformed();
     }
-    else if (source == PIDColour)
+    else if (source == abovePIDColour)
     {
-      PIDColour_actionPerformed();
+      abovePIDColour_itemStateChanged();
     }
-    else if (source == BLOSUM62Colour)
+    else if (source == conservationColour)
     {
-      BLOSUM62Colour_actionPerformed();
+      conservationMenuItem_itemStateChanged();
     }
-    else if (source == noColourmenuItem)
+    else if (source == showColourText)
     {
-      noColourmenuItem_actionPerformed();
+      showColourText_itemStateChanged();
+    }
+    else if (source == showText)
+    {
+      showText_itemStateChanged();
+    }
+    else if (source == showBoxes)
+    {
+      showBoxes_itemStateChanged();
+    }
+    else if (source == displayNonconserved)
+    {
+      this.showNonconserved_itemStateChanged();
+    }
+  }
+
+  /**
+   * Actions on clicking a menu item
+   */
+  @Override
+  public void actionPerformed(ActionEvent evt)
+  {
+    Object source = evt.getSource();
+    if (source == userDefinedColour)
+    {
+      userDefinedColour_actionPerformed();
     }
     else if (source == modifyConservation)
     {
@@ -868,14 +915,14 @@ public class APopupMenu extends java.awt.PopupMenu implements
   void addPDB()
   {
     Vector<PDBEntry> pdbs = seq.getAllPDBEntries();
-    if (pdbs != null&& !pdbs.isEmpty())
+    if (pdbs != null && !pdbs.isEmpty())
     {
       PDBEntry entry = pdbs.firstElement();
 
       if (ap.av.applet.jmolAvailable)
       {
-        new jalview.appletgui.AppletJmol(entry, new SequenceI[] { seq },
-                null, ap, DataSourceType.URL);
+        new AppletJmol(entry, new SequenceI[] { seq }, null, ap,
+                DataSourceType.URL);
       }
       else
       {
@@ -891,7 +938,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
       cap.setPDBImport(seq);
       Frame frame = new Frame();
       frame.add(cap);
-      jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
+      JalviewLite.addFrame(frame, MessageManager.formatMessage(
               "label.paste_pdb_file_for_sequence",
               new Object[] { seq.getName() }), 400, 300);
     }
@@ -911,19 +958,6 @@ public class APopupMenu extends java.awt.PopupMenu implements
             .getString("action.create_group"));
     createGroupMenuItem.addActionListener(this);
 
-    nucleotideMenuItem.setLabel(MessageManager
-            .getString("label.nucleotide"));
-    nucleotideMenuItem.addActionListener(this);
-    conservationMenuItem.addItemListener(this);
-    abovePIDColour.addItemListener(this);
-    modifyPID.setLabel(MessageManager
-            .getString("label.modify_identity_threshold"));
-    modifyPID.addActionListener(this);
-    modifyConservation.setLabel(MessageManager
-            .getString("label.modify_conservation_threshold"));
-    modifyPID.setEnabled(abovePIDColour.getState());
-    modifyConservation.setEnabled(conservationMenuItem.getState());
-    modifyConservation.addActionListener(this);
     colourMenu.setLabel(MessageManager.getString("label.group_colour"));
     showBoxes.setLabel(MessageManager.getString("action.boxes"));
     showBoxes.setState(true);
@@ -932,7 +966,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
     sequenceDetails.addActionListener(this);
     selSeqDetails.addActionListener(this);
     displayNonconserved.setLabel(MessageManager
-            .getString("label.show_non_conversed"));
+            .getString("label.show_non_conserved"));
     displayNonconserved.setState(false);
     displayNonconserved.addItemListener(this);
     showText.setLabel(MessageManager.getString("action.text"));
@@ -964,7 +998,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
     groupMenu.add(unGroupMenuItem);
     groupMenu.add(menu1);
 
-    colourMenu.add(noColourmenuItem);
+    colourMenu.add(noColour);
     colourMenu.add(clustalColour);
     colourMenu.add(BLOSUM62Colour);
     colourMenu.add(PIDColour);
@@ -975,50 +1009,91 @@ public class APopupMenu extends java.awt.PopupMenu implements
     colourMenu.add(strandColour);
     colourMenu.add(turnColour);
     colourMenu.add(buriedColour);
-    colourMenu.add(nucleotideMenuItem);
+    colourMenu.add(nucleotideColour);
+    colourMenu.add(purinePyrimidineColour);
     colourMenu.add(userDefinedColour);
     colourMenu.addSeparator();
-    colourMenu.add(conservationMenuItem);
+    colourMenu.add(conservationColour);
     colourMenu.add(modifyConservation);
     colourMenu.add(abovePIDColour);
     colourMenu.add(modifyPID);
 
-    noColourmenuItem.setLabel(MessageManager.getString("label.none"));
-    noColourmenuItem.addActionListener(this);
+    noColour.setLabel(MessageManager.getString("label.none"));
+    noColour.addItemListener(this);
 
+    /*
+     * setName allows setSelectedColour to do its thing
+     */
     clustalColour.setLabel(MessageManager
-            .getString("label.clustalx_colours"));
-    clustalColour.addActionListener(this);
-    zappoColour.setLabel(MessageManager.getString("label.zappo"));
-    zappoColour.addActionListener(this);
-    taylorColour.setLabel(MessageManager.getString("label.taylor"));
-    taylorColour.addActionListener(this);
+            .getString("label.colourScheme_clustal"));
+    clustalColour.setName(JalviewColourScheme.Clustal.toString());
+    clustalColour.addItemListener(this);
+    BLOSUM62Colour.setLabel(MessageManager
+            .getString("label.colourScheme_blosum62"));
+    BLOSUM62Colour.setName(JalviewColourScheme.Blosum62.toString());
+    BLOSUM62Colour.addItemListener(this);
+    PIDColour.setLabel(MessageManager
+            .getString("label.colourScheme_%_identity"));
+    PIDColour.setName(JalviewColourScheme.PID.toString());
+    PIDColour.addItemListener(this);
+    zappoColour.setLabel(MessageManager
+            .getString("label.colourScheme_zappo"));
+    zappoColour.setName(JalviewColourScheme.Zappo.toString());
+    zappoColour.addItemListener(this);
+    taylorColour.setLabel(MessageManager
+            .getString("label.colourScheme_taylor"));
+    taylorColour.setName(JalviewColourScheme.Taylor.toString());
+    taylorColour.addItemListener(this);
     hydrophobicityColour.setLabel(MessageManager
-            .getString("label.hydrophobicity"));
-    hydrophobicityColour.addActionListener(this);
-    helixColour
-            .setLabel(MessageManager.getString("label.helix_propensity"));
-    helixColour.addActionListener(this);
+            .getString("label.colourScheme_hydrophobic"));
+    hydrophobicityColour
+            .setName(JalviewColourScheme.Hydrophobic.toString());
+    hydrophobicityColour.addItemListener(this);
+    helixColour.setLabel(MessageManager
+            .getString("label.colourScheme_helix_propensity"));
+    helixColour.setName(JalviewColourScheme.Helix.toString());
+    helixColour.addItemListener(this);
     strandColour.setLabel(MessageManager
-            .getString("label.strand_propensity"));
-    strandColour.addActionListener(this);
-    turnColour.setLabel(MessageManager.getString("label.turn_propensity"));
-    turnColour.addActionListener(this);
-    buriedColour.setLabel(MessageManager.getString("label.buried_index"));
-    buriedColour.addActionListener(this);
-    abovePIDColour.setLabel(MessageManager
-            .getString("label.above_identity_percentage"));
+            .getString("label.colourScheme_strand_propensity"));
+    strandColour.setName(JalviewColourScheme.Strand.toString());
+    strandColour.addItemListener(this);
+    turnColour.setLabel(MessageManager
+            .getString("label.colourScheme_turn_propensity"));
+    turnColour.setName(JalviewColourScheme.Turn.toString());
+    turnColour.addItemListener(this);
+    buriedColour.setLabel(MessageManager
+            .getString("label.colourScheme_buried_index"));
+    buriedColour.setName(JalviewColourScheme.Buried.toString());
+    buriedColour.addItemListener(this);
+    nucleotideColour.setLabel(MessageManager
+            .getString("label.colourScheme_nucleotide"));
+    nucleotideColour.setName(JalviewColourScheme.Nucleotide.toString());
+    nucleotideColour.addItemListener(this);
+    purinePyrimidineColour.setLabel(MessageManager
+            .getString("label.colourScheme_purine/pyrimidine"));
+    purinePyrimidineColour.setName(JalviewColourScheme.PurinePyrimidine
+            .toString());
+    purinePyrimidineColour.addItemListener(this);
 
     userDefinedColour.setLabel(MessageManager
             .getString("action.user_defined"));
     userDefinedColour.addActionListener(this);
-    PIDColour.setLabel(MessageManager
-            .getString("label.percentage_identity"));
+
+    abovePIDColour.setLabel(MessageManager
+            .getString("label.above_identity_threshold"));
+    abovePIDColour.addItemListener(this);
+    modifyPID.setLabel(MessageManager
+            .getString("label.modify_identity_threshold"));
+    modifyPID.addActionListener(this);
+    conservationColour.setLabel(MessageManager
+            .getString("action.by_conservation"));
+    conservationColour.addItemListener(this);
+    modifyConservation.setLabel(MessageManager
+            .getString("label.modify_conservation_threshold"));
+    modifyConservation.addActionListener(this);
+
     PIDColour.addActionListener(this);
-    BLOSUM62Colour.setLabel("BLOSUM62");
     BLOSUM62Colour.addActionListener(this);
-    conservationMenuItem.setLabel(MessageManager
-            .getString("action.by_conservation"));
 
     editMenu.add(copy);
     copy.addActionListener(this);
@@ -1120,6 +1195,12 @@ public class APopupMenu extends java.awt.PopupMenu implements
     refresh();
   }
 
+  public void purinePyrimidineColour_actionPerformed()
+  {
+    getGroup().cs = new PurinePyrimidineColourScheme();
+    refresh();
+  }
+
   protected void abovePIDColour_itemStateChanged()
   {
     SequenceGroup sg = getGroup();
@@ -1190,7 +1271,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
       return;
     }
 
-    if (conservationMenuItem.getState())
+    if (conservationColour.getState())
     {
       sg.cs.setConservation(Conservation.calculateConservation("Group", sg
               .getSequences(ap.av.getHiddenRepSequences()), 0, ap.av
@@ -1205,7 +1286,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
       SliderPanel.hideConservationSlider();
       sg.cs.setConservation(null);
     }
-    modifyConservation.setEnabled(conservationMenuItem.getState());
+    modifyConservation.setEnabled(conservationColour.getState());
     refresh();
   }