Merge remote-tracking branch 'origin/develop' into
[jalview.git] / src / jalview / gui / AlignFrame.java
index 47f1c2a..5ef3da3 100644 (file)
@@ -57,10 +57,11 @@ import jalview.datamodel.SequenceGroup;
 import jalview.datamodel.SequenceI;
 import jalview.io.AlignmentProperties;
 import jalview.io.AnnotationFile;
+import jalview.io.BioJsHTMLOutput;
 import jalview.io.FeaturesFile;
 import jalview.io.FileLoader;
 import jalview.io.FormatAdapter;
-import jalview.io.HTMLOutput;
+import jalview.io.HtmlSvgOutput;
 import jalview.io.IdentifyFile;
 import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
@@ -121,6 +122,7 @@ import java.io.File;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Deque;
 import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.List;
@@ -391,7 +393,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                         .getKeyCode() <= KeyEvent.VK_NUMPAD9))
                 && Character.isDigit(evt.getKeyChar()))
         {
-          alignPanel.seqPanel.numberPressed(evt.getKeyChar());
+          alignPanel.getSeqPanel().numberPressed(evt.getKeyChar());
         }
 
         switch (evt.getKeyCode())
@@ -409,7 +411,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.moveCursor(0, 1);
+            alignPanel.getSeqPanel().moveCursor(0, 1);
           }
           break;
 
@@ -420,7 +422,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.moveCursor(0, -1);
+            alignPanel.getSeqPanel().moveCursor(0, -1);
           }
 
           break;
@@ -428,11 +430,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         case KeyEvent.VK_LEFT:
           if (evt.isAltDown() || !viewport.cursorMode)
           {
-            slideSequences(false, alignPanel.seqPanel.getKeyboardNo1());
+            slideSequences(false, alignPanel.getSeqPanel().getKeyboardNo1());
           }
           else
           {
-            alignPanel.seqPanel.moveCursor(-1, 0);
+            alignPanel.getSeqPanel().moveCursor(-1, 0);
           }
 
           break;
@@ -440,18 +442,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         case KeyEvent.VK_RIGHT:
           if (evt.isAltDown() || !viewport.cursorMode)
           {
-            slideSequences(true, alignPanel.seqPanel.getKeyboardNo1());
+            slideSequences(true, alignPanel.getSeqPanel().getKeyboardNo1());
           }
           else
           {
-            alignPanel.seqPanel.moveCursor(1, 0);
+            alignPanel.getSeqPanel().moveCursor(1, 0);
           }
           break;
 
         case KeyEvent.VK_SPACE:
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.insertGapAtCursor(evt.isControlDown()
+            alignPanel.getSeqPanel().insertGapAtCursor(evt.isControlDown()
                     || evt.isShiftDown() || evt.isAltDown());
           }
           break;
@@ -475,7 +477,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           }
           else
           {
-            alignPanel.seqPanel.deleteGapAtCursor(evt.isControlDown()
+            alignPanel.getSeqPanel().deleteGapAtCursor(evt.isControlDown()
                     || evt.isShiftDown() || evt.isAltDown());
           }
 
@@ -484,19 +486,19 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         case KeyEvent.VK_S:
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.setCursorRow();
+            alignPanel.getSeqPanel().setCursorRow();
           }
           break;
         case KeyEvent.VK_C:
           if (viewport.cursorMode && !evt.isControlDown())
           {
-            alignPanel.seqPanel.setCursorColumn();
+            alignPanel.getSeqPanel().setCursorColumn();
           }
           break;
         case KeyEvent.VK_P:
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.setCursorPosition();
+            alignPanel.getSeqPanel().setCursorPosition();
           }
           break;
 
@@ -504,20 +506,20 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         case KeyEvent.VK_COMMA:
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.setCursorRowAndColumn();
+            alignPanel.getSeqPanel().setCursorRowAndColumn();
           }
           break;
 
         case KeyEvent.VK_Q:
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.setSelectionAreaAtCursor(true);
+            alignPanel.getSeqPanel().setSelectionAreaAtCursor(true);
           }
           break;
         case KeyEvent.VK_M:
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.setSelectionAreaAtCursor(false);
+            alignPanel.getSeqPanel().setSelectionAreaAtCursor(false);
           }
           break;
 
@@ -528,10 +530,10 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   { (viewport.cursorMode ? "on" : "off") }));
           if (viewport.cursorMode)
           {
-            alignPanel.seqPanel.seqCanvas.cursorX = viewport.startRes;
-            alignPanel.seqPanel.seqCanvas.cursorY = viewport.startSeq;
+            alignPanel.getSeqPanel().seqCanvas.cursorX = viewport.startRes;
+            alignPanel.getSeqPanel().seqCanvas.cursorY = viewport.startSeq;
           }
-          alignPanel.seqPanel.seqCanvas.repaint();
+          alignPanel.getSeqPanel().seqCanvas.repaint();
           break;
 
         case KeyEvent.VK_F1:
@@ -831,14 +833,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     abovePIDThreshold.setSelected(av.getAbovePIDThreshold());
     conservationMenuItem.setSelected(av.getConservationSelected());
     seqLimits.setSelected(av.getShowJVSuffix());
-    idRightAlign.setSelected(av.rightAlignIds);
+    idRightAlign.setSelected(av.isRightAlignIds());
     centreColumnLabelsMenuItem.setState(av.centreColumnLabels);
     renderGapsMenuItem.setSelected(av.renderGaps);
     wrapMenuItem.setSelected(av.wrapAlignment);
     scaleAbove.setVisible(av.wrapAlignment);
     scaleLeft.setVisible(av.wrapAlignment);
     scaleRight.setVisible(av.wrapAlignment);
-    annotationPanelMenuItem.setState(av.showAnnotation);
+    annotationPanelMenuItem.setState(av.isShowAnnotation());
     /*
      * Show/hide annotations only enabled if annotation panel is shown
      */
@@ -858,7 +860,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     setColourSelected(ColourSchemeProperty.getColourName(av
             .getGlobalColourScheme()));
 
-    showSeqFeatures.setSelected(av.showSequenceFeatures);
+    showSeqFeatures.setSelected(av.isShowSequenceFeatures());
     hiddenMarkers.setState(av.showHiddenMarkers);
     applyToAllGroups.setState(av.getColourAppliesToAllGroups());
     showNpFeatsMenuitem.setSelected(av.isShowNpFeats());
@@ -952,7 +954,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         public void actionPerformed(ActionEvent e)
         {
           handler.cancelActivity(id);
-          us.setProgressBar(MessageManager.formatMessage("label.cancelled_params", new String[]{((JLabel) progressPanel.getComponent(0)).getText()}), id);
+          us.setProgressBar(MessageManager.formatMessage("label.cancelled_params", new Object[]{((JLabel) progressPanel.getComponent(0)).getText()}), id);
         }
       });
       progressPanel.add(cancel, BorderLayout.EAST);
@@ -989,7 +991,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
   public FeatureRenderer getFeatureRenderer()
   {
-    return alignPanel.seqPanel.seqCanvas.getFeatureRenderer();
+    return alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer();
   }
 
   @Override
@@ -1170,10 +1172,15 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 .lastIndexOf(java.io.File.separatorChar) + 1);
       }
 
-      success = new Jalview2XML().SaveAlignment(this, file, shortName);
+      /*
+       * First save any linked Chimera session.
+       */
+      Desktop.instance.saveChimeraSessions(file);
+
+      success = new Jalview2XML().saveAlignment(this, file, shortName);
 
       statusBar.setText(MessageManager.formatMessage(
-              "label.successfully_saved_to_file_in_format", new String[]
+              "label.successfully_saved_to_file_in_format", new Object[]
               { fileName, format }));
 
     }
@@ -1230,7 +1237,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           this.setTitle(file);
           statusBar.setText(MessageManager.formatMessage(
                   "label.successfully_saved_to_file_in_format",
-                  new String[]
+                  new Object[]
                   { fileName, format }));
         } catch (Exception ex)
         {
@@ -1243,7 +1250,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     if (!success)
     {
       JOptionPane.showInternalMessageDialog(this, MessageManager
-              .formatMessage("label.couldnt_save_file", new String[]
+              .formatMessage("label.couldnt_save_file", new Object[]
               { fileName }), MessageManager
               .getString("label.error_saving_file"),
               JOptionPane.WARNING_MESSAGE);
@@ -1305,7 +1312,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
               viewport.getAlignment(), omitHidden,
               viewport.getColumnSelection()));
       Desktop.addInternalFrame(cap, MessageManager.formatMessage(
-              "label.alignment_output_command", new String[]
+              "label.alignment_output_command", new Object[]
               { e.getActionCommand() }), 600, 500);
     } catch (OutOfMemoryError oom)
     {
@@ -1324,11 +1331,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   protected void htmlMenuItem_actionPerformed(ActionEvent e)
   {
-    new HTMLOutput(alignPanel,
-            alignPanel.seqPanel.seqCanvas.getSequenceRenderer(),
-            alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
+    // new HTMLOutput(alignPanel,
+    // alignPanel.getSeqPanel().seqCanvas.getSequenceRenderer(),
+    // alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
+    new HtmlSvgOutput(null, alignPanel);
   }
 
+  @Override
+  public void bioJSMenuItem_actionPerformed(ActionEvent e)
+  {
+    new BioJsHTMLOutput(alignPanel,
+            alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
+  }
   public void createImageMap(File file, String image)
   {
     alignPanel.makePNGImageMap(file, image);
@@ -1392,11 +1406,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void exportAnnotations_actionPerformed(ActionEvent e)
   {
-    new AnnotationExporter().exportAnnotations(alignPanel,
-            viewport.showAnnotation ? viewport.getAlignment()
-                    .getAlignmentAnnotation() : null, viewport
-                    .getAlignment().getGroups(), ((Alignment) viewport
-                    .getAlignment()).alignmentProperties);
+    new AnnotationExporter().exportAnnotations(alignPanel);
   }
 
   @Override
@@ -1510,7 +1520,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       undoMenuItem.setEnabled(true);
       CommandI command = viewport.getHistoryList().peek();
       undoMenuItem.setText(MessageManager.formatMessage(
-              "label.undo_command", new String[]
+              "label.undo_command", new Object[]
               { command.getDescription() }));
     }
     else
@@ -1525,7 +1535,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
       CommandI command = viewport.getRedoList().peek();
       redoMenuItem.setText(MessageManager.formatMessage(
-              "label.redo_command", new String[]
+              "label.redo_command", new Object[]
               { command.getDescription() }));
     }
     else
@@ -1589,7 +1599,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
     CommandI command = viewport.getHistoryList().pop();
     viewport.addToRedoList(command);
-    // TODO: execute command before adding to redo list / broadcasting?
     command.undoCommand(getViewAlignments());
 
     AlignmentViewport originalSource = getOriginatingSource(command);
@@ -1732,7 +1741,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     if (viewport.cursorMode)
     {
       sg.add(viewport.getAlignment().getSequenceAt(
-              alignPanel.seqPanel.seqCanvas.cursorY));
+              alignPanel.getSeqPanel().seqCanvas.cursorY));
     }
     else if (viewport.getSelectionGroup() != null
             && viewport.getSelectionGroup().getSize() != viewport
@@ -1782,7 +1791,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       if (viewport.cursorMode)
       {
-        alignPanel.seqPanel.moveCursor(size, 0);
+        alignPanel.getSeqPanel().moveCursor(size, 0);
       }
       else
       {
@@ -1793,7 +1802,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       if (viewport.cursorMode)
       {
-        alignPanel.seqPanel.moveCursor(-size, 0);
+        alignPanel.getSeqPanel().moveCursor(-size, 0);
       }
       else
       {
@@ -1810,13 +1819,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     }
 
     boolean appendHistoryItem = false;
-    if (viewport.getHistoryList() != null
-            && viewport.getHistoryList().size() > 0
-            && viewport.getHistoryList().peek() instanceof SlideSequencesCommand)
+    Deque<CommandI> historyList = viewport.getHistoryList();
+    if (historyList != null
+            && historyList.size() > 0
+            && historyList.peek() instanceof SlideSequencesCommand)
     {
       appendHistoryItem = ssc
-              .appendSlideCommand((SlideSequencesCommand) viewport
-                      .getHistoryList()
+              .appendSlideCommand((SlideSequencesCommand) historyList
                       .peek());
     }
 
@@ -1873,20 +1882,17 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       return;
     }
 
-    Vector hiddenColumns = null;
+    ArrayList<int[]> hiddenColumns = null;
     if (viewport.hasHiddenColumns())
     {
-      hiddenColumns = new Vector();
+      hiddenColumns = new ArrayList<int[]>();
       int hiddenOffset = viewport.getSelectionGroup().getStartRes(), hiddenCutoff = viewport
               .getSelectionGroup().getEndRes();
-      for (int i = 0; i < viewport.getColumnSelection().getHiddenColumns()
-              .size(); i++)
+      for (int[] region : viewport.getColumnSelection().getHiddenColumns())
       {
-        int[] region = viewport.getColumnSelection()
-                .getHiddenColumns().get(i);
         if (region[0] >= hiddenOffset && region[1] <= hiddenCutoff)
         {
-          hiddenColumns.addElement(new int[]
+          hiddenColumns.add(new int[]
           { region[0] - hiddenOffset, region[1] - hiddenOffset });
         }
       }
@@ -2213,19 +2219,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
         if (Desktop.jalviewClipboard != null
                 && Desktop.jalviewClipboard[2] != null)
         {
-          Vector hc = (Vector) Desktop.jalviewClipboard[2];
-          for (int i = 0; i < hc.size(); i++)
+          List<int[]> hc = (List<int[]>) Desktop.jalviewClipboard[2];
+          for (int[] region : hc)
           {
-            int[] region = (int[]) hc.elementAt(i);
             af.viewport.hideColumns(region[0], region[1]);
           }
         }
 
         // >>>This is a fix for the moment, until a better solution is
         // found!!<<<
-        af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
+        af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()
                 .transferSettings(
-                        alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
+                        alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
 
         // TODO: maintain provenance of an alignment, rather than just make the
         // title a concatenation of operations.
@@ -2273,19 +2278,18 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       if (Desktop.jalviewClipboard != null
               && Desktop.jalviewClipboard[2] != null)
       {
-        Vector hc = (Vector) Desktop.jalviewClipboard[2];
-        for (int i = 0; i < hc.size(); i++)
+        List<int[]> hc = (List<int[]>) Desktop.jalviewClipboard[2];
+        for (int region[] : hc)
         {
-          int[] region = (int[]) hc.elementAt(i);
           af.viewport.hideColumns(region[0], region[1]);
         }
       }
 
       // >>>This is a fix for the moment, until a better solution is
       // found!!<<<
-      af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer()
+      af.alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer()
               .transferSettings(
-                      alignPanel.seqPanel.seqCanvas.getFeatureRenderer());
+                      alignPanel.getSeqPanel().seqCanvas.getFeatureRenderer());
 
       // TODO: maintain provenance of an alignment, rather than just make the
       // title a concatenation of operations.
@@ -2449,14 +2453,14 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     if (viewport.cursorMode)
     {
-      alignPanel.seqPanel.keyboardNo1 = null;
-      alignPanel.seqPanel.keyboardNo2 = null;
+      alignPanel.getSeqPanel().keyboardNo1 = null;
+      alignPanel.getSeqPanel().keyboardNo2 = null;
     }
     viewport.setSelectionGroup(null);
     viewport.getColumnSelection().clear();
     viewport.setSelectionGroup(null);
-    alignPanel.seqPanel.seqCanvas.highlightSearchResults(null);
-    alignPanel.idPanel.idCanvas.searchResults = null;
+    alignPanel.getSeqPanel().seqCanvas.highlightSearchResults(null);
+    alignPanel.getIdPanel().getIdCanvas().searchResults = null;
     alignPanel.paintAlignment(true);
     PaintRefresher.Refresh(alignPanel, viewport.getSequenceSetId());
     viewport.sendSelection();
@@ -2617,7 +2621,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     addHistoryItem(removeGapCols);
 
     statusBar.setText(MessageManager.formatMessage(
-            "label.removed_empty_columns", new String[]
+            "label.removed_empty_columns", new Object[]
             { Integer.valueOf(removeGapCols.getSize()).toString() }));
 
     // This is to maintain viewport position on first residue
@@ -2888,7 +2892,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     viewport.setShowJVSuffix(seqLimits.isSelected());
 
-    alignPanel.idPanel.idCanvas.setPreferredSize(alignPanel
+    alignPanel.getIdPanel().getIdCanvas().setPreferredSize(alignPanel
             .calculateIdWidth());
     alignPanel.paintAlignment(true);
   }
@@ -2896,7 +2900,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   @Override
   public void idRightAlign_actionPerformed(ActionEvent e)
   {
-    viewport.rightAlignIds = idRightAlign.isSelected();
+    viewport.setRightAlignIds(idRightAlign.isSelected());
     alignPanel.paintAlignment(true);
   }
 
@@ -2918,7 +2922,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     if (viewport.followHighlight = this.followHighlightMenuItem.getState())
     {
       alignPanel.scrollToPosition(
-              alignPanel.seqPanel.seqCanvas.searchResults, false);
+              alignPanel.getSeqPanel().seqCanvas.searchResults, false);
     }
   }
 
@@ -3225,7 +3229,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   {
     viewport.setShowSequenceFeaturesHeight(showSeqFeaturesHeight
             .isSelected());
-    if (viewport.getShowSequenceFeaturesHeight())
+    if (viewport.isShowSequenceFeaturesHeight())
     {
       // ensure we're actually displaying features
       viewport.setShowSequenceFeatures(true);
@@ -3267,13 +3271,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     StringBuffer contents = new AlignmentProperties(viewport.getAlignment())
             .formatAsHtml();
     editPane.setText(MessageManager.formatMessage("label.html_content",
-            new String[]
+            new Object[]
             { contents.toString() }));
     JInternalFrame frame = new JInternalFrame();
     frame.getContentPane().add(new JScrollPane(editPane));
 
-    Desktop.instance.addInternalFrame(frame, MessageManager.formatMessage(
-            "label.alignment_properties", new String[]
+    Desktop.addInternalFrame(frame, MessageManager.formatMessage(
+            "label.alignment_properties", new Object[]
             { getTitle() }), 500, 400);
   }
 
@@ -3295,7 +3299,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     OverviewPanel overview = new OverviewPanel(alignPanel);
     frame.setContentPane(overview);
     Desktop.addInternalFrame(frame, MessageManager.formatMessage(
-            "label.overview_params", new String[]
+            "label.overview_params", new Object[]
             { this.getTitle() }), frame.getWidth(), frame.getHeight());
     frame.pack();
     frame.setLayer(JLayeredPane.PALETTE_LAYER);
@@ -3458,6 +3462,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   @Override
+  public void annotationColumn_actionPerformed(ActionEvent e)
+  {
+    new AnnotationColumnChooser(viewport, alignPanel);
+  }
+
+  @Override
   public void rnahelicesColour_actionPerformed(ActionEvent e)
   {
     new RNAHelicesColourChooser(viewport, alignPanel);
@@ -4098,7 +4108,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   public void addSortByOrderMenuItem(String title,
           final AlignmentOrder order)
   {
-    final JMenuItem item = new JMenuItem(MessageManager.formatMessage("action.by_title_param", new String[]{title}));
+    final JMenuItem item = new JMenuItem(MessageManager.formatMessage("action.by_title_param", new Object[]{title}));
     sort.add(item);
     item.addActionListener(new java.awt.event.ActionListener()
     {
@@ -4515,7 +4525,6 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       } catch (Exception e)
       {
       }
-      ;
     }
     final AlignFrame me = this;
     buildingMenu = true;
@@ -4670,14 +4679,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                         .debug("Exception during web service menu building process.",
                                 e);
               }
-              ;
             }
           });
         } catch (Exception e)
         {
         }
-        ;
-
         buildingMenu = false;
       }
     }).start();
@@ -4823,7 +4829,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       public void run()
       {
         final long sttime = System.currentTimeMillis();
-        ths.setProgressBar(MessageManager.formatMessage("status.searching_for_sequences_from", new String[]{fsrc}), sttime);
+        ths.setProgressBar(MessageManager.formatMessage("status.searching_for_sequences_from", new Object[]{fsrc}), sttime);
         try
         {
           Alignment ds = ths.getViewport().getAlignment().getDataset(); // update
@@ -4878,7 +4884,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           jalview.bin.Cache.log.error("Error when finding crossreferences",
                   e);
         }
-        ths.setProgressBar(MessageManager.formatMessage("status.finished_searching_for_sequences_from", new String[]{fsrc}),
+        ths.setProgressBar(MessageManager.formatMessage("status.finished_searching_for_sequences_from", new Object[]{fsrc}),
                 sttime);
       }
 
@@ -4943,7 +4949,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       AlignFrame af = new AlignFrame(al, DEFAULT_WIDTH, DEFAULT_HEIGHT);
       Desktop.addInternalFrame(af, MessageManager.formatMessage(
-              "label.translation_of_params", new String[]
+              "label.translation_of_params", new Object[]
               { this.getTitle() }), DEFAULT_WIDTH, DEFAULT_HEIGHT);
       // enable next line for linked editing
       // viewport.getStructureSelectionManager().addCommandListener(viewport);
@@ -4965,8 +4971,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     try
     {
       featuresFile = new FeaturesFile(file, type).parse(viewport
-              .getAlignment().getDataset(), alignPanel.seqPanel.seqCanvas
-              .getFeatureRenderer().featureColours, false,
+              .getAlignment().getDataset(), alignPanel.getSeqPanel().seqCanvas
+              .getFeatureRenderer().getFeatureColours(), false,
               jalview.bin.Cache.getDefault("RELAXEDSEQIDMATCHING", false));
     } catch (Exception ex)
     {
@@ -4975,12 +4981,12 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (featuresFile)
     {
-      viewport.showSequenceFeatures = true;
+      viewport.setShowSequenceFeatures(true);
       showSeqFeatures.setSelected(true);
-      if (alignPanel.seqPanel.seqCanvas.fr != null)
+      if (alignPanel.getSeqPanel().seqCanvas.fr != null)
       {
         // update the min/max ranges where necessary
-        alignPanel.seqPanel.seqCanvas.fr.findAllFeatures(true);
+        alignPanel.getSeqPanel().seqCanvas.fr.findAllFeatures(true);
       }
       if (featureSettings != null)
       {
@@ -5142,7 +5148,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                                   MessageManager
                                           .formatMessage(
                                                   "label.automatically_associate_pdb_files_with_sequences_same_name",
-                                                  new String[]
+                                                  new Object[]
                                                   { Integer.valueOf(
                                                           filesmatched
                                                                   .size())
@@ -5185,7 +5191,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                                   "<html>"+MessageManager
                                           .formatMessage(
                                                   "label.ignore_unmatched_dropped_files_info",
-                                                  new String[]
+                                                  new Object[]
                                                   { Integer.valueOf(
                                                           filesnotmatched
                                                                   .size())
@@ -5232,7 +5238,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       // try to parse as annotation.
       boolean isAnnotation = (format == null || format
               .equalsIgnoreCase("PFAM")) ? new AnnotationFile()
-              .readAnnotationFile(viewport.getAlignment(), file, protocol)
+              .annotateAlignmentView(viewport, file, protocol)
               : false;
 
       if (!isAnnotation)
@@ -5293,7 +5299,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
           {
             jalview.io.JPredFile predictions = new jalview.io.JPredFile(
                     file, protocol);
-            new JnetAnnotationMaker().add_annotation(predictions,
+            new JnetAnnotationMaker();
+            JnetAnnotationMaker.add_annotation(predictions,
                     viewport.getAlignment(), 0, false);
             isAnnotation = true;
           }
@@ -5603,7 +5610,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   }
 
                 });
-                fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{src.getDbName()})));
+                fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from", new Object[]{src.getDbName()})));
                 dfetch.add(fetchr);
                 comp++;
               }
@@ -5614,7 +5621,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                 // fetch all entry
                 DbSourceProxy src = otherdb.get(0);
                 fetchr = new JMenuItem(MessageManager.formatMessage(
-                        "label.fetch_all_param", new String[]
+                        "label.fetch_all_param", new Object[]
                         { src.getDbSource() }));
                 fetchr.addActionListener(new ActionListener()
                 {
@@ -5636,11 +5643,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   }
                 });
 
-                fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from_all_sources", new String[]{Integer.valueOf(otherdb.size()).toString(), src.getDbSource(), src.getDbName()})));
+                fetchr.setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager.formatMessage("label.fetch_retrieve_from_all_sources", new Object[]{Integer.valueOf(otherdb.size()).toString(), src.getDbSource(), src.getDbName()})));
                 dfetch.add(fetchr);
                 comp++;
                 // and then build the rest of the individual menus
-                ifetch = new JMenu(MessageManager.formatMessage("label.source_from_db_source", new String[]{src.getDbSource()}));
+                ifetch = new JMenu(MessageManager.formatMessage("label.source_from_db_source", new Object[]{src.getDbSource()}));
                 icomp = 0;
                 String imname = null;
                 int i = 0;
@@ -5653,7 +5660,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                           0, 10) + "..." : dbname;
                   if (imname == null)
                   {
-                    imname = MessageManager.formatMessage("label.from_msname", new String[]{sname});
+                    imname = MessageManager.formatMessage("label.from_msname", new Object[]{sname});
                   }
                   fetchr = new JMenuItem(msname);
                   final DbSourceProxy[] dassrc =
@@ -5680,7 +5687,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
                   });
                   fetchr.setToolTipText("<html>"
-                          + MessageManager.formatMessage("label.fetch_retrieve_from", new String[]{dbname}));
+                          + MessageManager.formatMessage("label.fetch_retrieve_from", new Object[]{dbname}));
                   ifetch.add(fetchr);
                   ++i;
                   if (++icomp >= mcomp || i == (otherdb.size()))
@@ -5844,6 +5851,16 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       alignPanel.paintAlignment(true);
     }
   }
+  public void clearAlignmentSeqRep()
+  {
+    // TODO refactor alignmentseqrep to controller
+    if (viewport.getAlignment().hasSeqrep()) {
+      viewport.getAlignment().setSeqrep(null);
+      PaintRefresher.Refresh(this, viewport.getSequenceSetId());
+      alignPanel.updateAnnotation();
+      alignPanel.paintAlignment(true);
+    }
+  }
 
   @Override
   protected void createGroup_actionPerformed(ActionEvent e)