X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FJalview.java;h=290f92062b30a3da5cecea1c40f6d5996a4f9495;hb=304e64fb34b32659be1bbfd39fb4e15b2f79586e;hp=af9d06eec76868322ce60e4d3235171e56392e1b;hpb=af83e7d123133d2bb44b0bcafe538e300304a1b1;p=jalview.git diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index af9d06e..290f920 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -20,6 +20,8 @@ */ package jalview.bin; +import java.awt.GraphicsEnvironment; + import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; @@ -37,18 +39,21 @@ import java.security.PermissionCollection; import java.security.Permissions; import java.security.Policy; import java.util.HashMap; +import java.util.Locale; 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 javax.swing.UIManager.LookAndFeelInfo; import com.threerings.getdown.util.LaunchUtil; import groovy.lang.Binding; import groovy.util.GroovyScriptEngine; import jalview.api.AlignCalcWorkerI; -import jalview.api.JalviewJSApp; import jalview.bin.ApplicationSingletonProvider.ApplicationSingletonI; import jalview.ext.so.SequenceOntology; import jalview.gui.AlignFrame; @@ -70,10 +75,11 @@ import jalview.io.NewickFile; import jalview.io.gff.SequenceOntologyFactory; import jalview.schemes.ColourSchemeI; import jalview.schemes.ColourSchemeProperty; +import jalview.util.ChannelProperties; +import jalview.util.HttpUtils; import jalview.util.MessageManager; import jalview.util.Platform; import jalview.ws.jws2.Jws2Discoverer; -//import netscape.javascript.JSObject; /** * Main class for Jalview Application
@@ -92,7 +98,6 @@ import jalview.ws.jws2.Jws2Discoverer; */ public class Jalview implements ApplicationSingletonI { - // for testing those nasty messages you cannot ever find. // static // { @@ -117,14 +122,9 @@ public class Jalview implements ApplicationSingletonI private Jalview() { - } - - static - { Platform.getURLCommandArguments(); } - private boolean headless; private Desktop desktop; @@ -132,8 +132,8 @@ public class Jalview implements ApplicationSingletonI public String appletResourcePath; - JalviewJSApp app; // JalviewJS-specific JavaScript interface - + public String j2sAppletID; + private boolean noCalculation, noMenuBar, noStatus; private boolean noAnnotation; @@ -259,8 +259,13 @@ public class Jalview implements ApplicationSingletonI { Platform.startJavaLogging(); } + getInstance().doMain(args); + } + + + /** * @param args @@ -300,20 +305,22 @@ public class Jalview implements ApplicationSingletonI Cache.getInstance().loadBuildProperties(true); ArgsParser aparser = new ArgsParser(args); - headless = false; + boolean headless = false; String usrPropsFile = aparser.getValue("props"); - Cache.loadProperties(usrPropsFile); // must do this before - + boolean allowServices = true; + if (isJS) { - app = new JalviewJSApp(aparser); - Preferences.setAppletDefaults(); - Cache.loadProperties(usrPropsFile); // again, because we - // might be changing defaults here? - appletResourcePath = (String) aparser.getAppletValue("resourcepath", null, true); + j2sAppletID = Platform.getAppID(null); + Preferences.setAppletDefaults(); + Cache.loadProperties(usrPropsFile); // again, because we + // might be changing defaults here? + appletResourcePath = (String) aparser.getAppletValue("resourcepath", + null, true); } + else /** * Java only @@ -321,7 +328,6 @@ public class Jalview implements ApplicationSingletonI * @j2sIgnore */ { - if (usrPropsFile != null) { System.out.println( @@ -332,19 +338,23 @@ public class Jalview implements ApplicationSingletonI showUsage(); System.exit(0); } - // ?>> + // BH note: Only -nodisplay is official; others are deprecated? if (aparser.contains("nodisplay") || aparser.contains("nogui") - || aparser.contains("headless")) + || aparser.contains("headless") + || GraphicsEnvironment.isHeadless()) { - System.setProperty("java.awt.headless", "true"); + if (!isJS) { + // BH Definitely not a good idea in JavaScript; + // probably should not be here for Java, either. + System.setProperty("java.awt.headless", "true"); + } headless = true; } - // < -1) + { + protocol = DataSourceType.URL; + } + + if (file.endsWith(".jar")) + { + format = FileFormat.Jalview; + } + else + { + try + { + format = new IdentifyFile().identify(file, protocol); + } catch (FileFormatException e) + { + // TODO what? + } + } + af = fileLoader.LoadFileWaitTillLoaded(file, protocol, format); + } + } + else { if (!headless) { @@ -603,8 +649,7 @@ public class Jalview implements ApplicationSingletonI * @j2sIgnore */ { - if (!file.startsWith("http://") && !file.startsWith("https://")) - // BH 2019 added https check for Java + if (!HttpUtils.startsWithHttpOrHttps(file)) { if (!(new File(file)).exists()) { @@ -616,9 +661,13 @@ public class Jalview implements ApplicationSingletonI } } } - String fileFormat = (isJS ? (String) aparser.getAppletValue("format", null, true) + + // JS Only argument to provide a format parameter to specify what format to use + String fileFormat = (isJS + ? (String) aparser.getAppletValue("format", null, true) : null); protocol = AppletFormatAdapter.checkProtocol(file); + try { format = (fileFormat != null @@ -633,39 +682,15 @@ public class Jalview implements ApplicationSingletonI // 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); + af = new FileLoader(!headless).LoadFileWaitTillLoaded(file, protocol, + format); if (af == null) { - System.out.println("error"); + System.out.println("jalview error - AlignFrame was not created"); } else { - + // JalviewLite interface for JavaScript allows second file open String file2 = aparser.getValue(ArgsParser.OPEN2, true); if (file2 != null) @@ -694,135 +719,14 @@ public class Jalview implements ApplicationSingletonI "CMD [-open2 " + file2 + "] executed successfully!"); } } + // af is loaded - so set it as current frame setCurrentAlignFrame(af); - String data = aparser.getValue(ArgsParser.COLOUR, true); - if (data != null) - { - data.replaceAll("%20", " "); - - ColourSchemeI cs = ColourSchemeProperty.getColourScheme( - af.getViewport(), af.getViewport().getAlignment(), data); - - if (cs != null) - { - System.out.println( - "CMD [-color " + data + "] executed successfully!"); - } - af.changeColour(cs); - } - - // Must maintain ability to use the groups flag - data = aparser.getValue(ArgsParser.GROUPS, true); - if (data != null) - { - af.parseFeaturesFile(data, - AppletFormatAdapter.checkProtocol(data)); - // System.out.println("Added " + data); - System.out.println( - "CMD groups[-" + data + "] executed successfully!"); - } - data = aparser.getValue(ArgsParser.FEATURES, true); - if (data != null) - { - af.parseFeaturesFile(data, - AppletFormatAdapter.checkProtocol(data)); - // System.out.println("Added " + data); - System.out.println( - "CMD [-features " + data + "] executed successfully!"); - } - data = aparser.getValue(ArgsParser.ANNOTATIONS, true); - if (data != null) - { - af.loadJalviewDataFile(data, null, null, null); - // System.out.println("Added " + data); - System.out.println( - "CMD [-annotations " + data + "] executed successfully!"); - } - - // JavaScript feature - - 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)) - { - af.getViewport().setSortByTree(true); - if (af.getViewport().getSortByTree()) - { - 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(ArgsParser.NOANNOTATION) - || aparser.contains(ArgsParser.NOANNOTATION2)) - { - af.getViewport().setShowAnnotation(false); - if (!af.getViewport().isShowAnnotation()) - { - doUpdateAnnotation = true; - System.out - .println("CMD no-annotation executed successfully!"); - } - } - } - - if (aparser.contains(ArgsParser.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); - if (data != null) - { - try - { - NewickFile nf = new NewickFile(data, - AppletFormatAdapter.checkProtocol(data)); - af.getViewport() - .setCurrentTree(af.showNewickTree(nf, data).getTree()); - System.out.println( - "CMD [-tree " + data + "] executed successfully!"); - } catch (IOException ex) - { - System.err.println("Couldn't add tree " + data); - ex.printStackTrace(System.err); - } - } - // TODO - load PDB structure(s) to alignment JAL-629 - // (associate with identical sequence in alignment, or a specified - // sequence) + setFrameDependentProperties(aparser, af); if (isJS) { - app.load(af); + jsApp.initFromParams(af); } else /** @@ -842,71 +746,28 @@ public class Jalview implements ApplicationSingletonI + "] executed successfully!"); groovyscript = null; } - createOutputFiles(aparser, af, format); + } + if (!isJS || !isStartup) { + createOutputFiles(aparser, format); } } - } - - AlignFrame startUpAlframe = null; - // We'll only open the default file if the desktop is visible. - // And the user - // //////////////////// - - if (!isJS && !headless && file == null - && Cache.getDefault("SHOW_STARTUP_FILE", true)) - /** - * Java only - * - * @j2sIgnore - */ - { - file = Cache.getDefault("STARTUP_FILE", - Cache.getDefault("www.jalview.org", "http://www.jalview.org") - + "/examples/exampleFile_2_7.jar"); - if (file.equals( - "http://www.jalview.org/examples/exampleFile_2_3.jar")) - { - // hardwire upgrade of the startup file - file.replace("_2_3.jar", "_2_7.jar"); - // and remove the stale setting - Cache.removeProperty("STARTUP_FILE"); - } - - protocol = DataSourceType.FILE; - - if (file.indexOf("http:") > -1) - { - protocol = DataSourceType.URL; - } - - if (file.endsWith(".jar")) + if (headless) { - format = FileFormat.Jalview; + af.getViewport().getCalcManager().shutdown(); } - else - { - try - { - format = new IdentifyFile().identify(file, protocol); - } catch (FileFormatException e) - { - // TODO what? - } - } - - startUpAlframe = fileLoader.LoadFileWaitTillLoaded(file, protocol, - format); - } - // extract groovy arguments before anything else. // Once all other stuff is done, execute any groovy scripts (in order) - if (groovyscript != null) + if (!isJS && groovyscript != null) { if (Cache.groovyJarsPresent()) { + // TODO: DECIDE IF THIS SECOND PASS AT GROOVY EXECUTION IS STILL REQUIRED !! System.out.println("Executing script " + groovyscript); - executeGroovyScript(groovyscript, startUpAlframe); + executeGroovyScript(groovyscript, af); + System.out.println("CMD groovy[" + groovyscript + + "] executed successfully!"); + } else { @@ -925,13 +786,170 @@ public class Jalview implements ApplicationSingletonI } desktop.setInBatchMode(false); } + + if (jsApp != null) { + jsApp.callInitCallback(); + } + } + + /** + * Set general display parameters irrespective of file loading or headlessness. + * + * @param aparser + */ + private void setDisplayParameters(ArgsParser aparser) + { + if (aparser.contains(ArgsParser.NOMENUBAR)) + { + noMenuBar = true; + System.out.println("CMD [nomenu] executed successfully!"); + } - if (isJS && isStartup) + if (aparser.contains(ArgsParser.NOSTATUS)) { - app.callInitCallback(); + 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!"); } } - + + + private void setFrameDependentProperties(ArgsParser aparser, + AlignFrame af) + { + String data = aparser.getValue(ArgsParser.COLOUR, true); + if (data != null) + { + data.replaceAll("%20", " "); + + ColourSchemeI cs = ColourSchemeProperty.getColourScheme( + af.getViewport(), af.getViewport().getAlignment(), data); + + if (cs != null) + { + System.out.println( + "CMD [-color " + data + "] executed successfully!"); + } + af.changeColour(cs); + } + + // Must maintain ability to use the groups flag + data = aparser.getValue(ArgsParser.GROUPS, true); + if (data != null) + { + af.parseFeaturesFile(data, + AppletFormatAdapter.checkProtocol(data)); + // System.out.println("Added " + data); + System.out.println( + "CMD groups[-" + data + "] executed successfully!"); + } + data = aparser.getValue(ArgsParser.FEATURES, true); + if (data != null) + { + af.parseFeaturesFile(data, + AppletFormatAdapter.checkProtocol(data)); + // System.out.println("Added " + data); + System.out.println( + "CMD [-features " + data + "] executed successfully!"); + } + data = aparser.getValue(ArgsParser.ANNOTATIONS, true); + if (data != null) + { + af.loadJalviewDataFile(data, null, null, null); + // System.out.println("Added " + data); + System.out.println( + "CMD [-annotations " + data + "] executed successfully!"); + } + + // JavaScript feature + + 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)) + { + af.getViewport().setSortByTree(true); + if (af.getViewport().getSortByTree()) + { + 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 (noAnnotation) + { + af.getViewport().setShowAnnotation(false); + if (!af.getViewport().isShowAnnotation()) + { + doUpdateAnnotation = true; + } + } + } + + if (aparser.contains(ArgsParser.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); + if (data != null) + { + try + { + NewickFile nf = new NewickFile(data, + AppletFormatAdapter.checkProtocol(data)); + af.getViewport() + .setCurrentTree(af.showNewickTree(nf, data).getTree()); + System.out.println( + "CMD [-tree " + data + "] executed successfully!"); + } catch (IOException ex) + { + System.err.println("Couldn't add tree " + data); + ex.printStackTrace(System.err); + } + } + // TODO - load PDB structure(s) to alignment JAL-629 + // (associate with identical sequence in alignment, or a specified + // sequence) + + } /** * Writes an output file for each format (if any) specified in the @@ -949,18 +967,18 @@ public class Jalview implements ApplicationSingletonI * corresponding alignment image output. * * @param aparser - * @param af * @param format */ - private void createOutputFiles(ArgsParser aparser, AlignFrame af, - FileFormatI format) + private void createOutputFiles(ArgsParser aparser, FileFormatI format) { + // logic essentially the same as 2.11.2/2.11.3 but uses a switch instead + AlignFrame af = currentAlignFrame; while (aparser.getSize() >= 2) { String outputFormat = aparser.nextValue(); File imageFile; String fname; - switch (outputFormat.toLowerCase()) + switch (outputFormat.toLowerCase(Locale.ROOT)) { case "png": imageFile = new File(aparser.nextValue()); @@ -1006,33 +1024,257 @@ public class Jalview implements ApplicationSingletonI System.out.println( "Creating image map: " + imageFile.getAbsolutePath()); continue; - } - if (!Platform.isJS()) - { - // skipping outputFormat? - System.out.println("Unknown arg: " + outputFormat); - fname = new File(aparser.nextValue()).getAbsolutePath(); - af.saveAlignment(fname, format); - if (af.isSaveAlignmentSuccessful()) + default: + // fall through - try to parse as an alignment data export format + FileFormatI outFormat = null; + try + { + outFormat = FileFormats.getInstance().forName(outputFormat); + } catch (Exception formatP) + { + } + if (outFormat == null) + { + System.out.println("Couldn't parse " + outputFormat + + " as a valid Jalview format string."); + continue; + } + if (!outFormat.isWritable()) { System.out.println( - "Written alignment in " + format + " format to " + fname); + "This version of Jalview does not support alignment export as " + + outputFormat); + continue; + } + // record file as it was passed to Jalview so it is recognisable to the CLI + // caller + String file; + fname = new File(file = aparser.nextValue()).getAbsolutePath(); + // JBPNote - yuck - really wish we did have a bean returned from this which gave + // success/fail like before ! + af.saveAlignment(fname, outFormat); + if (!af.isSaveAlignmentSuccessful()) + { + System.out.println("Written alignment in " + outputFormat + + " format to " + file); + continue; } else { - System.out.println("Error writing file " + fname + " in " + format - + " format!!"); + System.out.println("Error writing file " + file + " in " + + outputFormat + " format!!"); } } - while (aparser.getSize() > 0) + } + // ??? Should report - 'ignoring' extra args here... + while (aparser.getSize() > 0) + { + System.out.println("Ignoring extra argument: " + aparser.nextValue()); + } + } + + private static void setLookAndFeel() + { + // property laf = "crossplatform", "system", "gtk", "metal", "nimbus" or + // "mac" + // If not set (or chosen laf fails), use the normal SystemLaF and if on Mac, + // try Quaqua/Vaqua. + String lafProp = System.getProperty("laf"); + String lafSetting = Cache.getDefault("PREFERRED_LAF", null); + String laf = "none"; + if (lafProp != null) + { + laf = lafProp; + } + else if (lafSetting != null) + { + laf = lafSetting; + } + boolean lafSet = false; + switch (laf) + { + case "crossplatform": + lafSet = setCrossPlatformLookAndFeel(); + if (!lafSet) + { + Cache.log.error("Could not set requested laf=" + laf); + } + break; + case "system": + lafSet = setSystemLookAndFeel(); + if (!lafSet) + { + Cache.log.error("Could not set requested laf=" + laf); + } + break; + case "gtk": + lafSet = setGtkLookAndFeel(); + if (!lafSet) + { + Cache.log.error("Could not set requested laf=" + laf); + } + break; + case "metal": + lafSet = setMetalLookAndFeel(); + if (!lafSet) + { + Cache.log.error("Could not set requested laf=" + laf); + } + break; + case "nimbus": + lafSet = setNimbusLookAndFeel(); + if (!lafSet) + { + Cache.log.error("Could not set requested laf=" + laf); + } + break; + case "quaqua": + lafSet = setQuaquaLookAndFeel(); + if (!lafSet) { - System.out.println("Unknown arg: " + aparser.nextValue()); + Cache.log.error("Could not set requested laf=" + laf); } break; + case "vaqua": + lafSet = setVaquaLookAndFeel(); + if (!lafSet) + { + Cache.log.error("Could not set requested laf=" + laf); + } + break; + case "mac": + lafSet = setMacLookAndFeel(); + if (!lafSet) + { + Cache.log.error("Could not set requested laf=" + laf); + } + break; + case "none": + break; + default: + Cache.log.error("Requested laf=" + laf + " not implemented"); } + if (!lafSet) + { + setSystemLookAndFeel(); + if (Platform.isLinux()) + { + setMetalLookAndFeel(); + } + if (Platform.isMac()) + { + setMacLookAndFeel(); + } + } + } + private static boolean setCrossPlatformLookAndFeel() + { + boolean set = false; + try + { + UIManager.setLookAndFeel( + UIManager.getCrossPlatformLookAndFeelClassName()); + set = true; + } catch (Exception ex) + { + Cache.log.error("Unexpected Look and Feel Exception"); + Cache.log.error(ex.getMessage()); + Cache.log.debug(Cache.getStackTraceString(ex)); + } + return set; } + private static boolean setSystemLookAndFeel() + { + boolean set = false; + try + { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + set = true; + } catch (Exception ex) + { + Cache.log.error("Unexpected Look and Feel Exception"); + Cache.log.error(ex.getMessage()); + Cache.log.debug(Cache.getStackTraceString(ex)); + } + return set; + } + + private static boolean setSpecificLookAndFeel(String name, + String className, boolean nameStartsWith) + { + boolean set = false; + try + { + for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) + { + if (info.getName() != null && nameStartsWith + ? info.getName().toLowerCase(Locale.ROOT) + .startsWith(name.toLowerCase(Locale.ROOT)) + : info.getName().toLowerCase(Locale.ROOT).equals(name.toLowerCase(Locale.ROOT))) + { + className = info.getClassName(); + break; + } + } + UIManager.setLookAndFeel(className); + set = true; + } catch (Exception ex) + { + Cache.log.error("Unexpected Look and Feel Exception"); + Cache.log.error(ex.getMessage()); + Cache.log.debug(Cache.getStackTraceString(ex)); + } + return set; + } + + private static boolean setGtkLookAndFeel() + { + return setSpecificLookAndFeel("gtk", + "com.sun.java.swing.plaf.gtk.GTKLookAndFeel", true); + } + + private static boolean setMetalLookAndFeel() + { + return setSpecificLookAndFeel("metal", + "javax.swing.plaf.metal.MetalLookAndFeel", false); + } + + private static boolean setNimbusLookAndFeel() + { + return setSpecificLookAndFeel("nimbus", + "javax.swing.plaf.nimbus.NimbusLookAndFeel", false); + } + + private static boolean setQuaquaLookAndFeel() + { + return setSpecificLookAndFeel("quaqua", + ch.randelshofer.quaqua.QuaquaManager.getLookAndFeel().getClass() + .getName(), + false); + } + + private static boolean setVaquaLookAndFeel() + { + return setSpecificLookAndFeel("vaqua", + "org.violetlib.aqua.AquaLookAndFeel", false); + } + + private static boolean setMacLookAndFeel() + { + boolean set = false; + System.setProperty("com.apple.mrj.application.apple.menu.about.name", + ChannelProperties.getProperty("app_name")); + System.setProperty("apple.laf.useScreenMenuBar", "true"); + set = setQuaquaLookAndFeel(); + if ((!set) || !UIManager.getLookAndFeel().getClass().toString() + .toLowerCase(Locale.ROOT).contains("quaqua")) + { + set = setVaquaLookAndFeel(); + } + return set; + } private static void showUsage() { System.out.println( @@ -1071,7 +1313,9 @@ public class Jalview implements ApplicationSingletonI + "-jabaws URL\tSpecify URL for Jabaws services (e.g. for a local installation).\n" + "-fetchfrom nickname\tQuery nickname for features for the alignments and display them.\n" + "-groovy FILE\tExecute groovy script in FILE, after all other arguments have been processed (if FILE is the text 'STDIN' then the file will be read from STDIN)\n" - + "\n~Read documentation in Application or visit http://www.jalview.org for description of Features and Annotations file~\n\n"); + + "-jvmmempc=PERCENT\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to PERCENT% of total physical memory detected. This defaults to 90 if total physical memory can be detected. See https://www.jalview.org/help/html/memory.html for more details.\n" + + "-jvmmemmax=MAXMEMORY\tOnly available with standalone executable jar or jalview.bin.Launcher. Limit maximum heap size (memory) to MAXMEMORY. MAXMEMORY can be specified in bytes, kilobytes(k), megabytes(m), gigabytes(g) or if you're lucky enough, terabytes(t). This defaults to 32g if total physical memory can be detected, or to 8g if total physical memory cannot be detected. See https://www.jalview.org/help/html/memory.html for more details.\n" + + "\n~Read documentation in Application or visit https://www.jalview.org for description of Features and Annotations file~\n\n"); } private static void startUsageStats(final Desktop desktop) @@ -1241,8 +1485,8 @@ public class Jalview implements ApplicationSingletonI } /** - * Quit method delegates to Desktop.quit - unless running in headless mode - * when it just ends the JVM + * Quit method delegates to Desktop.quit - unless running in headless mode when + * it just ends the JVM */ public void quit() { @@ -1265,34 +1509,23 @@ public class Jalview implements ApplicationSingletonI { Jalview.getInstance().currentAlignFrame = currentAlignFrame; } - - /** - * 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) + public void notifyWorker(AlignCalcWorkerI worker, String status) { - return (Platform.isJS() ? getInstance().app.getAppID(frameType) : null); + // System.out.println("Jalview worker " + worker.getClass().getSimpleName() + // + " " + status); } - public String doSendCallback(Object callback, Object[] data) { - return (Platform.isJS() ? app.doSendCallback(callback, data) : null); - } - public void notifyWorker(AlignCalcWorkerI worker, String status) + private static boolean isInteractive = true; + + public static boolean isInteractive() { - // System.out.println("Jalview worker " + worker.getClass().getSimpleName() - // + " " + status); + return isInteractive; } - public Object arrayToSeparatorList(String[] seqs) + public static void setInteractive(boolean tf) { - return (Platform.isJS() ? app.arrayToSeparatorList(seqs) : null); + isInteractive = tf; } - - }