JAL-1264 adding show/hide annotation options to applet
[jalview.git] / src / jalview / appletgui / AlignFrame.java
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