X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FDesktop.java;h=070e67db37a91302ecdaee03f2453fec94a06b6d;hb=33e1f07ce64ed7f3db62ad2ea92968f009013e04;hp=ab5800c2dbe45cc1979d0e7fe56f02ebf652d4b4;hpb=dfb174e9d22355eb1abef39224f77389431c3350;p=jalview.git diff --git a/src/jalview/gui/Desktop.java b/src/jalview/gui/Desktop.java index ab5800c..070e67d 100644 --- a/src/jalview/gui/Desktop.java +++ b/src/jalview/gui/Desktop.java @@ -114,6 +114,8 @@ import jalview.bin.Cache; import jalview.bin.Jalview; import jalview.bin.Jalview.ExitCode; import jalview.bin.argparser.Arg; +import jalview.bin.groovy.JalviewObject; +import jalview.bin.groovy.JalviewObjectI; import jalview.datamodel.Alignment; import jalview.datamodel.HiddenColumns; import jalview.datamodel.Sequence; @@ -158,7 +160,7 @@ import jalview.ws.utils.UrlDownloadClient; */ public class Desktop extends jalview.jbgui.GDesktop implements DropTargetListener, ClipboardOwner, IProgressIndicator, - jalview.api.StructureSelectionManagerProvider + jalview.api.StructureSelectionManagerProvider, JalviewObjectI { private static final String CITATION; static @@ -1056,7 +1058,7 @@ public class Desktop extends jalview.jbgui.GDesktop { if (itf instanceof AlignFrame) { - Jalview.setCurrentAlignFrame((AlignFrame) itf); + Jalview.getInstance().setCurrentAlignFrame((AlignFrame) itf); } itf.requestFocus(); } @@ -1475,62 +1477,73 @@ public class Desktop extends jalview.jbgui.GDesktop desktopQuit(true, false); } - public QuitHandler.QResponse desktopQuit(boolean ui, boolean disposeFlag) - { - 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())); + /** + * 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) { + 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); + groovyConsole.exit(); + } - if (groovyConsole != null) - { - // suppress a possible repeat prompt to save script - groovyConsole.setDirty(false); - groovyConsole.exit(); - } + if (terminateJvm) + { + // note that shutdown hook will not be run + jalview.bin.Console.debug("Force Quit selected by user"); + Runtime.getRuntime().halt(0); + } - if (QuitHandler.gotQuitResponse() == QResponse.FORCE_QUIT) - { - // 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(); }; @@ -1539,7 +1552,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() @@ -1679,7 +1699,7 @@ public class Desktop extends jalview.jbgui.GDesktop { } } - Jalview.setCurrentAlignFrame(null); + Jalview.getInstance().setCurrentAlignFrame(null); jalview.bin.Console.info("ALL CLOSED"); /* @@ -2138,7 +2158,7 @@ public class Desktop extends jalview.jbgui.GDesktop return null; } List aps = new ArrayList<>(); - AlignFrame[] frames = getAlignFrames(); + AlignFrame[] frames = Desktop.getDesktopAlignFrames(); if (frames == null) { return null; @@ -2175,7 +2195,7 @@ public class Desktop extends jalview.jbgui.GDesktop List viewp = new ArrayList<>(); if (desktop != null) { - AlignFrame[] frames = Desktop.getAlignFrames(); + AlignFrame[] frames = Desktop.getDesktopAlignFrames(); for (AlignFrame afr : frames) { @@ -2536,12 +2556,12 @@ public class Desktop extends jalview.jbgui.GDesktop * * @return an array of AlignFrame, or null if none found */ - public static AlignFrame[] getAlignFrames() + @Override + public AlignFrame[] getAlignFrames() { - if (Jalview.isHeadlessMode()) + if (desktop == null) { - // Desktop.desktop is null in headless mode - return new AlignFrame[] { Jalview.currentAlignFrame }; + return null; } JInternalFrame[] frames = Desktop.desktop.getAllFrames(); @@ -2583,6 +2603,25 @@ public class Desktop extends jalview.jbgui.GDesktop } /** + * static version + */ + public static AlignFrame[] getDesktopAlignFrames() + { + if (Jalview.isHeadlessMode()) + { + // Desktop.desktop is null in headless mode + return Jalview.getInstance().getAlignFrames(); + } + + if (instance != null && desktop != null) + { + return instance.getAlignFrames(); + } + + return null; + } + + /** * Returns an array of any AppJmol frames in the Desktop (or null if none). * * @return @@ -2624,7 +2663,7 @@ public class Desktop extends jalview.jbgui.GDesktop openGroovyConsole(); } catch (Exception ex) { - jalview.bin.Console.error("Groovy Shell Creation failed.", ex); + jalview.bin.Console.error("Groovy Console creation failed.", ex); JvOptionPane.showInternalMessageDialog(Desktop.desktop, MessageManager.getString("label.couldnt_create_groovy_shell"), @@ -2640,8 +2679,11 @@ public class Desktop extends jalview.jbgui.GDesktop { if (groovyConsole == null) { - groovyConsole = new groovy.ui.Console(); - groovyConsole.setVariable("Jalview", this); + JalviewObjectI j = new JalviewObject(this); + groovyConsole = new groovy.console.ui.Console(); + groovyConsole.setVariable(JalviewObjectI.jalviewObjectName, j); + groovyConsole.setVariable(JalviewObjectI.currentAlFrameName, + getCurrentAlignFrame()); groovyConsole.run(); /* @@ -2714,7 +2756,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ groovyShell.setEnabled(!enabled); - AlignFrame[] alignFrames = getAlignFrames(); + AlignFrame[] alignFrames = getDesktopAlignFrames(); if (alignFrames != null) { for (AlignFrame af : alignFrames) @@ -3025,7 +3067,13 @@ 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."); + } + } /** @@ -3123,7 +3171,7 @@ public class Desktop extends jalview.jbgui.GDesktop */ private Semaphore block = new Semaphore(0); - private static groovy.ui.Console groovyConsole; + private static groovy.console.ui.Console groovyConsole; /** * add another dialog thread to the queue @@ -3385,7 +3433,7 @@ public class Desktop extends jalview.jbgui.GDesktop myTopFrame.setDisplayedView(myTopFrame.alignPanel); } - public static groovy.ui.Console getGroovyConsole() + public static groovy.console.ui.Console getGroovyConsole() { return groovyConsole; } @@ -3676,32 +3724,34 @@ 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(); + } } } @@ -3845,4 +3895,9 @@ public class Desktop extends jalview.jbgui.GDesktop { button }, button, modal, new JButton[] { jb }, false); } + @Override + public AlignFrame getCurrentAlignFrame() + { + return Jalview.getInstance().getCurrentAlignFrame(); + } }