JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / appletgui / AlignFrame.java
index ed64215..e01c4c9 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
 package jalview.appletgui;
 
 import jalview.analysis.AlignmentSorter;
+import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
 import jalview.api.AlignViewControllerGuiI;
 import jalview.api.AlignViewControllerI;
+import jalview.api.AlignViewportI;
+import jalview.api.FeatureRenderer;
+import jalview.api.FeatureSettingsControllerI;
 import jalview.api.SequenceStructureBinding;
 import jalview.bin.JalviewLite;
 import jalview.commands.CommandI;
@@ -34,6 +38,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;
@@ -55,14 +60,16 @@ import jalview.schemes.NucleotideColourScheme;
 import jalview.schemes.PIDColourScheme;
 import jalview.schemes.PurinePyrimidineColourScheme;
 import jalview.schemes.RNAHelicesColourChooser;
-import jalview.schemes.RNAInteractionColourScheme;
 import jalview.schemes.StrandColourScheme;
 import jalview.schemes.TCoffeeColourScheme;
 import jalview.schemes.TaylorColourScheme;
 import jalview.schemes.TurnColourScheme;
 import jalview.schemes.ZappoColourScheme;
 import jalview.structure.StructureSelectionManager;
+import jalview.structures.models.AAStructureBindingModel;
+import jalview.util.MappingUtils;
 import jalview.util.MessageManager;
+import jalview.viewmodel.AlignmentViewport;
 
 import java.awt.BorderLayout;
 import java.awt.Canvas;
@@ -89,12 +96,17 @@ import java.awt.event.WindowEvent;
 import java.io.IOException;
 import java.net.URL;
 import java.net.URLEncoder;
-import java.util.Enumeration;
+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 org.jmol.viewer.Viewer;
+
 public class AlignFrame extends EmbmenuFrame implements ActionListener,
         ItemListener, KeyListener, AlignViewControllerGuiI
 {
@@ -104,15 +116,62 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   public AlignViewport viewport;
 
-  int DEFAULT_WIDTH = 700;
+  // width and height may be overridden by applet parameters
+  int frameWidth = 700;
 
-  int DEFAULT_HEIGHT = 500;
+  int frameHeight = 500;
 
   String jalviewServletURL;
 
-  public AlignFrame(AlignmentI al, jalview.bin.JalviewLite applet,
+  /*
+   * 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.
+   * 
+   * @param al
+   * @param applet
+   * @param title
+   * @param embedded
+   */
+  public AlignFrame(AlignmentI al, JalviewLite applet, String title,
+          boolean embedded)
+  {
+    this(al, applet, title, embedded, true);
+  }
+
+  /**
+   * Constructor that optionally allows the frame to be displayed or only
+   * created.
+   * 
+   * @param al
+   * @param applet
+   * @param title
+   * @param embedded
+   * @param addToDisplay
+   */
+  public AlignFrame(AlignmentI al, JalviewLite applet, String title,
+          boolean embedded, boolean addToDisplay)
+  {
+    this(al, null, null, applet, title, embedded, addToDisplay);
+  }
+
+  public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs,
+          ColumnSelection columnSelection, JalviewLite applet,
           String title, boolean embedded)
   {
+    this(al, hiddenSeqs, columnSelection, applet, title, embedded, true);
+  }
+
+  public AlignFrame(AlignmentI al, SequenceI[] hiddenSeqs,
+          ColumnSelection columnSelection, JalviewLite applet,
+          String title, boolean embedded, boolean addToDisplay)
+  {
     if (applet != null)
     {
       jalviewServletURL = applet.getParameter("APPLICATION_URL");
@@ -135,36 +194,48 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
         if (param != null)
         {
           int width = Integer.parseInt(param);
-          DEFAULT_WIDTH = width;
+          frameWidth = width;
         }
         param = applet.getParameter("windowHeight");
         if (param != null)
         {
           int height = Integer.parseInt(param);
-          DEFAULT_HEIGHT = height;
+          frameHeight = height;
         }
       } catch (Exception ex)
       {
       }
     }
     viewport = new AlignViewport(al, applet);
+
+    if (hiddenSeqs != null && hiddenSeqs.length > 0)
+    {
+      viewport.hideSequence(hiddenSeqs);
+    }
+    if (columnSelection != null)
+    {
+      viewport.setColumnSelection(columnSelection);
+    }
+
     alignPanel = new AlignmentPanel(this, viewport);
     avc = new jalview.controller.AlignViewController(this, viewport,
             alignPanel);
     viewport.updateConservation(alignPanel);
     viewport.updateConsensus(alignPanel);
 
-    annotationPanelMenuItem.setState(viewport.showAnnotation);
     displayNonconservedMenuItem.setState(viewport.getShowUnconserved());
-    followMouseOverFlag.setState(viewport.getFollowHighlight());
+    followMouseOverFlag.setState(viewport.isFollowHighlight());
     showGroupConsensus.setState(viewport.isShowGroupConsensus());
     showGroupConservation.setState(viewport.isShowGroupConservation());
     showConsensusHistogram.setState(viewport.isShowConsensusHistogram());
     showSequenceLogo.setState(viewport.isShowSequenceLogo());
     normSequenceLogo.setState(viewport.isNormaliseSequenceLogo());
     applyToAllGroups.setState(viewport.getColourAppliesToAllGroups());
+    annotationPanelMenuItem.setState(viewport.isShowAnnotation());
+    showAlignmentAnnotations.setState(viewport.isShowAnnotation());
+    showSequenceAnnotations.setState(viewport.isShowAnnotation());
 
-    seqLimits.setState(viewport.showJVSuffix);
+    seqLimits.setState(viewport.getShowJVSuffix());
 
     if (applet != null)
     {
@@ -230,8 +301,19 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     alignPanel.annotationPanelHolder.addKeyListener(this);
     alignPanel.annotationSpaceFillerHolder.addKeyListener(this);
     alignPanel.alabels.addKeyListener(this);
-    createAlignFrameWindow(embedded, title);
 
+    if (addToDisplay)
+    {
+      addToDisplay(embedded);
+    }
+  }
+
+  /**
+   * @param embedded
+   */
+  public void addToDisplay(boolean embedded)
+  {
+    createAlignFrameWindow(embedded);
     validate();
     alignPanel.adjustAnnotationHeight();
     alignPanel.paintAlignment(true);
@@ -283,11 +365,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     boolean featuresFile = false;
     try
     {
-      featuresFile = new jalview.io.FeaturesFile(file, type)
-              .parse(viewport.getAlignment(), alignPanel.seqPanel.seqCanvas
-                      .getFeatureRenderer().featureColours, featureLinks,
-                      true, viewport.applet.getDefaultParameter(
-                              "relaxedidmatch", false));
+      featuresFile = new jalview.io.FeaturesFile(file, type).parse(viewport
+              .getAlignment(), alignPanel.seqPanel.seqCanvas
+              .getFeatureRenderer().getFeatureColours(), featureLinks,
+              true, viewport.applet.getDefaultParameter("relaxedidmatch",
+                      false));
     } catch (Exception ex)
     {
       ex.printStackTrace();
@@ -301,9 +383,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       }
       if (autoenabledisplay)
       {
-        viewport.showSequenceFeatures = true;
+        viewport.setShowSequenceFeatures(true);
         sequenceFeatures.setState(true);
       }
+      if (alignPanel.seqPanel.seqCanvas.fr != null)
+      {
+        // update the min/max ranges where necessary
+        alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
+      }
       if (viewport.featureSettings != null)
       {
         viewport.featureSettings.refreshTable();
@@ -465,8 +552,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     case KeyEvent.VK_F2:
       viewport.cursorMode = !viewport.cursorMode;
       statusBar.setText(MessageManager.formatMessage(
-              "label.keyboard_editing_mode", new String[]
-              { (viewport.cursorMode ? "on" : "off") }));
+              "label.keyboard_editing_mode",
+              new String[] { (viewport.cursorMode ? "on" : "off") }));
       if (viewport.cursorMode)
       {
         alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
@@ -490,7 +577,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     }
 
     case KeyEvent.VK_PAGE_UP:
-      if (viewport.wrapAlignment)
+      if (viewport.getWrapAlignment())
       {
         alignPanel.scrollUp(true);
       }
@@ -502,7 +589,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       break;
 
     case KeyEvent.VK_PAGE_DOWN:
-      if (viewport.wrapAlignment)
+      if (viewport.getWrapAlignment())
       {
         alignPanel.scrollUp(false);
       }
@@ -682,114 +769,193 @@ 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.showSequenceFeatures(sequenceFeatures.getState());
+      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(true);
+    validate();
+    repaint();
+  }
+
+  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();
+    viewport.setFollowHighlight(followMouseOverFlag.getState());
     // TODO: could kick the scrollTo mechanism to reset view for current
     // searchresults.
   }
@@ -803,6 +969,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   @Override
   public void actionPerformed(ActionEvent evt)
   {
+    viewport.applet.currentAlignFrame = this;
+
     Object source = evt.getSource();
 
     if (source == inputText)
@@ -1011,8 +1179,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       Frame frame = new Frame();
       frame.add(cap);
       jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
-              "label.alignment_properties", new String[]
-              { getTitle() }), 400, 250);
+              "label.alignment_properties", new String[] { getTitle() }),
+              400, 250);
     }
     else if (source == overviewMenuItem)
     {
@@ -1063,10 +1231,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       changeColour(new PurinePyrimidineColourScheme());
     }
-    else if (source == RNAInteractionColour)
-    {
-      changeColour(new RNAInteractionColourScheme());
-    }
+    // else if (source == RNAInteractionColour)
+    // {
+    // changeColour(new RNAInteractionColourScheme());
+    // }
     else if (source == RNAHelixColour)
     {
       new RNAHelicesColourChooser(viewport, alignPanel);
@@ -1099,6 +1267,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       new AnnotationColourChooser(viewport, alignPanel);
     }
+    else if (source == annotationColumnSelection)
+    {
+      new AnnotationColumnChooser(viewport, alignPanel);
+    }
     else if (source == sortPairwiseMenuItem)
     {
       sortPairwiseMenuItem_actionPerformed();
@@ -1169,11 +1341,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     Frame frame = new Frame();
     frame.add(cap);
     jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
-            "label.alignment_output_command", new String[]
-            { e.getActionCommand() }), 600, 500);
-    cap.setText(new AppletFormatAdapter().formatSequences(
+            "label.alignment_output_command",
+            new Object[] { e.getActionCommand() }), 600, 500);
+
+    FeatureRenderer fr = this.alignPanel.cloneFeatureRenderer();
+    cap.setText(new AppletFormatAdapter(alignPanel).formatSequences(
             e.getActionCommand(), viewport.getAlignment(),
-            viewport.showJVSuffix));
+            viewport.getShowJVSuffix()));
   }
 
   public void loadAnnotations()
@@ -1191,11 +1365,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   public String outputAnnotations(boolean displayTextbox)
   {
-    String annotation = new AnnotationFile().printAnnotations(
-            viewport.showAnnotation ? viewport.getAlignment()
-                    .getAlignmentAnnotation() : null, viewport
-                    .getAlignment().getGroups(), ((Alignment) viewport
-                    .getAlignment()).alignmentProperties);
+    String annotation = new AnnotationFile()
+            .printAnnotationsForView(viewport);
 
     if (displayTextbox)
     {
@@ -1210,20 +1381,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     return annotation;
   }
 
-  private Hashtable getDisplayedFeatureCols()
+  private Map<String, Object> getDisplayedFeatureCols()
   {
     if (alignPanel.getFeatureRenderer() != null
-            && viewport.featuresDisplayed != null)
+            && viewport.getFeaturesDisplayed() != null)
     {
-      FeatureRenderer fr = alignPanel.getFeatureRenderer();
-      Hashtable fcols = new Hashtable();
-      Enumeration en = viewport.featuresDisplayed.keys();
-      while (en.hasMoreElements())
-      {
-        Object col = en.nextElement();
-        fcols.put(col, fr.featureColours.get(col));
-      }
-      return fcols;
+      return alignPanel.getFeatureRenderer().getDisplayedFeatureCols();
+
     }
     return null;
   }
@@ -1278,7 +1442,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   {
     StringBuffer url = new StringBuffer(jalviewServletURL);
 
-    url.append("?open="
+    // allow servlet parameters to be passed in applet parameter
+    String firstSep = url.lastIndexOf("?") > url.lastIndexOf("/") ? "&"
+            : "?";
+    url.append(firstSep);
+
+    url.append("open="
             + appendProtocol(viewport.applet.getParameter("file")));
 
     if (viewport.applet.getParameter("features") != null)
@@ -1396,13 +1565,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   void updateEditMenuBar()
   {
 
-    if (viewport.historyList.size() > 0)
+    if (viewport.getHistoryList().size() > 0)
     {
       undoMenuItem.setEnabled(true);
-      CommandI command = (CommandI) viewport.historyList.peek();
+      CommandI command = viewport.getHistoryList().peek();
       undoMenuItem.setLabel(MessageManager.formatMessage(
-              "label.undo_command", new String[]
-              { command.getDescription() }));
+              "label.undo_command",
+              new Object[] { command.getDescription() }));
     }
     else
     {
@@ -1410,14 +1579,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       undoMenuItem.setLabel(MessageManager.getString("action.undo"));
     }
 
-    if (viewport.redoList.size() > 0)
+    if (viewport.getRedoList().size() > 0)
     {
       redoMenuItem.setEnabled(true);
 
-      CommandI command = (CommandI) viewport.redoList.peek();
+      CommandI command = viewport.getRedoList().peek();
       redoMenuItem.setLabel(MessageManager.formatMessage(
-              "label.redo_command", new String[]
-              { command.getDescription() }));
+              "label.redo_command",
+              new Object[] { command.getDescription() }));
     }
     else
     {
@@ -1429,12 +1598,13 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   /**
    * TODO: JAL-1104
    */
+  @Override
   public void addHistoryItem(CommandI command)
   {
     if (command.getSize() > 0)
     {
-      viewport.historyList.push(command);
-      viewport.redoList.removeAllElements();
+      viewport.addToHistoryList(command);
+      viewport.clearRedoList();
       updateEditMenuBar();
       viewport.updateHiddenColumns();
     }
@@ -1448,16 +1618,16 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
    */
   protected void undoMenuItem_actionPerformed()
   {
-    if (viewport.historyList.size() < 1)
+    if (viewport.getHistoryList().isEmpty())
     {
       return;
     }
 
-    CommandI command = (CommandI) viewport.historyList.pop();
-    viewport.redoList.push(command);
+    CommandI command = viewport.getHistoryList().pop();
+    viewport.addToRedoList(command);
     command.undoCommand(null);
 
-    AlignViewport originalSource = getOriginatingSource(command);
+    AlignmentViewport originalSource = getOriginatingSource(command);
     // JBPNote Test
     if (originalSource != viewport)
     {
@@ -1480,16 +1650,16 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
    */
   protected void redoMenuItem_actionPerformed()
   {
-    if (viewport.redoList.size() < 1)
+    if (viewport.getRedoList().isEmpty())
     {
       return;
     }
 
-    CommandI command = (CommandI) viewport.redoList.pop();
-    viewport.historyList.push(command);
+    CommandI command = viewport.getRedoList().pop();
+    viewport.addToHistoryList(command);
     command.doCommand(null);
 
-    AlignViewport originalSource = getOriginatingSource(command);
+    AlignmentViewport originalSource = getOriginatingSource(command);
     // JBPNote Test
     if (originalSource != viewport)
     {
@@ -1505,9 +1675,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
             .getAlignment().getSequences());
   }
 
-  AlignViewport getOriginatingSource(CommandI command)
+  AlignmentViewport getOriginatingSource(CommandI command)
   {
-    AlignViewport originalSource = null;
+    AlignmentViewport originalSource = null;
     // For sequence removal and addition, we need to fire
     // the property change event FROM the viewport where the
     // original alignment was altered
@@ -1546,6 +1716,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     return originalSource;
   }
 
+  /**
+   * Move the currently selected sequences up or down one position in the
+   * alignment
+   * 
+   * @param up
+   */
   public void moveSelectedSequences(boolean up)
   {
     SequenceGroup sg = viewport.getSelectionGroup();
@@ -1556,6 +1732,21 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     viewport.getAlignment().moveSelectedSequencesByOne(sg,
             up ? null : viewport.getHiddenRepSequences(), up);
     alignPanel.paintAlignment(true);
+
+    /*
+     * Also move cDNA/protein complement sequences
+     */
+    AlignViewportI complement = viewport.getCodingComplement();
+    if (complement != null)
+    {
+      SequenceGroup mappedSelection = MappingUtils.mapSequenceGroup(sg,
+              viewport, complement);
+      complement.getAlignment().moveSelectedSequencesByOne(mappedSelection,
+              up ? null : complement.getHiddenRepSequences(), up);
+      // TODO need to trigger a repaint of the complementary panel - how?
+      // would prefer to handle in SplitFrame but it is not overriding key
+      // listener chiz
+    }
   }
 
   synchronized void slideSequences(boolean right, int size)
@@ -1643,11 +1834,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     }
 
     boolean appendHistoryItem = false;
-    if (viewport.historyList != null && viewport.historyList.size() > 0
-            && viewport.historyList.peek() instanceof SlideSequencesCommand)
+    Deque<CommandI> historyList = viewport.getHistoryList();
+    if (historyList != null && historyList.size() > 0
+            && historyList.peek() instanceof SlideSequencesCommand)
     {
       appendHistoryItem = ssc
-              .appendSlideCommand((SlideSequencesCommand) viewport.historyList
+              .appendSlideCommand((SlideSequencesCommand) historyList
                       .peek());
     }
 
@@ -1672,12 +1864,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;
@@ -1687,14 +1879,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     {
       copiedHiddenColumns = new Vector();
       int hiddenOffset = viewport.getSelectionGroup().getStartRes();
-      for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
-              .size(); i++)
+      for (int[] region : viewport.getColumnSelection().getHiddenColumns())
       {
-        int[] region = (int[]) viewport.getColumnSelection()
-                .getHiddenColumns().elementAt(i);
-
-        copiedHiddenColumns.addElement(new int[]
-        { region[0] - hiddenOffset, region[1] - hiddenOffset });
+        copiedHiddenColumns.addElement(new int[] {
+            region[0] - hiddenOffset, region[1] - hiddenOffset });
       }
     }
     else
@@ -1708,11 +1896,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
@@ -1792,14 +1979,17 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
       if (newAlignment)
       {
-        String newtitle = MessageManager.getString("label.copied_sequences");
-        if (getTitle().startsWith(MessageManager.getString("label.copied_sequences")))
+        String newtitle = MessageManager
+                .getString("label.copied_sequences");
+        if (getTitle().startsWith(
+                MessageManager.getString("label.copied_sequences")))
         {
           newtitle = getTitle();
         }
         else
         {
-          newtitle = newtitle.concat(MessageManager.formatMessage("label.from_msname", new String[]{getTitle()}));
+          newtitle = newtitle.concat(MessageManager.formatMessage(
+                  "label.from_msname", new String[] { getTitle() }));
         }
         AlignFrame af = new AlignFrame(new Alignment(newSeqs),
                 viewport.applet, newtitle, false);
@@ -1812,8 +2002,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
           }
         }
 
-        jalview.bin.JalviewLite.addFrame(af, newtitle, DEFAULT_WIDTH,
-                DEFAULT_HEIGHT);
+        jalview.bin.JalviewLite.addFrame(af, newtitle, frameWidth,
+                frameHeight);
       }
       else
       {
@@ -2089,8 +2279,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       }
 
       statusBar.setText(MessageManager.formatMessage(
-              "label.removed_columns", new String[]
-              { Integer.valueOf(trimRegion.getSize()).toString() }));
+              "label.removed_columns",
+              new String[] { Integer.valueOf(trimRegion.getSize())
+                      .toString() }));
       addHistoryItem(trimRegion);
 
       for (SequenceGroup sg : viewport.getAlignment().getGroups())
@@ -2131,8 +2322,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     addHistoryItem(removeGapCols);
 
     statusBar.setText(MessageManager.formatMessage(
-            "label.removed_empty_columns", new String[]
-            { Integer.valueOf(removeGapCols.getSize()).toString() }));
+            "label.removed_empty_columns",
+            new String[] { Integer.valueOf(removeGapCols.getSize())
+                    .toString() }));
 
     // This is to maintain viewport position on first residue
     // of first sequence
@@ -2256,8 +2448,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
     newaf.setTitle(title.toString());
 
-    newaf.viewport.historyList = viewport.historyList;
-    newaf.viewport.redoList = viewport.redoList;
+    newaf.viewport.setHistoryList(viewport.getHistoryList());
+    newaf.viewport.setRedoList(viewport.getRedoList());
     return newaf;
   }
 
@@ -2271,7 +2463,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     if (alignPanel != null
             && (fr = alignPanel.getFeatureRenderer()) != null)
     {
-      return fr.getGroups();
+      List<String> gps = fr.getFeatureGroups();
+      String[] _gps = gps.toArray(new String[gps.size()]);
+      return _gps;
     }
     return null;
   }
@@ -2289,7 +2483,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     if (alignPanel != null
             && (fr = alignPanel.getFeatureRenderer()) != null)
     {
-      return fr.getGroups(visible);
+      List<String> gps = fr.getGroups(visible);
+      String[] _gps = gps.toArray(new String[gps.size()]);
+      return _gps;
     }
     return null;
   }
@@ -2306,11 +2502,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   {
     FeatureRenderer fr = null;
     this.sequenceFeatures.setState(true);
-    viewport.showSequenceFeatures(true);
+    viewport.setShowSequenceFeatures(true);
     if (alignPanel != null
             && (fr = alignPanel.getFeatureRenderer()) != null)
     {
-      fr.setGroupState(groups, state);
+
+      fr.setGroupVisibility(Arrays.asList(groups), state);
       alignPanel.seqPanel.seqCanvas.repaint();
       if (alignPanel.overviewPanel != null)
       {
@@ -2334,7 +2531,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   protected void displayNonconservedMenuItem_actionPerformed()
   {
-    viewport.setShowunconserved(displayNonconservedMenuItem.getState());
+    viewport.setShowUnconserved(displayNonconservedMenuItem.getState());
     alignPanel.paintAlignment(true);
   }
 
@@ -2360,8 +2557,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     frame.add(overview);
     // +50 must allow for applet frame window
     jalview.bin.JalviewLite.addFrame(frame, MessageManager.formatMessage(
-            "label.overview_params", new String[]
-            { this.getTitle() }), overview.getPreferredSize().width,
+            "label.overview_params", new String[] { this.getTitle() }),
+            overview.getPreferredSize().width,
             overview.getPreferredSize().height + 50);
 
     frame.pack();
@@ -2382,9 +2579,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   }
 
-  void changeColour(ColourSchemeI cs)
+  public void changeColour(ColourSchemeI cs)
   {
-    int threshold = 0;
 
     if (cs != null)
     {
@@ -2407,15 +2603,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     }
     viewport.setGlobalColourScheme(cs);
 
-    if (alignPanel.getOverviewPanel() != null)
-    {
-      alignPanel.getOverviewPanel().updateOverviewImage();
-    }
-
-    jalview.structure.StructureSelectionManager
-            .getStructureSelectionManager(viewport.applet)
-            .sequenceColoursChanged(alignPanel);
-
     alignPanel.paintAlignment(true);
   }
 
@@ -2647,8 +2834,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     // addHistoryItem(new HistoryItem("Sort", viewport.alignment,
     // HistoryItem.SORT));
     addHistoryItem(new OrderCommand(MessageManager.formatMessage(
-            "label.order_by_params", new String[]
-            { title }), oldOrder, viewport.getAlignment()));
+            "label.order_by_params", new String[] { title }), oldOrder,
+            viewport.getAlignment()));
     alignPanel.paintAlignment(true);
   }
 
@@ -2745,12 +2932,12 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
         // lite and application
         g.setFont(new Font("Helvetica", Font.BOLD, 14));
         g.drawString(MessageManager.formatMessage(
-                "label.jalviewLite_release", new String[]
-                { version }), x, y += fh);
+                "label.jalviewLite_release", new String[] { version }), x,
+                y += fh);
         g.setFont(new Font("Helvetica", Font.BOLD, 12));
         g.drawString(MessageManager.formatMessage(
-                "label.jaview_build_date", new String[]
-                { builddate }), x, y += fh);
+                "label.jaview_build_date", new String[] { builddate }), x,
+                y += fh);
         g.setFont(new Font("Helvetica", Font.PLAIN, 12));
         g.drawString(MessageManager.getString("label.jalview_authors_1"),
                 x, y += fh * 1.5);
@@ -2811,23 +2998,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
           MessageManager.getString("label.load_features_annotations"));
 
   MenuItem outputFeatures = new MenuItem(
-          MessageManager.getString("label.export_features").concat("..."));
+          MessageManager.getString("label.export_features"));
 
   MenuItem outputAnnotations = new MenuItem(
-          MessageManager.getString("label.export_annotations").concat("..."));
+          MessageManager.getString("label.export_annotations"));
 
   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"));
 
@@ -2871,8 +3049,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();
@@ -2891,7 +3067,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem purinePyrimidineColour = new MenuItem();
 
-  MenuItem RNAInteractionColour = new MenuItem();
+  // MenuItem RNAInteractionColour = new MenuItem();
 
   MenuItem RNAHelixColour = new MenuItem();
 
@@ -2970,22 +3146,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();
@@ -2996,8 +3165,6 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   CheckboxMenuItem followMouseOverFlag = new CheckboxMenuItem();
 
-  Menu autoAnnMenu = new Menu();
-
   CheckboxMenuItem showSequenceLogo = new CheckboxMenuItem();
 
   CheckboxMenuItem applyAutoAnnotationSettings = new CheckboxMenuItem();
@@ -3010,18 +3177,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()
@@ -3037,14 +3213,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);
@@ -3057,44 +3250,173 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     removeAllGapsMenuItem.setLabel(MessageManager
             .getString("action.remove_all_gaps"));
     removeAllGapsMenuItem.addActionListener(this);
+    removeRedundancyMenuItem.setLabel(MessageManager
+            .getString("action.remove_redundancy"));
+    removeRedundancyMenuItem.addActionListener(this);
+
+    /*
+     * Configure Select menu items and actions
+     */
+    findMenuItem.setLabel(MessageManager.getString("action.find"));
+    findMenuItem.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);
+    grpsFromSelection.setLabel(MessageManager
+            .getString("action.make_groups_selection"));
+    grpsFromSelection.addActionListener(this);
+    createGroup.setLabel(MessageManager.getString("action.create_group"));
+    unGroup.setLabel(MessageManager.getString("action.remove_group"));
+    annotationColumnSelection.setLabel(MessageManager
+            .getString("action.select_by_annotation"));
+    annotationColumnSelection.addActionListener(this);
+
+    /*
+     * 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"));
+    Menu hideMenu = new Menu(MessageManager.getString("action.hide"));
+    hideColumns
+            .setLabel(MessageManager.getString("label.selected_columns"));
+    hideSequences.setLabel(MessageManager
+            .getString("label.selected_sequences"));
+    hideAllButSelection.setLabel(MessageManager
+            .getString("label.all_but_selected_region"));
+    hideAllSelection.setLabel(MessageManager
+            .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("action.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
+            .getString("label.group_conservation"));
+    showConsensusHistogram.setLabel(MessageManager
+            .getString("label.show_consensus_histogram"));
+    showSequenceLogo.setLabel(MessageManager
+            .getString("label.show_consensus_logo"));
+    normSequenceLogo.setLabel(MessageManager
+            .getString("label.norm_consensus_logo"));
+    applyAutoAnnotationSettings.setLabel(MessageManager
+            .getString("label.apply_all_groups"));
+    applyAutoAnnotationSettings.setState(true);
+    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);
+    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);
-    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.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"));
+    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);
@@ -3116,9 +3438,9 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     purinePyrimidineColour.setLabel(MessageManager
             .getString("label.purine_pyrimidine"));
     purinePyrimidineColour.addActionListener(this);
-    RNAInteractionColour.setLabel(MessageManager
-            .getString("label.rna_interaction"));
-    RNAInteractionColour.addActionListener(this);
+    // RNAInteractionColour.setLabel(MessageManager
+    // .getString("label.rna_interaction"));
+    // RNAInteractionColour.addActionListener(this);
     RNAHelixColour.setLabel(MessageManager
             .getString("action.by_rna_helixes"));
     RNAHelixColour.addActionListener(this);
@@ -3133,213 +3455,127 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     BLOSUM62Colour.addActionListener(this);
     tcoffeeColour
             .setLabel(MessageManager.getString("label.tcoffee_scores"));
-    tcoffeeColour.setEnabled(false); // it will enabled only if a score file is
-                                     // provided
+    // it will be enabled only if a score file is provided
+    tcoffeeColour.setEnabled(false);
     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);
-    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);
-    deleteGroups.setLabel(MessageManager
-            .getString("action.undefine_groups"));
-    deleteGroups.addActionListener(this);
-    grpsFromSelection.setLabel(MessageManager
-            .getString("action.make_groups_selection"));
-    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);
+    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"));
-    sort.setLabel(MessageManager.getString("action.sort"));
-    calculate.setLabel(MessageManager.getString("action.calculate_tree"));
+    Menu sortMenu = new Menu(MessageManager.getString("action.sort"));
+    Menu calculateTreeMenu = new Menu(
+            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"));
+
+    /*
+     * 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);
-    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);
-    invertSequenceMenuItem.setLabel(MessageManager
-            .getString("action.invert_sequence_selection"));
-    invertColSel.setLabel(MessageManager
-            .getString("action.invert_column_selection"));
-    menu1.setLabel(MessageManager.getString("action.show"));
-    showColumns.setLabel(MessageManager.getString("label.all_columns"));
-    showSeqs.setLabel(MessageManager.getString("label.all_sequences"));
-    menu2.setLabel(MessageManager.getString("action.hide"));
-    hideColumns
-            .setLabel(MessageManager.getString("label.selected_columns"));
-    hideSequences.setLabel(MessageManager
-            .getString("label.selected_sequences"));
-    hideAllButSelection.setLabel(MessageManager
-            .getString("label.all_but_selected_region"));
-    hideAllSelection.setLabel(MessageManager
-            .getString("label.selected_region"));
-    showAllHidden.setLabel(MessageManager
-            .getString("label.all_sequences_columns"));
-    showGroupConsensus.setLabel(MessageManager
-            .getString("label.group_consensus"));
-    showGroupConservation.setLabel(MessageManager
-            .getString("label.group_conservation"));
-    showConsensusHistogram.setLabel(MessageManager
-            .getString("label.show_consensus_histogram"));
-    showSequenceLogo.setLabel(MessageManager
-            .getString("label.show_consensus_logo"));
-    normSequenceLogo.setLabel(MessageManager
-            .getString("label.norm_consensus_logo"));
-    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);
-    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);
+    /*
+     * 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();
@@ -3348,21 +3584,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);
@@ -3370,6 +3623,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);
@@ -3395,57 +3690,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);
 
+    /*
+     * 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)
@@ -3459,16 +3737,14 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem annotationColour = new MenuItem();
 
-  MenuItem invertColSel = new MenuItem();
+  MenuItem annotationColumnSelection = new MenuItem();
 
-  Menu menu1 = new Menu();
+  MenuItem invertColSel = new MenuItem();
 
   MenuItem showColumns = new MenuItem();
 
   MenuItem showSeqs = new MenuItem();
 
-  Menu menu2 = new Menu();
-
   MenuItem hideColumns = new MenuItem();
 
   MenuItem hideSequences = new MenuItem();
@@ -3479,11 +3755,21 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
 
   MenuItem showAllHidden = new MenuItem();
 
-  Menu formatMenu = new Menu();
+  MenuItem newView = new MenuItem();
+
+  private CheckboxMenuItem showAlignmentAnnotations;
 
-  Menu selectMenu = new Menu();
+  private CheckboxMenuItem showSequenceAnnotations;
 
-  MenuItem newView = new MenuItem();
+  private CheckboxMenuItem sortAnnBySequence;
+
+  private CheckboxMenuItem sortAnnByLabel;
+
+  private CheckboxMenuItem showAutoFirst;
+
+  private CheckboxMenuItem showAutoLast;
+
+  private SplitFrame splitFrame;
 
   /**
    * Attach the alignFrame panels after embedding menus, if necessary. This used
@@ -3494,46 +3780,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
    *          true to attach the view to the applet area on the page rather than
    *          in a new window
    */
-  public void createAlignFrameWindow(boolean reallyEmbedded, String title)
+  public void createAlignFrameWindow(boolean reallyEmbedded)
   {
     if (reallyEmbedded)
     {
-      // ////
-      // Explicly build the embedded menu panel for the on-page applet
-      //
-      // view cannot be closed if its actually on the page
-      fileMenu.remove(closeMenuItem);
-      fileMenu.remove(3); // Remove Seperator
-      embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, "Arial",
-              Font.PLAIN, 11, false); // use our own fonts.
-      // and actually add the components to the applet area
-      viewport.applet.setLayout(new BorderLayout());
-      viewport.applet.add(embeddedMenu, BorderLayout.NORTH);
-      viewport.applet.add(statusBar, BorderLayout.SOUTH);
-      alignPanel.setSize(viewport.applet.getSize().width,
-              viewport.applet.getSize().height - embeddedMenu.HEIGHT
-                      - statusBar.HEIGHT);
-      viewport.applet.add(alignPanel, BorderLayout.CENTER);
-      final AlignFrame me = this;
-      viewport.applet.addFocusListener(new FocusListener()
-      {
-
-        @Override
-        public void focusLost(FocusEvent e)
-        {
-          if (me.viewport.applet.currentAlignFrame == me)
-          {
-            me.viewport.applet.currentAlignFrame = null;
-          }
-        }
-
-        @Override
-        public void focusGained(FocusEvent e)
-        {
-          me.viewport.applet.currentAlignFrame = me;
-        }
-      });
-      viewport.applet.validate();
+      embedAlignFrameInApplet(viewport.applet);
     }
     else
     {
@@ -3542,19 +3793,68 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       //
       if (embedMenuIfNeeded(alignPanel))
       {
-        // adjust for status bar height too
-        alignPanel.setSize(getSize().width, getSize().height
-                - statusBar.HEIGHT);
+        /*
+         * adjust for status bar height too. ? pointless as overridden by layout
+         * manager
+         */
+        alignPanel.setSize(getSize().width,
+                getSize().height - statusBar.getHeight());
       }
       add(statusBar, BorderLayout.SOUTH);
       add(alignPanel, BorderLayout.CENTER);
       // and register with the applet so it can pass external API calls to us
-      jalview.bin.JalviewLite.addFrame(this, title, DEFAULT_WIDTH,
-              DEFAULT_HEIGHT);
+      jalview.bin.JalviewLite.addFrame(this, this.getTitle(), frameWidth,
+              frameHeight);
     }
   }
 
   /**
+   * Add the components of this AlignFrame to the applet container.
+   * 
+   * @param theApplet
+   */
+  public void embedAlignFrameInApplet(final JalviewLite theApplet)
+  {
+    // ////
+    // Explicitly build the embedded menu panel for the on-page applet
+    //
+    // view cannot be closed if its actually on the page
+    fileMenu.remove(closeMenuItem);
+    fileMenu.remove(3); // Remove Separator
+    // construct embedded menu, using default font
+    embeddedMenu = makeEmbeddedPopupMenu(alignFrameMenuBar, false, false);
+    // and actually add the components to the applet area
+    theApplet.setLayout(new BorderLayout());
+    theApplet.add(embeddedMenu, BorderLayout.NORTH);
+    theApplet.add(statusBar, BorderLayout.SOUTH);
+    // TODO should size be left to the layout manager?
+    alignPanel.setSize(theApplet.getSize().width,
+            theApplet.getSize().height - embeddedMenu.getHeight()
+                    - statusBar.getHeight());
+    theApplet.add(alignPanel, BorderLayout.CENTER);
+    final AlignFrame me = this;
+    theApplet.addFocusListener(new FocusListener()
+    {
+
+      @Override
+      public void focusLost(FocusEvent e)
+      {
+        if (theApplet.currentAlignFrame == me)
+        {
+          theApplet.currentAlignFrame = null;
+        }
+      }
+
+      @Override
+      public void focusGained(FocusEvent e)
+      {
+        theApplet.currentAlignFrame = me;
+      }
+    });
+    theApplet.validate();
+  }
+
+  /**
    * create a new binding between structures in an existing jmol viewer instance
    * and an alignpanel with sequences that have existing PDBFile entries. Note,
    * this does not open a new Jmol window, or modify the display of the
@@ -3570,10 +3870,10 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
   public SequenceStructureBinding addStructureViewInstance(
           Object jmolviewer, String[] sequenceIds)
   {
-    org.jmol.api.JmolViewer viewer = null;
+    Viewer viewer = null;
     try
     {
-      viewer = (org.jmol.api.JmolViewer) jmolviewer;
+      viewer = (Viewer) jmolviewer;
     } catch (ClassCastException ex)
     {
       System.err.println("Unsupported viewer object :"
@@ -3615,12 +3915,11 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
         return null;
       }
     }
-    ExtJmol jmv = null;
+    AAStructureBindingModel jmv = null;
     // TODO: search for a jmv that involves viewer
     if (jmv == null)
     { // create a new viewer/jalview binding.
-      jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][]
-      { seqs });
+      jmv = new ExtJmol(viewer, alignPanel, new SequenceI[][] { seqs });
     }
     return jmv;
 
@@ -3646,7 +3945,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     boolean needtoadd = false;
     if (toaddpdb != null)
     {
-      Vector pdbe = toaddpdb.getPDBId();
+      Vector pdbe = toaddpdb.getAllPDBEntries();
       PDBEntry pdbentry = null;
       if (pdbe != null && pdbe.size() > 0)
       {
@@ -3703,8 +4002,8 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
       {
         if (seqs[i] != null)
         {
-          sequences.addElement(new Object[]
-          { seqs[i], (chains != null) ? chains[i] : null });
+          sequences.addElement(new Object[] { seqs[i],
+              (chains != null) ? chains[i] : null });
         }
       }
       seqs = new SequenceI[sequences.size()];
@@ -3717,8 +4016,7 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
         chains[i] = (String) oj[1];
       }
     }
-    return new Object[]
-    { seqs, chains };
+    return new Object[] { seqs, chains };
 
   }
 
@@ -3896,4 +4194,46 @@ public class AlignFrame extends EmbmenuFrame implements ActionListener,
     return false;
   }
 
+  public SplitFrame getSplitFrame()
+  {
+    return this.splitFrame;
+  }
+
+  public void setSplitFrame(SplitFrame sf)
+  {
+    this.splitFrame = sf;
+  }
+
+  // may not need this
+  @Override
+  public void setShowSeqFeatures(boolean b)
+  {
+    // showSeqFeatures.setSelected(b);
+    viewport.setShowSequenceFeatures(b);
+
+  }
+
+  @Override
+  public void setMenusForViewport()
+  {
+    // setMenusFromViewport(viewport);
+
+  }
+
+  @Override
+  public void refreshFeatureUI(boolean enableIfNecessary)
+  {
+    if (enableIfNecessary)
+    {
+      sequenceFeatures.setState(true);
+      alignPanel.av.setShowSequenceFeatures(true);
+    }
+  }
+
+  @Override
+  public FeatureSettingsControllerI getFeatureSettingsUI()
+  {
+    return alignPanel.av.featureSettings;
+  }
+
 }