JAL-976 - tweak web services gui so empty menus don't get shown and included a 'still...
[jalview.git] / src / jalview / gui / AlignFrame.java
index e9b0873..e4d66e9 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)
- * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
+ * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
  * 
  * This file is part of Jalview.
  * 
@@ -65,12 +65,15 @@ import jalview.schemes.HelixColourScheme;
 import jalview.schemes.HydrophobicColourScheme;
 import jalview.schemes.NucleotideColourScheme;
 import jalview.schemes.PIDColourScheme;
+import jalview.schemes.PurinePyrimidineColourScheme;
+import jalview.schemes.RNAHelicesColourChooser;
 import jalview.schemes.ResidueProperties;
 import jalview.schemes.StrandColourScheme;
 import jalview.schemes.TaylorColourScheme;
 import jalview.schemes.TurnColourScheme;
 import jalview.schemes.UserColourScheme;
 import jalview.schemes.ZappoColourScheme;
+import jalview.ws.WSMenuEntryProviderI;
 import jalview.ws.jws1.Discoverer;
 import jalview.ws.jws2.Jws2Discoverer;
 
@@ -281,7 +284,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   void init()
   {
-    if (viewport.conservation == null)
+    if (viewport.getAlignmentConservationAnnotation()== null)
     {
       BLOSUM62Colour.setEnabled(false);
       conservationMenuItem.setEnabled(false);
@@ -307,7 +310,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       this.setDropTarget(new java.awt.dnd.DropTarget(this, this));
       addServiceListeners();
-      setGUINucleotide(viewport.alignment.isNucleotide());
+      setGUINucleotide(viewport.getAlignment().isNucleotide());
     }
 
     setMenusFromViewport(viewport);
@@ -400,7 +403,22 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                     || evt.isShiftDown() || evt.isAltDown());
           }
           break;
-
+          
+        //case KeyEvent.VK_A:
+       //      if (viewport.cursorMode)
+       //     {
+       //              alignPanel.seqPanel.insertNucAtCursor(false,"A");
+       //              //System.out.println("A");
+       //     }
+       //      break;
+        /*     
+        case KeyEvent.VK_CLOSE_BRACKET:
+               if (viewport.cursorMode)
+            {
+                       System.out.println("closing bracket");
+            }
+               break;
+         */
         case KeyEvent.VK_DELETE:
         case KeyEvent.VK_BACK_SPACE:
           if (!viewport.cursorMode)
@@ -567,12 +585,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (newPanel)
     {
-      if (ap.av.padGaps)
+      if (ap.av.isPadGaps())
       {
-        ap.av.alignment.padGaps();
+        ap.av.getAlignment().padGaps();
       }
       ap.av.updateConservation(ap);
       ap.av.updateConsensus(ap);
+      ap.av.updateStrucConsensus(ap);
     }
   }
 
@@ -644,11 +663,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     conservationMenuItem.setEnabled(!nucleotide);
     modifyConservation.setEnabled(!nucleotide);
     showGroupConservation.setEnabled(!nucleotide);
+    rnahelicesColour.setEnabled(nucleotide);
+    purinePyrimidineColour.setEnabled(nucleotide);
     // Remember AlignFrame always starts as protein
-    if (!nucleotide)
-    {
-      calculateMenu.remove(calculateMenu.getItemCount() - 2);
-    }
+    //if (!nucleotide)
+   // {
+   //   showTr
+   //   calculateMenu.remove(calculateMenu.getItemCount() - 2);
+   // }
   }
 
   /**
@@ -670,7 +692,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   void setMenusFromViewport(AlignViewport av)
   {
-    padGapsMenuitem.setSelected(av.padGaps);
+    padGapsMenuitem.setSelected(av.isPadGaps());
     colourTextMenuItem.setSelected(av.showColourText);
     abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
     conservationMenuItem.setSelected(av.getConservationSelected());
@@ -685,11 +707,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     annotationPanelMenuItem.setState(av.showAnnotation);
     viewBoxesMenuItem.setSelected(av.showBoxes);
     viewTextMenuItem.setSelected(av.showText);
-    showNonconservedMenuItem.setSelected(av.showUnconserved);
-    showGroupConsensus.setSelected(av.showGroupConsensus);
-    showGroupConservation.setSelected(av.showGroupConservation);
-    showConsensusHistogram.setSelected(av.showConsensusHistogram);
-    showSequenceLogo.setSelected(av.showSequenceLogo);
+    showNonconservedMenuItem.setSelected(av.getShowUnconserved());
+    showGroupConsensus.setSelected(av.isShowGroupConsensus());
+    showGroupConservation.setSelected(av.isShowGroupConservation());
+    showConsensusHistogram.setSelected(av.isShowConsensusHistogram());
+    showSequenceLogo.setSelected(av.isShowSequenceLogo());
+    normaliseSequenceLogo.setSelected(av.isNormaliseSequenceLogo());
+    
     setColourSelected(ColourSchemeProperty.getColourName(av
             .getGlobalColourScheme()));
 
@@ -698,7 +722,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     applyToAllGroups.setState(av.colourAppliesToAllGroups);
     showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
     showDbRefsMenuitem.setSelected(av.isShowDbRefs());
-
+    autoCalculate.setSelected(av.autoCalculateConsensus);
+    sortByTree.setSelected(av.sortByTree);
+    listenToViewSelections.setSelected(av.followSelection);
+    rnahelicesColour.setEnabled(av.getAlignment().hasRNAStructure());
+    rnahelicesColour.setSelected(av.getGlobalColourScheme() instanceof jalview.schemes.RNAHelicesColour);
     setShowProductsEnabled();
 
     updateEditMenuBar();
@@ -991,7 +1019,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
       String[] omitHidden = null;
 
-      if (viewport.hasHiddenColumns)
+      if (viewport.hasHiddenColumns())
       {
         int reply = JOptionPane
                 .showInternalConfirmDialog(
@@ -1009,9 +1037,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       }
       FormatAdapter f = new FormatAdapter();
       String output = f.formatSequences(format,
-              (Alignment) viewport.alignment, // class cast exceptions will
+              (Alignment) viewport.getAlignment(), // class cast exceptions will
               // occur in the distant future
-              omitHidden, f.getCacheSuffixDefault(format), viewport.colSel);
+              omitHidden, f.getCacheSuffixDefault(format), viewport.getColumnSelection());
 
       if (output == null)
       {
@@ -1071,7 +1099,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     String[] omitHidden = null;
 
-    if (viewport.hasHiddenColumns)
+    if (viewport.hasHiddenColumns())
     {
       int reply = JOptionPane
               .showInternalConfirmDialog(
@@ -1094,7 +1122,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     try
     {
       cap.setText(new FormatAdapter().formatSequences(e.getActionCommand(),
-              viewport.alignment, omitHidden, viewport.colSel));
+              viewport.getAlignment(), omitHidden, viewport.getColumnSelection()));
       Desktop.addInternalFrame(cap,
               "Alignment output - " + e.getActionCommand(), 600, 500);
     } catch (OutOfMemoryError oom)
@@ -1173,10 +1201,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     new AnnotationExporter().exportAnnotations(
             alignPanel,
-            viewport.showAnnotation ? viewport.alignment
-                    .getAlignmentAnnotation() : null, viewport.alignment
+            viewport.showAnnotation ? viewport.getAlignment()
+                    .getAlignmentAnnotation() : null, viewport.getAlignment()
                     .getGroups(),
-            ((Alignment) viewport.alignment).alignmentProperties);
+            ((Alignment) viewport.getAlignment()).alignmentProperties);
   }
 
   public void associatedData_actionPerformed(ActionEvent e)
@@ -1314,9 +1342,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       viewport.historyList.push(command);
       viewport.redoList.clear();
       updateEditMenuBar();
-      viewport.hasHiddenColumns = (viewport.colSel != null
-              && viewport.colSel.getHiddenColumns() != null && viewport.colSel
-              .getHiddenColumns().size() > 0);
+      viewport.updateHiddenColumns();
+//      viewport.hasHiddenColumns = (viewport.getColumnSelection() != null
+//              && viewport.getColumnSelection().getHiddenColumns() != null && viewport.getColumnSelection()
+//              .getHiddenColumns().size() > 0);
     }
   }
 
@@ -1339,7 +1368,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     if (viewport != null)
     {
       return new AlignmentI[]
-      { viewport.alignment };
+      { viewport.getAlignment() };
     }
     return null;
   }
@@ -1363,11 +1392,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (originalSource != null)
     {
-      originalSource.hasHiddenColumns = (viewport.colSel != null
-              && viewport.colSel.getHiddenColumns() != null && viewport.colSel
-              .getHiddenColumns().size() > 0);
+      if (originalSource!=viewport)
+      {
+        Cache.log.warn("Implementation worry: mismatch of viewport origin for undo");
+      }
+      originalSource.updateHiddenColumns();
+//      originalSource.hasHiddenColumns = (viewport.getColumnSelection() != null
+//              && viewport.getColumnSelection().getHiddenColumns() != null && viewport.getColumnSelection()
+//              .getHiddenColumns().size() > 0);
       originalSource.firePropertyChange("alignment", null,
-              originalSource.alignment.getSequences());
+              originalSource.getAlignment().getSequences());
     }
   }
 
@@ -1393,11 +1427,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (originalSource != null)
     {
-      originalSource.hasHiddenColumns = (viewport.colSel != null
-              && viewport.colSel.getHiddenColumns() != null && viewport.colSel
-              .getHiddenColumns().size() > 0);
+
+      if (originalSource!=viewport)
+      {
+        Cache.log.warn("Implementation worry: mismatch of viewport origin for redo");
+      }
+      originalSource.updateHiddenColumns();
+      //originalSource.hasHiddenColumns = (viewport.getColumnSelection() != null
+      //        && viewport.getColumnSelection().getHiddenColumns() != null && viewport.getColumnSelection()
+      //        .getHiddenColumns().size() > 0);
       originalSource.firePropertyChange("alignment", null,
-              originalSource.alignment.getSequences());
+              originalSource.getAlignment().getSequences());
     }
   }
 
@@ -1419,7 +1459,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         if (comps.elementAt(i) instanceof AlignmentPanel)
         {
-          if (al == ((AlignmentPanel) comps.elementAt(i)).av.alignment)
+          if (al == ((AlignmentPanel) comps.elementAt(i)).av.getAlignment())
           {
             originalSource = ((AlignmentPanel) comps.elementAt(i)).av;
             break;
@@ -1434,7 +1474,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       // the current view against the closed view first
       if (al != null)
       {
-        PaintRefresher.validateSequences(al, viewport.alignment);
+        PaintRefresher.validateSequences(al, viewport.getAlignment());
       }
 
       originalSource = viewport;
@@ -1460,46 +1500,46 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (up)
     {
-      for (int i = 1; i < viewport.alignment.getHeight(); i++)
+      for (int i = 1; i < viewport.getAlignment().getHeight(); i++)
       {
-        SequenceI seq = viewport.alignment.getSequenceAt(i);
+        SequenceI seq = viewport.getAlignment().getSequenceAt(i);
 
         if (!sg.getSequences(null).contains(seq))
         {
           continue;
         }
 
-        SequenceI temp = viewport.alignment.getSequenceAt(i - 1);
+        SequenceI temp = viewport.getAlignment().getSequenceAt(i - 1);
 
         if (sg.getSequences(null).contains(temp))
         {
           continue;
         }
 
-        viewport.alignment.getSequences().setElementAt(temp, i);
-        viewport.alignment.getSequences().setElementAt(seq, i - 1);
+        viewport.getAlignment().getSequences().setElementAt(temp, i);
+        viewport.getAlignment().getSequences().setElementAt(seq, i - 1);
       }
     }
     else
     {
-      for (int i = viewport.alignment.getHeight() - 2; i > -1; i--)
+      for (int i = viewport.getAlignment().getHeight() - 2; i > -1; i--)
       {
-        SequenceI seq = viewport.alignment.getSequenceAt(i);
+        SequenceI seq = viewport.getAlignment().getSequenceAt(i);
 
         if (!sg.getSequences(null).contains(seq))
         {
           continue;
         }
 
-        SequenceI temp = viewport.alignment.getSequenceAt(i + 1);
+        SequenceI temp = viewport.getAlignment().getSequenceAt(i + 1);
 
         if (sg.getSequences(null).contains(temp))
         {
           continue;
         }
 
-        viewport.alignment.getSequences().setElementAt(temp, i);
-        viewport.alignment.getSequences().setElementAt(seq, i + 1);
+        viewport.getAlignment().getSequences().setElementAt(temp, i);
+        viewport.getAlignment().getSequences().setElementAt(seq, i + 1);
       }
     }
 
@@ -1511,15 +1551,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     Vector sg = new Vector();
     if (viewport.cursorMode)
     {
-      sg.addElement(viewport.alignment
+      sg.addElement(viewport.getAlignment()
               .getSequenceAt(alignPanel.seqPanel.seqCanvas.cursorY));
     }
     else if (viewport.getSelectionGroup() != null
-            && viewport.getSelectionGroup().getSize() != viewport.alignment
+            && viewport.getSelectionGroup().getSize() != viewport.getAlignment()
                     .getHeight())
     {
       sg = viewport.getSelectionGroup().getSequences(
-              viewport.hiddenRepSequences);
+              viewport.getHiddenRepSequences());
     }
 
     if (sg.size() < 1)
@@ -1529,10 +1569,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     Vector invertGroup = new Vector();
 
-    for (int i = 0; i < viewport.alignment.getHeight(); i++)
+    for (int i = 0; i < viewport.getAlignment().getHeight(); i++)
     {
-      if (!sg.contains(viewport.alignment.getSequenceAt(i)))
-        invertGroup.add(viewport.alignment.getSequenceAt(i));
+      if (!sg.contains(viewport.getAlignment().getSequenceAt(i)))
+        invertGroup.add(viewport.getAlignment().getSequenceAt(i));
     }
 
     SequenceI[] seqs1 = new SequenceI[sg.size()];
@@ -1608,7 +1648,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     SequenceI[] seqs = viewport.getSelectionAsNewSequence();
     String[] omitHidden = null;
 
-    if (viewport.hasHiddenColumns)
+    if (viewport.hasHiddenColumns())
     {
       omitHidden = viewport.getViewAsString(true);
     }
@@ -1635,7 +1675,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     Vector hiddenColumns = null;
-    if (viewport.hasHiddenColumns)
+    if (viewport.hasHiddenColumns())
     {
       hiddenColumns = new Vector();
       int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
@@ -1654,7 +1694,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     Desktop.jalviewClipboard = new Object[]
-    { seqs, viewport.alignment.getDataset(), hiddenColumns };
+    { seqs, viewport.getAlignment().getDataset(), hiddenColumns };
     statusBar.setText("Copied " + seqs.length + " sequences to clipboard.");
   }
 
@@ -1985,7 +2025,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     // If the cut affects all sequences, remove highlighted columns
-    if (sg.getSize() == viewport.alignment.getHeight())
+    if (sg.getSize() == viewport.getAlignment().getHeight())
     {
       viewport.getColumnSelection().removeElements(sg.getStartRes(),
               sg.getEndRes() + 1);
@@ -2002,11 +2042,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
      */
     addHistoryItem(new EditCommand("Cut Sequences", EditCommand.CUT, cut,
             sg.getStartRes(), sg.getEndRes() - sg.getStartRes() + 1,
-            viewport.alignment));
+            viewport.getAlignment()));
 
     viewport.setSelectionGroup(null);
     viewport.sendSelection();
-    viewport.alignment.deleteGroup(sg);
+    viewport.getAlignment().deleteGroup(sg);
 
     viewport.firePropertyChange("alignment", null, viewport.getAlignment()
             .getSequences());
@@ -2029,7 +2069,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   protected void deleteGroups_actionPerformed(ActionEvent e)
   {
-    viewport.alignment.deleteAllGroups();
+    viewport.getAlignment().deleteAllGroups();
     viewport.sequenceColours = null;
     viewport.setSelectionGroup(null);
     PaintRefresher.Refresh(this, viewport.getSequenceSetId());
@@ -2052,7 +2092,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       sg.addSequence(viewport.getAlignment().getSequenceAt(i), false);
     }
 
-    sg.setEndRes(viewport.alignment.getWidth() - 1);
+    sg.setEndRes(viewport.getAlignment().getWidth() - 1);
     viewport.setSelectionGroup(sg);
     viewport.sendSelection();
     alignPanel.paintAlignment(true);
@@ -2158,11 +2198,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       if (viewport.getSelectionGroup() != null)
       {
         seqs = viewport.getSelectionGroup().getSequencesAsArray(
-                viewport.hiddenRepSequences);
+                viewport.getHiddenRepSequences());
       }
       else
       {
-        seqs = viewport.alignment.getSequencesArray();
+        seqs = viewport.getAlignment().getSequencesArray();
       }
 
       TrimRegionCommand trimRegion;
@@ -2170,23 +2210,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         trimRegion = new TrimRegionCommand("Remove Left",
                 TrimRegionCommand.TRIM_LEFT, seqs, column,
-                viewport.alignment, viewport.colSel,
-                viewport.selectionGroup);
+                viewport.getAlignment(), viewport.getColumnSelection(),
+                viewport.getSelectionGroup());
         viewport.setStartRes(0);
       }
       else
       {
         trimRegion = new TrimRegionCommand("Remove Right",
                 TrimRegionCommand.TRIM_RIGHT, seqs, column,
-                viewport.alignment, viewport.colSel,
-                viewport.selectionGroup);
+                viewport.getAlignment(), viewport.getColumnSelection(),
+                viewport.getSelectionGroup());
       }
 
       statusBar.setText("Removed " + trimRegion.getSize() + " columns.");
 
       addHistoryItem(trimRegion);
 
-      Vector groups = viewport.alignment.getGroups();
+      Vector groups = viewport.getAlignment().getGroups();
 
       for (int i = 0; i < groups.size(); i++)
       {
@@ -2195,7 +2235,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         if ((trimLeft && !sg.adjustForRemoveLeft(column))
                 || (!trimLeft && !sg.adjustForRemoveRight(column)))
         {
-          viewport.alignment.deleteGroup(sg);
+          viewport.getAlignment().deleteGroup(sg);
         }
       }
 
@@ -2212,23 +2252,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   public void removeGappedColumnMenuItem_actionPerformed(ActionEvent e)
   {
-    int start = 0, end = viewport.alignment.getWidth() - 1;
+    int start = 0, end = viewport.getAlignment().getWidth() - 1;
 
     SequenceI[] seqs;
     if (viewport.getSelectionGroup() != null)
     {
       seqs = viewport.getSelectionGroup().getSequencesAsArray(
-              viewport.hiddenRepSequences);
+              viewport.getHiddenRepSequences());
       start = viewport.getSelectionGroup().getStartRes();
       end = viewport.getSelectionGroup().getEndRes();
     }
     else
     {
-      seqs = viewport.alignment.getSequencesArray();
+      seqs = viewport.getAlignment().getSequencesArray();
     }
 
     RemoveGapColCommand removeGapCols = new RemoveGapColCommand(
-            "Remove Gapped Columns", seqs, start, end, viewport.alignment);
+            "Remove Gapped Columns", seqs, start, end, viewport.getAlignment());
 
     addHistoryItem(removeGapCols);
 
@@ -2237,7 +2277,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     // This is to maintain viewport position on first residue
     // of first sequence
-    SequenceI seq = viewport.alignment.getSequenceAt(0);
+    SequenceI seq = viewport.getAlignment().getSequenceAt(0);
     int startRes = seq.findPosition(viewport.startRes);
     // ShiftList shifts;
     // viewport.getAlignment().removeGaps(shifts=new ShiftList());
@@ -2258,28 +2298,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   public void removeAllGapsMenuItem_actionPerformed(ActionEvent e)
   {
-    int start = 0, end = viewport.alignment.getWidth() - 1;
+    int start = 0, end = viewport.getAlignment().getWidth() - 1;
 
     SequenceI[] seqs;
     if (viewport.getSelectionGroup() != null)
     {
       seqs = viewport.getSelectionGroup().getSequencesAsArray(
-              viewport.hiddenRepSequences);
+              viewport.getHiddenRepSequences());
       start = viewport.getSelectionGroup().getStartRes();
       end = viewport.getSelectionGroup().getEndRes();
     }
     else
     {
-      seqs = viewport.alignment.getSequencesArray();
+      seqs = viewport.getAlignment().getSequencesArray();
     }
 
     // This is to maintain viewport position on first residue
     // of first sequence
-    SequenceI seq = viewport.alignment.getSequenceAt(0);
+    SequenceI seq = viewport.getAlignment().getSequenceAt(0);
     int startRes = seq.findPosition(viewport.startRes);
 
     addHistoryItem(new RemoveGapsCommand("Remove Gaps", seqs, start, end,
-            viewport.alignment));
+            viewport.getAlignment()));
 
     viewport.setStartRes(seq.findIndex(startRes) - 1);
 
@@ -2296,7 +2336,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   public void padGapsMenuitem_actionPerformed(ActionEvent e)
   {
-    viewport.padGaps = padGapsMenuitem.isSelected();
+    viewport.setPadGaps(padGapsMenuitem.isSelected());
     viewport.firePropertyChange("alignment", null, viewport.getAlignment()
             .getSequences());
   }
@@ -2364,13 +2404,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     if (!copyAnnotation)
     {
       // just remove all the current annotation except for the automatic stuff
-      newap.av.alignment.deleteAllGroups();
-      for (AlignmentAnnotation alan : newap.av.alignment
+      newap.av.getAlignment().deleteAllGroups();
+      for (AlignmentAnnotation alan : newap.av.getAlignment()
               .getAlignmentAnnotation())
       {
         if (!alan.autoCalculated)
         {
-          newap.av.alignment.deleteAnnotation(alan);
+          newap.av.getAlignment().deleteAnnotation(alan);
         }
         ;
       }
@@ -2554,7 +2594,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       // Hide everything by the current selection - this is a hack - we do the
       // invert and then hide
       // first check that there will be visible columns after the invert.
-      if ((viewport.colSel != null && viewport.colSel.getSelected() != null && viewport.colSel
+      if ((viewport.getColumnSelection() != null && viewport.getColumnSelection().getSelected() != null && viewport.getColumnSelection()
               .getSelected().size() > 0)
               || (sg != null && sg.getSize() > 0 && sg.getStartRes() <= sg
                       .getEndRes()))
@@ -2578,12 +2618,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (toggleSeqs)
     {
-      if (sg != null && sg.getSize() != viewport.alignment.getHeight())
+      if (sg != null && sg.getSize() != viewport.getAlignment().getHeight())
       {
         hideSelSequences_actionPerformed(null);
         hide = true;
       }
-      else if (!(toggleCols && viewport.colSel.getSelected().size() > 0))
+      else if (!(toggleCols && viewport.getColumnSelection().getSelected().size() > 0))
       {
         showAllSeqs_actionPerformed(null);
       }
@@ -2591,12 +2631,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (toggleCols)
     {
-      if (viewport.colSel.getSelected().size() > 0)
+      if (viewport.getColumnSelection().getSelected().size() > 0)
       {
         hideSelColumns_actionPerformed(null);
         if (!toggleSeqs)
         {
-          viewport.selectionGroup = sg;
+          viewport.setSelectionGroup(sg);
         }
       }
       else if (!hide)
@@ -2805,7 +2845,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     JEditorPane editPane = new JEditorPane("text/html", "");
     editPane.setEditable(false);
-    StringBuffer contents = new AlignmentProperties(viewport.alignment)
+    StringBuffer contents = new AlignmentProperties(viewport.getAlignment())
             .formatAsHtml();
     editPane.setText("<html>" + contents.toString() + "</html>");
     JInternalFrame frame = new JInternalFrame();
@@ -2872,8 +2912,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   public void clustalColour_actionPerformed(ActionEvent e)
   {
     changeColour(new ClustalxColourScheme(
-            viewport.alignment.getSequences(),
-            viewport.alignment.getWidth()));
+            viewport.getAlignment().getSequences(),
+            viewport.getAlignment().getWidth()));
   }
 
   /**
@@ -2964,10 +3004,25 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     changeColour(new NucleotideColourScheme());
   }
 
+  public void purinePyrimidineColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new PurinePyrimidineColourScheme());
+  }
+  /*
+  public void covariationColour_actionPerformed(ActionEvent e)
+  {
+    changeColour(new CovariationColourScheme(viewport.getAlignment().getAlignmentAnnotation()[0]));
+  }
+  */
   public void annotationColour_actionPerformed(ActionEvent e)
   {
     new AnnotationColourChooser(viewport, alignPanel);
   }
+  
+  public void rnahelicesColour_actionPerformed(ActionEvent e)
+  {
+    new RNAHelicesColourChooser(viewport, alignPanel);
+  }
 
   /**
    * DOCUMENT ME!
@@ -3009,13 +3064,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       if (viewport.getConservationSelected())
       {
 
-        Alignment al = (Alignment) viewport.alignment;
+        Alignment al = (Alignment) viewport.getAlignment();
         Conservation c = new Conservation("All",
                 ResidueProperties.propHash, 3, al.getSequences(), 0,
                 al.getWidth() - 1);
 
         c.calculate();
-        c.verdict(false, viewport.ConsPercGaps);
+        c.verdict(false, viewport.getConsPercGaps());
 
         cs.setConservation(c);
 
@@ -3027,14 +3082,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         cs.setConservation(null);
       }
 
-      cs.setConsensus(viewport.hconsensus);
+      cs.setConsensus(viewport.getSequenceConsensusHash());
     }
 
     viewport.setGlobalColourScheme(cs);
 
     if (viewport.getColourAppliesToAllGroups())
     {
-      Vector groups = viewport.alignment.getGroups();
+      Vector groups = viewport.getAlignment().getGroups();
 
       for (int i = 0; i < groups.size(); i++)
       {
@@ -3049,7 +3104,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         if (cs instanceof ClustalxColourScheme)
         {
           sg.cs = new ClustalxColourScheme(
-                  sg.getSequences(viewport.hiddenRepSequences),
+                  sg.getSequences(viewport.getHiddenRepSequences()),
                   sg.getWidth());
         }
         else if (cs instanceof UserColourScheme)
@@ -3073,7 +3128,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           sg.cs.setThreshold(threshold, viewport.getIgnoreGapsConsensus());
 
           sg.cs.setConsensus(AAFrequency.calculate(
-                  sg.getSequences(viewport.hiddenRepSequences),
+                  sg.getSequences(viewport.getHiddenRepSequences()),
                   sg.getStartRes(), sg.getEndRes() + 1));
         }
         else
@@ -3085,10 +3140,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         {
           Conservation c = new Conservation("Group",
                   ResidueProperties.propHash, 3,
-                  sg.getSequences(viewport.hiddenRepSequences),
+                  sg.getSequences(viewport.getHiddenRepSequences()),
                   sg.getStartRes(), sg.getEndRes() + 1);
           c.calculate();
-          c.verdict(false, viewport.ConsPercGaps);
+          c.verdict(false, viewport.getConsPercGaps());
           sg.cs.setConservation(c);
         }
         else
@@ -3115,7 +3170,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   protected void modifyPID_actionPerformed(ActionEvent e)
   {
     if (viewport.getAbovePIDThreshold()
-            && viewport.globalColourScheme != null)
+            && viewport.getGlobalColourScheme() != null)
     {
       SliderPanel.setPIDSliderSource(alignPanel,
               viewport.getGlobalColourScheme(), "Background");
@@ -3132,10 +3187,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   protected void modifyConservation_actionPerformed(ActionEvent e)
   {
     if (viewport.getConservationSelected()
-            && viewport.globalColourScheme != null)
+            && viewport.getGlobalColourScheme()!= null)
     {
       SliderPanel.setConservationSlider(alignPanel,
-              viewport.globalColourScheme, "Background");
+              viewport.getGlobalColourScheme(), "Background");
       SliderPanel.showConservationSlider();
     }
   }
@@ -3302,7 +3357,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     AlignmentSorter.sortByPID(viewport.getAlignment(), viewport
             .getAlignment().getSequenceAt(0), null);
     addHistoryItem(new OrderCommand("Pairwise Sort", oldOrder,
-            viewport.alignment));
+            viewport.getAlignment()));
     alignPanel.paintAlignment(true);
   }
 
@@ -3316,7 +3371,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByID(viewport.getAlignment());
-    addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.alignment));
+    addHistoryItem(new OrderCommand("ID Sort", oldOrder, viewport.getAlignment()));
     alignPanel.paintAlignment(true);
   }
 
@@ -3331,7 +3386,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByLength(viewport.getAlignment());
     addHistoryItem(new OrderCommand("Length Sort", oldOrder,
-            viewport.alignment));
+            viewport.getAlignment()));
     alignPanel.paintAlignment(true);
   }
 
@@ -3346,7 +3401,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     SequenceI[] oldOrder = viewport.getAlignment().getSequencesArray();
     AlignmentSorter.sortByGroup(viewport.getAlignment());
     addHistoryItem(new OrderCommand("Group Sort", oldOrder,
-            viewport.alignment));
+            viewport.getAlignment()));
 
     alignPanel.paintAlignment(true);
   }
@@ -3419,7 +3474,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               .getAlignment().getSequences());
     }
   }
+  public void sortByTreeOption_actionPerformed(ActionEvent e)
+  {
+    viewport.sortByTree = sortByTree.isSelected();
+  }
 
+  @Override
+  protected void listenToViewSelections_actionPerformed(ActionEvent e)
+  {
+    viewport.followSelection = listenToViewSelections.isSelected();
+  }
   /**
    * DOCUMENT ME!
    * 
@@ -3518,7 +3582,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     else
     {
       // are the visible sequences aligned?
-      if (!viewport.alignment.isAligned(false))
+      if (!viewport.getAlignment().isAligned(false))
       {
         JOptionPane
                 .showMessageDialog(
@@ -3532,7 +3596,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         return;
       }
 
-      if (viewport.alignment.getHeight() < 2)
+      if (viewport.getAlignment().getHeight() < 2)
       {
         return;
       }
@@ -3576,7 +3640,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         AlignmentSorter.sortBy(viewport.getAlignment(), order);
 
         addHistoryItem(new OrderCommand(order.getName(), oldOrder,
-                viewport.alignment));
+                viewport.getAlignment()));
 
         alignPanel.paintAlignment(true);
       }
@@ -3605,7 +3669,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         AlignmentSorter.sortByAnnotationScore(scoreLabel,
                 viewport.getAlignment());// ,viewport.getSelectionGroup());
         addHistoryItem(new OrderCommand("Sort by " + scoreLabel, oldOrder,
-                viewport.alignment));
+                viewport.getAlignment()));
         alignPanel.paintAlignment(true);
       }
     });
@@ -3625,18 +3689,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   public void buildSortByAnnotationScoresMenu()
   {
-    if (viewport.alignment.getAlignmentAnnotation() == null)
+    if (viewport.getAlignment().getAlignmentAnnotation() == null)
     {
       return;
     }
 
-    if (viewport.alignment.getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)
+    if (viewport.getAlignment().getAlignmentAnnotation().hashCode() != _annotationScoreVectorHash)
     {
       sortByAnnotScore.removeAll();
       // almost certainly a quicker way to do this - but we keep it simple
       Hashtable scoreSorts = new Hashtable();
       AlignmentAnnotation aann[];
-      Enumeration sq = viewport.alignment.getSequences().elements();
+      Enumeration sq = viewport.getAlignment().getSequences().elements();
       while (sq.hasMoreElements())
       {
         aann = ((SequenceI) sq.nextElement()).getAnnotation();
@@ -3657,7 +3721,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       sortByAnnotScore.setVisible(scoreSorts.size() > 0);
       scoreSorts.clear();
 
-      _annotationScoreVectorHash = viewport.alignment
+      _annotationScoreVectorHash = viewport.getAlignment()
               .getAlignmentAnnotation().hashCode();
     }
   }
@@ -3702,21 +3766,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     for (i = 0; i < treePanels.size(); i++)
     {
-      TreePanel tp = (TreePanel) treePanels.elementAt(i);
+      final TreePanel tp = (TreePanel) treePanels.elementAt(i);
       final JMenuItem item = new JMenuItem(tp.getTitle());
       final NJTree tree = ((TreePanel) treePanels.elementAt(i)).getTree();
       item.addActionListener(new java.awt.event.ActionListener()
       {
         public void actionPerformed(ActionEvent e)
         {
-          SequenceI[] oldOrder = viewport.getAlignment()
-                  .getSequencesArray();
-          AlignmentSorter.sortByTree(viewport.getAlignment(), tree);
-
-          addHistoryItem(new OrderCommand("Tree Sort", oldOrder,
-                  viewport.alignment));
-
-          alignPanel.paintAlignment(true);
+          tp.sortByTree_actionPerformed(null);
+          addHistoryItem(tp.sortAlignmentIn(alignPanel));
+          
         }
       });
 
@@ -3731,7 +3790,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     if (undoname != null)
     {
       addHistoryItem(new OrderCommand(undoname, oldOrder,
-              viewport.alignment));
+              viewport.getAlignment()));
     }
     alignPanel.paintAlignment(true);
     return true;
@@ -3798,9 +3857,9 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
     // limit sequences - JBPNote in future - could spawn multiple prediction
     // jobs
-    // TODO: viewport.alignment.isAligned is a global state - the local
+    // TODO: viewport.getAlignment().isAligned is a global state - the local
     // selection may well be aligned - we preserve 2.0.8 behaviour for moment.
-    if (!viewport.alignment.isAligned(false))
+    if (!viewport.getAlignment().isAligned(false))
     {
       seqs.setSequences(new SeqCigar[]
       { seqs.getSequences()[0] });
@@ -3958,19 +4017,28 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           // TODO: group services by location as well as function and/or
           // introduce
           // object broker mechanism.
-          final Vector wsmenu = new Vector();
+          final Vector<JMenu> wsmenu = new Vector<JMenu>();
           final IProgressIndicator af = me;
-          if (Cache.getDefault("SHOW_JWS1_SERVICES", true)
-                  && Discoverer.services != null
-                  && (Discoverer.services.size() > 0))
+          final JMenu msawsmenu = new JMenu("Alignment");
+          final JMenu secstrmenu = new JMenu(
+                  "Secondary Structure Prediction");
+          final JMenu seqsrchmenu = new JMenu("Sequence Database Search");
+          final JMenu analymenu = new JMenu("Analysis");
+          final JMenu dismenu = new JMenu("Disorder");
+          // JAL-940 - only show secondary structure prediction services from
+          // the legacy server
+          if (// Cache.getDefault("SHOW_JWS1_SERVICES", true)
+              // &&
+          Discoverer.services != null && (Discoverer.services.size() > 0))
           {
             // TODO: refactor to allow list of AbstractName/Handler bindings to
             // be
             // stored or retrieved from elsewhere
-            Vector msaws = (Vector) Discoverer.services.get("MsaWS");
+            Vector msaws = null; // (Vector) Discoverer.services.get("MsaWS");
             Vector secstrpr = (Vector) Discoverer.services
                     .get("SecStrPred");
-            Vector seqsrch = (Vector) Discoverer.services.get("SeqSearch");
+            Vector seqsrch = null; // (Vector)
+                                   // Discoverer.services.get("SeqSearch");
             // TODO: move GUI generation code onto service implementation - so a
             // client instance attaches itself to the GUI with method call like
             // jalview.ws.MsaWSClient.bind(servicehandle, Desktop.instance,
@@ -3978,7 +4046,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             if (msaws != null)
             {
               // Add any Multiple Sequence Alignment Services
-              final JMenu msawsmenu = new JMenu("Alignment");
               for (int i = 0, j = msaws.size(); i < j; i++)
               {
                 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) msaws
@@ -3988,13 +4055,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 impl.attachWSMenuEntry(msawsmenu, me);
 
               }
-              wsmenu.add(msawsmenu);
             }
             if (secstrpr != null)
             {
               // Add any secondary structure prediction services
-              final JMenu secstrmenu = new JMenu(
-                      "Secondary Structure Prediction");
               for (int i = 0, j = secstrpr.size(); i < j; i++)
               {
                 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) secstrpr
@@ -4003,13 +4067,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                         .getServiceClient(sh);
                 impl.attachWSMenuEntry(secstrmenu, me);
               }
-              wsmenu.add(secstrmenu);
             }
             if (seqsrch != null)
             {
               // Add any sequence search services
-              final JMenu seqsrchmenu = new JMenu(
-                      "Sequence Database Search");
               for (int i = 0, j = seqsrch.size(); i < j; i++)
               {
                 final ext.vamsas.ServiceHandle sh = (ext.vamsas.ServiceHandle) seqsrch
@@ -4018,27 +4079,23 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                         .getServiceClient(sh);
                 impl.attachWSMenuEntry(seqsrchmenu, me);
               }
-              wsmenu.add(seqsrchmenu);
             }
           }
 
-          // TODO: move into separate menu builder class.
-          if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
-          {
-            Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
-            if (jws2servs != null)
-            {
-              if (jws2servs.hasServices())
-              {
-                JMenu jws2men = new JMenu("Jaba Web Services");
-                jws2servs.attachWSMenuEntry(jws2men, me);
-                for (int i = 0, iSize = jws2men.getMenuComponentCount(); i < iSize; i++)
-                {
-                  wsmenu.add(jws2men.getMenuComponent(i));
-                }
-              }
-            }
-          }
+          // Add all submenus in the order they should appear on the web
+          // services menu
+          wsmenu.add(msawsmenu);
+          wsmenu.add(secstrmenu);
+          wsmenu.add(dismenu);
+          wsmenu.add(analymenu);
+//          final ArrayList<JMenu> submens=new ArrayList<JMenu>();
+//          submens.add(msawsmenu);
+ //         submens.add(secstrmenu);
+ //         submens.add(dismenu);
+  //        submens.add(analymenu);
+          
+          // No search services yet
+          // wsmenu.add(seqsrchmenu);
 
           javax.swing.SwingUtilities.invokeLater(new Runnable()
           {
@@ -4046,9 +4103,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
             {
               try
               {
-
-                resetWebServiceMenu();
-                // finally, add the whole shebang onto the webservices menu
+                webService.removeAll();
+                // first, add discovered services onto the webservices menu
                 if (wsmenu.size() > 0)
                 {
                   for (int i = 0, j = wsmenu.size(); i < j; i++)
@@ -4058,7 +4114,40 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 }
                 else
                 {
-                  me.webService.add(me.webServiceNoServices);
+                  webService.add(me.webServiceNoServices);
+                }
+                // TODO: move into separate menu builder class.
+                if (Cache.getDefault("SHOW_JWS2_SERVICES", true))
+                {
+                  Jws2Discoverer jws2servs = Jws2Discoverer.getDiscoverer();
+                  if (jws2servs != null)
+                  {
+                    if (jws2servs.hasServices())
+                    {
+                      jws2servs.attachWSMenuEntry(webService, me);
+                    }
+                    if (jws2servs.isRunning())
+                    {
+                      JMenuItem tm = new JMenuItem(
+                              "Still discovering JABA Services");
+                      tm.setEnabled(false);
+                      webService.add(tm);
+                    }
+                  }
+                }
+
+                build_urlServiceMenu(me.webService);
+                build_fetchdbmenu(webService);
+                for (JMenu item : wsmenu)
+                {
+                  if (item.getItemCount() == 0)
+                  {
+                    item.setEnabled(false);
+                  }
+                  else
+                  {
+                    item.setEnabled(true);
+                  }
                 }
               } catch (Exception e)
               {
@@ -4077,17 +4166,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   }
 
-  /**
-   * empty the web service menu and add any ad-hoc functions not dynamically
-   * discovered.
-   * 
-   */
-  private void resetWebServiceMenu()
-  {
-    webService.removeAll();
-    build_fetchdbmenu(webService);
-    build_urlServiceMenu(webService);
-  }
 
   /**
    * construct any groupURL type service menu entries.
@@ -4096,11 +4174,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   private void build_urlServiceMenu(JMenu webService)
   {
-    if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))
-    {
-      jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(
-              webService, this);
-    }
     // TODO: remove this code when 2.7 is released
     // DEBUG - alignmentView
     /*
@@ -4108,17 +4181,25 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
      * AlignFrame af = this; testAlView.addActionListener(new ActionListener() {
      * 
      * @Override public void actionPerformed(ActionEvent e) {
-     * jalview.datamodel.AlignmentView.testSelectionViews(af.viewport.alignment,
-     * af.viewport.colSel, af.viewport.selectionGroup); }
+     * jalview.datamodel.AlignmentView.testSelectionViews(af.viewport.getAlignment(),
+     * af.viewport.getColumnSelection(), af.viewport.selectionGroup); }
      * 
      * }); webService.add(testAlView);
      */
     // TODO: refactor to RestClient discoverer and merge menu entries for
     // rest-style services with other types of analysis/calculation service
     // SHmmr test client - still being implemented.
-    jalview.ws.rest.RestClient.makeShmmrRestClient().attachWSMenuEntry(
-            webService, this);
     // DEBUG - alignmentView
+    
+    for (jalview.ws.rest.RestClient client: jalview.ws.rest.RestClient.getRestClients()) {
+      client.attachWSMenuEntry(JvSwingUtils.findOrCreateMenu(webService, client.getAction()), this);
+    }
+
+    if (Cache.getDefault("SHOW_ENFIN_SERVICES", true))
+    {
+      jalview.ws.EnfinEnvision2OneWay.getInstance().attachWSMenuEntry(
+              webService, this);
+    }
   }
 
   /*
@@ -4227,7 +4308,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         ths.setProgressBar("Searching for sequences from " + fsrc, sttime);
         try
         {
-          Alignment ds = ths.getViewport().alignment.getDataset(); // update
+          Alignment ds = ths.getViewport().getAlignment().getDataset(); // update
           // our local
           // dataset
           // reference
@@ -4349,8 +4430,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       al = jalview.analysis.Dna.CdnaTranslate(selection, seqstring,
               viewport.getViewAsVisibleContigs(true), viewport
-                      .getGapCharacter(), viewport.alignment
-                      .getAlignmentAnnotation(), viewport.alignment
+                      .getGapCharacter(), viewport.getAlignment()
+                      .getAlignmentAnnotation(), viewport.getAlignment()
                       .getWidth(), viewport.getAlignment().getDataset());
     } catch (Exception ex)
     {
@@ -4388,7 +4469,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     try
     {
       featuresFile = new FeaturesFile(file, type)
-              .parse(viewport.alignment.getDataset(),
+              .parse(viewport.getAlignment().getDataset(),
                       alignPanel.seqPanel.seqCanvas.getFeatureRenderer().featureColours,
                       false, jalview.bin.Cache.getDefault(
                               "RELAXEDSEQIDMATCHING", false));
@@ -4513,19 +4594,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           if (pdbfn.length() > 0)
           {
             // attempt to find a match in the alignment
-            SequenceI mtch = idm.findIdMatch(pdbfn);
+            SequenceI[] mtch = idm.findAllIdMatches(pdbfn);
             int l = 0, c = pdbfn.indexOf(".");
             while (mtch == null && c != -1)
             {
-              while ((c = pdbfn.indexOf(".", l)) > l)
+              do 
               {
                 l = c;
-              }
+              } while ((c = pdbfn.indexOf(".", l)) > l);
               if (l > -1)
               {
                 pdbfn = pdbfn.substring(0, l);
               }
-              mtch = idm.findIdMatch(pdbfn);
+              mtch = idm.findAllIdMatches(pdbfn);
             }
             if (mtch != null)
             {
@@ -4570,17 +4651,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               // try and associate
               // TODO: may want to set a standard ID naming formalism for
               // associating PDB files which have no IDs.
+              for (SequenceI toassoc: (SequenceI[])fm[2]) {
               PDBEntry pe = new AssociatePdbFileWithSeq()
                       .associatePdbWithSeq((String) fm[0], (String) fm[1],
-                              (SequenceI) fm[2], false);
+                              toassoc, false);
               if (pe != null)
               {
                 System.err
                         .println("Associated file : " + ((String) fm[0])
                                 + " with "
-                                + ((SequenceI) fm[2]).getDisplayId(true));
+                                + toassoc.getDisplayId(true));
                 assocfiles++;
               }
+              }
               alignPanel.paintAlignment(true);
             }
           }
@@ -4636,7 +4719,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       // try to parse as annotation.
       boolean isAnnotation = (format == null || format
               .equalsIgnoreCase("PFAM")) ? new AnnotationFile()
-              .readAnnotationFile(viewport.alignment, file, protocol)
+              .readAnnotationFile(viewport.getAlignment(), file, protocol)
               : false;
 
       if (!isAnnotation)
@@ -4743,7 +4826,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   protected void extractScores_actionPerformed(ActionEvent e)
   {
     ParseProperties pp = new jalview.analysis.ParseProperties(
-            viewport.alignment);
+            viewport.getAlignment());
     // TODO: verify regex and introduce GUI dialog for version 2.5
     // if (pp.getScoresFromDescription("col", "score column ",
     // "\\W*([-+]?\\d*\\.?\\d*e?-?\\d*)\\W+([-+]?\\d*\\.?\\d*e?-?\\d*)",
@@ -5000,7 +5083,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     viewport.setShowSequenceLogo(showSequenceLogo.getState());
     alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
   }
-
+  protected void normaliseSequenceLogo_actionPerformed(ActionEvent e)
+  {
+    viewport.setNormaliseSequenceLogo(normaliseSequenceLogo.getState());
+    alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
+  }
   protected void applyAutoAnnotationSettings_actionPerformed(ActionEvent e)
   {
     alignPanel.updateAnnotation(applyAutoAnnotationSettings.getState());
@@ -5021,8 +5108,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               viewport.getSequenceSelection(),
               viewport.getAlignmentView(true).getSequenceStrings(
                       viewport.getGapCharacter()),
-              viewport.alignment.getGroups());
-      viewport.alignment.deleteAllGroups();
+              viewport.getAlignment().getGroups());
+      viewport.getAlignment().deleteAllGroups();
       viewport.sequenceColours = null;
       viewport.setSelectionGroup(null);
       // set view properties for each group
@@ -5030,7 +5117,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       {
         gps[g].setShowNonconserved(viewport.getShowUnconserved());
         gps[g].setshowSequenceLogo(viewport.isShowSequenceLogo());
-        viewport.alignment.addGroup(gps[g]);
+        viewport.getAlignment().addGroup(gps[g]);
         Color col = new Color((int) (Math.random() * 255),
                 (int) (Math.random() * 255), (int) (Math.random() * 255));
         col = col.brighter();