X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=35c78187a1e335d290ab422799f2babe6b008d19;hb=ccc53e88e3260886f5d3bdacc619c0f374be9b8f;hp=b1f9000143ce1cfa82d96db5764ebfe2e41450e7;hpb=25e2a6f59681e1e7d9602a451fbcf3a2b414a49a;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index b1f9000..35c7818 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -184,7 +184,7 @@ public class Desktop extends jalview.jbgui.GDesktop : " \"University"); sb.append( - "

For help, see www.jalview.org/faq and join discourse.jalview.org"); + "

For help, see www.jalview.org/faq and join discourse.jalview.org"); sb.append("

If you use Jalview, please cite:" + "
Waterhouse, A.M., Procter, J.B., Martin, D.M.A, Clamp, M. and Barton, G. J. (2009)" + "
Jalview Version 2 - a multiple sequence alignment editor and analysis workbench" @@ -1477,62 +1477,95 @@ public class Desktop extends jalview.jbgui.GDesktop desktopQuit(true, false); } - public QuitHandler.QResponse desktopQuit(boolean ui, boolean disposeFlag) + /** + * close everything, stash window geometries, and shut down all associated + * threads/workers + * + * @param dispose + * - sets the dispose on close flag - JVM may terminate when set + * @param terminateJvm + * - quit with prejudice - stops the JVM. + */ + public void quitTheDesktop(boolean dispose, boolean terminateJvm) { - final Runnable doDesktopQuit = () -> { - Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); - Cache.setProperty("SCREENGEOMETRY_WIDTH", screen.width + ""); - Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height + ""); - storeLastKnownDimensions("", new Rectangle(getBounds().x, - getBounds().y, getWidth(), getHeight())); + Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); + Cache.setProperty("SCREENGEOMETRY_WIDTH", screen.width + ""); + Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height + ""); + storeLastKnownDimensions("", new Rectangle(getBounds().x, getBounds().y, + getWidth(), getHeight())); - if (jconsole != null) - { - storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds()); - jconsole.stopConsole(); - } + if (jconsole != null) + { + storeLastKnownDimensions("JAVA_CONSOLE_", jconsole.getBounds()); + jconsole.stopConsole(); + } - if (jvnews != null) - { - storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds()); - } + if (jvnews != null) + { + storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds()); + } - // Frames should all close automatically. Keeping external - // viewers open should already be decided by user. - closeAll_actionPerformed(null); + // Frames should all close automatically. Keeping external + // viewers open should already be decided by user. + closeAll_actionPerformed(null); - // check for aborted quit - if (QuitHandler.quitCancelled()) - { - jalview.bin.Console.debug("Desktop aborting quit"); - return; - } + if (dialogExecutor != null) + { + dialogExecutor.shutdownNow(); + } - if (dialogExecutor != null) - { - dialogExecutor.shutdownNow(); - } + if (groovyConsole != null) + { + // suppress a possible repeat prompt to save script + groovyConsole.setDirty(false); - if (groovyConsole != null) + // and tidy up + if (((Window) groovyConsole.getFrame()) != null + && ((Window) groovyConsole.getFrame()).isVisible()) { - // suppress a possible repeat prompt to save script - groovyConsole.setDirty(false); + // console is visible -- FIXME JAL-4327 groovyConsole.exit(); } - - if (QuitHandler.gotQuitResponse() == QResponse.FORCE_QUIT) + else { - // note that shutdown hook will not be run - jalview.bin.Console.debug("Force Quit selected by user"); - Runtime.getRuntime().halt(0); + // console is not, so just let it dispose itself when we shutdown + // we don't call groovyConsole.exit() because it calls the shutdown + // handler with invokeAndWait() causing deadlock + groovyConsole = null; } + } + + if (terminateJvm) + { + // note that shutdown hook will not be run + jalview.bin.Console.debug("Force Quit selected by user"); + Runtime.getRuntime().halt(0); + } + + jalview.bin.Console.debug("Quit selected by user"); + if (dispose) + { + instance.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + // instance.dispose(); + } + } + + public QuitHandler.QResponse desktopQuit(boolean ui, boolean disposeFlag) + { + final Runnable doDesktopQuit = () -> { - jalview.bin.Console.debug("Quit selected by user"); - if (disposeFlag) + // FIRST !! check for aborted quit + if (QuitHandler.quitCancelled()) { - instance.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - // instance.dispose(); + jalview.bin.Console + .debug("Quit was cancelled - Desktop aborting quit"); + return; } + + // Proceed with quitting + quitTheDesktop(disposeFlag, + QuitHandler.gotQuitResponse() == QResponse.FORCE_QUIT); + // and exit the JVM instance.quit(); }; @@ -1541,7 +1574,14 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * Don't call this directly, use desktopQuit() above. Exits the program. + * Exits the program and the JVM. + * + * Don't call this directly + * + * - use desktopQuit() above to tidy up first. + * + * - use closeDesktop() to shutdown Jalview without shutting down the JVM + * */ @Override public void quit() @@ -2663,8 +2703,9 @@ public class Desktop extends jalview.jbgui.GDesktop { JalviewObjectI j = new JalviewObject(this); groovyConsole = new groovy.console.ui.Console(); - groovyConsole.setVariable("Jalview", j); - groovyConsole.setVariable("currentAlFrame", getCurrentAlignFrame()); + groovyConsole.setVariable(JalviewObjectI.jalviewObjectName, j); + groovyConsole.setVariable(JalviewObjectI.currentAlFrameName, + getCurrentAlignFrame()); groovyConsole.run(); /* @@ -3048,7 +3089,16 @@ public class Desktop extends jalview.jbgui.GDesktop */ public static void showUrl(final String url) { - showUrl(url, Desktop.instance); + if (url != null && !url.trim().equals("")) + { + jalview.bin.Console.info("Opening URL: " + url); + showUrl(url, Desktop.instance); + } + else + { + jalview.bin.Console.warn("Ignoring attempt to show an empty URL."); + } + } /** @@ -3699,32 +3749,35 @@ public class Desktop extends jalview.jbgui.GDesktop } /** - * closes the current instance window, disposes and forgets about it. + * closes the current instance window, but leaves the JVM running. Bypasses + * any shutdown prompts, but does not set window dispose on close in case JVM + * terminates. */ public static void closeDesktop() { if (Desktop.instance != null) { - Desktop.instance.closeAll_actionPerformed(null); - Desktop.instance.setVisible(false); Desktop us = Desktop.instance; - Desktop.instance = null; + Desktop.instance.quitTheDesktop(false, false); // call dispose in a separate thread - try to avoid indirect deadlocks - new Thread(new Runnable() + if (us != null) { - @Override - public void run() + new Thread(new Runnable() { - ExecutorService dex = us.dialogExecutor; - if (dex != null) + @Override + public void run() { - dex.shutdownNow(); - us.dialogExecutor = null; - us.block.drainPermits(); + ExecutorService dex = us.dialogExecutor; + if (dex != null) + { + dex.shutdownNow(); + us.dialogExecutor = null; + us.block.drainPermits(); + } + us.dispose(); } - us.dispose(); - } - }).start(); + }).start(); + } } }