Merge branch 'features/JAL-1605_html-svg-export' into develop
[jalview.git] / src / jalview / jbgui / GAlignFrame.java
index d3154c7..4bf8176 100755 (executable)
  */
 package jalview.jbgui;
 
+import jalview.analysis.AnnotationSorter.SequenceAnnotationOrder;
+import jalview.bin.Cache;
+import jalview.gui.JvSwingUtils;
+import jalview.gui.Preferences;
 import jalview.schemes.ColourSchemeProperty;
 import jalview.util.MessageManager;
 
@@ -63,6 +67,8 @@ public class GAlignFrame extends JInternalFrame
 
   protected JMenu viewMenu = new JMenu();
 
+  protected JMenu annotationsMenu = new JMenu();
+
   protected JMenu colourMenu = new JMenu();
 
   protected JMenu calculateMenu = new JMenu();
@@ -208,6 +214,10 @@ public class GAlignFrame extends JInternalFrame
 
   JMenuItem createPNG = new JMenuItem();
 
+  JMenuItem createBioJS = new JMenuItem();
+
+  JMenuItem createSVG = new JMenuItem();
+
   protected JMenuItem font = new JMenuItem();
 
   public JCheckBoxMenuItem seqLimits = new JCheckBoxMenuItem();
@@ -302,6 +312,18 @@ public class GAlignFrame extends JInternalFrame
 
   JMenuItem showAllhidden = new JMenuItem();
 
+  protected JMenuItem showAllSeqAnnotations = new JMenuItem();
+
+  protected JMenuItem hideAllSeqAnnotations = new JMenuItem();
+
+  protected JMenuItem showAllAlAnnotations = new JMenuItem();
+
+  protected JMenuItem hideAllAlAnnotations = new JMenuItem();
+
+  protected JCheckBoxMenuItem sortAnnBySequence = new JCheckBoxMenuItem();
+
+  protected JCheckBoxMenuItem sortAnnByLabel = new JCheckBoxMenuItem();
+
   protected JCheckBoxMenuItem hiddenMarkers = new JCheckBoxMenuItem();
 
   JMenuItem invertColSel = new JMenuItem();
@@ -354,8 +376,16 @@ public class GAlignFrame extends JInternalFrame
 
   protected JCheckBoxMenuItem applyAutoAnnotationSettings = new JCheckBoxMenuItem();
 
+  protected JRadioButtonMenuItem showAutoFirst = new JRadioButtonMenuItem();
+
+  protected JRadioButtonMenuItem showAutoLast = new JRadioButtonMenuItem();
+
   private JMenuItem grpsFromSelection = new JMenuItem();
 
+  private SequenceAnnotationOrder annotationSortOrder;
+
+  private boolean showAutoCalculatedAbove = false;
+
   public GAlignFrame()
   {
     try
@@ -371,6 +401,7 @@ public class GAlignFrame extends JInternalFrame
 
         item.addActionListener(new java.awt.event.ActionListener()
         {
+          @Override
           public void actionPerformed(ActionEvent e)
           {
             outputText_actionPerformed(e);
@@ -381,6 +412,7 @@ public class GAlignFrame extends JInternalFrame
       }
     } catch (Exception e)
     {
+      System.err.println(e.toString());
     }
 
     if (!new jalview.util.Platform().isAMac())
@@ -407,6 +439,7 @@ public class GAlignFrame extends JInternalFrame
         radioItem.setName("USER_DEFINED");
         radioItem.addMouseListener(new MouseAdapter()
         {
+          @Override
           public void mousePressed(MouseEvent evt)
           {
             if (evt.isControlDown()
@@ -431,6 +464,7 @@ public class GAlignFrame extends JInternalFrame
               {
                 radioItem.addActionListener(new ActionListener()
                 {
+                  @Override
                   public void actionPerformed(ActionEvent evt)
                   {
                     userDefinedColour_actionPerformed(evt);
@@ -442,6 +476,7 @@ public class GAlignFrame extends JInternalFrame
         });
         radioItem.addActionListener(new ActionListener()
         {
+          @Override
           public void actionPerformed(ActionEvent evt)
           {
             userDefinedColour_actionPerformed(evt);
@@ -580,6 +615,7 @@ public class GAlignFrame extends JInternalFrame
                     | java.awt.event.KeyEvent.SHIFT_MASK, false));
     saveAs.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         saveAs_actionPerformed(e);
@@ -591,6 +627,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     closeMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         closeMenuItem_actionPerformed(false);
@@ -598,6 +635,7 @@ public class GAlignFrame extends JInternalFrame
     });
     editMenu.setText(MessageManager.getString("action.edit"));
     viewMenu.setText(MessageManager.getString("action.view"));
+    annotationsMenu.setText(MessageManager.getString("action.annotations"));
     colourMenu.setText(MessageManager.getString("action.colour"));
     calculateMenu.setText(MessageManager.getString("action.calculate"));
     webService.setText(MessageManager.getString("action.web_service"));
@@ -609,6 +647,7 @@ public class GAlignFrame extends JInternalFrame
     selectAllSequenceMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 selectAllSequenceMenuItem_actionPerformed(e);
@@ -621,6 +660,7 @@ public class GAlignFrame extends JInternalFrame
     deselectAllSequenceMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 deselectAllSequenceMenuItem_actionPerformed(e);
@@ -634,6 +674,7 @@ public class GAlignFrame extends JInternalFrame
     invertSequenceMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 invertSequenceMenuItem_actionPerformed(e);
@@ -643,6 +684,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("action.make_groups_selection"));
     grpsFromSelection.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         makeGrpsFromSelection_actionPerformed(e);
@@ -668,6 +710,7 @@ public class GAlignFrame extends JInternalFrame
     remove2LeftMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 remove2LeftMenuItem_actionPerformed(e);
@@ -681,6 +724,7 @@ public class GAlignFrame extends JInternalFrame
     remove2RightMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 remove2RightMenuItem_actionPerformed(e);
@@ -694,6 +738,7 @@ public class GAlignFrame extends JInternalFrame
     removeGappedColumnMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 removeGappedColumnMenuItem_actionPerformed(e);
@@ -708,6 +753,7 @@ public class GAlignFrame extends JInternalFrame
     removeAllGapsMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 removeAllGapsMenuItem_actionPerformed(e);
@@ -718,6 +764,7 @@ public class GAlignFrame extends JInternalFrame
     justifyLeftMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 justifyLeftMenuItem_actionPerformed(e);
@@ -728,6 +775,7 @@ public class GAlignFrame extends JInternalFrame
     justifyRightMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 justifyRightMenuItem_actionPerformed(e);
@@ -737,6 +785,7 @@ public class GAlignFrame extends JInternalFrame
     viewBoxesMenuItem.setState(true);
     viewBoxesMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         viewBoxesMenuItem_actionPerformed(e);
@@ -746,6 +795,7 @@ public class GAlignFrame extends JInternalFrame
     viewTextMenuItem.setState(true);
     viewTextMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         viewTextMenuItem_actionPerformed(e);
@@ -757,6 +807,7 @@ public class GAlignFrame extends JInternalFrame
     showNonconservedMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 showUnconservedMenuItem_actionPerformed(e);
@@ -767,6 +818,7 @@ public class GAlignFrame extends JInternalFrame
     sortPairwiseMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 sortPairwiseMenuItem_actionPerformed(e);
@@ -775,6 +827,7 @@ public class GAlignFrame extends JInternalFrame
     sortIDMenuItem.setText(MessageManager.getString("action.by_id"));
     sortIDMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         sortIDMenuItem_actionPerformed(e);
@@ -785,6 +838,7 @@ public class GAlignFrame extends JInternalFrame
     sortLengthMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 sortLengthMenuItem_actionPerformed(e);
@@ -793,19 +847,21 @@ public class GAlignFrame extends JInternalFrame
     sortGroupMenuItem.setText(MessageManager.getString("action.by_group"));
     sortGroupMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         sortGroupMenuItem_actionPerformed(e);
       }
     });
     removeRedundancyMenuItem.setText(MessageManager
-            .getString("action.remove_redundancy"));
+            .getString("action.remove_redundancy").concat("..."));
     removeRedundancyMenuItem.setAccelerator(javax.swing.KeyStroke
             .getKeyStroke(java.awt.event.KeyEvent.VK_D, Toolkit
                     .getDefaultToolkit().getMenuShortcutKeyMask(), false));
     removeRedundancyMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 removeRedundancyMenuItem_actionPerformed(e);
@@ -816,6 +872,7 @@ public class GAlignFrame extends JInternalFrame
     pairwiseAlignmentMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 pairwiseAlignmentMenuItem_actionPerformed(e);
@@ -825,6 +882,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.principal_component_analysis"));
     PCAMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         PCAMenuItem_actionPerformed(e);
@@ -835,6 +893,7 @@ public class GAlignFrame extends JInternalFrame
     averageDistanceTreeMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 averageDistanceTreeMenuItem_actionPerformed(e);
@@ -845,6 +904,7 @@ public class GAlignFrame extends JInternalFrame
     neighbourTreeMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 neighbourTreeMenuItem_actionPerformed(e);
@@ -862,6 +922,7 @@ public class GAlignFrame extends JInternalFrame
 
     clustalColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         clustalColour_actionPerformed(e);
@@ -870,6 +931,7 @@ public class GAlignFrame extends JInternalFrame
     zappoColour.setText(MessageManager.getString("label.zappo"));
     zappoColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         zappoColour_actionPerformed(e);
@@ -878,6 +940,7 @@ public class GAlignFrame extends JInternalFrame
     taylorColour.setText(MessageManager.getString("label.taylor"));
     taylorColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         taylorColour_actionPerformed(e);
@@ -888,6 +951,7 @@ public class GAlignFrame extends JInternalFrame
     hydrophobicityColour
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 hydrophobicityColour_actionPerformed(e);
@@ -896,6 +960,7 @@ public class GAlignFrame extends JInternalFrame
     helixColour.setText(MessageManager.getString("label.helix_propensity"));
     helixColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         helixColour_actionPerformed(e);
@@ -905,6 +970,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.strand_propensity"));
     strandColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         strandColour_actionPerformed(e);
@@ -913,6 +979,7 @@ public class GAlignFrame extends JInternalFrame
     turnColour.setText(MessageManager.getString("label.turn_propensity"));
     turnColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         turnColour_actionPerformed(e);
@@ -921,6 +988,7 @@ public class GAlignFrame extends JInternalFrame
     buriedColour.setText(MessageManager.getString("label.buried_index"));
     buriedColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         buriedColour_actionPerformed(e);
@@ -930,6 +998,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("action.user_defined"));
     userDefinedColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         userDefinedColour_actionPerformed(e);
@@ -939,6 +1008,7 @@ public class GAlignFrame extends JInternalFrame
             .setText(MessageManager.getString("label.percentage_identity"));
     PIDColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         PIDColour_actionPerformed(e);
@@ -948,6 +1018,7 @@ public class GAlignFrame extends JInternalFrame
             .setText(MessageManager.getString("label.blosum62_score"));
     BLOSUM62Colour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         BLOSUM62Colour_actionPerformed(e);
@@ -956,6 +1027,7 @@ public class GAlignFrame extends JInternalFrame
     nucleotideColour.setText(MessageManager.getString("label.nucleotide"));
     nucleotideColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         nucleotideColour_actionPerformed(e);
@@ -967,6 +1039,7 @@ public class GAlignFrame extends JInternalFrame
     purinePyrimidineColour
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 purinePyrimidineColour_actionPerformed(e);
@@ -977,6 +1050,7 @@ public class GAlignFrame extends JInternalFrame
     RNAInteractionColour
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 RNAInteractionColour_actionPerformed(e);
@@ -994,6 +1068,7 @@ public class GAlignFrame extends JInternalFrame
     avDistanceTreeBlosumMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 avTreeBlosumMenuItem_actionPerformed(e);
@@ -1004,6 +1079,7 @@ public class GAlignFrame extends JInternalFrame
     njTreeBlosumMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 njTreeBlosumMenuItem_actionPerformed(e);
@@ -1012,21 +1088,103 @@ public class GAlignFrame extends JInternalFrame
     annotationPanelMenuItem.setActionCommand("");
     annotationPanelMenuItem.setText(MessageManager
             .getString("label.show_annotations"));
-    annotationPanelMenuItem.setState(jalview.bin.Cache.getDefault(
-            "SHOW_ANNOTATIONS", true));
-    annotationPanelMenuItem
-            .addActionListener(new java.awt.event.ActionListener()
-            {
-              public void actionPerformed(ActionEvent e)
-              {
-                annotationPanelMenuItem_actionPerformed(e);
-              }
-            });
+    annotationPanelMenuItem.setState(Cache.getDefault("SHOW_ANNOTATIONS",
+            true));
+    annotationPanelMenuItem.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        annotationPanelMenuItem_actionPerformed(e);
+      }
+    });
+    showAllAlAnnotations.setText(MessageManager
+            .getString("label.show_all_al_annotations"));
+    final boolean isAnnotationPanelShown = annotationPanelMenuItem
+            .getState();
+    showAllAlAnnotations.setEnabled(isAnnotationPanelShown);
+    showAllAlAnnotations.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        showAllAnnotations_actionPerformed(false, true);
+      }
+    });
+    hideAllAlAnnotations.setText(MessageManager
+            .getString("label.hide_all_al_annotations"));
+    hideAllAlAnnotations.setEnabled(isAnnotationPanelShown);
+    hideAllAlAnnotations.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        hideAllAnnotations_actionPerformed(false, true);
+      }
+    });
+    showAllSeqAnnotations.setText(MessageManager
+            .getString("label.show_all_seq_annotations"));
+    showAllSeqAnnotations.setEnabled(isAnnotationPanelShown);
+    showAllSeqAnnotations.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        showAllAnnotations_actionPerformed(true, false);
+      }
+    });
+    hideAllSeqAnnotations.setText(MessageManager
+            .getString("label.hide_all_seq_annotations"));
+    hideAllSeqAnnotations.setEnabled(isAnnotationPanelShown);
+    hideAllSeqAnnotations.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        hideAllAnnotations_actionPerformed(true, false);
+      }
+    });
+    SequenceAnnotationOrder sortAnnotationsBy = SequenceAnnotationOrder
+            .valueOf(Cache.getDefault(Preferences.SORT_ANNOTATIONS,
+                    SequenceAnnotationOrder.NONE.name()));
+    sortAnnBySequence.setText(MessageManager
+            .getString("label.sort_annotations_by_sequence"));
+    sortAnnBySequence
+            .setSelected(sortAnnotationsBy == SequenceAnnotationOrder.SEQUENCE_AND_LABEL);
+    sortAnnBySequence.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        boolean newState = sortAnnBySequence.getState();
+        sortAnnByLabel.setSelected(false);
+        setAnnotationSortOrder(newState ? SequenceAnnotationOrder.SEQUENCE_AND_LABEL
+                : SequenceAnnotationOrder.NONE);
+        sortAnnotations_actionPerformed();
+      }
+    });
+    sortAnnByLabel.setText(MessageManager
+            .getString("label.sort_annotations_by_label"));
+    sortAnnByLabel
+            .setSelected(sortAnnotationsBy == SequenceAnnotationOrder.LABEL_AND_SEQUENCE);
+    sortAnnByLabel.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        boolean newState = sortAnnByLabel.getState();
+        sortAnnBySequence.setSelected(false);
+        setAnnotationSortOrder(newState ? SequenceAnnotationOrder.LABEL_AND_SEQUENCE
+                : SequenceAnnotationOrder.NONE);
+        sortAnnotations_actionPerformed();
+      }
+    });
     colourTextMenuItem.setText(MessageManager
             .getString("label.colour_text"));
     colourTextMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 colourTextMenuItem_actionPerformed(e);
@@ -1035,15 +1193,30 @@ public class GAlignFrame extends JInternalFrame
     htmlMenuItem.setText(MessageManager.getString("label.html"));
     htmlMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         htmlMenuItem_actionPerformed(e);
       }
     });
+
+    // TODO uncomment when supported by MassageManager
+    // createBioJS.setText(MessageManager.getString("label.biojs_html_export"));
+    createBioJS.setText("BioJS");
+    createBioJS.addActionListener(new java.awt.event.ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        bioJSMenuItem_actionPerformed(e);
+      }
+    });
+
     overviewMenuItem.setText(MessageManager
             .getString("label.overview_window"));
     overviewMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         overviewMenuItem_actionPerformed(e);
@@ -1056,6 +1229,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     undoMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         undoMenuItem_actionPerformed(e);
@@ -1068,6 +1242,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     redoMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         redoMenuItem_actionPerformed(e);
@@ -1078,6 +1253,7 @@ public class GAlignFrame extends JInternalFrame
     conservationMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 conservationMenuItem_actionPerformed(e);
@@ -1086,6 +1262,7 @@ public class GAlignFrame extends JInternalFrame
     noColourmenuItem.setText(MessageManager.getString("label.none"));
     noColourmenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         noColourmenuItem_actionPerformed(e);
@@ -1094,6 +1271,7 @@ public class GAlignFrame extends JInternalFrame
     wrapMenuItem.setText(MessageManager.getString("label.wrap"));
     wrapMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         wrapMenuItem_actionPerformed(e);
@@ -1105,6 +1283,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     printMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         printMenuItem_actionPerformed(e);
@@ -1116,6 +1295,7 @@ public class GAlignFrame extends JInternalFrame
     renderGapsMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 renderGapsMenuItem_actionPerformed(e);
@@ -1125,8 +1305,11 @@ public class GAlignFrame extends JInternalFrame
     findMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
             java.awt.event.KeyEvent.VK_F, Toolkit.getDefaultToolkit()
                     .getMenuShortcutKeyMask(), false));
+    findMenuItem.setToolTipText(JvSwingUtils.wrapTooltip(true,
+            MessageManager.getString("label.find_tip")));
     findMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         findMenuItem_actionPerformed(e);
@@ -1136,6 +1319,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.above_identity_threshold"));
     abovePIDThreshold.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         abovePIDThreshold_actionPerformed(e);
@@ -1145,6 +1329,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.show_sequence_features"));
     showSeqFeatures.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         showSeqFeatures_actionPerformed(actionEvent);
@@ -1161,6 +1346,7 @@ public class GAlignFrame extends JInternalFrame
     showDbRefsMenuitem.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showDbRefs_actionPerformed(e);
@@ -1172,6 +1358,7 @@ public class GAlignFrame extends JInternalFrame
     showNpFeatsMenuitem.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showNpFeats_actionPerformed(e);
@@ -1183,6 +1370,7 @@ public class GAlignFrame extends JInternalFrame
     showGroupConservation.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showGroupConservation_actionPerformed(e);
@@ -1195,6 +1383,7 @@ public class GAlignFrame extends JInternalFrame
     showGroupConsensus.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showGroupConsensus_actionPerformed(e);
@@ -1206,6 +1395,7 @@ public class GAlignFrame extends JInternalFrame
     showConsensusHistogram.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showConsensusHistogram_actionPerformed(e);
@@ -1217,6 +1407,7 @@ public class GAlignFrame extends JInternalFrame
     showSequenceLogo.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showSequenceLogo_actionPerformed(e);
@@ -1228,6 +1419,7 @@ public class GAlignFrame extends JInternalFrame
     normaliseSequenceLogo.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         normaliseSequenceLogo_actionPerformed(e);
@@ -1240,17 +1432,45 @@ public class GAlignFrame extends JInternalFrame
     applyAutoAnnotationSettings.setVisible(true);
     applyAutoAnnotationSettings.addActionListener(new ActionListener()
     {
-
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         applyAutoAnnotationSettings_actionPerformed(e);
       }
+    });
 
+    ButtonGroup buttonGroup = new ButtonGroup();
+    buttonGroup.add(showAutoFirst);
+    buttonGroup.add(showAutoLast);
+    showAutoFirst.setText(MessageManager.getString("label.show_first"));
+    showAutoFirst.setSelected(Cache.getDefault(
+            Preferences.SHOW_AUTOCALC_ABOVE,
+            false));
+    showAutoFirst.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        setShowAutoCalculatedAbove(showAutoFirst.isSelected());
+        sortAnnotations_actionPerformed();
+      }
+    });
+    showAutoLast.setText(MessageManager.getString("label.show_last"));
+    showAutoLast.setSelected(!showAutoFirst.isSelected());
+    showAutoLast.addActionListener(new ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        setShowAutoCalculatedAbove(!showAutoLast.isSelected());
+        sortAnnotations_actionPerformed();
+      }
     });
 
     nucleotideColour.setText(MessageManager.getString("label.nucleotide"));
     nucleotideColour.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         nucleotideColour_actionPerformed(e);
@@ -1276,6 +1496,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     deleteGroups.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         deleteGroups_actionPerformed(e);
@@ -1287,6 +1508,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     createGroup.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         createGroup_actionPerformed(e);
@@ -1299,6 +1521,7 @@ public class GAlignFrame extends JInternalFrame
                     | java.awt.event.KeyEvent.SHIFT_MASK, false));
     unGroup.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         unGroup_actionPerformed(e);
@@ -1311,6 +1534,7 @@ public class GAlignFrame extends JInternalFrame
 
     copy.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         copy_actionPerformed(e);
@@ -1322,16 +1546,16 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     cut.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         cut_actionPerformed(e);
       }
     });
     delete.setText(MessageManager.getString("action.delete"));
-    delete.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
-            java.awt.event.KeyEvent.VK_BACK_SPACE, 0, false));
     delete.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         delete_actionPerformed(e);
@@ -1345,6 +1569,7 @@ public class GAlignFrame extends JInternalFrame
                     | java.awt.event.KeyEvent.SHIFT_MASK, false));
     pasteNew.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         pasteNew_actionPerformed(e);
@@ -1356,6 +1581,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     pasteThis.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         pasteThis_actionPerformed(e);
@@ -1365,6 +1591,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.apply_colour_to_all_groups"));
     applyToAllGroups.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         applyToAllGroups_actionPerformed(e);
@@ -1372,6 +1599,7 @@ public class GAlignFrame extends JInternalFrame
     });
     createPNG.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         createPNG(null);
@@ -1380,20 +1608,22 @@ public class GAlignFrame extends JInternalFrame
     createPNG.setActionCommand(MessageManager
             .getString("label.save_png_image"));
     createPNG.setText("PNG");
+
     font.setText(MessageManager.getString("action.font"));
     font.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         font_actionPerformed(e);
       }
     });
-
     seqLimits.setText(MessageManager
             .getString("label.show_sequence_limits"));
     seqLimits.setState(jalview.bin.Cache.getDefault("SHOW_JVSUFFIX", true));
     seqLimits.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         seqLimit_actionPerformed(e);
@@ -1402,17 +1632,30 @@ public class GAlignFrame extends JInternalFrame
     epsFile.setText("EPS");
     epsFile.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         createEPS(null);
       }
     });
+
+    createSVG.setText("SVG");
+    createSVG.addActionListener(new java.awt.event.ActionListener()
+    {
+      @Override
+      public void actionPerformed(ActionEvent e)
+      {
+        createSVG(null);
+      }
+    });
+
     LoadtreeMenuItem.setActionCommand(MessageManager
             .getString("label.load_tree_for_sequence_set"));
     LoadtreeMenuItem.setText(MessageManager
             .getString("label.load_associated_tree"));
     LoadtreeMenuItem.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         LoadtreeMenuItem_actionPerformed(e);
@@ -1423,6 +1666,7 @@ public class GAlignFrame extends JInternalFrame
     scaleAbove.setText(MessageManager.getString("action.scale_above"));
     scaleAbove.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         scaleAbove_actionPerformed(e);
@@ -1433,6 +1677,7 @@ public class GAlignFrame extends JInternalFrame
     scaleLeft.setText(MessageManager.getString("action.scale_left"));
     scaleLeft.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         scaleLeft_actionPerformed(e);
@@ -1443,6 +1688,7 @@ public class GAlignFrame extends JInternalFrame
     scaleRight.setText(MessageManager.getString("action.scale_right"));
     scaleRight.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         scaleRight_actionPerformed(e);
@@ -1455,6 +1701,7 @@ public class GAlignFrame extends JInternalFrame
     centreColumnLabelsMenuItem
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 centreColumnLabels_actionPerformed(e);
@@ -1467,6 +1714,7 @@ public class GAlignFrame extends JInternalFrame
     followHighlightMenuItem.addActionListener(new ActionListener()
     {
 
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         followHighlight_actionPerformed();
@@ -1478,6 +1726,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.modify_identity_thereshold"));
     modifyPID.addActionListener(new java.awt.event.ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         modifyPID_actionPerformed(e);
@@ -1488,6 +1737,7 @@ public class GAlignFrame extends JInternalFrame
     modifyConservation
             .addActionListener(new java.awt.event.ActionListener()
             {
+              @Override
               public void actionPerformed(ActionEvent e)
               {
                 modifyConservation_actionPerformed(e);
@@ -1498,15 +1748,18 @@ public class GAlignFrame extends JInternalFrame
     sort.setText(MessageManager.getString("action.sort"));
     sort.addMenuListener(new MenuListener()
     {
+      @Override
       public void menuSelected(MenuEvent e)
       {
         buildTreeMenu();
       }
 
+      @Override
       public void menuDeselected(MenuEvent e)
       {
       }
 
+      @Override
       public void menuCanceled(MenuEvent e)
       {
       }
@@ -1514,17 +1767,20 @@ public class GAlignFrame extends JInternalFrame
     sortByAnnotScore.setText(MessageManager
             .getString("label.sort_by_score"));
     sort.add(sortByAnnotScore);
-    sortByAnnotScore.addMenuListener(new javax.swing.event.MenuListener()
+    sort.addMenuListener(new javax.swing.event.MenuListener()
     {
 
+      @Override
       public void menuCanceled(MenuEvent e)
       {
       }
 
+      @Override
       public void menuDeselected(MenuEvent e)
       {
       }
 
+      @Override
       public void menuSelected(MenuEvent e)
       {
         buildSortByAnnotationScoresMenu();
@@ -1541,6 +1797,7 @@ public class GAlignFrame extends JInternalFrame
             .getDefault("PAD_GAPS", false));
     padGapsMenuitem.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         padGapsMenuitem_actionPerformed(e);
@@ -1550,6 +1807,7 @@ public class GAlignFrame extends JInternalFrame
     vamsasStore.setText(MessageManager.getString("label.vamsas_store"));
     vamsasStore.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         vamsasStore_actionPerformed(e);
@@ -1559,6 +1817,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.translate_cDNA"));
     showTranslation.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showTranslation_actionPerformed(e);
@@ -1568,6 +1827,7 @@ public class GAlignFrame extends JInternalFrame
             + "...");
     extractScores.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         extractScores_actionPerformed(e);
@@ -1586,6 +1846,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.feature_settings"));
     openFeatureSettings.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         featureSettings_actionPerformed(e);
@@ -1595,6 +1856,7 @@ public class GAlignFrame extends JInternalFrame
             .setText(MessageManager.getString("label.fetch_sequences"));
     fetchSequence.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         fetchSequence_actionPerformed(e);
@@ -1605,6 +1867,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("action.by_annotation"));
     annotationColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         annotationColour_actionPerformed(e);
@@ -1615,6 +1878,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("action.by_rna_helixes"));
     rnahelicesColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         rnahelicesColour_actionPerformed(e);
@@ -1625,6 +1889,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.load_features_annotations"));
     associatedData.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         associatedData_actionPerformed(e);
@@ -1636,6 +1901,7 @@ public class GAlignFrame extends JInternalFrame
             "AUTO_CALC_CONSENSUS", true));
     autoCalculate.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         autoCalculate_actionPerformed(e);
@@ -1651,6 +1917,7 @@ public class GAlignFrame extends JInternalFrame
             .setState(jalview.bin.Cache.getDefault("SORT_BY_TREE", false));
     sortByTree.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         sortByTreeOption_actionPerformed(e);
@@ -1666,6 +1933,7 @@ public class GAlignFrame extends JInternalFrame
     listenToViewSelections.setState(false);
     listenToViewSelections.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         listenToViewSelections_actionPerformed(e);
@@ -1677,6 +1945,7 @@ public class GAlignFrame extends JInternalFrame
     addFromFile.setText(MessageManager.getString("label.from_file"));
     addFromFile.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         addFromFile_actionPerformed(e);
@@ -1685,6 +1954,7 @@ public class GAlignFrame extends JInternalFrame
     addFromText.setText(MessageManager.getString("label.from_textbox"));
     addFromText.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         addFromText_actionPerformed(e);
@@ -1693,6 +1963,7 @@ public class GAlignFrame extends JInternalFrame
     addFromURL.setText(MessageManager.getString("label.from_url"));
     addFromURL.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         addFromURL_actionPerformed(e);
@@ -1702,6 +1973,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.export_features"));
     exportFeatures.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         exportFeatures_actionPerformed(e);
@@ -1711,6 +1983,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.export_annotations"));
     exportAnnotations.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         exportAnnotations_actionPerformed(e);
@@ -1723,6 +1996,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.toggle_sequence_visibility"));
     showAllSeqs.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showAllSeqs_actionPerformed(e);
@@ -1733,6 +2007,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.toggle_columns_visibility"));
     showAllColumns.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showAllColumns_actionPerformed(e);
@@ -1745,6 +2020,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.toggle_sequence_visibility"));
     hideSelSequences.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         hideSelSequences_actionPerformed(e);
@@ -1756,6 +2032,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.toggle_columns_visibility"));
     hideSelColumns.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         hideSelColumns_actionPerformed(e);
@@ -1765,6 +2042,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.selected_region"));
     hideAllSelection.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         hideAllSelection_actionPerformed(e);
@@ -1775,6 +2053,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.all_but_selected_region"));
     hideAllButSelection.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         hideAllButSelection_actionPerformed(e);
@@ -1786,16 +2065,17 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.toggles_visibility_hidden_selected_regions"));
     showAllhidden.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         showAllhidden_actionPerformed(e);
       }
     });
-
     hiddenMarkers.setText(MessageManager
             .getString("action.show_hidden_markers"));
     hiddenMarkers.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         hiddenMarkers_actionPerformed(e);
@@ -1809,6 +2089,7 @@ public class GAlignFrame extends JInternalFrame
                     | java.awt.event.KeyEvent.ALT_MASK, false));
     invertColSel.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         invertColSel_actionPerformed(e);
@@ -1816,6 +2097,7 @@ public class GAlignFrame extends JInternalFrame
     });
     tabbedPane.addChangeListener(new javax.swing.event.ChangeListener()
     {
+      @Override
       public void stateChanged(ChangeEvent evt)
       {
         JTabbedPane pane = (JTabbedPane) evt.getSource();
@@ -1825,6 +2107,7 @@ public class GAlignFrame extends JInternalFrame
     });
     tabbedPane.addMouseListener(new MouseAdapter()
     {
+      @Override
       public void mousePressed(MouseEvent e)
       {
         tabbedPane_mousePressed(e);
@@ -1832,6 +2115,7 @@ public class GAlignFrame extends JInternalFrame
     });
     tabbedPane.addFocusListener(new FocusAdapter()
     {
+      @Override
       public void focusGained(FocusEvent e)
       {
         tabbedPane_focusGained(e);
@@ -1843,6 +2127,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     save.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         save_actionPerformed(e);
@@ -1852,6 +2137,7 @@ public class GAlignFrame extends JInternalFrame
     reload.setText(MessageManager.getString("action.reload"));
     reload.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         reload_actionPerformed(e);
@@ -1863,6 +2149,7 @@ public class GAlignFrame extends JInternalFrame
                     .getMenuShortcutKeyMask(), false));
     newView.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         newView_actionPerformed(e);
@@ -1875,6 +2162,7 @@ public class GAlignFrame extends JInternalFrame
             + "...");
     textColour.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         textColour_actionPerformed(e);
@@ -1886,6 +2174,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.right_align_sequence_id"));
     idRightAlign.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         idRightAlign_actionPerformed(e);
@@ -1897,6 +2186,7 @@ public class GAlignFrame extends JInternalFrame
             java.awt.event.KeyEvent.VK_G, 0, false));
     gatherViews.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         gatherViews_actionPerformed(e);
@@ -1908,6 +2198,7 @@ public class GAlignFrame extends JInternalFrame
             java.awt.event.KeyEvent.VK_X, 0, false));
     expandViews.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         expandViews_actionPerformed(e);
@@ -1917,6 +2208,7 @@ public class GAlignFrame extends JInternalFrame
             .setText(MessageManager.getString("action.page_setup") + "...");
     pageSetup.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         pageSetup_actionPerformed(e);
@@ -1926,6 +2218,7 @@ public class GAlignFrame extends JInternalFrame
             .getString("label.alignment_props") + "...");
     alignmentProperties.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent actionEvent)
       {
         alignmentProperties();
@@ -1939,6 +2232,7 @@ public class GAlignFrame extends JInternalFrame
     alignFrameMenuBar.add(editMenu);
     alignFrameMenuBar.add(selectMenu);
     alignFrameMenuBar.add(viewMenu);
+    alignFrameMenuBar.add(annotationsMenu);
     alignFrameMenuBar.add(formatMenu);
     alignFrameMenuBar.add(colourMenu);
     alignFrameMenuBar.add(calculateMenu);
@@ -1988,7 +2282,19 @@ public class GAlignFrame extends JInternalFrame
     viewMenu.add(hideMenu);
     viewMenu.addSeparator();
     viewMenu.add(followHighlightMenuItem);
-    viewMenu.add(annotationPanelMenuItem);
+    annotationsMenu.add(annotationPanelMenuItem);
+    annotationsMenu.addSeparator();
+    annotationsMenu.add(showAllAlAnnotations);
+    annotationsMenu.add(hideAllAlAnnotations);
+    annotationsMenu.addSeparator();
+    annotationsMenu.add(showAllSeqAnnotations);
+    annotationsMenu.add(hideAllSeqAnnotations);
+    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);
@@ -1996,7 +2302,7 @@ public class GAlignFrame extends JInternalFrame
     autoAnnMenu.addSeparator();
     autoAnnMenu.add(showGroupConservation);
     autoAnnMenu.add(showGroupConsensus);
-    viewMenu.add(autoAnnMenu);
+    annotationsMenu.add(autoAnnMenu);
     viewMenu.addSeparator();
     viewMenu.add(showSeqFeatures);
     // viewMenu.add(showSeqFeaturesHeight);
@@ -2061,6 +2367,8 @@ public class GAlignFrame extends JInternalFrame
     jMenu2.add(htmlMenuItem);
     jMenu2.add(epsFile);
     jMenu2.add(createPNG);
+    jMenu2.add(createBioJS);
+    jMenu2.add(createSVG);
     addSequenceMenu.add(addFromFile);
     addSequenceMenu.add(addFromText);
     addSequenceMenu.add(addFromURL);
@@ -2107,6 +2415,59 @@ public class GAlignFrame extends JInternalFrame
     // selectMenu.add(listenToViewSelections);
   }
 
+  /**
+   * Action on clicking sort annotations by type.
+   * 
+   * @param sortOrder
+   */
+  protected void sortAnnotations_actionPerformed()
+  {
+  }
+
+  /**
+   * Action on clicking Show all annotations.
+   * 
+   * @param forSequences
+   *          update sequence-related annotations
+   * @param forAlignment
+   *          update non-sequence-related annotations
+   */
+  protected void showAllAnnotations_actionPerformed(boolean forSequences,
+          boolean forAlignment)
+  {
+    setAnnotationsVisibility(true, forSequences, forAlignment);
+  }
+
+  /**
+   * Action on clicking Hide all annotations.
+   * 
+   * @param forSequences
+   *          update sequence-related annotations
+   * @param forAlignment
+   *          update non-sequence-related annotations
+   */
+  protected void hideAllAnnotations_actionPerformed(boolean forSequences,
+          boolean forAlignment)
+  {
+    setAnnotationsVisibility(false, forSequences, forAlignment);
+  }
+
+  /**
+   * Set the visibility of annotations to true or false. Can act on
+   * sequence-related annotations, or alignment-related, or both.
+   * 
+   * @param visible
+   * @param forSequences
+   *          update sequence-related annotations
+   * @param forAlignment
+   *          update non-sequence-related annotations
+   */
+  protected void setAnnotationsVisibility(boolean visible,
+          boolean forSequences, boolean forAlignment)
+  {
+
+  }
+
   protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
   {
     // TODO Auto-generated method stub
@@ -2265,6 +2626,11 @@ public class GAlignFrame extends JInternalFrame
   {
   }
 
+  protected void bioJSMenuItem_actionPerformed(ActionEvent e)
+  {
+
+  }
+
   protected void closeMenuItem_actionPerformed(boolean b)
   {
   }
@@ -2518,6 +2884,10 @@ public class GAlignFrame extends JInternalFrame
   {
   }
 
+  public void createSVG(java.io.File f)
+  {
+
+  }
   protected void LoadtreeMenuItem_actionPerformed(ActionEvent e)
   {
 
@@ -2751,4 +3121,24 @@ public class GAlignFrame extends JInternalFrame
     // TODO Auto-generated method stub
 
   }
+
+  protected boolean isShowAutoCalculatedAbove()
+  {
+    return showAutoCalculatedAbove;
+  }
+
+  protected void setShowAutoCalculatedAbove(boolean showAutoCalculatedAbove)
+  {
+    this.showAutoCalculatedAbove = showAutoCalculatedAbove;
+  }
+
+  protected SequenceAnnotationOrder getAnnotationSortOrder()
+  {
+    return annotationSortOrder;
+  }
+
+  protected void setAnnotationSortOrder(SequenceAnnotationOrder annotationSortOrder)
+  {
+    this.annotationSortOrder = annotationSortOrder;
+  }
 }