JAL-3210 Barebones gradle/buildship/eclipse. See README
[jalview.git] / src / jalview / bin / Jalview.java
index fae2b75..652b259 100755 (executable)
  */
 package jalview.bin;
 
-import jalview.api.AlignCalcWorkerI;
-import jalview.api.AlignFrameI;
-import jalview.api.AlignViewportI;
-import jalview.api.JalviewApp;
-import jalview.api.StructureSelectionManagerProvider;
-import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI;
-import jalview.datamodel.ColumnSelection;
-import jalview.datamodel.HiddenColumns;
-import jalview.datamodel.PDBEntry;
-import jalview.datamodel.SequenceGroup;
-import jalview.datamodel.SequenceI;
 import jalview.ext.so.SequenceOntology;
 import jalview.gui.AlignFrame;
-import jalview.gui.AlignViewport;
-import jalview.gui.AlignmentPanel;
-import jalview.gui.CalculationChooser;
 import jalview.gui.Desktop;
-import jalview.gui.Preferences;
 import jalview.gui.PromptUserConfig;
-import jalview.gui.StructureViewer;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.BioJsHTMLOutput;
 import jalview.io.DataSourceType;
 import jalview.io.FileFormat;
 import jalview.io.FileFormatException;
 import jalview.io.FileFormatI;
-import jalview.io.FileFormats;
 import jalview.io.FileLoader;
 import jalview.io.HtmlSvgOutput;
 import jalview.io.IdentifyFile;
 import jalview.io.NewickFile;
 import jalview.io.gff.SequenceOntologyFactory;
-import jalview.javascript.JSFunctionExec;
-import jalview.javascript.MouseOverStructureListener;
-import jalview.renderer.seqfeatures.FeatureRenderer;
 import jalview.schemes.ColourSchemeI;
 import jalview.schemes.ColourSchemeProperty;
-import jalview.structure.SelectionSource;
-import jalview.structure.VamsasSource;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.ws.jws2.Jws2Discoverer;
 
-import java.applet.AppletContext;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -81,16 +58,19 @@ import java.security.PermissionCollection;
 import java.security.Permissions;
 import java.security.Policy;
 import java.util.HashMap;
-import java.util.Hashtable;
 import java.util.Map;
 import java.util.Vector;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.swing.LookAndFeel;
 import javax.swing.UIManager;
 
+import com.threerings.getdown.util.LaunchUtil;
+
 import groovy.lang.Binding;
 import groovy.util.GroovyScriptEngine;
-import netscape.javascript.JSObject;
 
 /**
  * Main class for Jalview Application <br>
@@ -107,76 +87,20 @@ import netscape.javascript.JSObject;
  * @author $author$
  * @version $Revision$
  */
-public class Jalview implements ApplicationSingletonI, JalviewJSApi
+public class Jalview
 {
-
-  public static Jalview getInstance()
-  {
-    return (Jalview) ApplicationSingletonProvider
-            .getInstance(Jalview.class);
-  }
-
-  private Jalview()
-  {
-  }
-
   static
   {
     Platform.getURLCommandArguments();
   }
 
-  private boolean headless;
+  // singleton instance of this class
 
-  public static boolean isHeadlessMode()
-  {
-    return getInstance().headless;
-  }
+  private static Jalview instance;
 
   private Desktop desktop;
 
-  private AlignFrame currentAlignFrame;
-
-  public boolean isJavaAppletTag;
-
-  public String appletResourcePath;
-
-  JalviewAppLoader appLoader;
-
-  protected JSFunctionExec jsFunctionExec;
-
-  private boolean noCalculation, noMenuBar, noStatus;
-
-  private boolean noAnnotation;
-
-  public boolean getStartCalculations()
-  {
-    return !noCalculation;
-  }
-
-  public boolean getAllowMenuBar()
-  {
-    return !noMenuBar;
-  }
-
-  public boolean getShowStatus()
-  {
-    return !noStatus;
-  }
-
-  public boolean getShowAnnotation()
-  {
-    return !noAnnotation;
-  }
-
-  public static AlignFrame getCurrentAlignFrame()
-  {
-    return getInstance().currentAlignFrame;
-  }
-
-  public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
-  {
-    getInstance().currentAlignFrame = currentAlignFrame;
-  }
+  public static AlignFrame currentAlignFrame;
 
   static
   {
@@ -188,21 +112,21 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
      */
     {
       // grab all the rights we can for the JVM
-      Policy.setPolicy(new Policy()
-      {
-        @Override
-        public PermissionCollection getPermissions(CodeSource codesource)
-        {
-          Permissions perms = new Permissions();
-          perms.add(new AllPermission());
-          return (perms);
-        }
-
-        @Override
-        public void refresh()
-        {
-        }
-      });
+           Policy.setPolicy(new Policy()
+           {
+             @Override
+             public PermissionCollection getPermissions(CodeSource codesource)
+             {
+               Permissions perms = new Permissions();
+               perms.add(new AllPermission());
+               return (perms);
+             }
+       
+             @Override
+             public void refresh()
+             {
+             }
+           });
     }
   }
 
@@ -265,6 +189,11 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
 
   }
 
+  public static Jalview getInstance()
+  {
+    return instance;
+  }
+
   /**
    * main class for Jalview application
    * 
@@ -273,24 +202,61 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
    */
   public static void main(String[] args)
   {
-    // Platform.startJavaLogging();
-    getInstance().doMain(args);
-  }
+//     setLogging(); // BH - for event debugging in JavaScript
+    instance = new Jalview();
+    instance.doMain(args);
+}
 
+  private static void logClass(String name) 
+  {    
+         // BH - for event debugging in JavaScript
+      ConsoleHandler consoleHandler = new ConsoleHandler();
+      consoleHandler.setLevel(Level.ALL);
+      Logger logger = Logger.getLogger(name);
+      logger.setLevel(Level.ALL);
+      logger.addHandler(consoleHandler);
+  }
 
   @SuppressWarnings("unused")
+  private static void setLogging() 
+  {
+
+    /**
+     * @j2sIgnore
+     * 
+     */
+    {
+      System.out.println("not in js");
+    }
+
+         // BH - for event debugging in JavaScript (Java mode only)
+    if (!Platform.isJS())
+    /**
+     * Java only
+     * 
+     * @j2sIgnore
+     */
+       {
+               Logger.getLogger("").setLevel(Level.ALL);
+        logClass("java.awt.EventDispatchThread");
+        logClass("java.awt.EventQueue");
+        logClass("java.awt.Component");
+        logClass("java.awt.focus.Component");
+        logClass("java.awt.focus.DefaultKeyboardFocusManager"); 
+       }       
+
+  }
+  
+
+  
+
   /**
    * @param args
    */
   void doMain(String[] args)
   {
 
-    boolean isJS = Platform.isJS();
-    if (isJS)
-    {
-      Platform.setAppClass(this);
-    }
-    else
+    if (!Platform.isJS())
     {
       System.setSecurityManager(null);
     }
@@ -301,57 +267,60 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
             + System.getProperty("os.name") + " "
             + System.getProperty("os.version"));
 
+    String appdirString = System.getProperty("getdownappdir");
+    if (appdirString != null && appdirString.length() > 0)
+    {
+      final File appdir = new File(appdirString);
+      new Thread()
+      {
+        @Override
+        public void run()
+        {
+          LaunchUtil.upgradeGetdown(
+                  new File(appdir, "getdown-launcher-old.jar"),
+                  new File(appdir, "getdown-launcher.jar"),
+                  new File(appdir, "getdown-launcher-new.jar"));
+        }
+      }.start();
+
+    }
     ArgsParser aparser = new ArgsParser(args);
+    boolean headless = false;
 
-    String usrPropsFile = aparser.getValue(ArgsParser.PROPS);
-    Cache.loadProperties(usrPropsFile);
-    if (isJS)
+    String usrPropsFile = aparser.getValue("props");
+    Cache.loadProperties(usrPropsFile); // must do this before
+    if (usrPropsFile != null)
     {
-      isJavaAppletTag = aparser.isApplet();
-      if (isJavaAppletTag)
-      {
-        Preferences.setAppletDefaults();
-        Cache.loadProperties(usrPropsFile); // again, because we
-        // might be changing defaults here?
-      }
       System.out.println(
-              "<Applet> found: " + aparser.getValue("Info.j2sAppletID"));
-      appletResourcePath = aparser.getValue("Info.resourcePath");
+              "CMD [-props " + usrPropsFile + "] executed successfully!");
     }
-    else
+
+    if (!Platform.isJS())
     /**
      * Java only
      * 
      * @j2sIgnore
      */
     {
-      if (usrPropsFile != null)
-      {
-        System.out.println(
-                "CMD [-props " + usrPropsFile + "] executed successfully!");
-      }
-
       if (aparser.contains("help") || aparser.contains("h"))
       {
         showUsage();
         System.exit(0);
       }
-      if (aparser.contains(ArgsParser.NODISPLAY)
-              || aparser.contains(ArgsParser.NOGUI)
-              || aparser.contains(ArgsParser.HEADLESS)
-              || "true".equals(System.getProperty("java.awt.headless")))
+      if (aparser.contains("nodisplay") || aparser.contains("nogui")
+              || aparser.contains("headless"))
       {
+        System.setProperty("java.awt.headless", "true");
         headless = true;
       }
-
       // anything else!
 
-      final String jabawsUrl = aparser.getValue(ArgsParser.JABAWS);
+      final String jabawsUrl = aparser.getValue("jabaws");
       if (jabawsUrl != null)
       {
         try
         {
-          Jws2Discoverer.getInstance().setPreferredUrl(jabawsUrl);
+          Jws2Discoverer.getDiscoverer().setPreferredUrl(jabawsUrl);
           System.out.println(
                   "CMD [-jabaws " + jabawsUrl + "] executed successfully!");
         } catch (MalformedURLException e)
@@ -362,8 +331,7 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
       }
 
     }
-    // check for property setting
-    String defs = aparser.getValue(ArgsParser.SETPROP);
+    String defs = aparser.getValue("setprop");
     while (defs != null)
     {
       int p = defs.indexOf('=');
@@ -374,12 +342,17 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
       else
       {
         System.out.println("Executing setprop argument: " + defs);
-        if (isJS)
+        if (Platform.isJS())
         {
-          Cache.setProperty(defs.substring(0, p), defs.substring(p + 1));
+          Cache.setProperty(defs.substring(0,p), defs.substring(p+1));
         }
       }
-      defs = aparser.getValue(ArgsParser.SETPROP);
+      defs = aparser.getValue("setprop");
+    }
+    if (System.getProperty("java.awt.headless") != null
+            && System.getProperty("java.awt.headless").equals("true"))
+    {
+      headless = true;
     }
     System.setProperty("http.agent",
             "Jalview Desktop/" + Cache.getDefault("VERSION", "Unknown"));
@@ -423,9 +396,8 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
                   "Failed to set QuaQua look and feel: " + e.toString());
         }
       }
-      if (lookAndFeel == null
-              || !(lookAndFeel.getClass().isAssignableFrom(
-                      UIManager.getLookAndFeel().getClass()))
+      if (lookAndFeel == null || !(lookAndFeel.getClass()
+              .isAssignableFrom(UIManager.getLookAndFeel().getClass()))
               || !UIManager.getLookAndFeel().getClass().toString()
                       .toLowerCase().contains("quaqua"))
       {
@@ -446,18 +418,49 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
      * configure 'full' SO model if preferences say to, 
      * else use the default (SO Lite)
      */
-    if (Cache.getDefault(Preferences.USE_FULL_SO, false))
+    if (Cache.getDefault("USE_FULL_SO", false))
     {
-      SequenceOntologyFactory.setSequenceOntology(new SequenceOntology());
+      SequenceOntologyFactory.setInstance(new SequenceOntology());
     }
 
     if (!headless)
     {
-      desktop = Desktop.getInstance();
+      desktop = new Desktop() 
+//      {
+// // BH testing
+//       @Override
+//       protected void processEvent(AWTEvent e) {
+//               System.out.println("Jalview.java " + e);
+//               super.processEvent(e);
+//       }
+//       }
+      ;
       desktop.setInBatchMode(true); // indicate we are starting up
+
+      try
+      {
+             if (! Platform.isJS())
+                     /**
+                      * Java only
+                      * 
+                      * @j2sIgnore
+                      */
+             {
+               JalviewTaskbar.setTaskbar(this);
+             }
+      } catch (Exception e)
+      {
+        System.out.println("Cannot set Taskbar");
+        // e.printStackTrace();
+      } catch (Throwable t)
+      {
+        System.out.println("Cannot set Taskbar");
+        // t.printStackTrace();
+      }
+
       desktop.setVisible(true);
 
-      if (!isJS)
+      if (!Platform.isJS())
       /**
        * Java only
        * 
@@ -465,7 +468,7 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
        */
       {
         desktop.startServiceDiscovery();
-        if (!aparser.contains(ArgsParser.NOUSAGESTATS))
+        if (!aparser.contains("nousagestats"))
         {
           startUsageStats(desktop);
         }
@@ -474,9 +477,9 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
           System.err.println("CMD [-nousagestats] executed successfully!");
         }
 
-        if (!aparser.contains(ArgsParser.NOQUESTIONNAIRE))
+        if (!aparser.contains("noquestionnaire"))
         {
-          String url = aparser.getValue(ArgsParser.QUESTIONNAIRE);
+          String url = aparser.getValue("questionnaire");
           if (url != null)
           {
             // Start the desktop questionnaire prompter with the specified
@@ -488,7 +491,7 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
           }
           else
           {
-            if (Cache.getProperty(Preferences.NOQUESTIONNAIRES) == null)
+            if (Cache.getProperty("NOQUESTIONNAIRES") == null)
             {
               // Start the desktop questionnaire prompter with the specified
               // questionnaire
@@ -508,7 +511,7 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
                   .println("CMD [-noquestionnaire] executed successfully!");
         }
 
-        if (!aparser.contains(ArgsParser.NONEWS))
+        if (!aparser.contains("nonews"))
         {
           desktop.checkForNews();
         }
@@ -517,84 +520,111 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
       }
     }
 
-    parseArguments(aparser, true);
-  }
-
-  /**
-   * Allow an outside entity to initiate the second half of argument parsing
-   * (only).
-   * 
-   * @param args
-   * @return null is good
-   */
-  @Override
-  public Object parseArguments(String[] args)
-  {
-
-    try
-    {
-      ArgsParser aparser = new ArgsParser(args);
-      return parseArguments(aparser, false);
-    } catch (Throwable t)
-    {
-      return t;
-    }
-  }
-
-  /**
-   * 
-   * @param aparser
-   * @param isStartup
-   * @return
-   */
-  private Object parseArguments(ArgsParser aparser, boolean isStartup)
-  {
-    boolean isJS = Platform.isJS();
+    String file = null, data = null;
+    FileFormatI format = null;
+    DataSourceType protocol = null;
+    FileLoader fileLoader = new FileLoader(!headless);
 
-    Desktop desktop = (headless ? null : Desktop.getInstance());
-    // script to execute after all loading is
+    String groovyscript = null; // script to execute after all loading is
     // completed one way or another
     // extract groovy argument and execute if necessary
-    String groovyscript = (isJS ? null
-            : aparser.getValue(ArgsParser.GROOVY, true));
-    String file = aparser.getValue(ArgsParser.OPEN, true);
-    // BH this here to allow split frame; not working as of 5/17/2019
-    String file2 = aparser.getValue(ArgsParser.OPEN2, true);
-    String fileFormat = (isJavaAppletTag
-            ? aparser.getAppletValue("format", null)
-            : null);
-    FileFormatI format = null;
-    DataSourceType protocol = null;
+    groovyscript = aparser.getValue("groovy", true);
+    file = aparser.getValue("open", true);
 
     if (file == null && desktop == null)
     {
       System.out.println("No files to open!");
       System.exit(1);
     }
-    boolean haveImport = checkStartVamas(aparser);
-    // Finally, deal with the remaining input data.
-    long progress = -1;
-    if (file == null && isJavaAppletTag)
+    String vamsasImport = aparser.getValue("vdoc");
+    String vamsasSession = aparser.getValue("vsess");
+    if (vamsasImport != null || vamsasSession != null)
     {
-      // Maybe the sequences are added as parameters
-      StringBuffer data = new StringBuffer("PASTE");
-      int i = 1;
-      while ((file = aparser.getAppletValue("sequence" + i, null)) != null)
+      if (desktop == null || headless)
       {
-        data.append(file.toString() + "\n");
-        i++;
+        System.out.println(
+                "Headless vamsas sessions not yet supported. Sorry.");
+        System.exit(1);
+      }
+      // if we have a file, start a new session and import it.
+      boolean inSession = false;
+      if (vamsasImport != null)
+      {
+        try
+        {
+          DataSourceType viprotocol = AppletFormatAdapter
+                  .checkProtocol(vamsasImport);
+          if (viprotocol == DataSourceType.FILE)
+          {
+            inSession = desktop.vamsasImport(new File(vamsasImport));
+          }
+          else if (viprotocol == DataSourceType.URL)
+          {
+            inSession = desktop.vamsasImport(new URL(vamsasImport));
+          }
+
+        } catch (Exception e)
+        {
+          System.err.println("Exeption when importing " + vamsasImport
+                  + " as a vamsas document.");
+          e.printStackTrace();
+        }
+        if (!inSession)
+        {
+          System.err.println("Failed to import " + vamsasImport
+                  + " as a vamsas document.");
+        }
+        else
+        {
+          System.out.println("Imported Successfully into new session "
+                  + desktop.getVamsasApplication().getCurrentSession());
+        }
       }
-      if (data.length() > 5)
+      if (vamsasSession != null)
       {
-        file = data.toString();
+        if (vamsasImport != null)
+        {
+          // close the newly imported session and import the Jalview specific
+          // remnants into the new session later on.
+          desktop.vamsasStop_actionPerformed(null);
+        }
+        // now join the new session
+        try
+        {
+          if (desktop.joinVamsasSession(vamsasSession))
+          {
+            System.out.println(
+                    "Successfully joined vamsas session " + vamsasSession);
+          }
+          else
+          {
+            System.err.println("WARNING: Failed to join vamsas session "
+                    + vamsasSession);
+          }
+        } catch (Exception e)
+        {
+          System.err.println(
+                  "ERROR: Failed to join vamsas session " + vamsasSession);
+          e.printStackTrace();
+        }
+        if (vamsasImport != null)
+        {
+          // the Jalview specific remnants can now be imported into the new
+          // session at the user's leisure.
+          Cache.log.info(
+                  "Skipping Push for import of data into existing vamsas session."); // TODO:
+          // enable
+          // this
+          // when
+          // debugged
+          // desktop.getVamsasApplication().push_update();
+        }
       }
     }
-
-    String data;
-
+    long progress = -1;
+    // Finally, deal with the remaining input data.
     if (file != null)
     {
-
       if (!headless)
       {
         desktop.setProgressBar(
@@ -602,14 +632,14 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
                         .getString("status.processing_commandline_args"),
                 progress = System.currentTimeMillis());
       }
+      System.out.println("CMD [-open " + file + "] executed successfully!");
 
-      if (!isJS)
-      /**
-       * ignore in JavaScript -- can't just check file existence - could load
-       * it?
-       * 
-       * @j2sIgnore
-       */
+      if (!Platform.isJS())
+        /**
+         * ignore in JavaScript -- can't just file existence - could load it?
+         * 
+         * @j2sIgnore
+         */
       {
         if (!file.startsWith("http://") && !file.startsWith("https://"))
         // BH 2019 added https check for Java
@@ -625,94 +655,33 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
         }
       }
 
-      protocol = AppletFormatAdapter.checkProtocol(file);
+        protocol = AppletFormatAdapter.checkProtocol(file);
 
       try
       {
-        format = (isJavaAppletTag && fileFormat != null
-                ? FileFormats.getInstance().forName(fileFormat)
-                : null);
-        if (format == null)
-        {
-          format = new IdentifyFile().identify(file, protocol);
-        }
+        format = new IdentifyFile().identify(file, protocol);
       } catch (FileFormatException e1)
       {
         // TODO ?
       }
 
-      if (aparser.contains(ArgsParser.NOMENUBAR))
-      {
-        noMenuBar = true;
-        System.out.println("CMD [nomenu] executed successfully!");
-      }
-
-      if (aparser.contains(ArgsParser.NOSTATUS))
-      {
-        noStatus = true;
-        System.out.println("CMD [nostatus] executed successfully!");
-      }
-
-      if (aparser.contains(ArgsParser.NOANNOTATION)
-              || aparser.contains(ArgsParser.NOANNOTATION2))
-      {
-        noAnnotation = true;
-        System.out.println("CMD no-annotation executed successfully!");
-      }
-      if (aparser.contains(ArgsParser.NOCALCULATION))
-      {
-        noCalculation = true;
-        System.out.println("CMD [nocalculation] executed successfully!");
-      }
-
-      AlignFrame af = new FileLoader(!headless).loadFileWaitTillLoaded(file,
-              protocol, format);
+      AlignFrame af = fileLoader.LoadFileWaitTillLoaded(file, protocol,
+              format);
       if (af == null)
       {
         System.out.println("error");
       }
       else
       {
-        System.out
-                .println("CMD [-open " + file + "] executed successfully!");
-        if (file2 != null)
-        {
-          protocol = AppletFormatAdapter.checkProtocol(file2);
-          try
-          {
-            format = new IdentifyFile().identify(file2, protocol);
-          } catch (FileFormatException e1)
-          {
-            // TODO ?
-          }
-          AlignFrame af2 = new FileLoader(!headless)
-                  .loadFileWaitTillLoaded(file2, protocol, format);
-          if (af2 == null)
-          {
-            System.out.println("error");
-          }
-          else
-          {
-            AlignViewport.openLinkedAlignmentAs(af,
-                    af.getViewport().getAlignment(),
-                    af2.getViewport().getAlignment(), "",
-                    AlignViewport.SPLIT_FRAME);
-            System.out.println(
-                    "CMD [-open2 " + file2 + "] executed successfully!");
-          }
-        }
-
         setCurrentAlignFrame(af);
-
-        // TODO: file2 How to implement file2 for the applet spit screen?
-
-        data = aparser.getValue(ArgsParser.COLOUR, true);
+        data = aparser.getValue("colour", true);
         if (data != null)
         {
           data.replaceAll("%20", " ");
 
-          ColourSchemeI cs = ColourSchemeProperty.getColourScheme(
-                  af.getViewport(), af.getViewport().getAlignment(), data);
+          ColourSchemeI cs = ColourSchemeProperty
+                  .getColourScheme(af.getViewport(),
+                          af.getViewport().getAlignment(), data);
 
           if (cs != null)
           {
@@ -723,7 +692,7 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
         }
 
         // Must maintain ability to use the groups flag
-        data = aparser.getValue(ArgsParser.GROUPS, true);
+        data = aparser.getValue("groups", true);
         if (data != null)
         {
           af.parseFeaturesFile(data,
@@ -732,7 +701,7 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
           System.out.println(
                   "CMD groups[-" + data + "]  executed successfully!");
         }
-        data = aparser.getValue(ArgsParser.FEATURES, true);
+        data = aparser.getValue("features", true);
         if (data != null)
         {
           af.parseFeaturesFile(data,
@@ -742,7 +711,7 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
                   "CMD [-features " + data + "]  executed successfully!");
         }
 
-        data = aparser.getValue(ArgsParser.ANNOTATIONS, true);
+        data = aparser.getValue("annotations", true);
         if (data != null)
         {
           af.loadJalviewDataFile(data, null, null, null);
@@ -750,15 +719,8 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
           System.out.println(
                   "CMD [-annotations " + data + "] executed successfully!");
         }
-
-        if (aparser.contains(ArgsParser.SHOWOVERVIEW))
-        {
-          af.overviewMenuItem_actionPerformed(null);
-          System.out.println("CMD [showoverview] executed successfully!");
-        }
-
         // set or clear the sortbytree flag.
-        if (aparser.contains(ArgsParser.SORTBYTREE))
+        if (aparser.contains("sortbytree"))
         {
           af.getViewport().setSortByTree(true);
           if (af.getViewport().getSortByTree())
@@ -766,48 +728,24 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
             System.out.println("CMD [-sortbytree] executed successfully!");
           }
         }
-
-        boolean doUpdateAnnotation = false;
-
-        /**
-         * we do this earlier in JalviewJS because of a complication with
-         * SHOWOVERVIEW
-         * 
-         * For now, just fixing this in JalviewJS.
-         *
-         * 
-         * @j2sIgnore
-         * 
-         */
+        if (aparser.contains("no-annotation"))
         {
-          if (aparser.contains(ArgsParser.NOANNOTATION)
-                  || aparser.contains(ArgsParser.NOANNOTATION2))
+          af.getViewport().setShowAnnotation(false);
+          if (!af.getViewport().isShowAnnotation())
           {
-            af.getViewport().setShowAnnotation(false);
-            if (!af.getViewport().isShowAnnotation())
-            {
-              doUpdateAnnotation = true;
-              System.out
-                      .println("CMD no-annotation executed successfully!");
-            }
+            System.out.println("CMD no-annotation executed successfully!");
           }
         }
-        if (aparser.contains(ArgsParser.NOSORTBYTREE))
+        if (aparser.contains("nosortbytree"))
         {
           af.getViewport().setSortByTree(false);
           if (!af.getViewport().getSortByTree())
           {
-            doUpdateAnnotation = true;
             System.out
                     .println("CMD [-nosortbytree] executed successfully!");
           }
         }
-        if (doUpdateAnnotation)
-        { // BH 2019.07.24
-          af.setMenusForViewport();
-          af.alignPanel.updateLayout();
-        }
-        data = aparser.getValue(ArgsParser.TREE, true);
+        data = aparser.getValue("tree", true);
         if (data != null)
         {
           try
@@ -827,33 +765,100 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
         // TODO - load PDB structure(s) to alignment JAL-629
         // (associate with identical sequence in alignment, or a specified
         // sequence)
-        if (isJavaAppletTag)
+        if (groovyscript != null)
         {
-          loadAppletParams(aparser, af);
+          // Execute the groovy script after we've done all the rendering stuff
+          // and before any images or figures are generated.
+          System.out.println("Executing script " + groovyscript);
+          executeGroovyScript(groovyscript, af);
+          System.out.println("CMD groovy[" + groovyscript
+                  + "] executed successfully!");
+          groovyscript = null;
         }
-        else if (!isJS)
-        /**
-         * Java only
-         * 
-         * @j2sIgnore
-         */
+        String imageName = "unnamed.png";
+        while (aparser.getSize() > 1)
         {
-          if (groovyscript != null)
+          String outputFormat = aparser.nextValue();
+          file = aparser.nextValue();
+
+          if (outputFormat.equalsIgnoreCase("png"))
           {
-            // Execute the groovy script after we've done all the rendering
-            // stuff
-            // and before any images or figures are generated.
-            System.out.println("Executing script " + groovyscript);
-            executeGroovyScript(groovyscript, af);
-            System.out.println("CMD groovy[" + groovyscript
-                    + "] executed successfully!");
-            groovyscript = null;
+            af.createPNG(new File(file));
+            imageName = (new File(file)).getName();
+            System.out.println("Creating PNG image: " + file);
+            continue;
+          }
+          else if (outputFormat.equalsIgnoreCase("svg"))
+          {
+            File imageFile = new File(file);
+            imageName = imageFile.getName();
+            af.createSVG(imageFile);
+            System.out.println("Creating SVG image: " + file);
+            continue;
+          }
+          else if (outputFormat.equalsIgnoreCase("html"))
+          {
+            File imageFile = new File(file);
+            imageName = imageFile.getName();
+            HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
+            htmlSVG.exportHTML(file);
+
+            System.out.println("Creating HTML image: " + file);
+            continue;
+          }
+          else if (outputFormat.equalsIgnoreCase("biojsmsa"))
+          {
+            if (file == null)
+            {
+              System.err.println("The output html file must not be null");
+              return;
+            }
+            try
+            {
+              BioJsHTMLOutput.refreshVersionInfo(
+                      BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
+            } catch (URISyntaxException e)
+            {
+              e.printStackTrace();
+            }
+            BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
+            bjs.exportHTML(file);
+            System.out
+                    .println("Creating BioJS MSA Viwer HTML file: " + file);
+            continue;
+          }
+          else if (outputFormat.equalsIgnoreCase("imgMap"))
+          {
+            af.createImageMap(new File(file), imageName);
+            System.out.println("Creating image map: " + file);
+            continue;
+          }
+          else if (outputFormat.equalsIgnoreCase("eps"))
+          {
+            File outputFile = new File(file);
+            System.out.println(
+                    "Creating EPS file: " + outputFile.getAbsolutePath());
+            af.createEPS(outputFile);
+            continue;
+          }
+
+          af.saveAlignment(file, format);
+          if (af.isSaveAlignmentSuccessful())
+          {
+            System.out.println("Written alignment in " + format
+                    + " format to " + file);
           }
-          checkOutputFile(aparser, af, format);
-          while (aparser.getSize() > 0)
+          else
           {
-            System.out.println("Unknown arg: " + aparser.nextValue());
+            System.out.println("Error writing file " + file + " in "
+                    + format + " format!!");
           }
+
+        }
+
+        while (aparser.getSize() > 0)
+        {
+          System.out.println("Unknown arg: " + aparser.nextValue());
         }
       }
     }
@@ -862,7 +867,8 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
     // And the user
     // ////////////////////
 
-    if (!isJS && !headless && file == null && !haveImport
+    if (!Platform.isJS() && !headless && file == null
+            && vamsasImport == null
             && jalview.bin.Cache.getDefault("SHOW_STARTUP_FILE", true))
     /**
      * Java only
@@ -905,8 +911,8 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
         }
       }
 
-      startUpAlframe = new FileLoader(!headless)
-              .loadFileWaitTillLoaded(file, protocol, format);
+      startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol,
+              format);
       // extract groovy arguments before anything else.
     }
 
@@ -934,191 +940,9 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
       }
       desktop.setInBatchMode(false);
     }
-
-    return null;
   }
 
-  private boolean checkStartVamas(ArgsParser aparser)
-  {
-    String vamsasImport = aparser.getValue(ArgsParser.VDOC);
-    String vamsasSession = aparser.getValue(ArgsParser.VSESS);
-    if (vamsasImport == null && vamsasSession == null)
-    {
-      return false;
-    }
-    if (desktop == null || headless)
-    {
-      System.out.println(
-              "Headless vamsas sessions not yet supported. Sorry.");
-      System.exit(1);
-    }
-    boolean haveImport = (vamsasImport != null);
-    if (haveImport)
-    {
-      // if we have a file, start a new session and import it.
-      boolean inSession = false;
-      try
-      {
-        DataSourceType viprotocol = AppletFormatAdapter
-                .checkProtocol(vamsasImport);
-        if (viprotocol == DataSourceType.FILE)
-        {
-          inSession = desktop.vamsasImport(new File(vamsasImport));
-        }
-        else if (viprotocol == DataSourceType.URL)
-        {
-          inSession = desktop.vamsasImport(new URL(vamsasImport));
-        }
-
-      } catch (Exception e)
-      {
-        System.err.println("Exeption when importing " + vamsasImport
-                + " as a vamsas document.");
-        e.printStackTrace();
-      }
-      if (!inSession)
-      {
-        System.err.println("Failed to import " + vamsasImport
-                + " as a vamsas document.");
-      }
-      else
-      {
-        System.out.println("Imported Successfully into new session "
-                + desktop.getVamsasApplication().getCurrentSession());
-      }
-    }
-    if (vamsasSession != null)
-    {
-      if (vamsasImport != null)
-      {
-        // close the newly imported session and import the Jalview specific
-        // remnants into the new session later on.
-        desktop.vamsasStop_actionPerformed(null);
-      }
-      // now join the new session
-      try
-      {
-        if (desktop.joinVamsasSession(vamsasSession))
-        {
-          System.out.println(
-                  "Successfully joined vamsas session " + vamsasSession);
-        }
-        else
-        {
-          System.err.println("WARNING: Failed to join vamsas session "
-                  + vamsasSession);
-        }
-      } catch (Exception e)
-      {
-        System.err.println(
-                "ERROR: Failed to join vamsas session " + vamsasSession);
-        e.printStackTrace();
-      }
-      if (vamsasImport != null)
-      {
-        // the Jalview specific remnants can now be imported into the new
-        // session at the user's leisure.
-        Cache.log.info(
-                "Skipping Push for import of data into existing vamsas session.");
-        // TODO:
-        // enable
-        // this
-        // when
-        // debugged
-        // desktop.getVamsasApplication().push_update();
-      }
-    }
-    return haveImport;
-  }
-
-  private void checkOutputFile(ArgsParser aparser, AlignFrame af,
-          FileFormatI format)
-  {
-    String imageName = "unnamed.png";
-    while (aparser.getSize() > 1)
-    {
-      // PNG filename
-      // SVG filename
-      // HTML filename
-      // biojsmsa filename
-      String outputFormat = aparser.nextValue();
-      String file = aparser.nextValue();
-      if (outputFormat.equalsIgnoreCase("png"))
-      {
-        af.createPNG(new File(file));
-        imageName = (new File(file)).getName();
-        System.out.println("Creating PNG image: " + file);
-        continue;
-      }
-      else if (outputFormat.equalsIgnoreCase("svg"))
-      {
-        File imageFile = new File(file);
-        imageName = imageFile.getName();
-        af.createSVG(imageFile);
-        System.out.println("Creating SVG image: " + file);
-        continue;
-      }
-      else if (outputFormat.equalsIgnoreCase("html"))
-      {
-        File imageFile = new File(file);
-        imageName = imageFile.getName();
-        HtmlSvgOutput htmlSVG = new HtmlSvgOutput(af.alignPanel);
-        htmlSVG.exportHTML(file);
-
-        System.out.println("Creating HTML image: " + file);
-        continue;
-      }
-      else if (outputFormat.equalsIgnoreCase("biojsmsa"))
-      {
-        if (file == null)
-        {
-          System.err.println("The output html file must not be null");
-          return;
-        }
-        try
-        {
-          BioJsHTMLOutput.refreshVersionInfo(
-                  BioJsHTMLOutput.BJS_TEMPLATES_LOCAL_DIRECTORY);
-        } catch (URISyntaxException e)
-        {
-          e.printStackTrace();
-        }
-        BioJsHTMLOutput bjs = new BioJsHTMLOutput(af.alignPanel);
-        bjs.exportHTML(file);
-        System.out.println("Creating BioJS MSA Viwer HTML file: " + file);
-        continue;
-      }
-      else if (outputFormat.equalsIgnoreCase("imgMap"))
-      {
-        af.createImageMap(new File(file), imageName);
-        System.out.println("Creating image map: " + file);
-        continue;
-      }
-      else if (outputFormat.equalsIgnoreCase("eps"))
-      {
-        File outputFile = new File(file);
-        System.out.println(
-                "Creating EPS file: " + outputFile.getAbsolutePath());
-        af.createEPS(outputFile);
-        continue;
-      }
-
-      af.saveAlignment(file, format);
-      if (af.isSaveAlignmentSuccessful())
-      {
-        System.out.println(
-                "Written alignment in " + format + " format to " + file);
-      }
-      else
-      {
-        System.out.println("Error writing file " + file + " in " + format
-                + " format!!");
-      }
-
-    }
-  }
-
-  private static void showUsage()
+  private static void showUsage()
   {
     System.out.println(
             "Usage: jalview -open [FILE] [OUTPUT_FORMAT] [OUTPUT_FILE]\n\n"
@@ -1168,9 +992,8 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
     /**
      * start a User Config prompt asking if we can log usage statistics.
      */
-    PromptUserConfig prompter = new PromptUserConfig(
-            Desktop.getDesktopPane(), "USAGESTATS",
-            "Jalview Usage Statistics",
+    PromptUserConfig prompter = new PromptUserConfig(Desktop.desktop,
+            "USAGESTATS", "Jalview Usage Statistics",
             "Do you want to help make Jalview better by enabling "
                     + "the collection of usage statistics with Google Analytics ?"
                     + "\n\n(you can enable or disable usage tracking in the preferences)",
@@ -1289,7 +1112,7 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
     }
     try
     {
-      Map<String, Object> vbinding = new HashMap<>();
+      Map<String, java.lang.Object> vbinding = new HashMap<>();
       vbinding.put("Jalview", this);
       if (af != null)
       {
@@ -1313,6 +1136,16 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
     }
   }
 
+  public static boolean isHeadlessMode()
+  {
+    String isheadless = System.getProperty("java.awt.headless");
+    if (isheadless != null && isheadless.equalsIgnoreCase("true"))
+    {
+      return true;
+    }
+    return false;
+  }
+
   public AlignFrame[] getAlignFrames()
   {
     return desktop == null ? new AlignFrame[] { getCurrentAlignFrame() }
@@ -1326,12 +1159,6 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
    */
   public void quit()
   {
-    if (jsFunctionExec != null)
-    {
-      jsFunctionExec.tidyUp();
-      jsFunctionExec = null;
-    }
-
     if (desktop != null)
     {
       desktop.quit();
@@ -1342,719 +1169,13 @@ public class Jalview implements ApplicationSingletonI, JalviewJSApi
     }
   }
 
-  /**
-   * Get the SwingJS applet ID and combine that with the frameType
-   * 
-   * @param frameType
-   *          "alignment", "desktop", etc., or null
-   * @return
-   */
-  public static String getAppID(String frameType)
-  {
-    String id = Cache.getProperty("Info.j2sAppletID");
-    if (id == null)
-    {
-      id = "jalview";
-    }
-    return id + (frameType == null ? "" : "-" + frameType);
-  }
-
-  /**
-   * Handle all JalviewLite applet parameters
-   * 
-   * @param aparser
-   * @param af
-   */
-  private void loadAppletParams(ArgsParser aparser, AlignFrame af)
-  {
-    JalviewApp app = new JalviewApp()
-    {
-
-      // TODO BH 2019
-      //
-      // These are methods that are in JalviewLite that various classes call
-      // but are not in JalviewLiteJsApi. Or, even if they are, other classes
-      // call
-      // them to JalviewLite directly. Some may not be necessary, but they have
-      // to
-      // be at least mentioned here, or the classes calling them should
-      // reference
-      // JalviewLite itself.
-
-      private boolean alignPDBStructures; // From JalviewLite; not implemented
-
-      private Hashtable<String, Hashtable<String, String[]>> jsmessages;
-
-      private Hashtable<String, int[]> jshashes;
-
-      @Override
-      public String getParameter(String name)
-      {
-        return aparser.getAppletValue(name, null);
-      }
-
-      @Override
-      public boolean getDefaultParameter(String name, boolean def)
-      {
-        String stn;
-        return ((stn = getParameter(name)) == null ? def
-                : "true".equalsIgnoreCase(stn));
-      }
-
-      /**
-       * Get the applet-like document base even though this is an application.
-       */
-      @Override
-      public URL getDocumentBase()
-      {
-        return Platform.getDocumentBase();
-      }
-
-      /**
-       * Get the applet-like code base even though this is an application.
-       */
-      @Override
-      public URL getCodeBase()
-      {
-        return Platform.getCodeBase();
-      }
-
-      @Override
-      public AlignViewportI getViewport()
-      {
-        return af.getViewport();
-      }
-
-      /**
-       * features
-       * 
-       */
-      @Override
-      public boolean parseFeaturesFile(String filename,
-              DataSourceType protocol)
-      {
-        return af.parseFeaturesFile(filename, protocol);
-      }
-
-      /**
-       * scorefile
-       * 
-       */
-      @Override
-      public boolean loadScoreFile(String sScoreFile) throws IOException
-      {
-        af.loadJalviewDataFile(sScoreFile, null, null, null);
-        return true;
-      }
-
-      /**
-       * annotations, jpredfile, jnetfile
-       * 
-       */
-      @Override
-      public void updateForAnnotations()
-      {
-        af.updateForAnnotations();
-      }
-
-      @Override
-      public void loadTree(NewickFile fin, String treeFile)
-              throws IOException
-      {
-        // n/a -- already done by standard Jalview command line processing
-      }
-
-      @Override
-      public void setAlignPdbStructures(boolean defaultParameter)
-      {
-        alignPDBStructures = true;
-      }
-
-      @Override
-      public void newStructureView(PDBEntry pdb, SequenceI[] seqs,
-              String[] chains, DataSourceType protocol)
-      {
-        StructureViewer.launchStructureViewer(af.alignPanel, pdb, seqs);
-      }
-
-      @Override
-      public void setFeatureGroupState(String[] groups, boolean state)
-      {
-        af.setFeatureGroupState(groups, state);
-      }
-
-      @Override
-      public void alignedStructureView(PDBEntry[] pdb, SequenceI[][] seqs,
-              String[][] chains, String[] protocols)
-      {
-        System.err.println(
-                "Jalview applet interface alignedStructureView not implemented");
-      }
-
-      @Override
-      public void newFeatureSettings()
-      {
-        System.err.println(
-                "Jalview applet interface newFeatureSettings not implemented");
-      }
-
-      private Vector<Runnable> jsExecQueue;
-
-      @Override
-      public Vector<Runnable> getJsExecQueue(JSFunctionExec exec)
-      {
-        jsFunctionExec = exec;
-        return (jsExecQueue == null ? (jsExecQueue = new Vector<>())
-                : jsExecQueue);
-      }
-
-      @Override
-      public AppletContext getAppletContext()
-      {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public boolean isJsfallbackEnabled()
-      {
-        // TODO Auto-generated method stub
-        return false;
-      }
-
-      @Override
-      public JSObject getJSObject()
-      {
-        // TODO Auto-generated method stub
-        return null;
-      }
-
-      @Override
-      public StructureSelectionManagerProvider getStructureSelectionManagerProvider()
-      {
-        // TODO Q: what exactly is this? BH
-        return null;
-      }
-
-      @Override
-      public void updateColoursFromMouseOver(Object source,
-              MouseOverStructureListener mouseOverStructureListener)
-      {
-        // TODO Auto-generated method stub
-
-      }
-
-      @Override
-      public Object[] getSelectionForListener(SequenceGroup seqsel,
-              ColumnSelection colsel, HiddenColumns hidden,
-              SelectionSource source, Object alignFrame)
-      {
-        return appLoader.getSelectionForListener(getCurrentAlignFrame(),
-                seqsel, colsel, hidden, source, alignFrame);
-      }
-
-      @Override
-      public String arrayToSeparatorList(String[] array)
-      {
-        return appLoader.arrayToSeparatorList(array);
-      }
-
-      @Override
-      public Hashtable<String, int[]> getJSHashes()
-      {
-        return (jshashes == null ? (jshashes = new Hashtable<>())
-                : jshashes);
-      }
-
-      @Override
-      public Hashtable<String, Hashtable<String, String[]>> getJSMessages()
-      {
-        return (jsmessages == null ? (jsmessages = new Hashtable<>())
-                : jsmessages);
-      }
-
-      @Override
-      public Object getFrameForSource(VamsasSource source)
-      {
-        if (source != null)
-        {
-          AlignFrame af;
-          if (source instanceof jalview.gui.AlignViewport
-                  && source == (af = getCurrentAlignFrame()).getViewport())
-          {
-            // should be valid if it just generated an event!
-            return af;
-          }
-          // TODO: ensure that if '_af' is specified along with a handler
-          // function, then only events from that alignFrame are sent to that
-          // function
-        }
-        return null;
-      }
-
-      @Override
-      public FeatureRenderer getNewFeatureRenderer(AlignViewportI vp)
-      {
-        return new jalview.gui.FeatureRenderer((AlignmentPanel) vp);
-      }
-
-    };
-
-    appLoader = new JalviewAppLoader(true);
-    appLoader.load(app);
-  }
-
-  /**
-   * 
-   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences()
-   */
-  @Override
-  public String getSelectedSequences()
-  {
-    return getSelectedSequencesFrom(getCurrentAlignFrame());
-  }
-
-  /**
-   * 
-   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequences(java.lang.String)
-   */
-  @Override
-  public String getSelectedSequences(String sep)
-  {
-    return getSelectedSequencesFrom(getCurrentAlignFrame(), sep);
-  }
-
-  /**
-   * 
-   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
-   *      .AlignFrame)
-   */
-  @Override
-  public String getSelectedSequencesFrom(AlignFrameI alf)
-  {
-    return getSelectedSequencesFrom(alf, null);
-  }
-
-  /**
-   * 
-   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
-   *      .AlignFrame, java.lang.String)
-   */
-  @Override
-  public String getSelectedSequencesFrom(AlignFrameI alf, String sep)
-  {
-    return appLoader.getSelectedSequencesFrom(alf, sep);
-  }
-
-  /**
-   * 
-   * @see jalview.bin.JalviewLiteJsApi#getSelectedSequencesFrom(jalview.appletgui
-   *      .AlignFrame, java.lang.String)
-   */
-  @Override
-  public void highlight(String sequenceId, String position,
-          String alignedPosition)
-  {
-    highlightIn(getCurrentAlignFrame(), sequenceId, position,
-            alignedPosition);
-  }
-
-  @Override
-  public void highlightIn(AlignFrameI alf, String sequenceId,
-          String position, String alignedPosition)
-  {
-    appLoader.highlightIn(alf, sequenceId, position, alignedPosition);
-  }
-
-  @Override
-  public void select(String sequenceIds, String columns)
-  {
-    selectIn(getCurrentAlignFrame(), sequenceIds, columns, null);
-  }
-
-  @Override
-  public void select(String sequenceIds, String columns, String sep)
-  {
-    selectIn(getCurrentAlignFrame(), sequenceIds, columns, sep);
-  }
-
-  @Override
-  public void selectIn(AlignFrameI alf, String sequenceIds, String columns)
-  {
-    selectIn(alf, sequenceIds, columns, null);
-  }
-
-  @Override
-  public void selectIn(AlignFrameI alf, String sequenceIds, String columns,
-          String sep)
-  {
-    appLoader.selectIn(alf, sequenceIds, columns, sep);
-  }
-
-  @Override
-  public String getSelectedSequencesAsAlignment(String format,
-          String suffix)
-  {
-    return getSelectedSequencesAsAlignmentFrom(getCurrentAlignFrame(),
-            format, suffix);
-  }
-
-  @Override
-  public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
-          String format, String sep)
-  {
-    return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format, sep);
-  }
-
-  @Override
-  public String getAlignmentOrder()
-  {
-    return getAlignmentFrom(getCurrentAlignFrame(), null);
-  }
-
-  @Override
-  public String getAlignmentOrderFrom(AlignFrameI alf)
-  {
-    return getAlignmentFrom(alf, null);
-  }
-
-  @Override
-  public String getAlignmentOrderFrom(AlignFrameI alf, String sep)
-  {
-    return appLoader.getAlignmentOrderFrom(alf, sep);
-  }
-
-  @Override
-  public String orderBy(String order, String undoName)
-  {
-    return orderBy(order, undoName, null);
-  }
-
-  @Override
-  public String orderBy(String order, String undoName, String sep)
-  {
-    return orderAlignmentBy(getCurrentAlignFrame(), order, undoName, sep);
-  }
-
-  @Override
-  public String orderAlignmentBy(AlignFrameI alf, String order,
-          String undoName, String sep)
-  {
-    return appLoader.orderAlignmentBy(alf, order, undoName, sep);
-  }
-
-  @Override
-  public String getAlignment(String format)
-  {
-    return getAlignmentFrom(null, format, null);
-  }
-
-  @Override
-  public String getAlignmentFrom(AlignFrameI alf, String format)
-  {
-    return getAlignmentFrom(alf, format, null);
-  }
-
-  @Override
-  public String getAlignment(String format, String suffix)
-  {
-    return getAlignmentFrom(getCurrentAlignFrame(), format, suffix);
-  }
-
-  @Override
-  public String getAlignmentFrom(AlignFrameI alf, String format,
-          String suffix)
-  {
-    return appLoader.getAlignmentFrom(alf, format, suffix);
-  }
-
-  @Override
-  public void loadAnnotation(String annotation)
-  {
-    loadAnnotationFrom(getCurrentAlignFrame(), annotation);
-  }
-
-  @Override
-  public void loadAnnotationFrom(AlignFrameI alf, String annotation)
-  {
-    appLoader.loadAnnotationFrom(alf, annotation);
-  }
-
-  @Override
-  public void loadFeatures(String features, boolean autoenabledisplay)
-  {
-    loadFeaturesFrom(currentAlignFrame, features, autoenabledisplay);
-  }
-
-  @Override
-  public boolean loadFeaturesFrom(AlignFrameI alf, String features,
-          boolean autoenabledisplay)
-  {
-    return appLoader.loadFeaturesFrom(alf, features, autoenabledisplay);
-  }
-
-  @Override
-  public String getFeatures(String format)
-  {
-    return getFeaturesFrom(getCurrentAlignFrame(), format);
-  }
-
-  @Override
-  public String getFeaturesFrom(AlignFrameI alf, String format)
-  {
-    return appLoader.getFeaturesFrom(alf, format);
-  }
-
-  @Override
-  public String getAnnotation()
-  {
-    return getAnnotationFrom(getCurrentAlignFrame());
-  }
-
-  @Override
-  public String getAnnotationFrom(AlignFrameI alf)
-  {
-    return appLoader.getAnnotationFrom(alf);
-  }
-
-  @Override
-  public AlignFrameI newView()
-  {
-    return newViewFrom(getCurrentAlignFrame(), null);
-  }
-
-  @Override
-  public AlignFrameI newView(String name)
-  {
-    return newViewFrom(getCurrentAlignFrame(), name);
-  }
-
-  @Override
-  public AlignFrameI newViewFrom(AlignFrameI alf)
-  {
-    return newViewFrom(alf, null);
-  }
-
-  @Override
-  public AlignFrameI newViewFrom(AlignFrameI alf, String name)
-  {
-    return appLoader.newViewFrom(alf, name);
-  }
-
-  @Override
-  public AlignFrameI loadAlignment(String text, String title)
-  {
-    return appLoader.loadAlignment(text, AlignFrame.DEFAULT_WIDTH,
-            AlignFrame.DEFAULT_HEIGHT, title);
-  }
-
-  @Override
-  public boolean addPdbFile(AlignFrameI alFrame, String sequenceId,
-          String pdbEntryString, String pdbFile)
-  {
-    return appLoader.addPdbFile(alFrame, sequenceId, pdbEntryString,
-            pdbFile);
-  }
-
-  @Override
-  public void scrollViewToIn(AlignFrameI alf, String topRow,
-          String leftHandColumn)
-  {
-    appLoader.scrollViewToIn(alf, topRow, leftHandColumn);
-  }
-
-  @Override
-  public void scrollViewToRowIn(AlignFrameI alf, String topRow)
-  {
-    appLoader.scrollViewToRowIn(alf, topRow);
-  }
-
-  @Override
-  public void scrollViewToColumnIn(AlignFrameI alf, String leftHandColumn)
-  {
-    appLoader.scrollViewToColumnIn(alf, leftHandColumn);
-  }
-
-  @Override
-  public String getFeatureGroups()
-  {
-    return getFeatureGroupsOn(getCurrentAlignFrame());
-  }
-
-  @Override
-  public String getFeatureGroupsOn(AlignFrameI alf)
-  {
-    return appLoader.getFeatureGroupsOn(alf);
-  }
-
-  @Override
-  public String getFeatureGroupsOfState(boolean visible)
-  {
-    return getFeatureGroupsOfStateOn(getCurrentAlignFrame(), visible);
-  }
-
-  @Override
-  public String getFeatureGroupsOfStateOn(AlignFrameI alf, boolean visible)
-  {
-    return appLoader.getFeatureGroupsOfStateOn(alf, visible);
-  }
-
-  @Override
-  public void setFeatureGroupStateOn(AlignFrameI alf, String groups,
-          boolean state)
-  {
-    setFeatureGroupStateOn(alf, groups, state);
-  }
-
-  @Override
-  public void setFeatureGroupState(String groups, boolean state)
-  {
-    appLoader.setFeatureGroupStateOn(getCurrentAlignFrame(), groups, state);
-  }
-
-  @Override
-  public String getSeparator()
-  {
-    return appLoader.getSeparator();
-  }
-
-  @Override
-  public void setSeparator(String separator)
-  {
-    appLoader.setSeparator(separator);
-  }
-
-  @Override
-  public String getJsMessage(String messageclass, String viewId)
-  {
-    // see http://www.jalview.org/examples/jalviewLiteJs.html
-    return null;
-  }
-
-  /**
-   * Open a new Tree panel on the desktop statically. Params are standard (not
-   * set by Groovy). No dialog is opened.
-   * 
-   * @param af
-   * @param treeType
-   * @param modelName
-   * @return null, or the string "label.you_need_at_least_n_sequences" if number
-   *         of sequences selected is inappropriate
-   */
-  @Override
-  public Object openTreePanel(AlignFrame af, String treeType,
-          String modelName)
-  {
-    return CalculationChooser.openTreePanel(af, treeType, modelName, null);
-  }
-
-  /**
-   * public static method for JalviewJS API to open a PCAPanel without
-   * necessarily using a dialog.
-   * 
-   * @param af
-   * @param modelName
-   * @return the PCAPanel, or the string "label.you_need_at_least_n_sequences"
-   *         if number of sequences selected is inappropriate
-   */
-  @Override
-  public Object openPcaPanel(AlignFrame af, String modelName)
-  {
-    return CalculationChooser.openPcaPanel(af, modelName, null);
-  }
-
-  @Override
-  public String getSelectedSequencesAsAlignment(String format,
-          boolean suffix)
-  {
-    return getSelectedSequencesAsAlignmentFrom(getCurrentAlignFrame(),
-            format, suffix);
-  }
-
-  @Override
-  public String getSelectedSequencesAsAlignmentFrom(AlignFrameI alf,
-          String format, boolean suffix)
-  {
-    return appLoader.getSelectedSequencesAsAlignmentFrom(alf, format,
-            "" + suffix);
-  }
-
-  @Override
-  public String arrayToSeparatorList(String[] array)
-  {
-    return appLoader.arrayToSeparatorList(array);
-  }
-
-  @Override
-  public String[] separatorListToArray(String list)
-  {
-    return appLoader.separatorListToArray(list);
-  }
-
-  //// probably not needed in JalviewJS -- From when Jmol and Jalview did not
-  //// have a direct connection?
-
-  @Override
-  public void setMouseoverListener(String listener)
-  {
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public void setMouseoverListener(AlignFrameI af, String listener)
-  {
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public void setSelectionListener(String listener)
-  {
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public void setSelectionListener(AlignFrameI af, String listener)
-  {
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public void setStructureListener(String listener, String modelSet)
-  {
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public void removeJavascriptListener(AlignFrameI af, String listener)
-  {
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public void mouseOverStructure(String pdbResNum, String chain,
-          String pdbfile)
-  {
-    // TODO Auto-generated method stub
-
-  }
-
-  @Override
-  public void showOverview()
+  public static AlignFrame getCurrentAlignFrame()
   {
-    currentAlignFrame.overviewMenuItem_actionPerformed(null);
+    return Jalview.currentAlignFrame;
   }
 
-  public void notifyWorker(AlignCalcWorkerI worker, String status)
+  public static void setCurrentAlignFrame(AlignFrame currentAlignFrame)
   {
-    // System.out.println("Jalview worker " + worker.getClass().getSimpleName()
-    // + " " + status);
+    Jalview.currentAlignFrame = currentAlignFrame;
   }
-
 }
-