JAL-1264 adding show/hide annotation options to applet
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Wed, 25 Mar 2015 13:43:13 +0000 (13:43 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Wed, 25 Mar 2015 13:43:13 +0000 (13:43 +0000)
17 files changed:
resources/lang/Messages.properties
src/jalview/analysis/AlignmentUtils.java
src/jalview/appletgui/APopupMenu.java
src/jalview/appletgui/AlignFrame.java
src/jalview/appletgui/AlignmentPanel.java
src/jalview/appletgui/AnnotationLabels.java
src/jalview/appletgui/CutAndPasteTransfer.java
src/jalview/appletgui/SeqPanel.java
src/jalview/datamodel/SequenceFeature.java
src/jalview/gui/AlignFrame.java
src/jalview/gui/AlignViewport.java
src/jalview/gui/AnnotationLabels.java
src/jalview/gui/PopupMenu.java
src/jalview/jbgui/GAlignFrame.java
src/jalview/viewmodel/AlignmentViewport.java
test/jalview/analysis/AlignmentUtilsTests.java
test/jalview/gui/PopupMenuTest.java

index a797929..e6b69d5 100644 (file)
@@ -229,7 +229,6 @@ label.documentation = Documentation
 label.about = About...
 label.show_sequence_limits = Show Sequence Limits
 label.feature_settings = Feature Settings...
-label.sequence_features = Sequence Features
 label.all_columns = All Columns
 label.all_sequences = All Sequences
 label.selected_columns = Selected Columns 
@@ -1209,3 +1208,4 @@ label.display_name = Display Label
 label.description = Description
 label.include_description= Include Description
 label.start_jalview = Start Jalview
+label.biojs_html_export = BioJS
index 9202c0d..6f0125d 100644 (file)
  */
 package jalview.analysis;
 
-import jalview.datamodel.AlignedCodon;
-import jalview.datamodel.AlignedCodonFrame;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.Mapping;
-import jalview.datamodel.SearchResults;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceI;
-import jalview.schemes.ResidueProperties;
-import jalview.util.MapList;
-
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -43,6 +33,18 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;
 
+import jalview.datamodel.AlignedCodon;
+import jalview.datamodel.AlignedCodonFrame;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Mapping;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.schemes.ResidueProperties;
+import jalview.util.MapList;
+
 /**
  * grab bag of useful alignment manipulation operations Expect these to be
  * refactored elsewhere at some point.
@@ -1056,4 +1058,158 @@ public class AlignmentUtils
      */
     return mapProteinToCdna(proteinDs, dnaDs) != null;
   }
+
+  /**
+   * Finds any reference annotations associated with the sequences in
+   * sequenceScope, that are not already added to the alignment, and adds them
+   * to the 'candidates' map. Also populates a lookup table of annotation
+   * labels, keyed by calcId, for use in constructing tooltips or the like.
+   * 
+   * @param sequenceScope
+   *          the sequences to scan for reference annotations
+   * @param labelForCalcId
+   *          (optional) map to populate with label for calcId
+   * @param candidates
+   *          map to populate with annotations for sequence
+   * @param al
+   *          the alignment to check for presence of annotations
+   */
+  public static void findAddableReferenceAnnotations(
+          List<SequenceI> sequenceScope, Map<String, String> labelForCalcId,
+          final Map<SequenceI, List<AlignmentAnnotation>> candidates,
+          AlignmentI al)
+  {
+    if (sequenceScope == null)
+    {
+      return;
+    }
+  
+    /*
+     * For each sequence in scope, make a list of any annotations on the
+     * underlying dataset sequence which are not already on the alignment.
+     * 
+     * Add to a map of { alignmentSequence, <List of annotations to add> }
+     */
+    for (SequenceI seq : sequenceScope)
+    {
+      SequenceI dataset = seq.getDatasetSequence();
+      if (dataset == null)
+      {
+        continue;
+      }
+      AlignmentAnnotation[] datasetAnnotations = dataset.getAnnotation();
+      if (datasetAnnotations == null)
+      {
+        continue;
+      }
+      final List<AlignmentAnnotation> result = new ArrayList<AlignmentAnnotation>();
+      for (AlignmentAnnotation dsann : datasetAnnotations)
+      {
+        /*
+         * Find matching annotations on the alignment. If none is found, then
+         * add this annotation to the list of 'addable' annotations for this
+         * sequence.
+         */
+        final Iterable<AlignmentAnnotation> matchedAlignmentAnnotations = al
+                .findAnnotations(seq, dsann.getCalcId(),
+                        dsann.label);
+        if (!matchedAlignmentAnnotations.iterator().hasNext())
+        {
+          result.add(dsann);
+          if (labelForCalcId != null)
+          {
+            labelForCalcId.put(dsann.getCalcId(), dsann.label);
+          }
+        }
+      }
+      /*
+       * Save any addable annotations for this sequence
+       */
+      if (!result.isEmpty())
+      {
+        candidates.put(seq, result);
+      }
+    }
+  }
+
+  /**
+   * Adds annotations to the top of the alignment annotations, in the same order
+   * as their related sequences.
+   * 
+   * @param annotations
+   *          the annotations to add
+   * @param alignment
+   *          the alignment to add them to
+   * @param selectionGroup
+   *          current selection group (or null if none)
+   */
+  public static void addReferenceAnnotations(
+          Map<SequenceI, List<AlignmentAnnotation>> annotations,
+          final AlignmentI alignment, final SequenceGroup selectionGroup)
+  {
+    for (SequenceI seq : annotations.keySet())
+    {
+      for (AlignmentAnnotation ann : annotations.get(seq))
+      {
+        AlignmentAnnotation copyAnn = new AlignmentAnnotation(ann);
+        int startRes = 0;
+        int endRes = ann.annotations.length;
+        if (selectionGroup != null)
+        {
+          startRes = selectionGroup.getStartRes();
+          endRes = selectionGroup.getEndRes();
+        }
+        copyAnn.restrict(startRes, endRes);
+  
+        /*
+         * Add to the sequence (sets copyAnn.datasetSequence), unless the
+         * original annotation is already on the sequence.
+         */
+        if (!seq.hasAnnotation(ann))
+        {
+          seq.addAlignmentAnnotation(copyAnn);
+        }
+        // adjust for gaps
+        copyAnn.adjustForAlignment();
+        // add to the alignment and set visible
+        alignment.addAnnotation(copyAnn);
+        copyAnn.visible = true;
+      }
+    }
+  }
+
+  /**
+   * Set visibility of alignment annotations of specified types (labels), for
+   * specified sequences. This supports controls like
+   * "Show all secondary structure", "Hide all Temp factor", etc.
+   * 
+   * @al the alignment to scan for annotations
+   * @param types
+   *          the types (labels) of annotations to be updated
+   * @param forSequences
+   *          if not null, only annotations linked to one of these sequences are
+   *          in scope for update; if null, acts on all sequence annotations
+   * @param anyType
+   *          if this flag is true, 'types' is ignored (label not checked)
+   * @param doShow
+   *          if true, set visibility on, else set off
+   */
+  public static void showOrHideSequenceAnnotations(AlignmentI al,
+          Collection<String> types, List<SequenceI> forSequences,
+          boolean anyType, boolean doShow)
+  {
+    for (AlignmentAnnotation aa : al
+            .getAlignmentAnnotation())
+    {
+      if (anyType || types.contains(aa.label))
+      {
+        if ((aa.sequenceRef != null)
+                && (forSequences == null || forSequences
+                        .contains(aa.sequenceRef)))
+        {
+          aa.visible = doShow;
+        }
+      }
+    }
+  }
 }
index 1b2d19a..d71fdd4 100644 (file)
  */
 package jalview.appletgui;
 
+import java.awt.CheckboxMenuItem;
+import java.awt.Frame;
+import java.awt.Menu;
+import java.awt.MenuItem;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.Vector;
+
 import jalview.analysis.AAFrequency;
+import jalview.analysis.AlignmentAnnotationUtils;
+import jalview.analysis.AlignmentUtils;
 import jalview.analysis.Conservation;
 import jalview.commands.ChangeCaseCommand;
 import jalview.commands.EditCommand;
 import jalview.commands.EditCommand.Action;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.PDBEntry;
-import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceFeature;
 import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
@@ -48,20 +67,11 @@ import jalview.schemes.ZappoColourScheme;
 import jalview.util.MessageManager;
 import jalview.util.UrlLink;
 
-import java.awt.CheckboxMenuItem;
-import java.awt.Frame;
-import java.awt.Menu;
-import java.awt.MenuItem;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.List;
-import java.util.Vector;
-
 public class APopupMenu extends java.awt.PopupMenu implements
         ActionListener, ItemListener
 {
+  private static final String ALL_ANNOTATIONS = "All";
+
   Menu groupMenu = new Menu();
 
   MenuItem editGroupName = new MenuItem();
@@ -112,6 +122,24 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
   CheckboxMenuItem displayNonconserved = new CheckboxMenuItem();
 
+  Menu seqShowAnnotationsMenu = new Menu(
+          MessageManager.getString("label.show_annotations"));
+
+  Menu seqHideAnnotationsMenu = new Menu(
+          MessageManager.getString("label.hide_annotations"));
+
+  MenuItem seqAddReferenceAnnotations = new MenuItem(
+          MessageManager.getString("label.add_reference_annotations"));
+
+  Menu groupShowAnnotationsMenu = new Menu(
+          MessageManager.getString("label.show_annotations"));
+
+  Menu groupHideAnnotationsMenu = new Menu(
+          MessageManager.getString("label.hide_annotations"));
+
+  MenuItem groupAddReferenceAnnotations = new MenuItem(
+          MessageManager.getString("label.add_reference_annotations"));
+
   Menu editMenu = new Menu(MessageManager.getString("action.edit"));
 
   MenuItem copy = new MenuItem(MessageManager.getString("action.copy"));
@@ -154,7 +182,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
   MenuItem makeReferenceSeq = new MenuItem();
   
-  Sequence seq;
+  SequenceI seq;
 
   MenuItem revealAll = new MenuItem();
 
@@ -167,7 +195,8 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
   Menu menu1 = new Menu();
 
-  public APopupMenu(AlignmentPanel apanel, final Sequence seq, Vector links)
+  public APopupMenu(AlignmentPanel apanel, final SequenceI seq,
+          Vector<String> links)
   {
     // /////////////////////////////////////////////////////////
     // If this is activated from the sequence panel, the user may want to
@@ -196,12 +225,13 @@ public class APopupMenu extends java.awt.PopupMenu implements
       outputmenu.add(item);
     }
 
-    SequenceGroup sg = ap.av.getSelectionGroup();
+    buildAnnotationSubmenus();
 
+    SequenceGroup sg = ap.av.getSelectionGroup();
     if (sg != null && sg.getSize() > 0)
     {
       editGroupName.setLabel(MessageManager.formatMessage(
-              "label.name_param", new String[]
+              "label.name_param", new Object[]
               { sg.getName() }));
       showText.setState(sg.getDisplayText());
       showColourText.setState(sg.getColourText());
@@ -228,10 +258,9 @@ public class APopupMenu extends java.awt.PopupMenu implements
     if (links != null && links.size() > 0)
     {
       Menu linkMenu = new Menu(MessageManager.getString("action.link"));
-      String link;
       for (int i = 0; i < links.size(); i++)
       {
-        link = links.elementAt(i).toString();
+        String link = links.elementAt(i);
         UrlLink urlLink = new UrlLink(link);
         if (!urlLink.isValid())
         {
@@ -361,7 +390,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
                 .getString("action.set_as_reference")); // );
       }
       repGroup.setLabel(MessageManager.formatMessage(
-              "label.represent_group_with", new String[]
+              "label.represent_group_with", new Object[]
               { seq.getName() }));
     }
     else
@@ -391,6 +420,95 @@ public class APopupMenu extends java.awt.PopupMenu implements
   }
 
   /**
+   * Build menus for annotation types that may be shown or hidden, and for
+   * 'reference annotations' that may be added to the alignment.
+   */
+  private void buildAnnotationSubmenus()
+  {
+    /*
+     * First for the currently selected sequence (if there is one):
+     */
+    final List<SequenceI> selectedSequence = (seq == null ? Collections
+            .<SequenceI> emptyList() : Arrays.asList(seq));
+    buildAnnotationTypesMenus(seqShowAnnotationsMenu,
+            seqHideAnnotationsMenu, selectedSequence);
+    configureReferenceAnnotationsMenu(seqAddReferenceAnnotations,
+            selectedSequence);
+
+    /*
+     * and repeat for the current selection group (if there is one):
+     */
+    final List<SequenceI> selectedGroup = (ap.av.getSelectionGroup() == null ? Collections
+            .<SequenceI> emptyList() : ap.av.getSelectionGroup()
+            .getSequences());
+    buildAnnotationTypesMenus(groupShowAnnotationsMenu,
+            groupHideAnnotationsMenu, selectedGroup);
+    configureReferenceAnnotationsMenu(groupAddReferenceAnnotations,
+            selectedGroup);
+  }
+
+  /**
+   * Determine whether or not to enable 'add reference annotations' menu item.
+   * It is enable if there are any annotations, on any of the selected
+   * sequences, which are not yet on the alignment (visible or not).
+   * 
+   * @param menu
+   * @param forSequences
+   */
+  private void configureReferenceAnnotationsMenu(MenuItem menuItem,
+          List<SequenceI> forSequences)
+  {
+    menuItem.setEnabled(false);
+
+    /*
+     * 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>();
+    final Map<SequenceI, List<AlignmentAnnotation>> candidates = new LinkedHashMap<SequenceI, List<AlignmentAnnotation>>();
+    AlignmentI al = this.ap.av.getAlignment();
+    AlignmentUtils.findAddableReferenceAnnotations(forSequences,
+            tipEntries, candidates, al);
+    if (!candidates.isEmpty())
+    {
+      StringBuilder tooltip = new StringBuilder(64);
+      tooltip.append(MessageManager.getString("label.add_annotations_for"));
+
+      /*
+       * Found annotations that could be added. Enable the menu item, and
+       * configure its action.
+       */
+      menuItem.setEnabled(true);
+
+      menuItem.addActionListener(new ActionListener()
+      {
+        @Override
+        public void actionPerformed(ActionEvent e)
+        {
+          addReferenceAnnotations_actionPerformed(candidates);
+        }
+      });
+    }
+  }
+
+  /**
+   * Add annotations to the sequences and to the alignment.
+   * 
+   * @param candidates
+   *          a map whose keys are sequences on the alignment, and values a list
+   *          of annotations to add to each sequence
+   */
+  protected void addReferenceAnnotations_actionPerformed(
+          Map<SequenceI, List<AlignmentAnnotation>> candidates)
+  {
+    final SequenceGroup selectionGroup = this.ap.av.getSelectionGroup();
+    final AlignmentI alignment = this.ap.getAlignment();
+    AlignmentUtils.addReferenceAnnotations(candidates, alignment,
+            selectionGroup);
+    refresh();
+  }
+
+  /**
    * add a show URL menu item to the given linkMenu
    * 
    * @param linkMenu
@@ -591,7 +709,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
       {
         if (seq == null)
         {
-          seq = (Sequence) sg.getSequenceAt(0);
+          seq = sg.getSequenceAt(0);
         }
 
         EditNameDialog dialog = new EditNameDialog(seq.getSequenceAsString(
@@ -707,7 +825,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
     Frame frame = new Frame();
     frame.add(cap);
     jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
-            "label.selection_output_command", new String[]
+            "label.selection_output_command", new Object[]
             { e.getActionCommand() }), 600, 500);
     // JBPNote: getSelectionAsNewSequence behaviour has changed - this method
     // now returns a full copy of sequence data
@@ -738,7 +856,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
     for (SequenceI seq : sequences)
     {
       contents.append(MessageManager.formatMessage(
-              "label.annotation_for_displayid", new String[]
+              "label.annotation_for_displayid", new Object[]
               { seq.getDisplayId(true) }));
       new SequenceAnnotationReport(null)
               .createSequenceAnnotationReport(
@@ -757,7 +875,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
             + (sequences.length == 1 ? sequences[0].getDisplayId(true)
                     : "Selection"), 600, 500);
     cap.setText(MessageManager.formatMessage("label.html_content",
-            new String[]
+            new Object[]
             { contents.toString() }));
   }
 
@@ -784,12 +902,12 @@ public class APopupMenu extends java.awt.PopupMenu implements
 
       if (ap.av.applet.jmolAvailable)
       {
-        new jalview.appletgui.AppletJmol(entry, new Sequence[]
+        new jalview.appletgui.AppletJmol(entry, new SequenceI[]
         { seq }, null, ap, AppletFormatAdapter.URL);
       }
       else
       {
-        new MCview.AppletPDBViewer(entry, new Sequence[]
+        new MCview.AppletPDBViewer(entry, new SequenceI[]
         { seq }, null, ap, AppletFormatAdapter.URL);
       }
 
@@ -802,7 +920,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
       Frame frame = new Frame();
       frame.add(cap);
       jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
-              "label.paste_pdb_file_for_sequence", new String[]
+              "label.paste_pdb_file_for_sequence", new Object[]
               { seq.getName() }), 400, 300);
     }
   }
@@ -846,7 +964,7 @@ public class APopupMenu extends java.awt.PopupMenu implements
     pdb.setLabel(MessageManager.getString("label.view_pdb_structure"));
     hideSeqs.setLabel(MessageManager.getString("action.hide_sequences"));
     repGroup.setLabel(MessageManager.formatMessage(
-            "label.represent_group_with", new String[]
+            "label.represent_group_with", new Object[]
             { "" }));
     revealAll.setLabel(MessageManager.getString("action.reveal_all"));
     revealSeq.setLabel(MessageManager.getString("action.reveal_sequences"));
@@ -857,6 +975,9 @@ public class APopupMenu extends java.awt.PopupMenu implements
     this.add(revealSeq);
     this.add(revealAll);
     // groupMenu.add(selSeqDetails);
+    groupMenu.add(groupShowAnnotationsMenu);
+    groupMenu.add(groupHideAnnotationsMenu);
+    groupMenu.add(groupAddReferenceAnnotations);
     groupMenu.add(editMenu);
     groupMenu.add(outputmenu);
     groupMenu.add(sequenceFeature);
@@ -923,6 +1044,9 @@ public class APopupMenu extends java.awt.PopupMenu implements
     editMenu.add(toLower);
     toLower.addActionListener(this);
     editMenu.add(toggleCase);
+    seqMenu.add(seqShowAnnotationsMenu);
+    seqMenu.add(seqHideAnnotationsMenu);
+    seqMenu.add(seqAddReferenceAnnotations);
     seqMenu.add(sequenceName);
     seqMenu.add(makeReferenceSeq);
     // seqMenu.add(sequenceDetails);
@@ -1203,4 +1327,109 @@ public class APopupMenu extends java.awt.PopupMenu implements
     ap.av.sendSelection();
   }
 
+  /**
+   * Add annotation types to 'Show annotations' and/or 'Hide annotations' menus.
+   * "All" is added first, followed by a separator. Then add any annotation
+   * types associated with the current selection. Separate menus are built for
+   * the selected sequence group (if any), and the selected sequence.
+   * <p>
+   * Some annotation rows are always rendered together - these can be identified
+   * by a common graphGroup property > -1. Only one of each group will be marked
+   * as visible (to avoid duplication of the display). For such groups we add a
+   * composite type name, e.g.
+   * <p>
+   * IUPredWS (Long), IUPredWS (Short)
+   * 
+   * @param seq
+   */
+  protected void buildAnnotationTypesMenus(Menu showMenu, Menu hideMenu,
+          List<SequenceI> forSequences)
+  {
+    showMenu.removeAll();
+    hideMenu.removeAll();
+  
+    final List<String> all = Arrays.asList(ALL_ANNOTATIONS);
+    addAnnotationTypeToShowHide(showMenu, forSequences, "", all, true, true);
+    addAnnotationTypeToShowHide(hideMenu, forSequences, "", all, true,
+            false);
+    showMenu.addSeparator();
+    hideMenu.addSeparator();
+  
+    final AlignmentAnnotation[] annotations = ap.getAlignment()
+            .getAlignmentAnnotation();
+  
+    /*
+     * Find shown/hidden annotations types, distinguished by source (calcId),
+     * and grouped by graphGroup. Using LinkedHashMap means we will retrieve in
+     * the insertion order, which is the order of the annotations on the
+     * alignment.
+     */
+    Map<String, List<List<String>>> shownTypes = new LinkedHashMap<String, List<List<String>>>();
+    Map<String, List<List<String>>> hiddenTypes = new LinkedHashMap<String, List<List<String>>>();
+    AlignmentAnnotationUtils.getShownHiddenTypes(shownTypes,
+            hiddenTypes,
+            AlignmentAnnotationUtils.asList(annotations),
+            forSequences);
+  
+    for (String calcId : hiddenTypes.keySet())
+    {
+      for (List<String> type : hiddenTypes.get(calcId))
+      {
+        addAnnotationTypeToShowHide(showMenu, forSequences,
+                calcId, type, false, true);
+      }
+    }
+    // grey out 'show annotations' if none are hidden
+    showMenu.setEnabled(!hiddenTypes.isEmpty());
+  
+    for (String calcId : shownTypes.keySet())
+    {
+      for (List<String> type : shownTypes.get(calcId))
+      {
+        addAnnotationTypeToShowHide(hideMenu, forSequences,
+                calcId, type, false, false);
+      }
+    }
+    // grey out 'hide annotations' if none are shown
+    hideMenu.setEnabled(!shownTypes.isEmpty());
+  }
+
+  /**
+   * Add one annotation type to the 'Show Annotations' or 'Hide Annotations'
+   * menus.
+   * 
+   * @param showOrHideMenu
+   *          the menu to add to
+   * @param forSequences
+   *          the sequences whose annotations may be shown or hidden
+   * @param calcId
+   * @param types
+   *          the label to add
+   * @param allTypes
+   *          if true this is a special label meaning 'All'
+   * @param actionIsShow
+   *          if true, the select menu item action is to show the annotation
+   *          type, else hide
+   */
+  protected void addAnnotationTypeToShowHide(Menu showOrHideMenu,
+          final List<SequenceI> forSequences, String calcId,
+          final List<String> types, final boolean allTypes,
+          final boolean actionIsShow)
+  {
+    String label = types.toString(); // [a, b, c]
+    label = label.substring(1, label.length() - 1);
+    final MenuItem item = new MenuItem(label);
+    item.addActionListener(new java.awt.event.ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        AlignmentUtils.showOrHideSequenceAnnotations(ap.getAlignment(), types,
+                forSequences, allTypes, actionIsShow);
+        refresh();
+      }
+    });
+    showOrHideMenu.add(item);
+  }
+
 }
index ba90075..3e919f6 100644 (file)
  */
 package jalview.appletgui;
 
+import java.awt.BorderLayout;
+import java.awt.Canvas;
+import java.awt.CheckboxMenuItem;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Label;
+import java.awt.Menu;
+import java.awt.MenuBar;
+import java.awt.MenuItem;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.Arrays;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
 import jalview.analysis.AlignmentSorter;
+import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.api.AlignViewControllerGuiI;
 import jalview.api.AlignViewControllerI;
 import jalview.api.AlignViewportI;
@@ -36,6 +71,7 @@ import jalview.commands.RemoveGapsCommand;
 import jalview.commands.SlideSequencesCommand;
 import jalview.commands.TrimRegionCommand;
 import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
 import jalview.datamodel.AlignmentOrder;
 import jalview.datamodel.ColumnSelection;
@@ -68,39 +104,6 @@ import jalview.structures.models.AAStructureBindingModel;
 import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
 
-import java.awt.BorderLayout;
-import java.awt.Canvas;
-import java.awt.CheckboxMenuItem;
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Frame;
-import java.awt.Graphics;
-import java.awt.Label;
-import java.awt.Menu;
-import java.awt.MenuBar;
-import java.awt.MenuItem;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.util.Arrays;
-import java.util.Deque;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.Vector;
-
 public class AlignFrame extends EmbmenuFrame implements ActionListener,
         ItemListener, KeyListener, AlignViewControllerGuiI
 {
@@ -116,6 +119,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   String jalviewServletURL;
 
+  /*
+   * Flag for showing autocalculated consensus above or below other consensus
+   * rows
+   */
+  private boolean showAutoCalculatedAbove;
+
+  private SequenceAnnotationOrder annotationSortOrder;
+
   /**
    * Constructor that creates the frame and adds it to the display.
    * 
@@ -184,7 +195,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     viewport.updateConservation(alignPanel);
     viewport.updateConsensus(alignPanel);
 
-    annotationPanelMenuItem.setState(viewport.isShowAnnotation());
     displayNonconservedMenuItem.setState(viewport.getShowUnconserved());
     followMouseOverFlag.setState(viewport.getFollowHighlight());
     showGroupConsensus.setState(viewport.isShowGroupConsensus());
@@ -193,6 +203,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     showSequenceLogo.setState(viewport.isShowSequenceLogo());
     normSequenceLogo.setState(viewport.isNormaliseSequenceLogo());
     applyToAllGroups.setState(viewport.getColourAppliesToAllGroups());
+    showAlignmentAnnotations.setState(viewport.isShowAnnotation());
+    showSequenceAnnotations.setState(viewport.isShowAnnotation());
 
     seqLimits.setState(viewport.getShowJVSuffix());
 
@@ -728,111 +740,188 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   @Override
   public void itemStateChanged(ItemEvent evt)
   {
-    if (evt.getSource() == displayNonconservedMenuItem)
+    final Object source = evt.getSource();
+    if (source == displayNonconservedMenuItem)
     {
       displayNonconservedMenuItem_actionPerformed();
     }
-    else if (evt.getSource() == colourTextMenuItem)
+    else if (source == colourTextMenuItem)
     {
       colourTextMenuItem_actionPerformed();
     }
-    else if (evt.getSource() == wrapMenuItem)
+    else if (source == wrapMenuItem)
     {
       wrapMenuItem_actionPerformed();
     }
-    else if (evt.getSource() == scaleAbove)
+    else if (source == scaleAbove)
     {
       viewport.setScaleAboveWrapped(scaleAbove.getState());
     }
-    else if (evt.getSource() == scaleLeft)
+    else if (source == scaleLeft)
     {
       viewport.setScaleLeftWrapped(scaleLeft.getState());
     }
-    else if (evt.getSource() == scaleRight)
+    else if (source == scaleRight)
     {
       viewport.setScaleRightWrapped(scaleRight.getState());
     }
-    else if (evt.getSource() == seqLimits)
+    else if (source == seqLimits)
     {
       seqLimits_itemStateChanged();
     }
-    else if (evt.getSource() == viewBoxesMenuItem)
+    else if (source == viewBoxesMenuItem)
     {
       viewport.setShowBoxes(viewBoxesMenuItem.getState());
     }
-    else if (evt.getSource() == viewTextMenuItem)
+    else if (source == viewTextMenuItem)
     {
       viewport.setShowText(viewTextMenuItem.getState());
     }
-    else if (evt.getSource() == renderGapsMenuItem)
+    else if (source == renderGapsMenuItem)
     {
       viewport.setRenderGaps(renderGapsMenuItem.getState());
     }
-    else if (evt.getSource() == annotationPanelMenuItem)
+    else if (source == annotationPanelMenuItem)
     {
       viewport.setShowAnnotation(annotationPanelMenuItem.getState());
       alignPanel.setAnnotationVisible(annotationPanelMenuItem.getState());
     }
-    else if (evt.getSource() == sequenceFeatures)
+    else if (source == sequenceFeatures)
     {
       viewport.setShowSequenceFeatures(sequenceFeatures.getState());
       alignPanel.seqPanel.seqCanvas.repaint();
     }
-    else if (evt.getSource() == conservationMenuItem)
+    else if (source == showAlignmentAnnotations)
+    {
+      setAnnotationsVisibility();
+    }
+    else if (source == showSequenceAnnotations)
+    {
+      setAnnotationsVisibility();
+    }
+    else if (source == sortAnnBySequence)
+    {
+      boolean newState = sortAnnBySequence.getState();
+      sortAnnByLabel.setState(false);
+      setAnnotationSortOrder(newState ? SequenceAnnotationOrder.SEQUENCE_AND_LABEL
+              : SequenceAnnotationOrder.NONE);
+      setViewportAnnotationOrder();
+    }
+    else if (source == sortAnnByLabel)
+    {
+      boolean newState = sortAnnByLabel.getState();
+      sortAnnBySequence.setState(false);
+      setAnnotationSortOrder(newState ? SequenceAnnotationOrder.LABEL_AND_SEQUENCE
+              : SequenceAnnotationOrder.NONE);
+      setViewportAnnotationOrder();
+    }
+    else if (source == showAutoFirst)
+    {
+      showAutoLast.setState(!showAutoFirst.getState());
+      setShowAutoCalculatedAbove(showAutoFirst.getState());
+      setViewportAnnotationOrder();
+    }
+    else if (source == showAutoLast)
+    {
+      showAutoFirst.setState(!showAutoLast.getState());
+      setShowAutoCalculatedAbove(showAutoFirst.getState());
+      setViewportAnnotationOrder();
+    }
+    else if (source == conservationMenuItem)
     {
       conservationMenuItem_actionPerformed();
     }
-    else if (evt.getSource() == abovePIDThreshold)
+    else if (source == abovePIDThreshold)
     {
       abovePIDThreshold_actionPerformed();
     }
-    else if (evt.getSource() == applyToAllGroups)
+    else if (source == applyToAllGroups)
     {
       viewport.setColourAppliesToAllGroups(applyToAllGroups.getState());
     }
-    else if (evt.getSource() == autoCalculate)
+    else if (source == autoCalculate)
     {
       viewport.autoCalculateConsensus = autoCalculate.getState();
     }
-    else if (evt.getSource() == sortByTree)
+    else if (source == sortByTree)
     {
       viewport.sortByTree = sortByTree.getState();
     }
-    else if (evt.getSource() == this.centreColumnLabelFlag)
+    else if (source == this.centreColumnLabelFlag)
     {
       centreColumnLabelFlag_stateChanged();
     }
-    else if (evt.getSource() == this.followMouseOverFlag)
+    else if (source == this.followMouseOverFlag)
     {
       mouseOverFlag_stateChanged();
     }
-    else if (evt.getSource() == showGroupConsensus)
+    else if (source == showGroupConsensus)
     {
       showGroupConsensus_actionPerformed();
     }
-    else if (evt.getSource() == showGroupConservation)
+    else if (source == showGroupConservation)
     {
       showGroupConservation_actionPerformed();
     }
-    else if (evt.getSource() == showSequenceLogo)
+    else if (source == showSequenceLogo)
     {
       showSequenceLogo_actionPerformed();
     }
-    else if (evt.getSource() == normSequenceLogo)
+    else if (source == normSequenceLogo)
     {
       normSequenceLogo_actionPerformed();
     }
-    else if (evt.getSource() == showConsensusHistogram)
+    else if (source == showConsensusHistogram)
     {
       showConsensusHistogram_actionPerformed();
     }
-    else if (evt.getSource() == applyAutoAnnotationSettings)
+    else if (source == applyAutoAnnotationSettings)
     {
       applyAutoAnnotationSettings_actionPerformed();
     }
     alignPanel.paintAlignment(true);
   }
 
+  /**
+   * Set the visibility state of sequence-related and/or alignment-related
+   * annotations depending on checkbox selections. Repaint after calling.
+   * 
+   * @param visible
+   */
+  private void setAnnotationsVisibility()
+  {
+    boolean showForAlignment = showAlignmentAnnotations.getState();
+    boolean showForSequences = showSequenceAnnotations.getState();
+    for (AlignmentAnnotation aa : alignPanel.getAlignment()
+            .getAlignmentAnnotation())
+    {
+      boolean visible = (aa.sequenceRef == null ? showForAlignment
+              : showForSequences);
+        aa.visible = visible;
+    }
+    alignPanel.validateAnnotationDimensions(false);
+  }
+
+  private void setAnnotationSortOrder(SequenceAnnotationOrder order)
+  {
+    this.annotationSortOrder = order;
+  }
+
+  /**
+   * Set flags on the viewport that control annotation ordering
+   */
+  private void setViewportAnnotationOrder()
+  {
+    this.alignPanel.av.setSortAnnotationsBy(this.annotationSortOrder);
+    this.alignPanel.av
+            .setShowAutocalculatedAbove(this.showAutoCalculatedAbove);
+  }
+
+  private void setShowAutoCalculatedAbove(boolean showAbove)
+  {
+    this.showAutoCalculatedAbove = showAbove;
+  }
+
   private void mouseOverFlag_stateChanged()
   {
     viewport.followHighlight = followMouseOverFlag.getState();
@@ -1740,12 +1829,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
     SequenceGroup sg = viewport.getSelectionGroup();
     copiedSequences = new StringBuffer();
-    Hashtable orderedSeqs = new Hashtable();
+    Map<Integer, SequenceI> orderedSeqs = new HashMap<Integer, SequenceI>();
     for (int i = 0; i < sg.getSize(); i++)
     {
       SequenceI seq = sg.getSequenceAt(i);
       int index = viewport.getAlignment().findIndex(seq);
-      orderedSeqs.put(index + "", seq);
+      orderedSeqs.put(index, seq);
     }
 
     int index = 0, startRes, endRes;
@@ -1772,11 +1861,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
       while (seq == null)
       {
-        if (orderedSeqs.containsKey(index + ""))
+        if (orderedSeqs.containsKey(index))
         {
-          seq = (SequenceI) orderedSeqs.get(index + "");
+          seq = orderedSeqs.get(index);
           index++;
-
           break;
         }
         else
@@ -2335,13 +2423,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     if (alignPanel != null
             && (fr = alignPanel.getFeatureRenderer()) != null)
     {
-      List gps = fr.getFeatureGroups();
-      int p=0;
-      String[] _gps = new String[gps.size()];
-      for (Object gp:gps)
-      {
-        _gps[p++] = gp.toString();
-      }
+      List<String> gps = fr.getFeatureGroups();
+      String[] _gps = gps.toArray(new String[gps.size()]);
       return _gps;
     }
     return null;
@@ -2360,13 +2443,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     if (alignPanel != null
             && (fr = alignPanel.getFeatureRenderer()) != null)
     {
-      List gps = fr.getGroups(visible);
-      int p=0;
-      String[] _gps = new String[gps.size()];
-      for (Object gp:gps)
-      {
-        _gps[p++] = gp.toString();
-      }
+      List<String> gps = fr.getGroups(visible);
+      String[] _gps = gps.toArray(new String[gps.size()]);
       return _gps;
     }
     return null;
@@ -2898,15 +2976,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   MenuItem closeMenuItem = new MenuItem(
           MessageManager.getString("action.close"));
 
-  Menu editMenu = new Menu(MessageManager.getString("action.edit"));
-
-  Menu viewMenu = new Menu(MessageManager.getString("action.view"));
-
-  Menu colourMenu = new Menu(MessageManager.getString("action.colour"));
-
-  Menu calculateMenu = new Menu(
-          MessageManager.getString("action.calculate"));
-
   MenuItem selectAllSequenceMenuItem = new MenuItem(
           MessageManager.getString("action.select_all"));
 
@@ -2950,8 +3019,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   public Label statusBar = new Label();
 
-  Menu outputTextboxMenu = new Menu();
-
   MenuItem clustalColour = new MenuItem();
 
   MenuItem zappoColour = new MenuItem();
@@ -3049,22 +3116,15 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem modifyConservation = new MenuItem();
 
-  CheckboxMenuItem autoCalculate = new CheckboxMenuItem(
-          "Autocalculate Consensus", true);
+  CheckboxMenuItem autoCalculate = null;
 
   CheckboxMenuItem sortByTree = new CheckboxMenuItem(
           "Sort Alignment With New Tree", true);
 
   Menu sortByTreeMenu = new Menu();
 
-  Menu sort = new Menu();
-
-  Menu calculate = new Menu();
-
   MenuItem inputText = new MenuItem();
 
-  Menu helpMenu = new Menu();
-
   MenuItem documentation = new MenuItem();
 
   MenuItem about = new MenuItem();
@@ -3075,8 +3135,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
 
-  Menu autoAnnMenu = new Menu();
-
   CheckboxMenuItem showSequenceLogo = new CheckboxMenuItem();
 
   CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem();
@@ -3089,18 +3147,27 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   CheckboxMenuItem normSequenceLogo = new CheckboxMenuItem();
 
+  /**
+   * Initialise menus and other items
+   * 
+   * @throws Exception
+   */
   private void jbInit() throws Exception
   {
-
     setMenuBar(alignFrameMenuBar);
 
-    MenuItem item;
-
-    // dynamically fill save as menu with available formats
+    /*
+     * Configure File menu items and actions
+     */
+    inputText
+            .setLabel(MessageManager.getString("label.input_from_textbox"));
+    inputText.addActionListener(this);
+    Menu outputTextboxMenu = new Menu(
+            MessageManager.getString("label.out_to_textbox"));
     for (int i = 0; i < jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS.length; i++)
     {
 
-      item = new MenuItem(
+      MenuItem item = new MenuItem(
               jalview.io.AppletFormatAdapter.WRITEABLE_FORMATS[i]);
 
       item.addActionListener(new java.awt.event.ActionListener()
@@ -3116,14 +3183,31 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     }
     closeMenuItem.addActionListener(this);
     loadApplication.addActionListener(this);
-
     loadTree.addActionListener(this);
     loadAnnotations.addActionListener(this);
     outputFeatures.addActionListener(this);
     outputAnnotations.addActionListener(this);
-    selectAllSequenceMenuItem.addActionListener(this);
-    deselectAllSequenceMenuItem.addActionListener(this);
-    invertSequenceMenuItem.addActionListener(this);
+
+    /*
+     * Configure Edit menu items and actions
+     */
+    undoMenuItem.setEnabled(false);
+    undoMenuItem.setLabel(MessageManager.getString("action.undo"));
+    undoMenuItem.addActionListener(this);
+    redoMenuItem.setEnabled(false);
+    redoMenuItem.setLabel(MessageManager.getString("action.redo"));
+    redoMenuItem.addActionListener(this);
+    copy.setLabel(MessageManager.getString("action.copy"));
+    copy.addActionListener(this);
+    cut.setLabel(MessageManager.getString("action.cut"));
+    cut.addActionListener(this);
+    delete.setLabel(MessageManager.getString("action.delete"));
+    delete.addActionListener(this);
+    pasteMenu.setLabel(MessageManager.getString("action.paste"));
+    pasteNew.setLabel(MessageManager.getString("label.to_new_alignment"));
+    pasteNew.addActionListener(this);
+    pasteThis.setLabel(MessageManager.getString("label.to_this_alignment"));
+    pasteThis.addActionListener(this);
     remove2LeftMenuItem.setLabel(MessageManager
             .getString("action.remove_left"));
     remove2LeftMenuItem.addActionListener(this);
@@ -3136,128 +3220,23 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     removeAllGapsMenuItem.setLabel(MessageManager
             .getString("action.remove_all_gaps"));
     removeAllGapsMenuItem.addActionListener(this);
-    viewBoxesMenuItem.setLabel(MessageManager.getString("action.boxes"));
-    viewBoxesMenuItem.setState(true);
-    viewBoxesMenuItem.addItemListener(this);
-    viewTextMenuItem.setLabel(MessageManager.getString("action.text"));
-    viewTextMenuItem.setState(true);
-    viewTextMenuItem.addItemListener(this);
-    sortPairwiseMenuItem.setLabel(MessageManager
-            .getString("action.by_pairwise_id"));
-    sortPairwiseMenuItem.addActionListener(this);
-    sortIDMenuItem.setLabel(MessageManager.getString("action.by_id"));
-    sortIDMenuItem.addActionListener(this);
-    sortLengthMenuItem.setLabel(MessageManager
-            .getString("action.by_length"));
-    sortLengthMenuItem.addActionListener(this);
-    sortGroupMenuItem.setLabel(MessageManager.getString("action.by_group"));
-    sortGroupMenuItem.addActionListener(this);
-    removeRedundancyMenuItem.setLabel(MessageManager
-            .getString("action.remove_redundancy").concat("..."));
+    removeRedundancyMenuItem.setLabel(MessageManager.getString(
+            "action.remove_redundancy").concat("..."));
     removeRedundancyMenuItem.addActionListener(this);
-    pairwiseAlignmentMenuItem.setLabel(MessageManager
-            .getString("action.pairwise_alignment"));
-    pairwiseAlignmentMenuItem.addActionListener(this);
-    PCAMenuItem.setLabel(MessageManager
-            .getString("label.principal_component_analysis"));
-    PCAMenuItem.addActionListener(this);
-    averageDistanceTreeMenuItem.setLabel(MessageManager
-            .getString("label.average_distance_identity"));
-    averageDistanceTreeMenuItem.addActionListener(this);
-    neighbourTreeMenuItem.setLabel(MessageManager
-            .getString("label.neighbour_joining_identity"));
-    neighbourTreeMenuItem.addActionListener(this);
-    statusBar.setBackground(Color.white);
-    statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
-    statusBar.setText(MessageManager.getString("label.status_bar"));
-    outputTextboxMenu.setLabel(MessageManager
-            .getString("label.out_to_textbox"));
-    clustalColour.setLabel(MessageManager.getString("label.clustalx"));
 
-    clustalColour.addActionListener(this);
-    zappoColour.setLabel(MessageManager.getString("label.zappo"));
-    zappoColour.addActionListener(this);
-    taylorColour.setLabel(MessageManager.getString("label.taylor"));
-    taylorColour.addActionListener(this);
-    hydrophobicityColour.setLabel(MessageManager
-            .getString("label.hydrophobicity"));
-    hydrophobicityColour.addActionListener(this);
-    helixColour
-            .setLabel(MessageManager.getString("label.helix_propensity"));
-    helixColour.addActionListener(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);
-    purinePyrimidineColour.setLabel(MessageManager
-            .getString("label.purine_pyrimidine"));
-    purinePyrimidineColour.addActionListener(this);
-    RNAInteractionColour.setLabel(MessageManager
-            .getString("label.rna_interaction"));
-    RNAInteractionColour.addActionListener(this);
-    RNAHelixColour.setLabel(MessageManager
-            .getString("action.by_rna_helixes"));
-    RNAHelixColour.addActionListener(this);
-    userDefinedColour.setLabel(MessageManager
-            .getString("action.user_defined"));
-    userDefinedColour.addActionListener(this);
-    PIDColour.setLabel(MessageManager
-            .getString("label.percentage_identity"));
-    PIDColour.addActionListener(this);
-    BLOSUM62Colour.setLabel(MessageManager
-            .getString("label.blosum62_score"));
-    BLOSUM62Colour.addActionListener(this);
-    tcoffeeColour
-            .setLabel(MessageManager.getString("label.tcoffee_scores"));
-    tcoffeeColour.setEnabled(false); // it will enabled only if a score file is
-                                     // provided
-    tcoffeeColour.addActionListener(this);
-    avDistanceTreeBlosumMenuItem.setLabel(MessageManager
-            .getString("label.average_distance_bloslum62"));
-    avDistanceTreeBlosumMenuItem.addActionListener(this);
-    njTreeBlosumMenuItem.setLabel(MessageManager
-            .getString("label.neighbour_blosum62"));
-    njTreeBlosumMenuItem.addActionListener(this);
-    annotationPanelMenuItem.setLabel(MessageManager
-            .getString("label.show_annotations"));
-    annotationPanelMenuItem.addItemListener(this);
-    colourTextMenuItem.setLabel(MessageManager
-            .getString("label.colour_text"));
-    colourTextMenuItem.addItemListener(this);
-    displayNonconservedMenuItem.setLabel(MessageManager
-            .getString("label.show_non_conversed"));
-    displayNonconservedMenuItem.addItemListener(this);
-    alProperties.addActionListener(this);
-    overviewMenuItem.setLabel(MessageManager
-            .getString("label.overview_window"));
-    overviewMenuItem.addActionListener(this);
-    undoMenuItem.setEnabled(false);
-    undoMenuItem.setLabel(MessageManager.getString("action.undo"));
-    undoMenuItem.addActionListener(this);
-    redoMenuItem.setEnabled(false);
-    redoMenuItem.setLabel(MessageManager.getString("action.redo"));
-    redoMenuItem.addActionListener(this);
-    conservationMenuItem.setLabel(MessageManager
-            .getString("action.by_conservation"));
-    conservationMenuItem.addItemListener(this);
-    noColourmenuItem.setLabel(MessageManager.getString("label.none"));
-    noColourmenuItem.addActionListener(this);
-    wrapMenuItem.setLabel(MessageManager.getString("action.wrap"));
-    wrapMenuItem.addItemListener(this);
-    renderGapsMenuItem.setLabel(MessageManager
-            .getString("action.show_gaps"));
-    renderGapsMenuItem.setState(true);
-    renderGapsMenuItem.addItemListener(this);
+    /*
+     * Configure Select menu items and actions
+     */
     findMenuItem.setLabel(MessageManager.getString("action.find"));
     findMenuItem.addActionListener(this);
-    abovePIDThreshold.setLabel(MessageManager
-            .getString("label.above_identity_threshold"));
-    abovePIDThreshold.addItemListener(this);
-    nucleotideColour.setLabel(MessageManager.getString("label.nucleotide"));
-    nucleotideColour.addActionListener(this);
+    selectAllSequenceMenuItem.addActionListener(this);
+    deselectAllSequenceMenuItem.addActionListener(this);
+    invertSequenceMenuItem.setLabel(MessageManager
+            .getString("action.invert_sequence_selection"));
+    invertSequenceMenuItem.addActionListener(this);
+    invertColSel.setLabel(MessageManager
+            .getString("action.invert_column_selection"));
+    invertColSel.addActionListener(this);
     deleteGroups.setLabel(MessageManager
             .getString("action.undefine_groups"));
     deleteGroups.addActionListener(this);
@@ -3266,88 +3245,18 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     grpsFromSelection.addActionListener(this);
     createGroup.setLabel(MessageManager.getString("action.create_group"));
     unGroup.setLabel(MessageManager.getString("action.remove_group"));
-    copy.setLabel(MessageManager.getString("action.copy"));
-    copy.addActionListener(this);
-    cut.setLabel(MessageManager.getString("action.cut"));
-    cut.addActionListener(this);
-    delete.setLabel(MessageManager.getString("action.delete"));
-    delete.addActionListener(this);
-    pasteMenu.setLabel(MessageManager.getString("action.paste"));
-    pasteNew.setLabel(MessageManager.getString("label.to_new_alignment"));
-    pasteNew.addActionListener(this);
-    pasteThis.setLabel(MessageManager.getString("label.to_this_alignment"));
-    pasteThis.addActionListener(this);
-    applyToAllGroups.setLabel(MessageManager
-            .getString("label.apply_colour_to_all_groups"));
-    applyToAllGroups.setState(true);
-    applyToAllGroups.addItemListener(this);
-    font.setLabel(MessageManager.getString("action.font"));
-    font.addActionListener(this);
-    scaleAbove.setLabel(MessageManager.getString("action.scale_above"));
-    scaleAbove.setState(true);
-    scaleAbove.setEnabled(false);
-    scaleAbove.addItemListener(this);
-    scaleLeft.setEnabled(false);
-    scaleLeft.setState(true);
-    scaleLeft.setLabel(MessageManager.getString("action.scale_left"));
-    scaleLeft.addItemListener(this);
-    scaleRight.setEnabled(false);
-    scaleRight.setState(true);
-    scaleRight.setLabel(MessageManager.getString("action.scale_right"));
-    scaleRight.addItemListener(this);
-    modifyPID.setLabel(MessageManager
-            .getString("label.modify_identity_thereshold"));
-    modifyPID.addActionListener(this);
-    modifyConservation.setLabel(MessageManager
-            .getString("label.modify_conservation_thereshold"));
-    modifyConservation.addActionListener(this);
-    sortByTreeMenu.setLabel(MessageManager
-            .getString("action.by_tree_order"));
-    sort.setLabel(MessageManager.getString("action.sort"));
-    calculate.setLabel(MessageManager.getString("action.calculate_tree"));
-    autoCalculate.addItemListener(this);
-    sortByTree.addItemListener(this);
-    inputText
-            .setLabel(MessageManager.getString("label.input_from_textbox"));
-    inputText.addActionListener(this);
-    centreColumnLabelFlag.setLabel(MessageManager
-            .getString("label.centre_column_labels"));
-    centreColumnLabelFlag.addItemListener(this);
-    followMouseOverFlag.setLabel(MessageManager
-            .getString("label.automatic_scrolling"));
-    followMouseOverFlag.addItemListener(this);
-    helpMenu.setLabel(MessageManager.getString("action.help"));
-    documentation.setLabel(MessageManager.getString("label.documentation"));
-    documentation.addActionListener(this);
-
-    about.setLabel(MessageManager.getString("label.about"));
-    about.addActionListener(this);
-    seqLimits.setState(true);
-    seqLimits.setLabel(MessageManager
-            .getString("label.show_sequence_limits"));
-    seqLimits.addItemListener(this);
-    featureSettings.setLabel(MessageManager
-            .getString("label.feature_settings"));
-    featureSettings.addActionListener(this);
-    sequenceFeatures.setLabel(MessageManager
-            .getString("label.sequence_features"));
-    sequenceFeatures.addItemListener(this);
-    sequenceFeatures.setState(false);
-    annotationColour.setLabel(MessageManager
-            .getString("action.by_annotation"));
-    annotationColour.addActionListener(this);
-
     annotationColumnSelection.setLabel("Select by Annotation");
     annotationColumnSelection.addActionListener(this);
 
-    invertSequenceMenuItem.setLabel(MessageManager
-            .getString("action.invert_sequence_selection"));
-    invertColSel.setLabel(MessageManager
-            .getString("action.invert_column_selection"));
-    menu1.setLabel(MessageManager.getString("action.show"));
+    /*
+     * Configure View menu items and actions
+     */
+    newView.setLabel(MessageManager.getString("action.new_view"));
+    newView.addActionListener(this);
+    Menu showMenu = new Menu(MessageManager.getString("action.show"));
     showColumns.setLabel(MessageManager.getString("label.all_columns"));
     showSeqs.setLabel(MessageManager.getString("label.all_sequences"));
-    menu2.setLabel(MessageManager.getString("action.hide"));
+    Menu hideMenu = new Menu(MessageManager.getString("action.hide"));
     hideColumns
             .setLabel(MessageManager.getString("label.selected_columns"));
     hideSequences.setLabel(MessageManager
@@ -3358,6 +3267,34 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
             .getString("label.selected_region"));
     showAllHidden.setLabel(MessageManager
             .getString("label.all_sequences_columns"));
+    showColumns.addActionListener(this);
+    showSeqs.addActionListener(this);
+    hideColumns.addActionListener(this);
+    hideSequences.addActionListener(this);
+    hideAllButSelection.addActionListener(this);
+    hideAllSelection.addActionListener(this);
+    showAllHidden.addActionListener(this);
+    featureSettings.setLabel(MessageManager
+            .getString("label.feature_settings"));
+    featureSettings.addActionListener(this);
+    sequenceFeatures.setLabel(MessageManager
+            .getString("label.show_sequence_features"));
+    sequenceFeatures.addItemListener(this);
+    sequenceFeatures.setState(false);
+    followMouseOverFlag.setLabel(MessageManager
+            .getString("label.automatic_scrolling"));
+    followMouseOverFlag.addItemListener(this);
+    alProperties.addActionListener(this);
+    overviewMenuItem.setLabel(MessageManager
+            .getString("label.overview_window"));
+    overviewMenuItem.addActionListener(this);
+
+    /*
+     * Configure Annotations menu items and actions
+     */
+    annotationPanelMenuItem.setLabel(MessageManager
+            .getString("label.show_annotations"));
+    annotationPanelMenuItem.addItemListener(this);
     showGroupConsensus.setLabel(MessageManager
             .getString("label.group_consensus"));
     showGroupConservation.setLabel(MessageManager
@@ -3371,58 +3308,243 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     applyAutoAnnotationSettings.setLabel(MessageManager
             .getString("label.apply_all_groups"));
     applyAutoAnnotationSettings.setState(true);
-    autoAnnMenu.setLabel(MessageManager
-            .getString("label.autocalculated_annotation"));
-
-    invertColSel.addActionListener(this);
-    showColumns.addActionListener(this);
-    showSeqs.addActionListener(this);
-    hideColumns.addActionListener(this);
-    hideSequences.addActionListener(this);
-    hideAllButSelection.addActionListener(this);
-    hideAllSelection.addActionListener(this);
-    showAllHidden.addActionListener(this);
+    Menu autoAnnMenu = new Menu(
+            MessageManager.getString("label.autocalculated_annotation"));
     showGroupConsensus.addItemListener(this);
     showGroupConservation.addItemListener(this);
     showConsensusHistogram.addItemListener(this);
     showSequenceLogo.addItemListener(this);
     normSequenceLogo.addItemListener(this);
-
     applyAutoAnnotationSettings.addItemListener(this);
-    formatMenu.setLabel(MessageManager.getString("action.format"));
-    selectMenu.setLabel(MessageManager.getString("action.select"));
-    newView.setLabel(MessageManager.getString("action.new_view"));
-    newView.addActionListener(this);
+    showAlignmentAnnotations = new CheckboxMenuItem(
+            MessageManager.getString("label.show_all_al_annotations"));
+    showSequenceAnnotations = new CheckboxMenuItem(
+            MessageManager.getString("label.show_all_seq_annotations"));
+    sortAnnBySequence = new CheckboxMenuItem(
+            MessageManager.getString("label.sort_annotations_by_sequence"));
+    sortAnnByLabel = new CheckboxMenuItem(
+            MessageManager.getString("label.sort_annotations_by_label"));
+    showAutoFirst = new CheckboxMenuItem(
+            MessageManager.getString("label.show_first"));
+    showAutoLast = new CheckboxMenuItem(
+            MessageManager.getString("label.show_last"));
+    showAlignmentAnnotations.addItemListener(this);
+    showSequenceAnnotations.addItemListener(this);
+    sortAnnBySequence.addItemListener(this);
+    sortAnnByLabel.addItemListener(this);
+    showAutoFirst.addItemListener(this);
+    showAutoLast.addItemListener(this);
+
+    /*
+     * Configure Format menu items and actions
+     */
+    font.setLabel(MessageManager.getString("action.font"));
+    font.addActionListener(this);
+    scaleAbove.setLabel(MessageManager.getString("action.scale_above"));
+    scaleAbove.setState(true);
+    scaleAbove.setEnabled(false);
+    scaleAbove.addItemListener(this);
+    scaleLeft.setEnabled(false);
+    scaleLeft.setState(true);
+    scaleLeft.setLabel(MessageManager.getString("action.scale_left"));
+    scaleLeft.addItemListener(this);
+    scaleRight.setEnabled(false);
+    scaleRight.setState(true);
+    scaleRight.setLabel(MessageManager.getString("action.scale_right"));
+    scaleRight.addItemListener(this);
+    viewBoxesMenuItem.setLabel(MessageManager.getString("action.boxes"));
+    viewBoxesMenuItem.setState(true);
+    viewBoxesMenuItem.addItemListener(this);
+    viewTextMenuItem.setLabel(MessageManager.getString("action.text"));
+    viewTextMenuItem.setState(true);
+    viewTextMenuItem.addItemListener(this);
+    colourTextMenuItem.setLabel(MessageManager
+            .getString("label.colour_text"));
+    colourTextMenuItem.addItemListener(this);
+    displayNonconservedMenuItem.setLabel(MessageManager
+            .getString("label.show_non_conversed"));
+    displayNonconservedMenuItem.addItemListener(this);
+    wrapMenuItem.setLabel(MessageManager.getString("action.wrap"));
+    wrapMenuItem.addItemListener(this);
+    renderGapsMenuItem.setLabel(MessageManager
+            .getString("action.show_gaps"));
+    renderGapsMenuItem.setState(true);
+    renderGapsMenuItem.addItemListener(this);
+    centreColumnLabelFlag.setLabel(MessageManager
+            .getString("label.centre_column_labels"));
+    centreColumnLabelFlag.addItemListener(this);
+    seqLimits.setState(true);
+    seqLimits.setLabel(MessageManager
+            .getString("label.show_sequence_limits"));
+    seqLimits.addItemListener(this);
+
+    /*
+     * Configure Colour menu items and actions
+     */
+    applyToAllGroups.setLabel(MessageManager
+            .getString("label.apply_colour_to_all_groups"));
+    applyToAllGroups.setState(true);
+    applyToAllGroups.addItemListener(this);
+    clustalColour.setLabel(MessageManager.getString("label.clustalx"));
+    clustalColour.addActionListener(this);
+    zappoColour.setLabel(MessageManager.getString("label.zappo"));
+    zappoColour.addActionListener(this);
+    taylorColour.setLabel(MessageManager.getString("label.taylor"));
+    taylorColour.addActionListener(this);
+    hydrophobicityColour.setLabel(MessageManager
+            .getString("label.hydrophobicity"));
+    hydrophobicityColour.addActionListener(this);
+    helixColour
+            .setLabel(MessageManager.getString("label.helix_propensity"));
+    helixColour.addActionListener(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);
+    purinePyrimidineColour.setLabel(MessageManager
+            .getString("label.purine_pyrimidine"));
+    purinePyrimidineColour.addActionListener(this);
+    RNAInteractionColour.setLabel(MessageManager
+            .getString("label.rna_interaction"));
+    RNAInteractionColour.addActionListener(this);
+    RNAHelixColour.setLabel(MessageManager
+            .getString("action.by_rna_helixes"));
+    RNAHelixColour.addActionListener(this);
+    userDefinedColour.setLabel(MessageManager
+            .getString("action.user_defined"));
+    userDefinedColour.addActionListener(this);
+    PIDColour.setLabel(MessageManager
+            .getString("label.percentage_identity"));
+    PIDColour.addActionListener(this);
+    BLOSUM62Colour.setLabel(MessageManager
+            .getString("label.blosum62_score"));
+    BLOSUM62Colour.addActionListener(this);
+    tcoffeeColour
+            .setLabel(MessageManager.getString("label.tcoffee_scores"));
+    // it will be enabled only if a score file is provided
+    tcoffeeColour.setEnabled(false);
+    tcoffeeColour.addActionListener(this);
+    conservationMenuItem.setLabel(MessageManager
+            .getString("action.by_conservation"));
+    conservationMenuItem.addItemListener(this);
+    noColourmenuItem.setLabel(MessageManager.getString("label.none"));
+    noColourmenuItem.addActionListener(this);
+    abovePIDThreshold.setLabel(MessageManager
+            .getString("label.above_identity_threshold"));
+    abovePIDThreshold.addItemListener(this);
+    nucleotideColour.setLabel(MessageManager.getString("label.nucleotide"));
+    nucleotideColour.addActionListener(this);
+    modifyPID.setLabel(MessageManager
+            .getString("label.modify_identity_thereshold"));
+    modifyPID.addActionListener(this);
+    modifyConservation.setLabel(MessageManager
+            .getString("label.modify_conservation_thereshold"));
+    modifyConservation.addActionListener(this);
+    annotationColour.setLabel(MessageManager
+            .getString("action.by_annotation"));
+    annotationColour.addActionListener(this);
+
+    /*
+     * Configure Calculate menu items and actions
+     */
+    sortPairwiseMenuItem.setLabel(MessageManager
+            .getString("action.by_pairwise_id"));
+    sortPairwiseMenuItem.addActionListener(this);
+    sortIDMenuItem.setLabel(MessageManager.getString("action.by_id"));
+    sortIDMenuItem.addActionListener(this);
+    sortLengthMenuItem.setLabel(MessageManager
+            .getString("action.by_length"));
+    sortLengthMenuItem.addActionListener(this);
+    sortGroupMenuItem.setLabel(MessageManager.getString("action.by_group"));
+    sortGroupMenuItem.addActionListener(this);
+    pairwiseAlignmentMenuItem.setLabel(MessageManager
+            .getString("action.pairwise_alignment"));
+    pairwiseAlignmentMenuItem.addActionListener(this);
+    PCAMenuItem.setLabel(MessageManager
+            .getString("label.principal_component_analysis"));
+    PCAMenuItem.addActionListener(this);
+    autoCalculate = new CheckboxMenuItem(
+            MessageManager.getString("label.autocalculate_consensus"), true);
+    averageDistanceTreeMenuItem.setLabel(MessageManager
+            .getString("label.average_distance_identity"));
+    averageDistanceTreeMenuItem.addActionListener(this);
+    neighbourTreeMenuItem.setLabel(MessageManager
+            .getString("label.neighbour_joining_identity"));
+    neighbourTreeMenuItem.addActionListener(this);
+    avDistanceTreeBlosumMenuItem.setLabel(MessageManager
+            .getString("label.average_distance_bloslum62"));
+    avDistanceTreeBlosumMenuItem.addActionListener(this);
+    njTreeBlosumMenuItem.setLabel(MessageManager
+            .getString("label.neighbour_blosum62"));
+    njTreeBlosumMenuItem.addActionListener(this);
+    sortByTreeMenu.setLabel(MessageManager
+            .getString("action.by_tree_order"));
+    Menu sortMenu = new Menu(MessageManager.getString("action.sort"));
+    Menu calculateTreeMenu = new Menu(
+            MessageManager.getString("action.calculate_tree"));
+    autoCalculate.addItemListener(this);
+    sortByTree.addItemListener(this);
+
+    /*
+     * Configure Help menu items and actions
+     */
+    Menu helpMenu = new Menu(MessageManager.getString("action.help"));
+    documentation.setLabel(MessageManager.getString("label.documentation"));
+    documentation.addActionListener(this);
+    about.setLabel(MessageManager.getString("label.about"));
+    about.addActionListener(this);
+
+    /*
+     * Add top level menus to frame
+     */
     alignFrameMenuBar.add(fileMenu);
+    Menu editMenu = new Menu(MessageManager.getString("action.edit"));
     alignFrameMenuBar.add(editMenu);
+    Menu selectMenu = new Menu(MessageManager.getString("action.select"));
     alignFrameMenuBar.add(selectMenu);
+    Menu viewMenu = new Menu(MessageManager.getString("action.view"));
     alignFrameMenuBar.add(viewMenu);
+    Menu annotationsMenu = new Menu(
+            MessageManager.getString("action.annotations"));
+    alignFrameMenuBar.add(annotationsMenu);
+    Menu formatMenu = new Menu(MessageManager.getString("action.format"));
     alignFrameMenuBar.add(formatMenu);
+    Menu colourMenu = new Menu(MessageManager.getString("action.colour"));
     alignFrameMenuBar.add(colourMenu);
+    Menu calculateMenu = new Menu(
+            MessageManager.getString("action.calculate"));
     alignFrameMenuBar.add(calculateMenu);
     alignFrameMenuBar.add(helpMenu);
 
+    /*
+     * File menu
+     */
     fileMenu.add(inputText);
     fileMenu.add(loadTree);
     fileMenu.add(loadAnnotations);
-
     fileMenu.addSeparator();
     fileMenu.add(outputTextboxMenu);
     fileMenu.add(outputFeatures);
     fileMenu.add(outputAnnotations);
-
     if (jalviewServletURL != null)
     {
       fileMenu.add(loadApplication);
     }
-
     fileMenu.addSeparator();
     fileMenu.add(closeMenuItem);
 
+    /*
+     * Edit menu
+     */
     editMenu.add(undoMenuItem);
     editMenu.add(redoMenuItem);
     editMenu.add(cut);
     editMenu.add(copy);
+    pasteMenu.add(pasteNew);
+    pasteMenu.add(pasteThis);
     editMenu.add(pasteMenu);
     editMenu.add(delete);
     editMenu.addSeparator();
@@ -3431,21 +3553,38 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     editMenu.add(removeGappedColumnMenuItem);
     editMenu.add(removeAllGapsMenuItem);
     editMenu.add(removeRedundancyMenuItem);
+
+    /*
+     * Select menu
+     */
+    selectMenu.add(findMenuItem);
+    selectMenu.addSeparator();
+    selectMenu.add(selectAllSequenceMenuItem);
+    selectMenu.add(deselectAllSequenceMenuItem);
+    selectMenu.add(invertSequenceMenuItem);
+    selectMenu.add(invertColSel);
+    selectMenu.add(createGroup);
+    selectMenu.add(unGroup);
+    selectMenu.add(grpsFromSelection);
+    selectMenu.add(deleteGroups);
+    selectMenu.add(annotationColumnSelection);
+
+    /*
+     * View menu
+     */
     viewMenu.add(newView);
     viewMenu.addSeparator();
-    viewMenu.add(menu1);
-    viewMenu.add(menu2);
+    showMenu.add(showColumns);
+    showMenu.add(showSeqs);
+    showMenu.add(showAllHidden);
+    viewMenu.add(showMenu);
+    hideMenu.add(hideColumns);
+    hideMenu.add(hideSequences);
+    hideMenu.add(hideAllSelection);
+    hideMenu.add(hideAllButSelection);
+    viewMenu.add(hideMenu);
     viewMenu.addSeparator();
     viewMenu.add(followMouseOverFlag);
-    viewMenu.add(annotationPanelMenuItem);
-    autoAnnMenu.add(applyAutoAnnotationSettings);
-    autoAnnMenu.add(showConsensusHistogram);
-    autoAnnMenu.add(showSequenceLogo);
-    autoAnnMenu.add(normSequenceLogo);
-    autoAnnMenu.addSeparator();
-    autoAnnMenu.add(showGroupConservation);
-    autoAnnMenu.add(showGroupConsensus);
-    viewMenu.add(autoAnnMenu);
     viewMenu.addSeparator();
     viewMenu.add(sequenceFeatures);
     viewMenu.add(featureSettings);
@@ -3453,6 +3592,48 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     viewMenu.add(alProperties);
     viewMenu.addSeparator();
     viewMenu.add(overviewMenuItem);
+
+    /*
+     * Annotations menu
+     */
+    // annotationsMenu.add(annotationPanelMenuItem);
+    // annotationsMenu.addSeparator();
+    annotationsMenu.add(showAlignmentAnnotations);
+    annotationsMenu.add(showSequenceAnnotations);
+    annotationsMenu.add(sortAnnBySequence);
+    annotationsMenu.add(sortAnnByLabel);
+    annotationsMenu.addSeparator();
+    autoAnnMenu.add(showAutoFirst);
+    autoAnnMenu.add(showAutoLast);
+    autoAnnMenu.addSeparator();
+    autoAnnMenu.add(applyAutoAnnotationSettings);
+    autoAnnMenu.add(showConsensusHistogram);
+    autoAnnMenu.add(showSequenceLogo);
+    autoAnnMenu.add(normSequenceLogo);
+    autoAnnMenu.addSeparator();
+    autoAnnMenu.add(showGroupConservation);
+    autoAnnMenu.add(showGroupConsensus);
+    annotationsMenu.add(autoAnnMenu);
+
+    /*
+     * Format menu
+     */
+    formatMenu.add(font);
+    formatMenu.add(seqLimits);
+    formatMenu.add(wrapMenuItem);
+    formatMenu.add(scaleAbove);
+    formatMenu.add(scaleLeft);
+    formatMenu.add(scaleRight);
+    formatMenu.add(viewBoxesMenuItem);
+    formatMenu.add(viewTextMenuItem);
+    formatMenu.add(colourTextMenuItem);
+    formatMenu.add(displayNonconservedMenuItem);
+    formatMenu.add(renderGapsMenuItem);
+    formatMenu.add(centreColumnLabelFlag);
+
+    /*
+     * Colour menu
+     */
     colourMenu.add(applyToAllGroups);
     colourMenu.addSeparator();
     colourMenu.add(noColourmenuItem);
@@ -3478,58 +3659,40 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     colourMenu.add(modifyPID);
     colourMenu.add(annotationColour);
     colourMenu.add(RNAHelixColour);
-    calculateMenu.add(sort);
-    calculateMenu.add(calculate);
+
+    /*
+     * Calculate menu
+     */
+    sortMenu.add(sortIDMenuItem);
+    sortMenu.add(sortLengthMenuItem);
+    sortMenu.add(sortByTreeMenu);
+    sortMenu.add(sortGroupMenuItem);
+    sortMenu.add(sortPairwiseMenuItem);
+    calculateMenu.add(sortMenu);
+    calculateTreeMenu.add(averageDistanceTreeMenuItem);
+    calculateTreeMenu.add(neighbourTreeMenuItem);
+    calculateTreeMenu.add(avDistanceTreeBlosumMenuItem);
+    calculateTreeMenu.add(njTreeBlosumMenuItem);
+    calculateMenu.add(calculateTreeMenu);
     calculateMenu.addSeparator();
     calculateMenu.add(pairwiseAlignmentMenuItem);
     calculateMenu.add(PCAMenuItem);
     calculateMenu.add(autoCalculate);
     calculateMenu.add(sortByTree);
-    this.add(statusBar, BorderLayout.SOUTH);
-    pasteMenu.add(pasteNew);
-    pasteMenu.add(pasteThis);
-    sort.add(sortIDMenuItem);
-    sort.add(sortLengthMenuItem);
-    sort.add(sortByTreeMenu);
-    sort.add(sortGroupMenuItem);
-    sort.add(sortPairwiseMenuItem);
-    calculate.add(averageDistanceTreeMenuItem);
-    calculate.add(neighbourTreeMenuItem);
-    calculate.add(avDistanceTreeBlosumMenuItem);
-    calculate.add(njTreeBlosumMenuItem);
+
+    /*
+     * Help menu
+     */
     helpMenu.add(documentation);
     helpMenu.add(about);
-    menu1.add(showColumns);
-    menu1.add(showSeqs);
-    menu1.add(showAllHidden);
-    menu2.add(hideColumns);
-    menu2.add(hideSequences);
-    menu2.add(hideAllSelection);
-    menu2.add(hideAllButSelection);
-    formatMenu.add(font);
-    formatMenu.add(seqLimits);
-    formatMenu.add(wrapMenuItem);
-    formatMenu.add(scaleAbove);
-    formatMenu.add(scaleLeft);
-    formatMenu.add(scaleRight);
-    formatMenu.add(viewBoxesMenuItem);
-    formatMenu.add(viewTextMenuItem);
-    formatMenu.add(colourTextMenuItem);
-    formatMenu.add(displayNonconservedMenuItem);
-    formatMenu.add(renderGapsMenuItem);
-    formatMenu.add(centreColumnLabelFlag);
-    selectMenu.add(findMenuItem);
-    selectMenu.addSeparator();
-    selectMenu.add(selectAllSequenceMenuItem);
-    selectMenu.add(deselectAllSequenceMenuItem);
-    selectMenu.add(invertSequenceMenuItem);
-    selectMenu.add(invertColSel);
-    selectMenu.add(createGroup);
-    selectMenu.add(unGroup);
-    selectMenu.add(grpsFromSelection);
-    selectMenu.add(deleteGroups);
-    selectMenu.add(annotationColumnSelection);
 
+    /*
+     * Status bar
+     */
+    statusBar.setBackground(Color.white);
+    statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
+    statusBar.setText(MessageManager.getString("label.status_bar"));
+    this.add(statusBar, BorderLayout.SOUTH);
   }
 
   public void setStatus(String string)
@@ -3547,14 +3710,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem invertColSel = new MenuItem();
 
-  Menu menu1 = new Menu();
-
   MenuItem showColumns = new MenuItem();
 
   MenuItem showSeqs = new MenuItem();
 
-  Menu menu2 = new Menu();
-
   MenuItem hideColumns = new MenuItem();
 
   MenuItem hideSequences = new MenuItem();
@@ -3565,11 +3724,19 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem showAllHidden = new MenuItem();
 
-  Menu formatMenu = new Menu();
+  MenuItem newView = new MenuItem();
 
-  Menu selectMenu = new Menu();
+  private CheckboxMenuItem showAlignmentAnnotations;
 
-  MenuItem newView = new MenuItem();
+  private CheckboxMenuItem showSequenceAnnotations;
+
+  private CheckboxMenuItem sortAnnBySequence;
+
+  private CheckboxMenuItem sortAnnByLabel;
+
+  private CheckboxMenuItem showAutoFirst;
+
+  private CheckboxMenuItem showAutoLast;
 
   /**
    * Attach the alignFrame panels after embedding menus, if necessary. This used
index 9896ee7..c74914f 100644 (file)
  */
 package jalview.appletgui;
 
-import jalview.api.AlignViewportI;
-import jalview.api.AlignmentViewPanel;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.SearchResults;
-import jalview.datamodel.SequenceI;
-import jalview.structure.StructureSelectionManager;
-
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Dimension;
@@ -40,6 +33,14 @@ import java.awt.event.AdjustmentListener;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 
+import jalview.analysis.AnnotationSorter;
+import jalview.api.AlignViewportI;
+import jalview.api.AlignmentViewPanel;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SearchResults;
+import jalview.datamodel.SequenceI;
+import jalview.structure.StructureSelectionManager;
+
 public class AlignmentPanel extends Panel implements AdjustmentListener,
         AlignmentViewPanel
 {
@@ -801,8 +802,15 @@ public class AlignmentPanel extends Panel implements AdjustmentListener,
                     av.endSeq);
   }
 
+  /**
+   * Repaint the alignment and annotations, and, optionally, any overview window
+   */
   public void paintAlignment(boolean updateOverview)
   {
+    final AnnotationSorter sorter = new AnnotationSorter(getAlignment(),
+            av.isShowAutocalculatedAbove());
+    sorter.sort(getAlignment().getAlignmentAnnotation(),
+            av.getSortAnnotationsBy());
     repaint();
 
     if (updateOverview)
index ce50cee..67faf11 100755 (executable)
  */
 package jalview.appletgui;
 
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.Annotation;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-import jalview.util.MessageManager;
-import jalview.util.ParseHtmlBodyAndLinks;
-
 import java.awt.Checkbox;
 import java.awt.CheckboxMenuItem;
 import java.awt.Color;
@@ -48,8 +41,17 @@ import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Vector;
 
+import jalview.analysis.AlignmentUtils;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.util.MessageManager;
+import jalview.util.ParseHtmlBodyAndLinks;
+
 public class AnnotationLabels extends Panel implements ActionListener,
         MouseListener, MouseMotionListener
 {
@@ -211,6 +213,14 @@ public class AnnotationLabels extends Panel implements ActionListener,
       }
 
     }
+    refresh();
+  }
+
+  /**
+   * Adjust size and repaint
+   */
+  protected void refresh()
+  {
     ap.annotationPanel.adjustPanelHeight();
     setSize(getSize().width, ap.annotationPanel.getSize().height);
     ap.validate();
@@ -461,6 +471,32 @@ public class AnnotationLabels extends Panel implements ActionListener,
       item = new MenuItem(HIDE);
       item.addActionListener(this);
       popup.add(item);
+
+      /*
+       * Hide all <label>:
+       */
+      if (selectedRow < aa.length)
+      {
+        if (aa[selectedRow].sequenceRef != null)
+        {
+          final String label = aa[selectedRow].label;
+          MenuItem hideType = new MenuItem(
+                  MessageManager.getString("label.hide_all") + " " + label);
+          hideType.addActionListener(new ActionListener()
+          {
+            @Override
+            public void actionPerformed(ActionEvent e)
+            {
+              AlignmentUtils.showOrHideSequenceAnnotations(
+                      ap.av.getAlignment(), Collections.singleton(label),
+                      null, false, false);
+              refresh();
+            }
+          });
+          popup.add(hideType);
+        }
+      }
+
       if (hasHiddenRows)
       {
         item = new MenuItem(SHOWALL);
index 963961d..036bbe3 100644 (file)
  */
 package jalview.appletgui;
 
-import jalview.analysis.AlignmentUtils;
-import jalview.bin.JalviewLite;
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.PDBEntry;
-import jalview.datamodel.Sequence;
-import jalview.io.AnnotationFile;
-import jalview.io.AppletFormatAdapter;
-import jalview.io.IdentifyFile;
-import jalview.io.NewickFile;
-import jalview.io.TCoffeeScoreFile;
-import jalview.schemes.TCoffeeColourScheme;
-import jalview.util.MessageManager;
-
 import java.awt.BorderLayout;
 import java.awt.Button;
 import java.awt.Dialog;
@@ -47,6 +33,20 @@ import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 
+import jalview.analysis.AlignmentUtils;
+import jalview.bin.JalviewLite;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.PDBEntry;
+import jalview.datamodel.SequenceI;
+import jalview.io.AnnotationFile;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.IdentifyFile;
+import jalview.io.NewickFile;
+import jalview.io.TCoffeeScoreFile;
+import jalview.schemes.TCoffeeColourScheme;
+import jalview.util.MessageManager;
+
 public class CutAndPasteTransfer extends Panel implements ActionListener,
         MouseListener
 {
@@ -56,7 +56,7 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
 
   boolean annotationImport = false;
 
-  Sequence seq;
+  SequenceI seq;
 
   AlignFrame alignFrame;
 
@@ -88,7 +88,7 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
     textarea.setText(text);
   }
 
-  public void setPDBImport(Sequence seq)
+  public void setPDBImport(SequenceI seq)
   {
     this.seq = seq;
     accept.setLabel(MessageManager.getString("action.accept"));
@@ -395,12 +395,12 @@ public class CutAndPasteTransfer extends Panel implements ActionListener,
 
     if (alignFrame.alignPanel.av.applet.jmolAvailable)
     {
-      new jalview.appletgui.AppletJmol(pdb, new Sequence[]
+      new jalview.appletgui.AppletJmol(pdb, new SequenceI[]
       { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
     }
     else
     {
-      new MCview.AppletPDBViewer(pdb, new Sequence[]
+      new MCview.AppletPDBViewer(pdb, new SequenceI[]
       { seq }, null, alignFrame.alignPanel, AppletFormatAdapter.PASTE);
     }
   }
index 4ea0046..ae4ae10 100644 (file)
  */
 package jalview.appletgui;
 
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Panel;
+import java.awt.Point;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.List;
+import java.util.Vector;
+
 import jalview.api.AlignViewportI;
 import jalview.commands.EditCommand;
 import jalview.commands.EditCommand.Action;
@@ -39,18 +51,6 @@ import jalview.structure.VamsasSource;
 import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
 
-import java.awt.BorderLayout;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Panel;
-import java.awt.Point;
-import java.awt.event.InputEvent;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.util.List;
-import java.util.Vector;
-
 public class SeqPanel extends Panel implements MouseMotionListener,
         MouseListener, SequenceListener, SelectionListener
 {
@@ -1462,7 +1462,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
       SequenceFeature[] allFeatures = findFeaturesAtRes(sequence,
               sequence.findPosition(res));
 
-      Vector links = null;
+      Vector<String> links = null;
       if (allFeatures != null)
       {
         for (int i = 0; i < allFeatures.length; i++)
@@ -1471,7 +1471,7 @@ public class SeqPanel extends Panel implements MouseMotionListener,
           {
             if (links == null)
             {
-              links = new Vector();
+              links = new Vector<String>();
             }
             for (int j = 0; j < allFeatures[i].links.size(); j++)
             {
index 48b7f88..28ab82c 100755 (executable)
@@ -20,7 +20,8 @@
  */
 package jalview.datamodel;
 
-import java.util.*;
+import java.util.Hashtable;
+import java.util.Vector;
 
 /**
  * DOCUMENT ME!
@@ -42,7 +43,7 @@ public class SequenceFeature
 
   public Hashtable otherDetails;
 
-  public java.util.Vector links;
+  public Vector<String> links;
 
   // Feature group can be set from a features file
   // as a group of features between STARTGROUP and ENDGROUP markers
@@ -90,7 +91,7 @@ public class SequenceFeature
       }
       if (cpy.links != null && cpy.links.size() > 0)
       {
-        links = new Vector();
+        links = new Vector<String>();
         for (int i = 0, iSize = cpy.links.size(); i < iSize; i++)
         {
           links.addElement(cpy.links.elementAt(i));
@@ -211,7 +212,7 @@ public class SequenceFeature
   {
     if (links == null)
     {
-      links = new java.util.Vector();
+      links = new Vector<String>();
     }
 
     links.insertElementAt(labelLink, 0);
@@ -283,7 +284,9 @@ public class SequenceFeature
     {
       String stat = (String) otherDetails.get("status");
       if (stat != null)
+      {
         return new String(stat);
+      }
     }
     return null;
   }
index 5cc48fd..c7792a5 100644 (file)
  */
 package jalview.gui;
 
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+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;
+import java.beans.PropertyChangeEvent;
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Deque;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JEditorPane;
+import javax.swing.JInternalFrame;
+import javax.swing.JLabel;
+import javax.swing.JLayeredPane;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+
 import jalview.analysis.AAFrequency;
 import jalview.analysis.AlignmentSorter;
 import jalview.analysis.AlignmentUtils;
@@ -96,57 +147,6 @@ import jalview.ws.jws2.Jws2Discoverer;
 import jalview.ws.jws2.jabaws2.Jws2Instance;
 import jalview.ws.seqfetcher.DbSourceProxy;
 
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.GridLayout;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.StringSelection;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.DnDConstants;
-import java.awt.dnd.DropTargetDragEvent;
-import java.awt.dnd.DropTargetDropEvent;
-import java.awt.dnd.DropTargetEvent;
-import java.awt.dnd.DropTargetListener;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-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;
-import java.beans.PropertyChangeEvent;
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Deque;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-
-import javax.swing.JButton;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JEditorPane;
-import javax.swing.JInternalFrame;
-import javax.swing.JLabel;
-import javax.swing.JLayeredPane;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JProgressBar;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.JScrollPane;
-import javax.swing.SwingUtilities;
-
 /**
  * DOCUMENT ME!
  * 
@@ -4323,7 +4323,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    *          DOCUMENT ME!
    */
   @Override
-  protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
+  protected void loadTreeMenuItem_actionPerformed(ActionEvent e)
   {
     // Pick the tree file
     JalviewFileChooser chooser = new JalviewFileChooser(
index 405782d..e4593a3 100644 (file)
  */
 package jalview.gui;
 
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.Vector;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
 import jalview.analysis.AlignmentUtils;
 import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.NJTree;
@@ -63,18 +75,6 @@ import jalview.util.MessageManager;
 import jalview.viewmodel.AlignmentViewport;
 import jalview.ws.params.AutoCalcSetting;
 
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Rectangle;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Set;
-import java.util.Vector;
-
-import javax.swing.JInternalFrame;
-import javax.swing.JOptionPane;
-
 /**
  * DOCUMENT ME!
  * 
@@ -92,9 +92,6 @@ public class AlignViewport extends AlignmentViewport implements
 
   int endSeq;
 
-
-  SequenceAnnotationOrder sortAnnotationsBy = null;
-
   Font font;
 
   NJTree currentTree = null;
@@ -841,8 +838,6 @@ public class AlignViewport extends AlignmentViewport implements
 
   private Hashtable<String, AutoCalcSetting> calcIdParams = new Hashtable<String, AutoCalcSetting>();
 
-  private boolean showAutocalculatedAbove;
-
   public AutoCalcSetting getCalcIdSettingsFor(String calcId)
   {
     return calcIdParams.get(calcId);
@@ -861,26 +856,6 @@ public class AlignViewport extends AlignmentViewport implements
     }
   }
 
-  protected SequenceAnnotationOrder getSortAnnotationsBy()
-  {
-    return sortAnnotationsBy;
-  }
-
-  protected void setSortAnnotationsBy(SequenceAnnotationOrder sortAnnotationsBy)
-  {
-    this.sortAnnotationsBy = sortAnnotationsBy;
-  }
-
-  protected boolean isShowAutocalculatedAbove()
-  {
-    return showAutocalculatedAbove;
-  }
-
-  protected void setShowAutocalculatedAbove(boolean showAutocalculatedAbove)
-  {
-    this.showAutocalculatedAbove = showAutocalculatedAbove;
-  }
-
   /**
    * Method called when another alignment's edit (or possibly other) command is
    * broadcast to here.
index 891aaf7..a544813 100755 (executable)
  */
 package jalview.gui;
 
-import jalview.datamodel.Alignment;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.Annotation;
-import jalview.datamodel.Sequence;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
-import jalview.io.FormatAdapter;
-import jalview.util.MessageManager;
-
 import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Font;
@@ -49,6 +40,7 @@ import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.regex.Pattern;
 
 import javax.swing.JCheckBoxMenuItem;
@@ -58,6 +50,16 @@ import javax.swing.JPopupMenu;
 import javax.swing.SwingUtilities;
 import javax.swing.ToolTipManager;
 
+import jalview.analysis.AlignmentUtils;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+import jalview.io.FormatAdapter;
+import jalview.util.MessageManager;
+
 /**
  * DOCUMENT ME!
  * 
@@ -623,11 +625,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     item.addActionListener(this);
     pop.add(item);
     // JAL-1264 hide all sequence-specific annotations of this type
-    final String label = aa[selectedRow].label;
     if (selectedRow < aa.length)
     {
       if (aa[selectedRow].sequenceRef != null)
       {
+        final String label = aa[selectedRow].label;
         JMenuItem hideType = new JMenuItem();
         String text = MessageManager.getString("label.hide_all") + " " + label;
         hideType.setText(text);
@@ -636,15 +638,18 @@ public class AnnotationLabels extends JPanel implements MouseListener,
           @Override
           public void actionPerformed(ActionEvent e)
           {
-            for (AlignmentAnnotation ann : ap.av.getAlignment()
-                    .getAlignmentAnnotation())
-            {
-              if (ann.sequenceRef != null && ann.label != null
-                      && ann.label.equals(label))
-              {
-                ann.visible = false;
-              }
-            }
+            AlignmentUtils.showOrHideSequenceAnnotations(
+                    ap.av.getAlignment(), Collections.singleton(label),
+                    null, false, false);
+            // for (AlignmentAnnotation ann : ap.av.getAlignment()
+            // .getAlignmentAnnotation())
+            // {
+            // if (ann.sequenceRef != null && ann.label != null
+            // && ann.label.equals(label))
+            // {
+            // ann.visible = false;
+            // }
+            // }
             refresh();
           }
         });
@@ -667,6 +672,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     // property methods
     if (selectedRow < aa.length)
     {
+      final String label = aa[selectedRow].label;
       if (!aa[selectedRow].autoCalculated)
       {
         if (aa[selectedRow].graph == AlignmentAnnotation.NO_GRAPH)
index 0000291..174772c 100644 (file)
@@ -23,9 +23,7 @@ package jalview.gui;
 import java.awt.Color;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.Hashtable;
 import java.util.LinkedHashMap;
@@ -45,6 +43,7 @@ import javax.swing.JRadioButtonMenuItem;
 
 import jalview.analysis.AAFrequency;
 import jalview.analysis.AlignmentAnnotationUtils;
+import jalview.analysis.AlignmentUtils;
 import jalview.analysis.Conservation;
 import jalview.commands.ChangeCaseCommand;
 import jalview.commands.EditCommand;
@@ -198,13 +197,15 @@ public class PopupMenu extends JPopupMenu
 
   JMenu seqHideAnnotationsMenu = new JMenu();
 
-  JMenuItem seqAddReferenceAnnotations = new JMenuItem();
+  JMenuItem seqAddReferenceAnnotations = new JMenuItem(
+          MessageManager.getString("label.add_reference_annotations"));
 
   JMenu groupShowAnnotationsMenu = new JMenu();
 
   JMenu groupHideAnnotationsMenu = new JMenu();
 
-  JMenuItem groupAddReferenceAnnotations = new JMenuItem();
+  JMenuItem groupAddReferenceAnnotations = new JMenuItem(
+          MessageManager.getString("label.add_reference_annotations"));
 
   JMenuItem sequenceFeature = new JMenuItem();
 
@@ -946,7 +947,7 @@ public class PopupMenu extends JPopupMenu
           final boolean actionIsShow)
   {
     String label = types.toString(); // [a, b, c]
-    label = label.substring(1, label.length() - 1);
+    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()
@@ -954,41 +955,14 @@ public class PopupMenu extends JPopupMenu
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        showHideAnnotation_actionPerformed(types, forSequences, allTypes,
-                actionIsShow);
+        AlignmentUtils.showOrHideSequenceAnnotations(ap.getAlignment(), types,
+                forSequences, allTypes, actionIsShow);
+        refresh();
       }
     });
     showOrHideMenu.add(item);
   }
 
-  /**
-   * Action on selecting a list of annotation type (or the 'all types' values)
-   * to show or hide for the specified sequences.
-   * 
-   * @param types
-   * @param forSequences
-   * @param anyType
-   * @param doShow
-   */
-  protected void showHideAnnotation_actionPerformed(
-          Collection<String> types, List<SequenceI> forSequences,
-          boolean anyType, boolean doShow)
-  {
-    for (AlignmentAnnotation aa : ap.getAlignment()
-            .getAlignmentAnnotation())
-    {
-      if (anyType || types.contains(aa.label))
-      {
-        if ((aa.sequenceRef != null)
-                && forSequences.contains(aa.sequenceRef))
-        {
-          aa.visible = doShow;
-        }
-      }
-    }
-    refresh();
-  }
-
   private void buildGroupURLMenu(SequenceGroup sg, Vector groupLinks)
   {
 
@@ -1815,68 +1789,22 @@ public class PopupMenu extends JPopupMenu
   protected void configureReferenceAnnotationsMenu(
           JMenuItem menuItem, List<SequenceI> forSequences)
   {
-    menuItem.setText(MessageManager
-            .getString("label.add_reference_annotations"));
     menuItem.setEnabled(false);
-    if (forSequences == null)
-    {
-      return;
-    }
 
     /*
      * 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>();
-    StringBuilder tooltip = new StringBuilder(64);
-    tooltip.append(MessageManager.getString("label.add_annotations_for"));
-
-    /*
-     * For each sequence selected in the alignment, make a list of any
-     * annotations on the underlying dataset sequence which are not already on
-     * the alignment.
-     * 
-     * Build a map of { alignmentSequence, <List of annotations to add> }
-     */
-    AlignmentI al = this.ap.av.getAlignment();
     final Map<SequenceI, List<AlignmentAnnotation>> candidates = new LinkedHashMap<SequenceI, List<AlignmentAnnotation>>();
-    for (SequenceI seq : forSequences)
-    {
-      SequenceI dataset = seq.getDatasetSequence();
-      if (dataset == null)
-      {
-        continue;
-      }
-      AlignmentAnnotation[] datasetAnnotations = dataset.getAnnotation();
-      if (datasetAnnotations == null)
-      {
-        continue;
-      }
-      final List<AlignmentAnnotation> result = new ArrayList<AlignmentAnnotation>();
-      for (AlignmentAnnotation dsann : datasetAnnotations)
-      {
-        /*
-         * Find matching annotations on the alignment.
-         */
-        final Iterable<AlignmentAnnotation> matchedAlignmentAnnotations = al
-                .findAnnotations(seq, dsann.getCalcId(),
-                        dsann.label);
-        if (!matchedAlignmentAnnotations.iterator().hasNext())
-        {
-          result.add(dsann);
-          tipEntries.put(dsann.getCalcId(), dsann.label);
-        }
-      }
-      /*
-       * Save any addable annotations for this sequence
-       */
-      if (!result.isEmpty())
-      {
-        candidates.put(seq, result);
-      }
-    }
+    AlignmentI al = this.ap.av.getAlignment();
+    AlignmentUtils.findAddableReferenceAnnotations(forSequences,
+            tipEntries, candidates, al);
     if (!candidates.isEmpty())
     {
+      StringBuilder tooltip = new StringBuilder(64);
+      tooltip.append(MessageManager.getString("label.add_annotations_for"));
+
       /*
        * Found annotations that could be added. Enable the menu item, and
        * configure its tooltip and action.
@@ -1911,40 +1839,10 @@ public class PopupMenu extends JPopupMenu
   protected void addReferenceAnnotations_actionPerformed(
           Map<SequenceI, List<AlignmentAnnotation>> candidates)
   {
-    /*
-     * Add annotations at the top of the annotation, in the same order as their
-     * related sequences.
-     */
-    for (SequenceI seq : candidates.keySet())
-    {
-      for (AlignmentAnnotation ann : candidates.get(seq))
-      {
-        AlignmentAnnotation copyAnn = new AlignmentAnnotation(ann);
-        int startRes = 0;
-        int endRes = ann.annotations.length;
-        final SequenceGroup selectionGroup = this.ap.av.getSelectionGroup();
-        if (selectionGroup != null)
-        {
-          startRes = selectionGroup.getStartRes();
-          endRes = selectionGroup.getEndRes();
-        }
-        copyAnn.restrict(startRes, endRes);
-
-        /*
-         * Add to the sequence (sets copyAnn.datasetSequence), unless the
-         * original annotation is already on the sequence.
-         */
-        if (!seq.hasAnnotation(ann))
-        {
-          seq.addAlignmentAnnotation(copyAnn);
-        }
-        // adjust for gaps
-        copyAnn.adjustForAlignment();
-        // add to the alignment and set visible
-        this.ap.getAlignment().addAnnotation(copyAnn);
-        copyAnn.visible = true;
-      }
-    }
+    final SequenceGroup selectionGroup = this.ap.av.getSelectionGroup();
+    final AlignmentI alignment = this.ap.getAlignment();
+    AlignmentUtils.addReferenceAnnotations(candidates, alignment,
+            selectionGroup);
     refresh();
   }
 
index 75d09d3..befa3b1 100755 (executable)
  */
 package jalview.jbgui;
 
-import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
-import jalview.api.SplitContainerI;
-import jalview.bin.Cache;
-import jalview.gui.JvSwingUtils;
-import jalview.gui.Preferences;
-import jalview.schemes.ColourSchemeProperty;
-import jalview.util.MessageManager;
-
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.GridLayout;
@@ -60,72 +52,34 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.MenuEvent;
 import javax.swing.event.MenuListener;
 
+import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
+import jalview.api.SplitContainerI;
+import jalview.bin.Cache;
+import jalview.gui.JvSwingUtils;
+import jalview.gui.Preferences;
+import jalview.schemes.ColourSchemeProperty;
+import jalview.util.MessageManager;
+
 public class GAlignFrame extends JInternalFrame
 {
   protected JMenuBar alignFrameMenuBar = new JMenuBar();
 
-  protected JMenu fileMenu = new JMenu();
-
   protected JMenuItem closeMenuItem = new JMenuItem();
 
-  protected JMenu editMenu = new JMenu();
-
-  protected JMenu viewMenu = new JMenu();
-
-  protected JMenu annotationsMenu = new JMenu();
-
   protected JMenu colourMenu = new JMenu();
 
-  protected JMenu calculateMenu = new JMenu();
-
   protected JMenu webService = new JMenu();
 
   protected JMenuItem webServiceNoServices;
 
-  protected JMenuItem selectAllSequenceMenuItem = new JMenuItem();
-
-  protected JMenuItem deselectAllSequenceMenuItem = new JMenuItem();
-
-  protected JMenuItem invertSequenceMenuItem = new JMenuItem();
-
-  protected JMenuItem remove2LeftMenuItem = new JMenuItem();
-
-  protected JMenuItem remove2RightMenuItem = new JMenuItem();
-
-  protected JMenuItem removeGappedColumnMenuItem = new JMenuItem();
-
-  protected JMenuItem removeAllGapsMenuItem = new JMenuItem();
-
   public JCheckBoxMenuItem viewBoxesMenuItem = new JCheckBoxMenuItem();
 
   public JCheckBoxMenuItem viewTextMenuItem = new JCheckBoxMenuItem();
 
-  protected JMenuItem sortPairwiseMenuItem = new JMenuItem();
-
-  protected JMenuItem sortIDMenuItem = new JMenuItem();
-
-  protected JMenuItem sortLengthMenuItem = new JMenuItem();
-
-  protected JMenuItem sortGroupMenuItem = new JMenuItem();
-
   protected JMenu sortByAnnotScore = new JMenu();
 
-  protected JMenuItem removeRedundancyMenuItem = new JMenuItem();
-
-  protected JMenuItem pairwiseAlignmentMenuItem = new JMenuItem();
-
-  protected JMenuItem PCAMenuItem = new JMenuItem();
-
-  protected JMenuItem averageDistanceTreeMenuItem = new JMenuItem();
-
-  protected JMenuItem neighbourTreeMenuItem = new JMenuItem();
-
-  BorderLayout borderLayout1 = new BorderLayout();
-
   public JLabel statusBar = new JLabel();
 
-  protected JMenuItem saveAs = new JMenuItem();
-
   protected JMenu outputTextboxMenu = new JMenu();
 
   protected JRadioButtonMenuItem clustalColour = new JRadioButtonMenuItem();
@@ -161,20 +115,12 @@ public class GAlignFrame extends JInternalFrame
 
   protected JRadioButtonMenuItem tcoffeeColour = new JRadioButtonMenuItem();
 
-  JMenuItem njTreeBlosumMenuItem = new JMenuItem();
-
-  JMenuItem avDistanceTreeBlosumMenuItem = new JMenuItem();
-
   public JCheckBoxMenuItem annotationPanelMenuItem = new JCheckBoxMenuItem();
 
   public JCheckBoxMenuItem colourTextMenuItem = new JCheckBoxMenuItem();
 
   public JCheckBoxMenuItem showNonconservedMenuItem = new JCheckBoxMenuItem();
 
-  JMenuItem htmlMenuItem = new JMenuItem();
-
-  JMenuItem overviewMenuItem = new JMenuItem();
-
   protected JMenuItem undoMenuItem = new JMenuItem();
 
   protected JMenuItem redoMenuItem = new JMenuItem();
@@ -185,60 +131,30 @@ public class GAlignFrame extends JInternalFrame
 
   public JCheckBoxMenuItem wrapMenuItem = new JCheckBoxMenuItem();
 
-  JMenuItem printMenuItem = new JMenuItem();
-
   public JCheckBoxMenuItem renderGapsMenuItem = new JCheckBoxMenuItem();
 
-  JMenuItem findMenuItem = new JMenuItem();
-
   public JCheckBoxMenuItem abovePIDThreshold = new JCheckBoxMenuItem();
 
   public JCheckBoxMenuItem showSeqFeatures = new JCheckBoxMenuItem();
 
   public JCheckBoxMenuItem showSeqFeaturesHeight = new JCheckBoxMenuItem();
 
-  JMenuItem deleteGroups = new JMenuItem();
-
-  JMenuItem createGroup = new JMenuItem();
-
-  JMenuItem unGroup = new JMenuItem();
-
-  JMenuItem delete = new JMenuItem();
-
   JMenuItem copy = new JMenuItem();
 
   JMenuItem cut = new JMenuItem();
 
   JMenu pasteMenu = new JMenu();
 
-  JMenuItem pasteNew = new JMenuItem();
-
-  JMenuItem pasteThis = new JMenuItem();
-
   public JCheckBoxMenuItem applyToAllGroups = new JCheckBoxMenuItem();
 
-  JMenuItem createPNG = new JMenuItem();
-
-  JMenuItem createBioJS = new JMenuItem();
-
-  JMenuItem createSVG = new JMenuItem();
-
-  protected JMenuItem font = new JMenuItem();
-
   public JCheckBoxMenuItem seqLimits = new JCheckBoxMenuItem();
 
-  JMenuItem epsFile = new JMenuItem();
-
-  JMenuItem LoadtreeMenuItem = new JMenuItem();
-
   public JCheckBoxMenuItem scaleAbove = new JCheckBoxMenuItem();
 
   public JCheckBoxMenuItem scaleLeft = new JCheckBoxMenuItem();
 
   public JCheckBoxMenuItem scaleRight = new JCheckBoxMenuItem();
 
-  protected JMenuItem modifyPID = new JMenuItem();
-
   protected JMenuItem modifyConservation = new JMenuItem();
 
   protected JMenu sortByTreeMenu = new JMenu();
@@ -247,8 +163,6 @@ public class GAlignFrame extends JInternalFrame
 
   protected JMenu calculateTree = new JMenu();
 
-  JMenu jMenu2 = new JMenu();
-
   protected JCheckBoxMenuItem padGapsMenuitem = new JCheckBoxMenuItem();
 
   protected JCheckBoxMenuItem showNpFeatsMenuitem = new JCheckBoxMenuItem();
@@ -257,68 +171,20 @@ public class GAlignFrame extends JInternalFrame
 
   protected ButtonGroup colours = new ButtonGroup();
 
-  JMenuItem vamsasStore = new JMenuItem();
-
   protected JMenuItem showTranslation = new JMenuItem();
 
-  protected JMenuItem extractScores = new JMenuItem();
-
-  protected JMenuItem expandAlignment = new JMenuItem();
-
   protected JMenu showProducts = new JMenu();
 
-  public JMenuItem openFeatureSettings = new JMenuItem();
-
-  JMenuItem fetchSequence = new JMenuItem();
-
-  JMenuItem annotationColour = new JMenuItem();
-
-  JMenuItem annotationColumn = new JMenuItem();
-
   protected JMenuItem rnahelicesColour = new JMenuItem();
 
-  JMenuItem associatedData = new JMenuItem();
-
   protected JCheckBoxMenuItem autoCalculate = new JCheckBoxMenuItem();
 
   protected JCheckBoxMenuItem sortByTree = new JCheckBoxMenuItem();
 
   protected JCheckBoxMenuItem listenToViewSelections = new JCheckBoxMenuItem();
 
-  JMenu addSequenceMenu = new JMenu();
-
-  JMenuItem addFromFile = new JMenuItem();
-
-  JMenuItem addFromText = new JMenuItem();
-
-  JMenuItem addFromURL = new JMenuItem();
-
-  JMenuItem exportAnnotations = new JMenuItem();
-
-  JMenuItem exportFeatures = new JMenuItem();
-
   protected JPanel statusPanel = new JPanel();
 
-  GridLayout gridLayout1 = new GridLayout();
-
-  JMenu showMenu = new JMenu();
-
-  JMenuItem showAllSeqs = new JMenuItem();
-
-  JMenuItem showAllColumns = new JMenuItem();
-
-  JMenu hideMenu = new JMenu();
-
-  JMenuItem hideSelSequences = new JMenuItem();
-
-  JMenuItem hideSelColumns = new JMenuItem();
-
-  JMenuItem hideAllButSelection = new JMenuItem();
-
-  JMenuItem hideAllSelection = new JMenuItem();
-
-  JMenuItem showAllhidden = new JMenuItem();
-
   protected JMenuItem showAllSeqAnnotations = new JMenuItem();
 
   protected JMenuItem hideAllSeqAnnotations = new JMenuItem();
@@ -329,28 +195,14 @@ public class GAlignFrame extends JInternalFrame
 
   protected JCheckBoxMenuItem showComplementMenuItem = new JCheckBoxMenuItem();
 
-  protected JCheckBoxMenuItem sortAnnBySequence = new JCheckBoxMenuItem();
-
-  protected JCheckBoxMenuItem sortAnnByLabel = new JCheckBoxMenuItem();
-
   protected JCheckBoxMenuItem hiddenMarkers = new JCheckBoxMenuItem();
 
-  JMenuItem invertColSel = new JMenuItem();
-
   protected JTabbedPane tabbedPane = new JTabbedPane();
 
-  JMenuItem save = new JMenuItem();
-
   protected JMenuItem reload = new JMenuItem();
 
-  JMenuItem newView = new JMenuItem();
-
-  JMenuItem textColour = new JMenuItem();
-
   protected JMenu formatMenu = new JMenu();
 
-  JMenu selectMenu = new JMenu();
-
   protected JCheckBoxMenuItem idRightAlign = new JCheckBoxMenuItem();
 
   protected JCheckBoxMenuItem centreColumnLabelsMenuItem = new JCheckBoxMenuItem();
@@ -361,18 +213,6 @@ public class GAlignFrame extends JInternalFrame
 
   protected JMenuItem expandViews = new JMenuItem();
 
-  JMenuItem pageSetup = new JMenuItem();
-
-  JMenuItem alignmentProperties = new JMenuItem();
-
-  JMenu tooltipSettingsMenu = new JMenu();
-
-  private JMenuItem justifyLeftMenuItem = new JMenuItem();
-
-  private JMenuItem justifyRightMenuItem = new JMenuItem();
-
-  JMenu autoAnnMenu = new JMenu();
-
   protected JCheckBoxMenuItem showGroupConsensus = new JCheckBoxMenuItem();
 
   protected JCheckBoxMenuItem showGroupConservation = new JCheckBoxMenuItem();
@@ -385,12 +225,6 @@ public class GAlignFrame extends JInternalFrame
 
   protected JCheckBoxMenuItem applyAutoAnnotationSettings = new JCheckBoxMenuItem();
 
-  protected JRadioButtonMenuItem showAutoFirst = new JRadioButtonMenuItem();
-
-  protected JRadioButtonMenuItem showAutoLast = new JRadioButtonMenuItem();
-
-  private JMenuItem grpsFromSelection = new JMenuItem();
-
   private SequenceAnnotationOrder annotationSortOrder;
 
   private boolean showAutoCalculatedAbove = false;
@@ -619,9 +453,8 @@ public class GAlignFrame extends JInternalFrame
 
   private void jbInit() throws Exception
   {
-    fileMenu.setText(MessageManager.getString("action.file"));
-
-    saveAs.setText(MessageManager.getString("action.save_as") + "...");
+    JMenuItem saveAs = new JMenuItem(
+            MessageManager.getString("action.save_as") + "...");
     ActionListener al = new ActionListener()
     {
       @Override
@@ -648,14 +481,17 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, closeMenuItem, al);
 
-    editMenu.setText(MessageManager.getString("action.edit"));
-    viewMenu.setText(MessageManager.getString("action.view"));
-    annotationsMenu.setText(MessageManager.getString("action.annotations"));
+    JMenu editMenu = new JMenu(MessageManager.getString("action.edit"));
+    JMenu viewMenu = new JMenu(MessageManager.getString("action.view"));
+    JMenu annotationsMenu = new JMenu(
+            MessageManager.getString("action.annotations"));
+    JMenu showMenu = new JMenu(MessageManager.getString("action.show"));
     colourMenu.setText(MessageManager.getString("action.colour"));
-    calculateMenu.setText(MessageManager.getString("action.calculate"));
+    JMenu calculateMenu = new JMenu(
+            MessageManager.getString("action.calculate"));
     webService.setText(MessageManager.getString("action.web_service"));
-
-    selectAllSequenceMenuItem.setText(MessageManager
+    JMenuItem selectAllSequenceMenuItem = new JMenuItem(
+            MessageManager
             .getString("action.select_all"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
@@ -669,8 +505,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, selectAllSequenceMenuItem, al);
 
-    deselectAllSequenceMenuItem.setText(MessageManager
-            .getString("action.deselect_all"));
+    JMenuItem deselectAllSequenceMenuItem = new JMenuItem(
+            MessageManager.getString("action.deselect_all"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false);
     al = new ActionListener()
     {
@@ -682,8 +518,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, deselectAllSequenceMenuItem, al);
 
-    invertSequenceMenuItem.setText(MessageManager
-            .getString("action.invert_sequence_selection"));
+    JMenuItem invertSequenceMenuItem = new JMenuItem(
+            MessageManager.getString("action.invert_sequence_selection"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -696,8 +532,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, invertSequenceMenuItem, al);
 
-    grpsFromSelection.setText(MessageManager
-            .getString("action.make_groups_selection"));
+    JMenuItem grpsFromSelection = new JMenuItem(
+            MessageManager.getString("action.make_groups_selection"));
     grpsFromSelection.addActionListener(new ActionListener()
     {
       @Override
@@ -706,8 +542,8 @@ public class GAlignFrame extends JInternalFrame
         makeGrpsFromSelection_actionPerformed(e);
       }
     });
-    expandAlignment.setText(MessageManager
-            .getString("action.view_flanking_regions"));
+    JMenuItem expandAlignment = new JMenuItem(
+            MessageManager.getString("action.view_flanking_regions"));
     expandAlignment.setToolTipText(MessageManager
             .getString("label.view_flanking_regions"));
     expandAlignment.addActionListener(new ActionListener()
@@ -718,8 +554,8 @@ public class GAlignFrame extends JInternalFrame
         expand_newalign(e);
       }
     });
-    remove2LeftMenuItem.setText(MessageManager
-            .getString("action.remove_left"));
+    JMenuItem remove2LeftMenuItem = new JMenuItem(
+            MessageManager.getString("action.remove_left"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_L, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -732,8 +568,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, remove2LeftMenuItem, al);
 
-    remove2RightMenuItem.setText(MessageManager
-            .getString("action.remove_right"));
+    JMenuItem remove2RightMenuItem = new JMenuItem(
+            MessageManager.getString("action.remove_right"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_R, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -746,8 +582,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, remove2RightMenuItem, al);
 
-    removeGappedColumnMenuItem.setText(MessageManager
-            .getString("action.remove_empty_columns"));
+    JMenuItem removeGappedColumnMenuItem = new JMenuItem(
+            MessageManager.getString("action.remove_empty_columns"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -760,8 +596,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, removeGappedColumnMenuItem, al);
 
-    removeAllGapsMenuItem.setText(MessageManager
-            .getString("action.remove_all_gaps"));
+    JMenuItem removeAllGapsMenuItem = new JMenuItem(
+            MessageManager.getString("action.remove_all_gaps"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_E, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask()
             | KeyEvent.SHIFT_MASK, false);
@@ -775,8 +611,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, removeAllGapsMenuItem, al);
 
-    justifyLeftMenuItem.setText(MessageManager
-            .getString("action.left_justify_alignment"));
+    JMenuItem justifyLeftMenuItem = new JMenuItem(
+            MessageManager.getString("action.left_justify_alignment"));
     justifyLeftMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -785,8 +621,8 @@ public class GAlignFrame extends JInternalFrame
         justifyLeftMenuItem_actionPerformed(e);
       }
     });
-    justifyRightMenuItem.setText(MessageManager
-            .getString("action.right_justify_alignment"));
+    JMenuItem justifyRightMenuItem = new JMenuItem(
+            MessageManager.getString("action.right_justify_alignment"));
     justifyRightMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -826,8 +662,8 @@ public class GAlignFrame extends JInternalFrame
         showUnconservedMenuItem_actionPerformed(e);
       }
     });
-    sortPairwiseMenuItem.setText(MessageManager
-            .getString("action.by_pairwise_id"));
+    JMenuItem sortPairwiseMenuItem = new JMenuItem(
+            MessageManager.getString("action.by_pairwise_id"));
     sortPairwiseMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -836,7 +672,8 @@ public class GAlignFrame extends JInternalFrame
         sortPairwiseMenuItem_actionPerformed(e);
       }
     });
-    sortIDMenuItem.setText(MessageManager.getString("action.by_id"));
+    JMenuItem sortIDMenuItem = new JMenuItem(
+            MessageManager.getString("action.by_id"));
     sortIDMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -845,8 +682,8 @@ public class GAlignFrame extends JInternalFrame
         sortIDMenuItem_actionPerformed(e);
       }
     });
-    sortLengthMenuItem
-            .setText(MessageManager.getString("action.by_length"));
+    JMenuItem sortLengthMenuItem = new JMenuItem(
+            MessageManager.getString("action.by_length"));
     sortLengthMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -855,7 +692,8 @@ public class GAlignFrame extends JInternalFrame
         sortLengthMenuItem_actionPerformed(e);
       }
     });
-    sortGroupMenuItem.setText(MessageManager.getString("action.by_group"));
+    JMenuItem sortGroupMenuItem = new JMenuItem(
+            MessageManager.getString("action.by_group"));
     sortGroupMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -865,8 +703,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    removeRedundancyMenuItem.setText(MessageManager.getString(
-            "action.remove_redundancy").concat("..."));
+    JMenuItem removeRedundancyMenuItem = new JMenuItem(MessageManager
+            .getString("action.remove_redundancy").concat("..."));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -879,8 +717,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, removeRedundancyMenuItem, al);
 
-    pairwiseAlignmentMenuItem.setText(MessageManager
-            .getString("action.pairwise_alignment"));
+    JMenuItem pairwiseAlignmentMenuItem = new JMenuItem(
+            MessageManager.getString("action.pairwise_alignment"));
     pairwiseAlignmentMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -889,8 +727,8 @@ public class GAlignFrame extends JInternalFrame
         pairwiseAlignmentMenuItem_actionPerformed(e);
       }
     });
-    PCAMenuItem.setText(MessageManager
-            .getString("label.principal_component_analysis"));
+    JMenuItem PCAMenuItem = new JMenuItem(
+            MessageManager.getString("label.principal_component_analysis"));
     PCAMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -899,8 +737,8 @@ public class GAlignFrame extends JInternalFrame
         PCAMenuItem_actionPerformed(e);
       }
     });
-    averageDistanceTreeMenuItem.setText(MessageManager
-            .getString("label.average_distance_identity"));
+    JMenuItem averageDistanceTreeMenuItem = new JMenuItem(
+            MessageManager.getString("label.average_distance_identity"));
     averageDistanceTreeMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -909,8 +747,8 @@ public class GAlignFrame extends JInternalFrame
         averageDistanceTreeMenuItem_actionPerformed(e);
       }
     });
-    neighbourTreeMenuItem.setText(MessageManager
-            .getString("label.neighbour_joining_identity"));
+    JMenuItem neighbourTreeMenuItem = new JMenuItem(
+            MessageManager.getString("label.neighbour_joining_identity"));
     neighbourTreeMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -919,7 +757,8 @@ public class GAlignFrame extends JInternalFrame
         neighbourTreeMenuItem_actionPerformed(e);
       }
     });
-    this.getContentPane().setLayout(borderLayout1);
+
+    this.getContentPane().setLayout(new BorderLayout());
     alignFrameMenuBar.setFont(new java.awt.Font("Verdana", 0, 11));
     statusBar.setBackground(Color.white);
     statusBar.setFont(new java.awt.Font("Verdana", 0, 11));
@@ -928,7 +767,6 @@ public class GAlignFrame extends JInternalFrame
     outputTextboxMenu.setText(MessageManager
             .getString("label.out_to_textbox"));
     clustalColour.setText(MessageManager.getString("label.clustalx"));
-
     clustalColour.addActionListener(new ActionListener()
     {
       @Override
@@ -1069,8 +907,8 @@ public class GAlignFrame extends JInternalFrame
      * });
      */
 
-    avDistanceTreeBlosumMenuItem.setText(MessageManager
-            .getString("label.average_distance_bloslum62"));
+    JMenuItem avDistanceTreeBlosumMenuItem = new JMenuItem(
+            MessageManager.getString("label.average_distance_bloslum62"));
     avDistanceTreeBlosumMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -1079,8 +917,8 @@ public class GAlignFrame extends JInternalFrame
         avTreeBlosumMenuItem_actionPerformed(e);
       }
     });
-    njTreeBlosumMenuItem.setText(MessageManager
-            .getString("label.neighbour_blosum62"));
+    JMenuItem njTreeBlosumMenuItem = new JMenuItem(
+            MessageManager.getString("label.neighbour_blosum62"));
     njTreeBlosumMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -1151,8 +989,11 @@ public class GAlignFrame extends JInternalFrame
     SequenceAnnotationOrder sortAnnotationsBy = SequenceAnnotationOrder
             .valueOf(Cache.getDefault(Preferences.SORT_ANNOTATIONS,
                     SequenceAnnotationOrder.NONE.name()));
-    sortAnnBySequence.setText(MessageManager
-            .getString("label.sort_annotations_by_sequence"));
+    final JCheckBoxMenuItem sortAnnBySequence = new JCheckBoxMenuItem(
+            MessageManager.getString("label.sort_annotations_by_sequence"));
+    final JCheckBoxMenuItem sortAnnByLabel = new JCheckBoxMenuItem(
+            MessageManager.getString("label.sort_annotations_by_label"));
+
     sortAnnBySequence
             .setSelected(sortAnnotationsBy == SequenceAnnotationOrder.SEQUENCE_AND_LABEL);
     sortAnnBySequence.addActionListener(new ActionListener()
@@ -1167,8 +1008,6 @@ public class GAlignFrame extends JInternalFrame
         sortAnnotations_actionPerformed();
       }
     });
-    sortAnnByLabel.setText(MessageManager
-            .getString("label.sort_annotations_by_label"));
     sortAnnByLabel
             .setSelected(sortAnnotationsBy == SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
     sortAnnByLabel.addActionListener(new ActionListener()
@@ -1193,7 +1032,9 @@ public class GAlignFrame extends JInternalFrame
         colourTextMenuItem_actionPerformed(e);
       }
     });
-    htmlMenuItem.setText(MessageManager.getString("label.html"));
+
+    JMenuItem htmlMenuItem = new JMenuItem(
+            MessageManager.getString("label.html"));
     htmlMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -1203,9 +1044,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    // TODO uncomment when supported by MassageManager
-    // createBioJS.setText(MessageManager.getString("label.biojs_html_export"));
-    createBioJS.setText("BioJS");
+    JMenuItem createBioJS = new JMenuItem(
+            MessageManager.getString("label.biojs_html_export"));
     createBioJS.addActionListener(new java.awt.event.ActionListener()
     {
       @Override
@@ -1215,8 +1055,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    overviewMenuItem.setText(MessageManager
-            .getString("label.overview_window"));
+    JMenuItem overviewMenuItem = new JMenuItem(
+            MessageManager.getString("label.overview_window"));
     overviewMenuItem.addActionListener(new ActionListener()
     {
       @Override
@@ -1283,7 +1123,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    printMenuItem.setText(MessageManager.getString("action.print") + "...");
+    JMenuItem printMenuItem = new JMenuItem(
+            MessageManager.getString("action.print") + "...");
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_P, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -1308,7 +1149,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    findMenuItem.setText(MessageManager.getString("action.find"));
+    JMenuItem findMenuItem = new JMenuItem(
+            MessageManager.getString("action.find"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_F, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     findMenuItem.setToolTipText(JvSwingUtils.wrapTooltip(true,
@@ -1448,9 +1290,12 @@ public class GAlignFrame extends JInternalFrame
     });
 
     ButtonGroup buttonGroup = new ButtonGroup();
+    final JRadioButtonMenuItem showAutoFirst = new JRadioButtonMenuItem(
+            MessageManager.getString("label.show_first"));
+    final JRadioButtonMenuItem showAutoLast = new JRadioButtonMenuItem(
+            MessageManager.getString("label.show_last"));
     buttonGroup.add(showAutoFirst);
     buttonGroup.add(showAutoLast);
-    showAutoFirst.setText(MessageManager.getString("label.show_first"));
     showAutoFirst.setSelected(Cache.getDefault(
             Preferences.SHOW_AUTOCALC_ABOVE, false));
     showAutoFirst.addActionListener(new ActionListener()
@@ -1462,7 +1307,6 @@ public class GAlignFrame extends JInternalFrame
         sortAnnotations_actionPerformed();
       }
     });
-    showAutoLast.setText(MessageManager.getString("label.show_last"));
     showAutoLast.setSelected(!showAutoFirst.isSelected());
     showAutoLast.addActionListener(new ActionListener()
     {
@@ -1496,8 +1340,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    deleteGroups
-            .setText(MessageManager.getString("action.undefine_groups"));
+    JMenuItem deleteGroups = new JMenuItem(
+            MessageManager.getString("action.undefine_groups"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_U, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -1510,7 +1354,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, deleteGroups, al);
 
-    createGroup.setText(MessageManager.getString("action.create_groups"));
+    JMenuItem createGroup = new JMenuItem(
+            MessageManager.getString("action.create_groups"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -1523,7 +1368,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, createGroup, al);
 
-    unGroup.setText(MessageManager.getString("action.remove_group"));
+    JMenuItem unGroup = new JMenuItem(
+            MessageManager.getString("action.remove_group"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_G, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask()
             | KeyEvent.SHIFT_MASK, false);
@@ -1564,7 +1410,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, cut, al);
 
-    delete.setText(MessageManager.getString("action.delete"));
+    JMenuItem delete = new JMenuItem(
+            MessageManager.getString("action.delete"));
     delete.addActionListener(new ActionListener()
     {
       @Override
@@ -1575,7 +1422,8 @@ public class GAlignFrame extends JInternalFrame
     });
 
     pasteMenu.setText(MessageManager.getString("action.paste"));
-    pasteNew.setText(MessageManager.getString("label.to_new_alignment"));
+    JMenuItem pasteNew = new JMenuItem(
+            MessageManager.getString("label.to_new_alignment"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask()
             | KeyEvent.SHIFT_MASK, false);
@@ -1589,7 +1437,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, pasteNew, al);
 
-    pasteThis.setText(MessageManager.getString("label.to_this_alignment"));
+    JMenuItem pasteThis = new JMenuItem(
+            MessageManager.getString("label.to_this_alignment"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -1612,6 +1461,7 @@ public class GAlignFrame extends JInternalFrame
         applyToAllGroups_actionPerformed(e);
       }
     });
+    JMenuItem createPNG = new JMenuItem("PNG");
     createPNG.addActionListener(new ActionListener()
     {
       @Override
@@ -1622,9 +1472,8 @@ public class GAlignFrame extends JInternalFrame
     });
     createPNG.setActionCommand(MessageManager
             .getString("label.save_png_image"));
-    createPNG.setText("PNG");
 
-    font.setText(MessageManager.getString("action.font"));
+    JMenuItem font = new JMenuItem(MessageManager.getString("action.font"));
     font.addActionListener(new ActionListener()
     {
       @Override
@@ -1644,7 +1493,7 @@ public class GAlignFrame extends JInternalFrame
         seqLimit_actionPerformed(e);
       }
     });
-    epsFile.setText("EPS");
+    JMenuItem epsFile = new JMenuItem("EPS");
     epsFile.addActionListener(new ActionListener()
     {
       @Override
@@ -1654,7 +1503,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    createSVG.setText("SVG");
+    JMenuItem createSVG = new JMenuItem("SVG");
     createSVG.addActionListener(new ActionListener()
     {
       @Override
@@ -1664,16 +1513,16 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    LoadtreeMenuItem.setActionCommand(MessageManager
+    JMenuItem loadTreeMenuItem = new JMenuItem(
+            MessageManager.getString("label.load_associated_tree"));
+    loadTreeMenuItem.setActionCommand(MessageManager
             .getString("label.load_tree_for_sequence_set"));
-    LoadtreeMenuItem.setText(MessageManager
-            .getString("label.load_associated_tree"));
-    LoadtreeMenuItem.addActionListener(new ActionListener()
+    loadTreeMenuItem.addActionListener(new ActionListener()
     {
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        LoadtreeMenuItem_actionPerformed(e);
+        loadTreeMenuItem_actionPerformed(e);
       }
     });
 
@@ -1736,8 +1585,8 @@ public class GAlignFrame extends JInternalFrame
 
     });
 
-    modifyPID.setText(MessageManager
-            .getString("label.modify_identity_thereshold"));
+    JMenuItem modifyPID = new JMenuItem(
+            MessageManager.getString("label.modify_identity_thereshold"));
     modifyPID.addActionListener(new ActionListener()
     {
       @Override
@@ -1804,7 +1653,6 @@ public class GAlignFrame extends JInternalFrame
     calculateTree
             .setText(MessageManager.getString("action.calculate_tree"));
 
-    jMenu2.setText(MessageManager.getString("label.export_image"));
     padGapsMenuitem.setText(MessageManager.getString("label.pad_gaps"));
     padGapsMenuitem.setState(jalview.bin.Cache
             .getDefault("PAD_GAPS", false));
@@ -1816,8 +1664,9 @@ public class GAlignFrame extends JInternalFrame
         padGapsMenuitem_actionPerformed(e);
       }
     });
+    JMenuItem vamsasStore = new JMenuItem(
+            MessageManager.getString("label.vamsas_store"));
     vamsasStore.setVisible(false);
-    vamsasStore.setText(MessageManager.getString("label.vamsas_store"));
     vamsasStore.addActionListener(new ActionListener()
     {
       @Override
@@ -1837,8 +1686,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    extractScores.setText(MessageManager.getString("label.extract_scores")
-            + "...");
+    JMenuItem extractScores = new JMenuItem(
+            MessageManager.getString("label.extract_scores") + "...");
     extractScores.addActionListener(new ActionListener()
     {
       @Override
@@ -1852,8 +1701,9 @@ public class GAlignFrame extends JInternalFrame
 
     // for show products actions see AlignFrame.canShowProducts
     showProducts.setText(MessageManager.getString("label.get_cross_refs"));
-    openFeatureSettings.setText(MessageManager
-            .getString("label.feature_settings"));
+
+    JMenuItem openFeatureSettings = new JMenuItem(
+            MessageManager.getString("label.feature_settings"));
     openFeatureSettings.addActionListener(new ActionListener()
     {
       @Override
@@ -1862,8 +1712,8 @@ public class GAlignFrame extends JInternalFrame
         featureSettings_actionPerformed(e);
       }
     });
-    fetchSequence
-            .setText(MessageManager.getString("label.fetch_sequences"));
+    JMenuItem fetchSequence = new JMenuItem(
+            MessageManager.getString("label.fetch_sequences"));
     fetchSequence.addActionListener(new ActionListener()
     {
       @Override
@@ -1873,8 +1723,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    annotationColour.setText(MessageManager
-            .getString("action.by_annotation"));
+    JMenuItem annotationColour = new JMenuItem(
+            MessageManager.getString("action.by_annotation"));
     annotationColour.addActionListener(new ActionListener()
     {
       @Override
@@ -1884,8 +1734,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    annotationColumn.setText(MessageManager
-            .getString("action.select_by_annotation"));
+    JMenuItem annotationColumn = new JMenuItem(
+            MessageManager.getString("action.select_by_annotation"));
     annotationColumn.addActionListener(new ActionListener()
     {
       @Override
@@ -1906,8 +1756,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    associatedData.setText(MessageManager
-            .getString("label.load_features_annotations"));
+    JMenuItem associatedData = new JMenuItem(
+            MessageManager.getString("label.load_features_annotations"));
     associatedData.addActionListener(new ActionListener()
     {
       @Override
@@ -1961,9 +1811,10 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    addSequenceMenu
-            .setText(MessageManager.getString("label.add_sequences"));
-    addFromFile.setText(MessageManager.getString("label.from_file"));
+    JMenu addSequenceMenu = new JMenu(
+            MessageManager.getString("label.add_sequences"));
+    JMenuItem addFromFile = new JMenuItem(
+            MessageManager.getString("label.from_file"));
     addFromFile.addActionListener(new ActionListener()
     {
       @Override
@@ -1972,7 +1823,8 @@ public class GAlignFrame extends JInternalFrame
         addFromFile_actionPerformed(e);
       }
     });
-    addFromText.setText(MessageManager.getString("label.from_textbox"));
+    JMenuItem addFromText = new JMenuItem(
+            MessageManager.getString("label.from_textbox"));
     addFromText.addActionListener(new ActionListener()
     {
       @Override
@@ -1981,7 +1833,8 @@ public class GAlignFrame extends JInternalFrame
         addFromText_actionPerformed(e);
       }
     });
-    addFromURL.setText(MessageManager.getString("label.from_url"));
+    JMenuItem addFromURL = new JMenuItem(
+            MessageManager.getString("label.from_url"));
     addFromURL.addActionListener(new ActionListener()
     {
       @Override
@@ -1990,8 +1843,8 @@ public class GAlignFrame extends JInternalFrame
         addFromURL_actionPerformed(e);
       }
     });
-    exportFeatures.setText(MessageManager
-            .getString("label.export_features"));
+    JMenuItem exportFeatures = new JMenuItem(
+            MessageManager.getString("label.export_features"));
     exportFeatures.addActionListener(new ActionListener()
     {
       @Override
@@ -2000,8 +1853,8 @@ public class GAlignFrame extends JInternalFrame
         exportFeatures_actionPerformed(e);
       }
     });
-    exportAnnotations.setText(MessageManager
-            .getString("label.export_annotations"));
+    JMenuItem exportAnnotations = new JMenuItem(
+            MessageManager.getString("label.export_annotations"));
     exportAnnotations.addActionListener(new ActionListener()
     {
       @Override
@@ -2010,9 +1863,9 @@ public class GAlignFrame extends JInternalFrame
         exportAnnotations_actionPerformed(e);
       }
     });
-    statusPanel.setLayout(gridLayout1);
-    showMenu.setText(MessageManager.getString("action.show"));
-    showAllSeqs.setText(MessageManager.getString("label.all_sequences"));
+    statusPanel.setLayout(new GridLayout());
+    JMenuItem showAllSeqs = new JMenuItem(
+            MessageManager.getString("label.all_sequences"));
     showAllSeqs.setToolTipText(MessageManager
             .getString("label.toggle_sequence_visibility"));
     showAllSeqs.addActionListener(new ActionListener()
@@ -2023,7 +1876,8 @@ public class GAlignFrame extends JInternalFrame
         showAllSeqs_actionPerformed(e);
       }
     });
-    showAllColumns.setText(MessageManager.getString("label.all_columns"));
+    JMenuItem showAllColumns = new JMenuItem(
+            MessageManager.getString("label.all_columns"));
     showAllColumns.setToolTipText(MessageManager
             .getString("label.toggle_columns_visibility"));
     showAllColumns.addActionListener(new ActionListener()
@@ -2034,9 +1888,9 @@ public class GAlignFrame extends JInternalFrame
         showAllColumns_actionPerformed(e);
       }
     });
-    hideMenu.setText(MessageManager.getString("action.hide"));
-    hideSelSequences.setText(MessageManager
-            .getString("label.selected_sequences"));
+    JMenu hideMenu = new JMenu(MessageManager.getString("action.hide"));
+    JMenuItem hideSelSequences = new JMenuItem(
+            MessageManager.getString("label.selected_sequences"));
     hideSelSequences.setToolTipText(MessageManager
             .getString("label.toggle_sequence_visibility"));
     hideSelSequences.addActionListener(new ActionListener()
@@ -2047,8 +1901,8 @@ public class GAlignFrame extends JInternalFrame
         hideSelSequences_actionPerformed(e);
       }
     });
-    hideSelColumns.setText(MessageManager
-            .getString("label.selected_columns"));
+    JMenuItem hideSelColumns = new JMenuItem(
+            MessageManager.getString("label.selected_columns"));
     hideSelColumns.setToolTipText(MessageManager
             .getString("label.toggle_columns_visibility"));
     hideSelColumns.addActionListener(new ActionListener()
@@ -2059,8 +1913,8 @@ public class GAlignFrame extends JInternalFrame
         hideSelColumns_actionPerformed(e);
       }
     });
-    hideAllSelection.setText(MessageManager
-            .getString("label.selected_region"));
+    JMenuItem hideAllSelection = new JMenuItem(
+            MessageManager.getString("label.selected_region"));
     hideAllSelection.addActionListener(new ActionListener()
     {
       @Override
@@ -2070,8 +1924,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     // TODO: should be hidden if no selection exists.
-    hideAllButSelection.setText(MessageManager
-            .getString("label.all_but_selected_region"));
+    JMenuItem hideAllButSelection = new JMenuItem(
+            MessageManager.getString("label.all_but_selected_region"));
     hideAllButSelection.addActionListener(new ActionListener()
     {
       @Override
@@ -2080,8 +1934,8 @@ public class GAlignFrame extends JInternalFrame
         hideAllButSelection_actionPerformed(e);
       }
     });
-    showAllhidden.setText(MessageManager
-            .getString("label.all_sequences_columns"));
+    JMenuItem showAllhidden = new JMenuItem(
+            MessageManager.getString("label.all_sequences_columns"));
     showAllhidden.setToolTipText(MessageManager
             .getString("label.toggles_visibility_hidden_selected_regions"));
     showAllhidden.addActionListener(new ActionListener()
@@ -2103,8 +1957,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    invertColSel.setText(MessageManager
-            .getString("action.invert_column_selection"));
+    JMenuItem invertColSel = new JMenuItem(
+            MessageManager.getString("action.invert_column_selection"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_I,
             Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
             | KeyEvent.ALT_MASK, false);
@@ -2155,7 +2009,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    save.setText(MessageManager.getString("action.save"));
+    JMenuItem save = new JMenuItem(MessageManager.getString("action.save"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -2179,7 +2033,8 @@ public class GAlignFrame extends JInternalFrame
       }
     });
 
-    newView.setText(MessageManager.getString("action.new_view"));
+    JMenuItem newView = new JMenuItem(
+            MessageManager.getString("action.new_view"));
     keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_T, Toolkit
             .getDefaultToolkit().getMenuShortcutKeyMask(), false);
     al = new ActionListener()
@@ -2195,8 +2050,8 @@ public class GAlignFrame extends JInternalFrame
     tabbedPane.setToolTipText("<html><i>"
             + MessageManager.getString("label.rename_tab_eXpand_reGroup")
             + "</i></html>");
-    textColour.setText(MessageManager.getString("label.colour_text")
-            + "...");
+    JMenuItem textColour = new JMenuItem(
+            MessageManager.getString("label.colour_text") + "...");
     textColour.addActionListener(new ActionListener()
     {
       @Override
@@ -2206,7 +2061,7 @@ public class GAlignFrame extends JInternalFrame
       }
     });
     formatMenu.setText(MessageManager.getString("action.format"));
-    selectMenu.setText(MessageManager.getString("action.select"));
+    JMenu selectMenu = new JMenu(MessageManager.getString("action.select"));
     idRightAlign.setText(MessageManager
             .getString("label.right_align_sequence_id"));
     idRightAlign.addActionListener(new ActionListener()
@@ -2244,8 +2099,8 @@ public class GAlignFrame extends JInternalFrame
     };
     addMenuActionAndAccelerator(keyStroke, expandViews, al);
 
-    pageSetup
-            .setText(MessageManager.getString("action.page_setup") + "...");
+    JMenuItem pageSetup = new JMenuItem(
+            MessageManager.getString("action.page_setup") + "...");
     pageSetup.addActionListener(new ActionListener()
     {
       @Override
@@ -2254,8 +2109,8 @@ public class GAlignFrame extends JInternalFrame
         pageSetup_actionPerformed(e);
       }
     });
-    alignmentProperties.setText(MessageManager
-            .getString("label.alignment_props") + "...");
+    JMenuItem alignmentProperties = new JMenuItem(
+            MessageManager.getString("label.alignment_props") + "...");
     alignmentProperties.addActionListener(new ActionListener()
     {
       @Override
@@ -2264,10 +2119,14 @@ public class GAlignFrame extends JInternalFrame
         alignmentProperties();
       }
     });
-    tooltipSettingsMenu.setText(MessageManager
-            .getString("label.sequence_id_tooltip"));
-    autoAnnMenu.setText(MessageManager
-            .getString("label.autocalculated_annotation"));
+    JMenu tooltipSettingsMenu = new JMenu(
+            MessageManager.getString("label.sequence_id_tooltip"));
+    JMenu autoAnnMenu = new JMenu(
+            MessageManager.getString("label.autocalculated_annotation"));
+
+    JMenu exportImageMenu = new JMenu(
+            MessageManager.getString("label.export_image"));
+    JMenu fileMenu = new JMenu(MessageManager.getString("action.file"));
     alignFrameMenuBar.add(fileMenu);
     alignFrameMenuBar.add(editMenu);
     alignFrameMenuBar.add(selectMenu);
@@ -2288,10 +2147,10 @@ public class GAlignFrame extends JInternalFrame
     fileMenu.add(pageSetup);
     fileMenu.add(printMenuItem);
     fileMenu.addSeparator();
-    fileMenu.add(jMenu2);
+    fileMenu.add(exportImageMenu);
     fileMenu.add(exportFeatures);
     fileMenu.add(exportAnnotations);
-    fileMenu.add(LoadtreeMenuItem);
+    fileMenu.add(loadTreeMenuItem);
     fileMenu.add(associatedData);
     fileMenu.addSeparator();
     fileMenu.add(closeMenuItem);
@@ -2314,6 +2173,7 @@ public class GAlignFrame extends JInternalFrame
     // editMenu.add(justifyRightMenuItem);
     // editMenu.addSeparator();
     editMenu.add(padGapsMenuitem);
+
     viewMenu.add(newView);
     viewMenu.add(expandViews);
     viewMenu.add(gatherViews);
@@ -2323,6 +2183,18 @@ public class GAlignFrame extends JInternalFrame
     viewMenu.add(showComplementMenuItem);
     viewMenu.addSeparator();
     viewMenu.add(followHighlightMenuItem);
+    viewMenu.addSeparator();
+    viewMenu.add(showSeqFeatures);
+    // viewMenu.add(showSeqFeaturesHeight);
+    viewMenu.add(openFeatureSettings);
+    tooltipSettingsMenu.add(showDbRefsMenuitem);
+    tooltipSettingsMenu.add(showNpFeatsMenuitem);
+    viewMenu.add(tooltipSettingsMenu);
+    viewMenu.addSeparator();
+    viewMenu.add(alignmentProperties);
+    viewMenu.addSeparator();
+    viewMenu.add(overviewMenuItem);
+
     annotationsMenu.add(annotationPanelMenuItem);
     annotationsMenu.addSeparator();
     annotationsMenu.add(showAllAlAnnotations);
@@ -2344,18 +2216,7 @@ public class GAlignFrame extends JInternalFrame
     autoAnnMenu.add(showGroupConservation);
     autoAnnMenu.add(showGroupConsensus);
     annotationsMenu.add(autoAnnMenu);
-    viewMenu.addSeparator();
-    viewMenu.add(showSeqFeatures);
-    // viewMenu.add(showSeqFeaturesHeight);
 
-    viewMenu.add(openFeatureSettings);
-    tooltipSettingsMenu.add(showDbRefsMenuitem);
-    tooltipSettingsMenu.add(showNpFeatsMenuitem);
-    viewMenu.add(tooltipSettingsMenu);
-    viewMenu.addSeparator();
-    viewMenu.add(alignmentProperties);
-    viewMenu.addSeparator();
-    viewMenu.add(overviewMenuItem);
     colourMenu.add(applyToAllGroups);
     colourMenu.add(textColour);
     colourMenu.addSeparator();
@@ -2405,11 +2266,11 @@ public class GAlignFrame extends JInternalFrame
     sort.add(sortGroupMenuItem);
     sort.add(sortPairwiseMenuItem);
     sort.add(sortByTreeMenu);
-    jMenu2.add(htmlMenuItem);
-    jMenu2.add(epsFile);
-    jMenu2.add(createPNG);
-    jMenu2.add(createBioJS);
-    jMenu2.add(createSVG);
+    exportImageMenu.add(htmlMenuItem);
+    exportImageMenu.add(epsFile);
+    exportImageMenu.add(createPNG);
+    exportImageMenu.add(createBioJS);
+    exportImageMenu.add(createSVG);
     addSequenceMenu.add(addFromFile);
     addSequenceMenu.add(addFromText);
     addSequenceMenu.add(addFromURL);
@@ -2942,7 +2803,7 @@ public class GAlignFrame extends JInternalFrame
   {
 
   }
-  protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
+  protected void loadTreeMenuItem_actionPerformed(ActionEvent e)
   {
 
   }
index 2cfc1e6..7054ed3 100644 (file)
  */
 package jalview.viewmodel;
 
+import java.awt.Color;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Deque;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.analysis.Conservation;
 import jalview.api.AlignCalcManagerI;
 import jalview.api.AlignViewportI;
@@ -51,17 +63,6 @@ import jalview.workers.ComplementConsensusThread;
 import jalview.workers.ConsensusThread;
 import jalview.workers.StrucConsensusThread;
 
-import java.awt.Color;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.BitSet;
-import java.util.Deque;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 /**
  * base class holding visualization and analysis attributes and common logic for
  * an active alignment view displayed in the GUI
@@ -1190,6 +1191,10 @@ public abstract class AlignmentViewport implements AlignViewportI,
 
   private Map<SequenceI, Color> sequenceColours = new HashMap<SequenceI, Color>();
 
+  protected SequenceAnnotationOrder sortAnnotationsBy = null;
+
+  protected boolean showAutocalculatedAbove;
+
   /**
    * Property change listener for changes in alignment
    * 
@@ -2386,4 +2391,24 @@ public abstract class AlignmentViewport implements AlignViewportI,
   {
     return this;
   }
+
+  public SequenceAnnotationOrder getSortAnnotationsBy()
+  {
+    return sortAnnotationsBy;
+  }
+
+  public void setSortAnnotationsBy(SequenceAnnotationOrder sortAnnotationsBy)
+  {
+    this.sortAnnotationsBy = sortAnnotationsBy;
+  }
+
+  public boolean isShowAutocalculatedAbove()
+  {
+    return showAutocalculatedAbove;
+  }
+
+  public void setShowAutocalculatedAbove(boolean showAutocalculatedAbove)
+  {
+    this.showAutocalculatedAbove = showAutocalculatedAbove;
+  }
 }
index 59a265f..bc6a137 100644 (file)
@@ -24,9 +24,21 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+
 import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
+import jalview.datamodel.Annotation;
 import jalview.datamodel.DBRefEntry;
 import jalview.datamodel.Mapping;
 import jalview.datamodel.Sequence;
@@ -35,15 +47,6 @@ import jalview.io.AppletFormatAdapter;
 import jalview.io.FormatAdapter;
 import jalview.util.MapList;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.Test;
-
 public class AlignmentUtilsTests 
 {
   // @formatter:off
@@ -698,4 +701,113 @@ public class AlignmentUtilsTests
     assertEquals(cdna.getSequenceAt(0).getDatasetSequence(),
             acf.getdnaSeqs()[0]);
   }
+
+  /**
+   * Test the method that shows or hides sequence annotations by type(s) and
+   * selection group.
+   */
+  @Test
+  public void testShowOrHideSequenceAnnotations()
+  {
+    SequenceI seq1 = new Sequence("Seq1", "AAA");
+    SequenceI seq2 = new Sequence("Seq2", "BBB");
+    SequenceI seq3 = new Sequence("Seq3", "CCC");
+    Annotation[] anns = new Annotation[]
+    { new Annotation(2f) };
+    AlignmentAnnotation ann1 = new AlignmentAnnotation("Structure", "ann1",
+            anns);
+    ann1.setSequenceRef(seq1);
+    AlignmentAnnotation ann2 = new AlignmentAnnotation("Structure", "ann2",
+            anns);
+    ann2.setSequenceRef(seq2);
+    AlignmentAnnotation ann3 = new AlignmentAnnotation("Structure", "ann3",
+            anns);
+    AlignmentAnnotation ann4 = new AlignmentAnnotation("Temp", "ann4", anns);
+    ann4.setSequenceRef(seq1);
+    AlignmentAnnotation ann5 = new AlignmentAnnotation("Temp", "ann5", anns);
+    ann5.setSequenceRef(seq2);
+    AlignmentAnnotation ann6 = new AlignmentAnnotation("Temp", "ann6", anns);
+    AlignmentI al = new Alignment(new SequenceI[] {seq1, seq2, seq3});
+    al.addAnnotation(ann1); // Structure for Seq1
+    al.addAnnotation(ann2); // Structure for Seq2
+    al.addAnnotation(ann3); // Structure for no sequence
+    al.addAnnotation(ann4); // Temp for seq1
+    al.addAnnotation(ann5); // Temp for seq2
+    al.addAnnotation(ann6); // Temp for no sequence
+    List<String> types = new ArrayList<String>();
+    List<SequenceI> scope = new ArrayList<SequenceI>();
+
+    /*
+     * Set all sequence related Structure to hidden (ann1, ann2)
+     */
+    types.add("Structure");
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, false,
+            false);
+    assertFalse(ann1.visible);
+    assertFalse(ann2.visible);
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertTrue(ann4.visible); // not Structure, not affected
+    assertTrue(ann5.visible); // "
+    assertTrue(ann6.visible); // not sequence-related, not affected
+
+    /*
+     * Set Temp in {seq1, seq3} to hidden
+     */
+    types.clear();
+    types.add("Temp");
+    scope.add(seq1);
+    scope.add(seq3);
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, scope, false,
+            false);
+    assertFalse(ann1.visible); // unchanged
+    assertFalse(ann2.visible); // unchanged
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertFalse(ann4.visible); // Temp for seq1 hidden
+    assertTrue(ann5.visible); // not in scope, not affected
+    assertTrue(ann6.visible); // not sequence-related, not affected
+
+    /*
+     * Set Temp in all sequences to hidden
+     */
+    types.clear();
+    types.add("Temp");
+    scope.add(seq1);
+    scope.add(seq3);
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, false,
+            false);
+    assertFalse(ann1.visible); // unchanged
+    assertFalse(ann2.visible); // unchanged
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertFalse(ann4.visible); // Temp for seq1 hidden
+    assertFalse(ann5.visible); // Temp for seq2 hidden
+    assertTrue(ann6.visible); // not sequence-related, not affected
+
+    /*
+     * Set all types in {seq1, seq3} to visible
+     */
+    types.clear();
+    scope.clear();
+    scope.add(seq1);
+    scope.add(seq3);
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, scope, true,
+            true);
+    assertTrue(ann1.visible); // Structure for seq1 set visible
+    assertFalse(ann2.visible); // not in scope, unchanged
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertTrue(ann4.visible); // Temp for seq1 set visible
+    assertFalse(ann5.visible); // not in scope, unchanged
+    assertTrue(ann6.visible); // not sequence-related, not affected
+
+    /*
+     * Set all types in all scope to hidden
+     */
+    AlignmentUtils.showOrHideSequenceAnnotations(al, types, null, true,
+            false);
+    assertFalse(ann1.visible);
+    assertFalse(ann2.visible);
+    assertTrue(ann3.visible); // not sequence-related, not affected
+    assertFalse(ann4.visible);
+    assertFalse(ann5.visible);
+    assertTrue(ann6.visible); // not sequence-related, not affected
+  }
 }
index f7b1482..f2248a8 100644 (file)
@@ -3,12 +3,6 @@ package jalview.gui;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.SequenceI;
-import jalview.io.AppletFormatAdapter;
-import jalview.io.FormatAdapter;
-import jalview.util.MessageManager;
 
 import java.awt.Component;
 import java.io.IOException;
@@ -23,6 +17,12 @@ import javax.swing.JSeparator;
 import org.junit.Before;
 import org.junit.Test;
 
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.SequenceI;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.FormatAdapter;
+
 public class PopupMenuTest
 {
   // 4 sequences x 13 positions
@@ -66,12 +66,9 @@ public class PopupMenuTest
     List<SequenceI> seqs = new ArrayList<SequenceI>();
     testee.configureReferenceAnnotationsMenu(menu, seqs);
     assertFalse(menu.isEnabled());
-    assertEquals(
-            MessageManager.getString("label.add_reference_annotations"),
-            menu.getText());
     // now try null list
     menu.setEnabled(true);
-    testee.configureReferenceAnnotationsMenu(menu, seqs);
+    testee.configureReferenceAnnotationsMenu(menu, null);
     assertFalse(menu.isEnabled());
   }