extracted jalviewlite API calls as separate interface (JAL-859)
[jalview.git] / src / jalview / bin / JalviewLite.java
old mode 100755 (executable)
new mode 100644 (file)
index 8e22a1a..f044411
@@ -17,7 +17,9 @@
  */\r
 package jalview.bin;\r
 \r
+import jalview.api.StructureSelectionManagerProvider;\r
 import jalview.appletgui.AlignFrame;\r
+import jalview.appletgui.AlignViewport;\r
 import jalview.appletgui.EmbmenuFrame;\r
 import jalview.appletgui.FeatureSettings;\r
 import jalview.datamodel.Alignment;\r
@@ -34,6 +36,7 @@ import jalview.io.FileParse;
 import jalview.io.IdentifyFile;\r
 import jalview.io.JnetAnnotationMaker;\r
 import jalview.javascript.JSFunctionExec;\r
+import jalview.javascript.JalviewLiteJsApi;\r
 import jalview.javascript.JsCallBack;\r
 import jalview.structure.SelectionListener;\r
 import jalview.structure.StructureSelectionManager;\r
@@ -60,55 +63,40 @@ import netscape.javascript.JSObject;
  * Jalview Applet. Runs in Java 1.18 runtime\r
  * \r
  * @author $author$\r
- * @version $Revision$\r
+ * @version $Revision: 1.92 $\r
  */\r
-public class JalviewLite extends Applet\r
+public class JalviewLite extends Applet implements StructureSelectionManagerProvider, JalviewLiteJsApi\r
 {\r
 \r
   // /////////////////////////////////////////\r
   // The following public methods maybe called\r
   // externally, eg via javascript in HTML page\r
-  /**\r
-   * @return String list of selected sequence IDs, each terminated by the\r
-   *         'boolean not' character (""+0x00AC) or (¬)\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences()\r
    */\r
   public String getSelectedSequences()\r
   {\r
     return getSelectedSequencesFrom(getDefaultTargetFrame());\r
   }\r
 \r
-  /**\r
-   * @param sep\r
-   *          separator string or null for default\r
-   * @return String list of selected sequence IDs, each terminated by given\r
-   *         separator string\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String)\r
    */\r
   public String getSelectedSequences(String sep)\r
   {\r
     return getSelectedSequencesFrom(getDefaultTargetFrame(), sep);\r
   }\r
 \r
-  /**\r
-   * @param alf\r
-   *          alignframe containing selection\r
-   * @return String list of selected sequence IDs, each terminated by current\r
-   *         default separator sequence\r
-   * \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui.AlignFrame)\r
    */\r
   public String getSelectedSequencesFrom(AlignFrame alf)\r
   {\r
     return getSelectedSequencesFrom(alf, separator); // ""+0x00AC);\r
   }\r
 \r
-  /**\r
-   * get list of selected sequence IDs separated by given separator\r
-   * \r
-   * @param alf\r
-   *          window containing selection\r
-   * @param sep\r
-   *          separator string to use - default is 'boolean not'\r
-   * @return String list of selected sequence IDs, each terminated by the given\r
-   *         separator\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui.AlignFrame, java.lang.String)\r
    */\r
   public String getSelectedSequencesFrom(AlignFrame alf, String sep)\r
   {\r
@@ -132,15 +120,8 @@ public class JalviewLite extends Applet
     return result.toString();\r
   }\r
 \r
-  /**\r
-   * \r
-   * @param sequenceId\r
-   *          id of sequence to highlight\r
-   * @param position\r
-   *          integer position [ tobe implemented or range ] on sequence\r
-   * @param alignedPosition\r
-   *          true/false/empty string - indicate if position is an alignment\r
-   *          column or unaligned sequence position\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#highlight(java.lang.String, java.lang.String, java.lang.String)\r
    */\r
   public void highlight(String sequenceId, String position,\r
           String alignedPosition)\r
@@ -149,15 +130,8 @@ public class JalviewLite extends Applet
             alignedPosition);\r
   }\r
 \r
-  /**\r
-   * \r
-   * @param sequenceId\r
-   *          id of sequence to highlight\r
-   * @param position\r
-   *          integer position [ tobe implemented or range ] on sequence\r
-   * @param alignedPosition\r
-   *          false, blank or something else - indicate if position is an\r
-   *          alignment column or unaligned sequence position\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#highlightIn(jalview.appletgui.AlignFrame, java.lang.String, java.lang.String, java.lang.String)\r
    */\r
   public void highlightIn(AlignFrame alf, String sequenceId,\r
           String position, String alignedPosition)\r
@@ -182,67 +156,44 @@ public class JalviewLite extends Applet
               && (alignedPosition.trim().length() == 0 || alignedPosition\r
                       .toLowerCase().indexOf("false") > -1))\r
       {\r
-        StructureSelectionManager.getStructureSelectionManager()\r
+        StructureSelectionManager.getStructureSelectionManager(this)\r
                 .mouseOverVamsasSequence(sq, sq.findIndex(apos), null);\r
       }\r
       else\r
       {\r
-        StructureSelectionManager.getStructureSelectionManager()\r
+        StructureSelectionManager.getStructureSelectionManager(this)\r
                 .mouseOverVamsasSequence(sq, apos, null);\r
       }\r
 \r
     }\r
   }\r
 \r
-  /**\r
-   * select regions of the currrent alignment frame\r
-   * \r
-   * @param sequenceIds\r
-   *          String separated list of sequence ids or empty string\r
-   * @param columns\r
-   *          String separated list { column range or column, ..} or empty\r
-   *          string\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String, java.lang.String)\r
    */\r
   public void select(String sequenceIds, String columns)\r
   {\r
     selectIn(getDefaultTargetFrame(), sequenceIds, columns, separator);\r
   }\r
 \r
-  /**\r
-   * select regions of the currrent alignment frame\r
-   * \r
-   * @param toselect\r
-   *          String separated list { column range, seq1...seqn sequence ids }\r
-   * @param sep\r
-   *          separator between toselect fields\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#select(java.lang.String, java.lang.String, java.lang.String)\r
    */\r
   public void select(String sequenceIds, String columns, String sep)\r
   {\r
     selectIn(getDefaultTargetFrame(), sequenceIds, columns, sep);\r
   }\r
 \r
-  /**\r
-   * select regions of the given alignment frame\r
-   * \r
-   * @param alf\r
-   * @param toselect\r
-   *          String separated list { column range, seq1...seqn sequence ids }\r
-   * @param sep\r
-   *          separator between toselect fields\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame, java.lang.String, java.lang.String)\r
    */\r
   public void selectIn(AlignFrame alf, String sequenceIds, String columns)\r
   {\r
     selectIn(alf, sequenceIds, columns, separator);\r
   }\r
 \r
-  /**\r
-   * select regions of the given alignment frame\r
-   * \r
-   * @param alf\r
-   * @param toselect\r
-   *          String separated list { column range, seq1...seqn sequence ids }\r
-   * @param sep\r
-   *          separator between toselect fields\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#selectIn(jalview.appletgui.AlignFrame, java.lang.String, java.lang.String, java.lang.String)\r
    */\r
   public void selectIn(AlignFrame alf, String sequenceIds, String columns,\r
           String sep)\r
@@ -453,18 +404,8 @@ public class JalviewLite extends Applet
     }\r
   }\r
 \r
-  /**\r
-   * get sequences selected in current alignFrame and return their alignment in\r
-   * format 'format' either with or without suffix\r
-   * \r
-   * @param alf\r
-   *          - where selection is\r
-   * @param format\r
-   *          - format of alignment file\r
-   * @param suffix\r
-   *          - "true" to append /start-end string to each sequence ID\r
-   * @return selected sequences as flat file or empty string if there was no\r
-   *         current selection\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignment(java.lang.String, java.lang.String)\r
    */\r
   public String getSelectedSequencesAsAlignment(String format, String suffix)\r
   {\r
@@ -472,18 +413,8 @@ public class JalviewLite extends Applet
             format, suffix);\r
   }\r
 \r
-  /**\r
-   * get sequences selected in alf and return their alignment in format 'format'\r
-   * either with or without suffix\r
-   * \r
-   * @param alf\r
-   *          - where selection is\r
-   * @param format\r
-   *          - format of alignment file\r
-   * @param suffix\r
-   *          - "true" to append /start-end string to each sequence ID\r
-   * @return selected sequences as flat file or empty string if there was no\r
-   *         current selection\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesAsAlignmentFrom(jalview.appletgui.AlignFrame, java.lang.String, java.lang.String)\r
    */\r
   public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf,\r
           String format, String suffix)\r
@@ -506,16 +437,25 @@ public class JalviewLite extends Applet
     return "";\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAlignmentOrder()\r
+   */\r
   public String getAlignmentOrder()\r
   {\r
     return getAlignmentOrderFrom(getDefaultTargetFrame());\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame)\r
+   */\r
   public String getAlignmentOrderFrom(AlignFrame alf)\r
   {\r
     return getAlignmentOrderFrom(alf, separator);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAlignmentOrderFrom(jalview.appletgui.AlignFrame, java.lang.String)\r
+   */\r
   public String getAlignmentOrderFrom(AlignFrame alf, String sep)\r
   {\r
     AlignmentI alorder = alf.getAlignViewport().getAlignment();\r
@@ -527,16 +467,25 @@ public class JalviewLite extends Applet
     return arrayToSeparatorList(order);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String, java.lang.String)\r
+   */\r
   public String orderBy(String order, String undoName)\r
   {\r
     return orderBy(order, undoName, separator);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#orderBy(java.lang.String, java.lang.String, java.lang.String)\r
+   */\r
   public String orderBy(String order, String undoName, String sep)\r
   {\r
     return orderAlignmentBy(getDefaultTargetFrame(), order, undoName, sep);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#orderAlignmentBy(jalview.appletgui.AlignFrame, java.lang.String, java.lang.String, java.lang.String)\r
+   */\r
   public String orderAlignmentBy(AlignFrame alf, String order,\r
           String undoName, String sep)\r
   {\r
@@ -586,21 +535,33 @@ public class JalviewLite extends Applet
     return alf.sortBy(aorder, undoName) ? "true" : "";\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String)\r
+   */\r
   public String getAlignment(String format)\r
   {\r
     return getAlignmentFrom(getDefaultTargetFrame(), format, "true");\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame, java.lang.String)\r
+   */\r
   public String getAlignmentFrom(AlignFrame alf, String format)\r
   {\r
     return getAlignmentFrom(alf, format, "true");\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAlignment(java.lang.String, java.lang.String)\r
+   */\r
   public String getAlignment(String format, String suffix)\r
   {\r
     return getAlignmentFrom(getDefaultTargetFrame(), format, suffix);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAlignmentFrom(jalview.appletgui.AlignFrame, java.lang.String, java.lang.String)\r
+   */\r
   public String getAlignmentFrom(AlignFrame alf, String format,\r
           String suffix)\r
   {\r
@@ -618,11 +579,17 @@ public class JalviewLite extends Applet
     }\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#loadAnnotation(java.lang.String)\r
+   */\r
   public void loadAnnotation(String annotation)\r
   {\r
     loadAnnotationFrom(getDefaultTargetFrame(), annotation);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#loadAnnotationFrom(jalview.appletgui.AlignFrame, java.lang.String)\r
+   */\r
   public void loadAnnotationFrom(AlignFrame alf, String annotation)\r
   {\r
     if (new AnnotationFile().readAnnotationFile(alf.getAlignViewport()\r
@@ -637,53 +604,72 @@ public class JalviewLite extends Applet
     }\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getFeatures(java.lang.String)\r
+   */\r
   public String getFeatures(String format)\r
   {\r
     return getFeaturesFrom(getDefaultTargetFrame(), format);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getFeaturesFrom(jalview.appletgui.AlignFrame, java.lang.String)\r
+   */\r
   public String getFeaturesFrom(AlignFrame alf, String format)\r
   {\r
     return alf.outputFeatures(false, format);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAnnotation()\r
+   */\r
   public String getAnnotation()\r
   {\r
     return getAnnotationFrom(getDefaultTargetFrame());\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getAnnotationFrom(jalview.appletgui.AlignFrame)\r
+   */\r
   public String getAnnotationFrom(AlignFrame alf)\r
   {\r
     return alf.outputAnnotations(false);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#newView()\r
+   */\r
   public AlignFrame newView()\r
   {\r
     return newViewFrom(getDefaultTargetFrame());\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#newView(java.lang.String)\r
+   */\r
   public AlignFrame newView(String name)\r
   {\r
     return newViewFrom(getDefaultTargetFrame(), name);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame)\r
+   */\r
   public AlignFrame newViewFrom(AlignFrame alf)\r
   {\r
     return alf.newView(null);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#newViewFrom(jalview.appletgui.AlignFrame, java.lang.String)\r
+   */\r
   public AlignFrame newViewFrom(AlignFrame alf, String name)\r
   {\r
     return alf.newView(name);\r
   }\r
 \r
-  /**\r
-   * \r
-   * @param text\r
-   *          alignment file as a string\r
-   * @param title\r
-   *          window title\r
-   * @return null or new alignment frame\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#loadAlignment(java.lang.String, java.lang.String)\r
    */\r
   public AlignFrame loadAlignment(String text, String title)\r
   {\r
@@ -706,13 +692,19 @@ public class JalviewLite extends Applet
     return null;\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#setMouseoverListener(java.lang.String)\r
+   */\r
   public void setMouseoverListener(String listener)\r
   {\r
     setMouseoverListener(currentAlignFrame, listener);\r
   }\r
 \r
-  private Vector javascriptListeners = new Vector();\r
+  private Vector<jalview.javascript.JSFunctionExec> javascriptListeners = new Vector<jalview.javascript.JSFunctionExec>();\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#setMouseoverListener(jalview.appletgui.AlignFrame, java.lang.String)\r
+   */\r
   public void setMouseoverListener(AlignFrame af, String listener)\r
   {\r
     if (listener != null)\r
@@ -728,7 +720,7 @@ public class JalviewLite extends Applet
     jalview.javascript.MouseOverListener mol = new jalview.javascript.MouseOverListener(\r
             this, af, listener);\r
     javascriptListeners.addElement(mol);\r
-    StructureSelectionManager.getStructureSelectionManager()\r
+    StructureSelectionManager.getStructureSelectionManager(this)\r
             .addStructureViewerListener(mol);\r
     if (debug)\r
     {\r
@@ -740,11 +732,17 @@ public class JalviewLite extends Applet
     }\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#setSelectionListener(java.lang.String)\r
+   */\r
   public void setSelectionListener(String listener)\r
   {\r
     setSelectionListener(null, listener);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#setSelectionListener(jalview.appletgui.AlignFrame, java.lang.String)\r
+   */\r
   public void setSelectionListener(AlignFrame af, String listener)\r
   {\r
     if (listener != null)\r
@@ -760,7 +758,7 @@ public class JalviewLite extends Applet
     jalview.javascript.JsSelectionSender mol = new jalview.javascript.JsSelectionSender(\r
             this, af, listener);\r
     javascriptListeners.addElement(mol);\r
-    StructureSelectionManager.getStructureSelectionManager()\r
+    StructureSelectionManager.getStructureSelectionManager(this)\r
             .addSelectionListener(mol);\r
     if (debug)\r
     {\r
@@ -772,6 +770,9 @@ public class JalviewLite extends Applet
     }\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#setStructureListener(java.lang.String, java.lang.String)\r
+   */\r
   public void setStructureListener(String listener, String modelSet)\r
   {\r
     if (listener != null)\r
@@ -787,7 +788,7 @@ public class JalviewLite extends Applet
     jalview.javascript.MouseOverStructureListener mol = new jalview.javascript.MouseOverStructureListener(\r
             this, listener, separatorListToArray(modelSet));\r
     javascriptListeners.addElement(mol);\r
-    StructureSelectionManager.getStructureSelectionManager()\r
+    StructureSelectionManager.getStructureSelectionManager(this)\r
             .addStructureViewerListener(mol);\r
     if (debug)\r
     {\r
@@ -798,14 +799,8 @@ public class JalviewLite extends Applet
     }\r
   }\r
 \r
-  /**\r
-   * remove any callback using the given listener function and associated with\r
-   * the given alignFrame (or null for all callbacks)\r
-   * \r
-   * @param af\r
-   *          (may be null)\r
-   * @param listener\r
-   *          (may be null)\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#removeJavascriptListener(jalview.appletgui.AlignFrame, java.lang.String)\r
    */\r
   public void removeJavascriptListener(AlignFrame af, String listener)\r
   {\r
@@ -830,12 +825,12 @@ public class JalviewLite extends Applet
         msSize--;\r
         if (lstner instanceof SelectionListener)\r
         {\r
-          StructureSelectionManager.getStructureSelectionManager()\r
+          StructureSelectionManager.getStructureSelectionManager(this)\r
                   .removeSelectionListener((SelectionListener) lstner);\r
         }\r
         else\r
         {\r
-          StructureSelectionManager.getStructureSelectionManager()\r
+          StructureSelectionManager.getStructureSelectionManager(this)\r
                   .removeStructureViewerListener(lstner, null);\r
         }\r
         rprt = debug;\r
@@ -858,41 +853,63 @@ public class JalviewLite extends Applet
 \r
   public void stop()\r
   {\r
+    System.err.println("Applet "+getName()+" stop().");\r
+    tidyUp();\r
+  }\r
+  public void destroy()\r
+  {\r
+    System.err.println("Applet "+getName()+" destroy().");\r
+    tidyUp();\r
+  }\r
+  private void tidyUp()\r
+  {\r
+    removeAll();\r
+    if (currentAlignFrame!=null && currentAlignFrame.viewport!=null\r
+            && currentAlignFrame.viewport.applet!=null)\r
+    {\r
+      AlignViewport av = currentAlignFrame.viewport;\r
+      currentAlignFrame.closeMenuItem_actionPerformed();\r
+      av.applet=null;\r
+      currentAlignFrame=null;\r
+    }\r
     if (javascriptListeners != null)\r
     {\r
       while (javascriptListeners.size() > 0)\r
       {\r
-        Object mol = javascriptListeners.elementAt(0);\r
+        jalview.javascript.JSFunctionExec mol = javascriptListeners.elementAt(0);\r
         javascriptListeners.removeElement(mol);\r
         if (mol instanceof SelectionListener)\r
         {\r
-          StructureSelectionManager.getStructureSelectionManager()\r
+          StructureSelectionManager.getStructureSelectionManager(this)\r
                   .removeSelectionListener((SelectionListener) mol);\r
         }\r
         else\r
         {\r
-          StructureSelectionManager.getStructureSelectionManager()\r
+          StructureSelectionManager.getStructureSelectionManager(this)\r
                   .removeStructureViewerListener(mol, null);\r
         }\r
+        mol.jvlite=null;\r
       }\r
     }\r
-    jsFunctionExec.stopQueue();\r
+    if (jsFunctionExec!=null) {\r
+      jsFunctionExec.stopQueue();\r
+      jsFunctionExec.jvlite=null;\r
+    }\r
+    initialAlignFrame=null;\r
+    jsFunctionExec = null;\r
+    javascriptListeners=null;\r
+    StructureSelectionManager.release(this);\r
   }\r
   private jalview.javascript.JSFunctionExec jsFunctionExec;\r
-  /**\r
-   * send a mouseover message to all the alignment windows associated with the\r
-   * given residue in the pdbfile\r
-   * \r
-   * @param pdbResNum\r
-   * @param chain\r
-   * @param pdbfile\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#mouseOverStructure(java.lang.String, java.lang.String, java.lang.String)\r
    */\r
   public void mouseOverStructure(String pdbResNum, String chain,\r
           String pdbfile)\r
   {\r
     try\r
     {\r
-      StructureSelectionManager.getStructureSelectionManager()\r
+      StructureSelectionManager.getStructureSelectionManager(this)\r
               .mouseOverStructure(new Integer(pdbResNum).intValue(), chain,\r
                       pdbfile);\r
       if (debug)\r
@@ -906,6 +923,20 @@ public class JalviewLite extends Applet
               + pdbResNum + "'");\r
     }\r
   }\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#scrollViewToIn(jalview.appletgui.AlignFrame, java.lang.String, java.lang.String)\r
+   */\r
+  public void scrollViewToIn(AlignFrame alf, String topRow, String leftHandColumn)\r
+  {\r
+    try {\r
+      alf.scrollTo(new Integer(topRow).intValue(), new Integer(leftHandColumn).intValue());\r
+      \r
+    } catch (Exception ex)\r
+    {\r
+      System.err.println("Couldn't parse integer arguments (topRow='"+topRow+"' and leftHandColumn='"+leftHandColumn+"'");\r
+      ex.printStackTrace();\r
+    }\r
+  }\r
 \r
   // //////////////////////////////////////////////\r
   // //////////////////////////////////////////////\r
@@ -1235,11 +1266,15 @@ public class JalviewLite extends Applet
       {\r
         if (frame instanceof AlignFrame)\r
         {\r
+          AlignViewport vp = ((AlignFrame) frame).viewport;\r
           ((AlignFrame) frame).closeMenuItem_actionPerformed();\r
-          if (((AlignFrame) frame).viewport.applet.currentAlignFrame == frame)\r
+          if (vp.applet.currentAlignFrame == frame)\r
           {\r
-            ((AlignFrame) frame).viewport.applet.currentAlignFrame = null;\r
+            vp.applet.currentAlignFrame = null;\r
           }\r
+          vp.applet=null;\r
+          vp=null;\r
+          \r
         }\r
         lastFrameX -= 40;\r
         lastFrameY -= 40;\r
@@ -1794,6 +1829,7 @@ public class JalviewLite extends Applet
         applet.remove(launcher);\r
         applet.repaint();\r
       }\r
+      callInitCallback();\r
     }\r
 \r
     /**\r
@@ -2018,9 +2054,8 @@ public class JalviewLite extends Applet
     return "" + separator;\r
   }\r
 \r
-  /**\r
-   * @return\r
-   * @see jalview.appletgui.AlignFrame#getFeatureGroups()\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getFeatureGroups()\r
    */\r
   public String getFeatureGroups()\r
   {\r
@@ -2029,11 +2064,8 @@ public class JalviewLite extends Applet
     return lst;\r
   }\r
 \r
-  /**\r
-   * @param alf\r
-   *          alignframe to get feature groups on\r
-   * @return\r
-   * @see jalview.appletgui.AlignFrame#getFeatureGroups()\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getFeatureGroupsOn(jalview.appletgui.AlignFrame)\r
    */\r
   public String getFeatureGroupsOn(AlignFrame alf)\r
   {\r
@@ -2041,10 +2073,8 @@ public class JalviewLite extends Applet
     return lst;\r
   }\r
 \r
-  /**\r
-   * @param visible\r
-   * @return\r
-   * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean)\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfState(boolean)\r
    */\r
   public String getFeatureGroupsOfState(boolean visible)\r
   {\r
@@ -2052,25 +2082,16 @@ public class JalviewLite extends Applet
             .getFeatureGroupsOfState(visible));\r
   }\r
 \r
-  /**\r
-   * @param alf\r
-   *          align frame to get groups of state visible\r
-   * @param visible\r
-   * @return\r
-   * @see jalview.appletgui.AlignFrame#getFeatureGroupsOfState(boolean)\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getFeatureGroupsOfStateOn(jalview.appletgui.AlignFrame, boolean)\r
    */\r
   public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean visible)\r
   {\r
     return arrayToSeparatorList(alf.getFeatureGroupsOfState(visible));\r
   }\r
 \r
-  /**\r
-   * @param groups\r
-   *          tab separated list of group names\r
-   * @param state\r
-   *          true or false\r
-   * @see jalview.appletgui.AlignFrame#setFeatureGroupState(java.lang.String[],\r
-   *      boolean)\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupStateOn(jalview.appletgui.AlignFrame, java.lang.String, boolean)\r
    */\r
   public void setFeatureGroupStateOn(AlignFrame alf, String groups,\r
           boolean state)\r
@@ -2080,26 +2101,24 @@ public class JalviewLite extends Applet
     alf.setFeatureGroupState(separatorListToArray(groups), st);\r
   }\r
 \r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#setFeatureGroupState(java.lang.String, boolean)\r
+   */\r
   public void setFeatureGroupState(String groups, boolean state)\r
   {\r
     setFeatureGroupStateOn(getDefaultTargetFrame(), groups, state);\r
   }\r
 \r
-  /**\r
-   * List separator string\r
-   * \r
-   * @return the separator\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getSeparator()\r
    */\r
   public String getSeparator()\r
   {\r
     return separator;\r
   }\r
 \r
-  /**\r
-   * List separator string\r
-   * \r
-   * @param separator\r
-   *          the separator to set. empty string will reset separator to default\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#setSeparator(java.lang.String)\r
    */\r
   public void setSeparator(String separator)\r
   {\r
@@ -2139,21 +2158,8 @@ public class JalviewLite extends Applet
     return false;\r
   }\r
 \r
-  /**\r
-   * bind a pdb file to a sequence in the given alignFrame.\r
-   * \r
-   * @param alFrame\r
-   *          - null or specific alignFrame. This specifies the dataset that\r
-   *          will be searched for a seuqence called sequenceId\r
-   * @param sequenceId\r
-   *          - sequenceId within the dataset.\r
-   * @param pdbEntryString\r
-   *          - the short name for the PDB file\r
-   * @param pdbFile\r
-   *          - pdb file - either a URL or a valid PDB file.\r
-   * @return true if binding was as success TODO: consider making an exception\r
-   *         structure for indicating when PDB parsing or sequenceId location\r
-   *         fails.\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#addPdbFile(jalview.appletgui.AlignFrame, java.lang.String, java.lang.String, java.lang.String)\r
    */\r
   public boolean addPdbFile(AlignFrame alFrame, String sequenceId,\r
           String pdbEntryString, String pdbFile)\r
@@ -2173,7 +2179,7 @@ public class JalviewLite extends Applet
 \r
   public void start()\r
   {\r
-    callInitCallback();\r
+//    callInitCallback();\r
   }\r
   private Hashtable<String,long[]> jshashes=new Hashtable<String,long[]>();\r
   private Hashtable<String,Hashtable<String,String[]>> jsmessages=new Hashtable<String,Hashtable<String,String[]>>();\r
@@ -2191,6 +2197,9 @@ public class JalviewLite extends Applet
     for (int i=0;i<colcommands.length;i++) { l[i] = colcommands[i].hashCode();}\r
     jshashes.put(messageclass+"|"+viewId,l);\r
   }\r
+  /* (non-Javadoc)\r
+   * @see jalview.bin.JalviewLiteJsApi#getJsMessage(java.lang.String, java.lang.String)\r
+   */\r
   public String getJsMessage(String messageclass, String viewId)\r
   {\r
     Hashtable<String,String[]> msgset = jsmessages.get(messageclass);\r