X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FJalview.java;h=290f92062b30a3da5cecea1c40f6d5996a4f9495;hb=304e64fb34b32659be1bbfd39fb4e15b2f79586e;hp=36b5ea3a1439873b513e0750dc50db332473271a;hpb=700502ef808b904af9431e7eca8efe3b4c457e04;p=jalview.git diff --git a/src/jalview/bin/Jalview.java b/src/jalview/bin/Jalview.java index 36b5ea3..290f920 100755 --- a/src/jalview/bin/Jalview.java +++ b/src/jalview/bin/Jalview.java @@ -21,6 +21,7 @@ package jalview.bin; import java.awt.GraphicsEnvironment; + import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; @@ -38,11 +39,15 @@ 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; @@ -70,6 +75,8 @@ 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; @@ -91,7 +98,6 @@ import jalview.ws.jws2.Jws2Discoverer; */ public class Jalview implements ApplicationSingletonI { - // for testing those nasty messages you cannot ever find. // static // { @@ -116,9 +122,9 @@ public class Jalview implements ApplicationSingletonI private Jalview() { + Platform.getURLCommandArguments(); } - private boolean headless; private Desktop desktop; @@ -154,9 +160,12 @@ public class Jalview implements ApplicationSingletonI static { - if (Platform.isJS()) { - Platform.getURLCommandArguments(); - } else /** @j2sIgnore */ + if (!Platform.isJS()) + /** + * Java only + * + * @j2sIgnore + */ { // grab all the rights we can for the JVM Policy.setPolicy(new Policy() @@ -250,8 +259,13 @@ public class Jalview implements ApplicationSingletonI { Platform.startJavaLogging(); } + getInstance().doMain(args); + } + + + /** * @param args @@ -291,12 +305,10 @@ 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) @@ -308,6 +320,7 @@ public class Jalview implements ApplicationSingletonI appletResourcePath = (String) aparser.getAppletValue("resourcepath", null, true); } + else /** * Java only @@ -315,7 +328,6 @@ public class Jalview implements ApplicationSingletonI * @j2sIgnore */ { - if (usrPropsFile != null) { System.out.println( @@ -338,12 +350,6 @@ public class Jalview implements ApplicationSingletonI } headless = true; } - if (GraphicsEnvironment.isHeadless()) - { - headless = true; - } - // <= 2) { String outputFormat = aparser.nextValue(); File imageFile; String fname; - switch (outputFormat.toLowerCase()) + switch (outputFormat.toLowerCase(Locale.ROOT)) { case "png": imageFile = new File(aparser.nextValue()); @@ -1083,6 +1073,208 @@ public class Jalview implements ApplicationSingletonI } } + 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) + { + 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( @@ -1121,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) @@ -1291,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() { @@ -1315,7 +1509,6 @@ public class Jalview implements ApplicationSingletonI { Jalview.getInstance().currentAlignFrame = currentAlignFrame; } - public void notifyWorker(AlignCalcWorkerI worker, String status) { @@ -1335,5 +1528,4 @@ public class Jalview implements ApplicationSingletonI { isInteractive = tf; } - }