Merge commit 'ab43013b7e357b84b4abade0dba949668dfb2a0e' into develop
[jalview.git] / src / jalview / gui / AppJmol.java
index bcdc2de..4379c20 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2b1)
  * Copyright (C) 2014 The Jalview Authors
  * 
  * This file is part of Jalview.
  */
 package jalview.gui;
 
-import java.util.*;
-import java.awt.*;
-
-import javax.swing.*;
-import javax.swing.event.*;
-
-import java.awt.event.*;
-import java.io.*;
-
-import jalview.jbgui.GStructureViewer;
-import jalview.api.SequenceStructureBinding;
-import jalview.api.structures.JalviewStructureDisplayI;
 import jalview.bin.Cache;
-import jalview.datamodel.*;
-import jalview.gui.ViewSelectionMenu.ViewSetProvider;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
 import jalview.datamodel.PDBEntry;
-import jalview.ext.jmol.JalviewJmolBinding;
-import jalview.io.*;
-import jalview.schemes.*;
+import jalview.datamodel.SequenceI;
+import jalview.io.AppletFormatAdapter;
+import jalview.io.JalviewFileChooser;
+import jalview.io.JalviewFileView;
+import jalview.schemes.BuriedColourScheme;
+import jalview.schemes.ColourSchemeI;
+import jalview.schemes.HelixColourScheme;
+import jalview.schemes.HydrophobicColourScheme;
+import jalview.schemes.PurinePyrimidineColourScheme;
+import jalview.schemes.StrandColourScheme;
+import jalview.schemes.TaylorColourScheme;
+import jalview.schemes.TurnColourScheme;
+import jalview.schemes.ZappoColourScheme;
+import jalview.structures.models.AAStructureBindingModel;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 
-public class AppJmol extends GStructureViewer implements Runnable,
-        ViewSetProvider, JalviewStructureDisplayI
-
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.PrintWriter;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JColorChooser;
+import javax.swing.JInternalFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSplitPane;
+import javax.swing.event.InternalFrameAdapter;
+import javax.swing.event.InternalFrameEvent;
+import javax.swing.event.MenuEvent;
+import javax.swing.event.MenuListener;
+
+public class AppJmol extends StructureViewerBase
 {
   AppJmolBinding jmb;
 
@@ -54,8 +83,6 @@ public class AppJmol extends GStructureViewer implements Runnable,
 
   RenderPanel renderPanel;
 
-  AlignmentPanel ap;
-
   Vector atomsPicked = new Vector();
 
   private boolean addingStructures = false;
@@ -70,6 +97,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
    * @param bounds
    * @deprecated defaults to AppJmol(String[] files, ... , viewid);
    */
+  @Deprecated
   public AppJmol(String file, String id, SequenceI[] seq,
           AlignmentPanel ap, String loadStatus, Rectangle bounds)
   {
@@ -79,6 +107,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
   /**
    * @deprecated
    */
+  @Deprecated
   public AppJmol(String file, String id, SequenceI[] seq,
           AlignmentPanel ap, String loadStatus, Rectangle bounds,
           String viewid)
@@ -118,9 +147,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
     PDBEntry[] pdbentrys = new PDBEntry[files.length];
     for (int i = 0; i < pdbentrys.length; i++)
     {
-      PDBEntry pdbentry = new PDBEntry();
-      pdbentry.setFile(files[i]);
-      pdbentry.setId(ids[i]);
+      PDBEntry pdbentry = new PDBEntry(files[i], ids[i]);
       pdbentrys[i] = pdbentry;
     }
     // / TODO: check if protocol is needed to be set, and if chains are
@@ -138,18 +165,18 @@ public class AppJmol extends GStructureViewer implements Runnable,
     {
       jmb.setColourBySequence(false);
       seqColour.setSelected(false);
-      jmolColour.setSelected(true);
+      viewerColour.setSelected(true);
     }
-    if (usetoColour)
+    else if (usetoColour)
     {
       useAlignmentPanelForColourbyseq(ap);
       jmb.setColourBySequence(true);
       seqColour.setSelected(true);
-      jmolColour.setSelected(false);
+      viewerColour.setSelected(false);
     }
     this.setBounds(bounds);
     initMenus();
-    viewId = viewid;
+    setViewId(viewid);
     // jalview.gui.Desktop.addInternalFrame(this, "Loading File",
     // bounds.width,bounds.height);
 
@@ -167,7 +194,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
   private void initMenus()
   {
     seqColour.setSelected(jmb.isColourBySequence());
-    jmolColour.setSelected(!jmb.isColourBySequence());
+    viewerColour.setSelected(!jmb.isColourBySequence());
     if (_colourwith == null)
     {
       _colourwith = new Vector<AlignmentPanel>();
@@ -177,7 +204,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
       _alignwith = new Vector<AlignmentPanel>();
     }
 
-    seqColourBy = new ViewSelectionMenu("Colour by ..", this, _colourwith,
+    seqColourBy = new ViewSelectionMenu(MessageManager.getString("label.colour_by"), this, _colourwith,
             new ItemListener()
             {
 
@@ -197,7 +224,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
             });
     viewMenu.add(seqColourBy);
     final ItemListener handler;
-    JMenu alpanels = new ViewSelectionMenu("Superpose with ..", this,
+    JMenu alpanels = new ViewSelectionMenu(MessageManager.getString("label.superpose_with"), this,
             _alignwith, handler = new ItemListener()
             {
 
@@ -213,8 +240,8 @@ public class AppJmol extends GStructureViewer implements Runnable,
               }
             });
     handler.itemStateChanged(null);
-    jmolActionMenu.add(alpanels);
-    jmolActionMenu.addMenuListener(new MenuListener()
+    viewerActionMenu.add(alpanels);
+    viewerActionMenu.addMenuListener(new MenuListener()
     {
 
       @Override
@@ -265,16 +292,21 @@ public class AppJmol extends GStructureViewer implements Runnable,
                       "label.pdb_entry_is_already_displayed", new String[]
                       { pdbentry.getId() }), MessageManager.formatMessage(
                       "label.map_sequences_to_visible_window", new String[]
-                      { pdbentry.getId() }), JOptionPane.YES_NO_OPTION);
+                      { pdbentry.getId() }),
+              JOptionPane.YES_NO_CANCEL_OPTION);
 
+      if (option == JOptionPane.CANCEL_OPTION)
+      {
+        return;
+      }
       if (option == JOptionPane.YES_OPTION)
       {
         // TODO : Fix multiple seq to one chain issue here.
         ap.getStructureSelectionManager().setMapping(seq, chains,
                 alreadyMapped, AppletFormatAdapter.FILE);
-        if (ap.seqPanel.seqCanvas.fr != null)
+        if (ap.getSeqPanel().seqCanvas.fr != null)
         {
-          ap.seqPanel.seqCanvas.fr.featuresAdded();
+          ap.getSeqPanel().seqCanvas.fr.featuresAdded();
           ap.paintAlignment(true);
         }
 
@@ -289,15 +321,16 @@ public class AppJmol extends GStructureViewer implements Runnable,
             final AppJmol topJmol = ((AppJmol) frames[i]);
             // JBPNOTE: this looks like a binding routine, rather than a gui
             // routine
-            for (int pe = 0; pe < topJmol.jmb.pdbentry.length; pe++)
+            for (int pe = 0; pe < topJmol.jmb.getPdbCount(); pe++)
             {
-              if (topJmol.jmb.pdbentry[pe].getFile().equals(alreadyMapped))
+              if (topJmol.jmb.getPdbEntry(pe).getFile()
+                      .equals(alreadyMapped))
               {
                 topJmol.jmb.addSequence(pe, seq);
                 topJmol.addAlignmentPanel(ap);
                 // add it to the set used for colouring
                 topJmol.useAlignmentPanelForColourbyseq(ap);
-                topJmol.buildJmolActionMenu();
+                topJmol.buildActionMenu();
                 ap.getStructureSelectionManager()
                         .sequenceColoursChanged(ap);
                 break;
@@ -328,7 +361,11 @@ public class AppJmol extends GStructureViewer implements Runnable,
                                 { pdbentry.getId(), topJmol.getTitle() }),
                         MessageManager
                                 .getString("label.align_to_existing_structure_view"),
-                        JOptionPane.YES_NO_OPTION);
+                        JOptionPane.YES_NO_CANCEL_OPTION);
+        if (option == JOptionPane.CANCEL_OPTION)
+        {
+          return;
+        }
         if (option == JOptionPane.YES_OPTION)
         {
           topJmol.useAlignmentPanelForSuperposition(ap);
@@ -389,133 +426,6 @@ public class AppJmol extends GStructureViewer implements Runnable,
   }
 
   /**
-   * list of sequenceSet ids associated with the view
-   */
-  ArrayList<String> _aps = new ArrayList();
-
-  public AlignmentPanel[] getAllAlignmentPanels()
-  {
-    AlignmentPanel[] t, list = new AlignmentPanel[0];
-    for (String setid : _aps)
-    {
-      AlignmentPanel[] panels = PaintRefresher.getAssociatedPanels(setid);
-      if (panels != null)
-      {
-        t = new AlignmentPanel[list.length + panels.length];
-        System.arraycopy(list, 0, t, 0, list.length);
-        System.arraycopy(panels, 0, t, list.length, panels.length);
-        list = t;
-      }
-    }
-
-    return list;
-  }
-
-  /**
-   * list of alignment panels to use for superposition
-   */
-  Vector<AlignmentPanel> _alignwith = new Vector<AlignmentPanel>();
-
-  /**
-   * list of alignment panels that are used for colouring structures by aligned
-   * sequences
-   */
-  Vector<AlignmentPanel> _colourwith = new Vector<AlignmentPanel>();
-
-  /**
-   * set the primary alignmentPanel reference and add another alignPanel to the
-   * list of ones to use for colouring and aligning
-   * 
-   * @param nap
-   */
-  public void addAlignmentPanel(AlignmentPanel nap)
-  {
-    if (ap == null)
-    {
-      ap = nap;
-    }
-    if (!_aps.contains(nap.av.getSequenceSetId()))
-    {
-      _aps.add(nap.av.getSequenceSetId());
-    }
-  }
-
-  /**
-   * remove any references held to the given alignment panel
-   * 
-   * @param nap
-   */
-  public void removeAlignmentPanel(AlignmentPanel nap)
-  {
-    try
-    {
-      _alignwith.remove(nap);
-      _colourwith.remove(nap);
-      if (ap == nap)
-      {
-        ap = null;
-        for (AlignmentPanel aps : getAllAlignmentPanels())
-        {
-          if (aps != nap)
-          {
-            ap = aps;
-            break;
-          }
-        }
-      }
-    } catch (Exception ex)
-    {
-    }
-    if (ap != null)
-    {
-      buildJmolActionMenu();
-    }
-  }
-
-  public void useAlignmentPanelForSuperposition(AlignmentPanel nap)
-  {
-    addAlignmentPanel(nap);
-    if (!_alignwith.contains(nap))
-    {
-      _alignwith.add(nap);
-    }
-  }
-
-  public void excludeAlignmentPanelForSuperposition(AlignmentPanel nap)
-  {
-    if (_alignwith.contains(nap))
-    {
-      _alignwith.remove(nap);
-    }
-  }
-
-  public void useAlignmentPanelForColourbyseq(AlignmentPanel nap,
-          boolean enableColourBySeq)
-  {
-    useAlignmentPanelForColourbyseq(nap);
-    jmb.setColourBySequence(enableColourBySeq);
-    seqColour.setSelected(enableColourBySeq);
-    jmolColour.setSelected(!enableColourBySeq);
-  }
-
-  public void useAlignmentPanelForColourbyseq(AlignmentPanel nap)
-  {
-    addAlignmentPanel(nap);
-    if (!_colourwith.contains(nap))
-    {
-      _colourwith.add(nap);
-    }
-  }
-
-  public void excludeAlignmentPanelForColourbyseq(AlignmentPanel nap)
-  {
-    if (_colourwith.contains(nap))
-    {
-      _colourwith.remove(nap);
-    }
-  }
-
-  /**
    * pdb retrieval thread.
    */
   private Thread worker = null;
@@ -576,25 +486,22 @@ public class AppJmol extends GStructureViewer implements Runnable,
     return;
   }
 
-  private Vector getJmolsFor(AlignmentPanel ap2)
+  private Vector getJmolsFor(AlignmentPanel apanel)
   {
-    Vector otherJmols = new Vector();
-    // Now this AppJmol is mapped to new sequences. We must add them to
-    // the exisiting array
+    Vector result = new Vector();
     JInternalFrame[] frames = Desktop.instance.getAllFrames();
 
-    for (int i = 0; i < frames.length; i++)
+    for (JInternalFrame frame : frames)
     {
-      if (frames[i] instanceof AppJmol)
+      if (frame instanceof AppJmol)
       {
-        AppJmol topJmol = ((AppJmol) frames[i]);
-        if (topJmol.isLinkedWith(ap2))
+        if (((StructureViewerBase) frame).isLinkedWith(apanel))
         {
-          otherJmols.addElement(topJmol);
+          result.addElement(frame);
         }
       }
     }
-    return otherJmols;
+    return result;
   }
 
   void initJmol(String command)
@@ -643,7 +550,9 @@ public class AppJmol extends GStructureViewer implements Runnable,
         for (int i = 0; i < chainMenu.getItemCount(); i++)
         {
           if (chainMenu.getItem(i) instanceof JCheckBoxMenuItem)
+          {
             ((JCheckBoxMenuItem) chainMenu.getItem(i)).setSelected(true);
+          }
         }
         centerViewer();
         allChainsSelected = false;
@@ -660,7 +569,9 @@ public class AppJmol extends GStructureViewer implements Runnable,
         public void itemStateChanged(ItemEvent evt)
         {
           if (!allChainsSelected)
+          {
             centerViewer();
+          }
         }
       });
 
@@ -694,7 +605,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
   public void closeViewer()
   {
     jmb.closeViewer();
-    ap = null;
+    setAlignmentPanel(null);
     _aps.clear();
     _alignwith.clear();
     _colourwith.clear();
@@ -720,22 +631,23 @@ public class AppJmol extends GStructureViewer implements Runnable,
       // TODO: replace with reference fetching/transfer code (validate PDBentry
       // as a DBRef?)
       jalview.ws.dbsources.Pdb pdbclient = new jalview.ws.dbsources.Pdb();
-      for (int pi = 0; pi < jmb.pdbentry.length; pi++)
+      for (int pi = 0; pi < jmb.getPdbCount(); pi++)
       {
-        String file = jmb.pdbentry[pi].getFile();
+        String file = jmb.getPdbEntry(pi).getFile();
         if (file == null)
         {
           // retrieve the pdb and store it locally
           AlignmentI pdbseq = null;
-          pdbid = jmb.pdbentry[pi].getId();
+          pdbid = jmb.getPdbEntry(pi).getId();
           long hdl = pdbid.hashCode() - System.currentTimeMillis();
           if (progressBar != null)
           {
-            progressBar.setProgressBar("Fetching PDB " + pdbid, hdl);
+            progressBar.setProgressBar(MessageManager.formatMessage("status.fetching_pdb", new String[]{pdbid}), hdl);
           }
           try
           {
-            pdbseq = pdbclient.getSequenceRecords(pdbid = jmb.pdbentry[pi]
+            pdbseq = pdbclient.getSequenceRecords(pdbid = jmb.getPdbEntry(
+                    pi)
                     .getId());
           } catch (OutOfMemoryError oomerror)
           {
@@ -747,7 +659,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
           }
           if (progressBar != null)
           {
-            progressBar.setProgressBar("Finished.", hdl);
+            progressBar.setProgressBar(MessageManager.getString("label.state_completed"), hdl);
           }
           if (pdbseq != null)
           {
@@ -755,7 +667,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
             // PDBEntry
             file = new File(((PDBEntry) pdbseq.getSequenceAt(0).getPDBId()
                     .elementAt(0)).getFile()).getAbsolutePath();
-            jmb.pdbentry[pi].setFile(file);
+            jmb.getPdbEntry(pi).setFile(file);
 
             files.append(" \"" + Platform.escapeString(file) + "\"");
           }
@@ -850,7 +762,7 @@ public class AppJmol extends GStructureViewer implements Runnable,
       // need to wait around until script has finished
       while (addingStructures ? lastnotify >= jmb.getLoadNotifiesHandled()
               : (jmb.isFinishedInit() && jmb.getPdbFile() != null && jmb
-                      .getPdbFile().length != jmb.pdbentry.length))
+                      .getPdbFile().length != jmb.getPdbCount()))
       {
         try
         {
@@ -885,13 +797,14 @@ public class AppJmol extends GStructureViewer implements Runnable,
     worker = null;
   }
 
+  @Override
   public void pdbFile_actionPerformed(ActionEvent actionEvent)
   {
     JalviewFileChooser chooser = new JalviewFileChooser(
             jalview.bin.Cache.getProperty("LAST_DIRECTORY"));
 
     chooser.setFileView(new JalviewFileView());
-    chooser.setDialogTitle("Save PDB File");
+    chooser.setDialogTitle(MessageManager.getString("label.save_pdb_file"));
     chooser.setToolTipText(MessageManager.getString("action.save"));
 
     int value = chooser.showSaveDialog(this);
@@ -922,14 +835,15 @@ public class AppJmol extends GStructureViewer implements Runnable,
     }
   }
 
+  @Override
   public void viewMapping_actionPerformed(ActionEvent actionEvent)
   {
     jalview.gui.CutAndPasteTransfer cap = new jalview.gui.CutAndPasteTransfer();
     try
     {
-      for (int pdbe = 0; pdbe < jmb.pdbentry.length; pdbe++)
+      for (int pdbe = 0; pdbe < jmb.getPdbCount(); pdbe++)
       {
-        cap.appendText(jmb.printMapping(jmb.pdbentry[pdbe].getFile()));
+        cap.appendText(jmb.printMapping(jmb.getPdbEntry(pdbe).getFile()));
         cap.appendText("\n");
       }
     } catch (OutOfMemoryError e)
@@ -945,46 +859,45 @@ public class AppJmol extends GStructureViewer implements Runnable,
             600);
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
-   */
+  @Override
   public void eps_actionPerformed(ActionEvent e)
   {
-    makePDBImage(jalview.util.ImageMaker.EPS);
+    makePDBImage(jalview.util.ImageMaker.TYPE.EPS);
   }
 
-  /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
-   */
+  @Override
   public void png_actionPerformed(ActionEvent e)
   {
-    makePDBImage(jalview.util.ImageMaker.PNG);
+    makePDBImage(jalview.util.ImageMaker.TYPE.PNG);
   }
 
-  void makePDBImage(int type)
+  void makePDBImage(jalview.util.ImageMaker.TYPE type)
   {
     int width = getWidth();
     int height = getHeight();
 
     jalview.util.ImageMaker im;
 
-    if (type == jalview.util.ImageMaker.PNG)
+    if (type == jalview.util.ImageMaker.TYPE.PNG)
     {
-      im = new jalview.util.ImageMaker(this, jalview.util.ImageMaker.PNG,
+      im = new jalview.util.ImageMaker(this,
+              jalview.util.ImageMaker.TYPE.PNG,
               "Make PNG image from view", width, height, null, null);
     }
-    else
+    else if (type == jalview.util.ImageMaker.TYPE.EPS)
     {
-      im = new jalview.util.ImageMaker(this, jalview.util.ImageMaker.EPS,
+      im = new jalview.util.ImageMaker(this,
+              jalview.util.ImageMaker.TYPE.EPS,
               "Make EPS file from view", width, height, null,
               this.getTitle());
     }
+    else
+    {
+
+      im = new jalview.util.ImageMaker(this,
+              jalview.util.ImageMaker.TYPE.SVG, "Make SVG file from PCA",
+              width, height, null, this.getTitle());
+    }
 
     if (im.getGraphics() != null)
     {
@@ -994,15 +907,17 @@ public class AppJmol extends GStructureViewer implements Runnable,
     }
   }
 
-  public void jmolColour_actionPerformed(ActionEvent actionEvent)
+  @Override
+  public void viewerColour_actionPerformed(ActionEvent actionEvent)
   {
-    if (jmolColour.isSelected())
+    if (viewerColour.isSelected())
     {
       // disable automatic sequence colouring.
       jmb.setColourBySequence(false);
     }
   }
 
+  @Override
   public void seqColour_actionPerformed(ActionEvent actionEvent)
   {
     jmb.setColourBySequence(seqColour.isSelected());
@@ -1014,96 +929,109 @@ public class AppJmol extends GStructureViewer implements Runnable,
     {
       if (!jmb.isLoadingFromArchive())
       {
-        if (_colourwith.size() == 0 && ap != null)
+        if (_colourwith.size() == 0 && getAlignmentPanel() != null)
         {
           // Make the currently displayed alignment panel the associated view
-          _colourwith.add(ap.alignFrame.alignPanel);
+          _colourwith.add(getAlignmentPanel().alignFrame.alignPanel);
         }
       }
       // Set the colour using the current view for the associated alignframe
       for (AlignmentPanel ap : _colourwith)
       {
-        jmb.colourBySequence(ap.av.showSequenceFeatures, ap);
+        jmb.colourBySequence(ap.av.isShowSequenceFeatures(), ap);
       }
     }
   }
 
+  @Override
   public void chainColour_actionPerformed(ActionEvent actionEvent)
   {
     chainColour.setSelected(true);
     jmb.colourByChain();
   }
 
+  @Override
   public void chargeColour_actionPerformed(ActionEvent actionEvent)
   {
     chargeColour.setSelected(true);
     jmb.colourByCharge();
   }
 
+  @Override
   public void zappoColour_actionPerformed(ActionEvent actionEvent)
   {
     zappoColour.setSelected(true);
     jmb.setJalviewColourScheme(new ZappoColourScheme());
   }
 
+  @Override
   public void taylorColour_actionPerformed(ActionEvent actionEvent)
   {
     taylorColour.setSelected(true);
     jmb.setJalviewColourScheme(new TaylorColourScheme());
   }
 
+  @Override
   public void hydroColour_actionPerformed(ActionEvent actionEvent)
   {
     hydroColour.setSelected(true);
     jmb.setJalviewColourScheme(new HydrophobicColourScheme());
   }
 
+  @Override
   public void helixColour_actionPerformed(ActionEvent actionEvent)
   {
     helixColour.setSelected(true);
     jmb.setJalviewColourScheme(new HelixColourScheme());
   }
 
+  @Override
   public void strandColour_actionPerformed(ActionEvent actionEvent)
   {
     strandColour.setSelected(true);
     jmb.setJalviewColourScheme(new StrandColourScheme());
   }
 
+  @Override
   public void turnColour_actionPerformed(ActionEvent actionEvent)
   {
     turnColour.setSelected(true);
     jmb.setJalviewColourScheme(new TurnColourScheme());
   }
 
+  @Override
   public void buriedColour_actionPerformed(ActionEvent actionEvent)
   {
     buriedColour.setSelected(true);
     jmb.setJalviewColourScheme(new BuriedColourScheme());
   }
 
+  @Override
   public void purinePyrimidineColour_actionPerformed(ActionEvent actionEvent)
   {
     setJalviewColourScheme(new PurinePyrimidineColourScheme());
   }
 
+  @Override
   public void userColour_actionPerformed(ActionEvent actionEvent)
   {
     userColour.setSelected(true);
     new UserDefinedColours(this, null);
   }
 
+  @Override
   public void backGround_actionPerformed(ActionEvent actionEvent)
   {
     java.awt.Color col = JColorChooser.showDialog(this,
-            "Select Background Colour", null);
+            MessageManager.getString("label.select_backgroud_colour"), null);
     if (col != null)
     {
       jmb.setBackgroundColour(col);
     }
   }
 
-  public void jmolHelp_actionPerformed(ActionEvent actionEvent)
+  @Override
+  public void showHelp_actionPerformed(ActionEvent actionEvent)
   {
     try
     {
@@ -1168,15 +1096,15 @@ public class AppJmol extends GStructureViewer implements Runnable,
                 + "...", 20, currentSize.height / 2);
         StringBuffer sb = new StringBuffer();
         int lines = 0;
-        for (int e = 0; e < jmb.pdbentry.length; e++)
+        for (int e = 0; e < jmb.getPdbCount(); e++)
         {
-          sb.append(jmb.pdbentry[e].getId());
-          if (e < jmb.pdbentry.length - 1)
+          sb.append(jmb.getPdbEntry(e).getId());
+          if (e < jmb.getPdbCount() - 1)
           {
             sb.append(",");
           }
 
-          if (e == jmb.pdbentry.length - 1 || sb.length() > 20)
+          if (e == jmb.getPdbCount() - 1 || sb.length() > 20)
           {
             lines++;
             g.drawString(sb.toString(), 20, currentSize.height / 2 - lines
@@ -1200,17 +1128,6 @@ public class AppJmol extends GStructureViewer implements Runnable,
     }
   }
 
-  String viewId = null;
-
-  public String getViewId()
-  {
-    if (viewId == null)
-    {
-      viewId = System.currentTimeMillis() + "." + this.hashCode();
-    }
-    return viewId;
-  }
-
   public void updateTitleAndMenus()
   {
     if (jmb.fileLoadingError != null && jmb.fileLoadingError.length() > 0)
@@ -1221,9 +1138,9 @@ public class AppJmol extends GStructureViewer implements Runnable,
     setChainMenuItems(jmb.chainNames);
 
     this.setTitle(jmb.getViewerTitle());
-    if (jmb.getPdbFile().length > 1 && jmb.sequence.length > 1)
+    if (jmb.getPdbFile().length > 1 && jmb.getSequence().length > 1)
     {
-      jmolActionMenu.setVisible(true);
+      viewerActionMenu.setVisible(true);
     }
     if (!jmb.isLoadingFromArchive())
     {
@@ -1231,27 +1148,6 @@ public class AppJmol extends GStructureViewer implements Runnable,
     }
   }
 
-  protected void buildJmolActionMenu()
-  {
-    if (_alignwith == null)
-    {
-      _alignwith = new Vector<AlignmentPanel>();
-    }
-    if (_alignwith.size() == 0 && ap != null)
-    {
-      _alignwith.add(ap);
-    }
-    ;
-    for (Component c : jmolActionMenu.getMenuComponents())
-    {
-      if (c != alignStructs)
-      {
-        jmolActionMenu.remove((JMenuItem) c);
-      }
-    }
-    final ItemListener handler;
-  }
-
   /*
    * (non-Javadoc)
    * 
@@ -1267,14 +1163,14 @@ public class AppJmol extends GStructureViewer implements Runnable,
 
   private void alignStructs_withAllAlignPanels()
   {
-    if (ap == null)
+    if (getAlignmentPanel() == null)
     {
       return;
     }
     ;
     if (_alignwith.size() == 0)
     {
-      _alignwith.add(ap);
+      _alignwith.add(getAlignmentPanel());
     }
     ;
     try
@@ -1326,42 +1222,19 @@ public class AppJmol extends GStructureViewer implements Runnable,
         return ap;
       }
     }
-    return ap;
-  }
-
-  /**
-   * 
-   * @param ap2
-   * @return true if this Jmol instance is linked with the given alignPanel
-   */
-  public boolean isLinkedWith(AlignmentPanel ap2)
-  {
-    return _aps.contains(ap2.av.getSequenceSetId());
+    return getAlignmentPanel();
   }
 
-  public boolean isUsedforaligment(AlignmentPanel ap2)
-  {
-
-    return (_alignwith != null) && _alignwith.contains(ap2);
-  }
-
-  public boolean isUsedforcolourby(AlignmentPanel ap2)
-  {
-    return (_colourwith != null) && _colourwith.contains(ap2);
-  }
-
-  /**
-   * 
-   * @return TRUE if the view is NOT being coloured by sequence associations.
-   */
-  public boolean isColouredByJmol()
+  @Override
+  public AAStructureBindingModel getBinding()
   {
-    return !jmb.isColourBySequence();
+    return this.jmb;
   }
 
-  public JalviewJmolBinding getBinding()
+  @Override
+  public String getStateInfo()
   {
-    return jmb;
+    return jmb == null ? null : jmb.viewer.getStateInfo();
   }
 
 }