X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=35c78187a1e335d290ab422799f2babe6b008d19;hb=e57f77dc13f5a295cf49a403da05770a68a6e22b;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
: " ");
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();
+ }
}
}