X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FQuitHandler.java;h=ad7684ef6a5f6ad7a4baf182b01281cedeb98064;hb=1624d4fc89f17c4a6cdb80b7d4cc37a095b6fe67;hp=79723cf562040d4eb5b13d271cbc9f34d1b1c533;hpb=80b889f0cca49103e1b20ed806755a0719789906;p=jalview.git diff --git a/src/jalview/gui/QuitHandler.java b/src/jalview/gui/QuitHandler.java index 79723cf..ad7684e 100644 --- a/src/jalview/gui/QuitHandler.java +++ b/src/jalview/gui/QuitHandler.java @@ -2,7 +2,7 @@ package jalview.gui; import java.io.File; import java.util.List; -import java.util.concurrent.Callable; +import java.util.Locale; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -17,6 +17,7 @@ import javax.swing.JOptionPane; import javax.swing.JTextPane; import com.formdev.flatlaf.extras.FlatDesktop; +import com.formdev.flatlaf.extras.FlatDesktop.QuitResponse; import jalview.api.AlignmentViewPanel; import jalview.bin.Cache; @@ -36,6 +37,8 @@ public class QuitHandler private static boolean interactive = true; + private static QuitResponse flatlafResponse = null; + public static enum QResponse { NULL, QUIT, CANCEL_QUIT, FORCE_QUIT @@ -55,29 +58,17 @@ public class QuitHandler private static ExecutorService executor = Executors.newFixedThreadPool(3); - public static QResponse setQuitHandler() + public static void setQuitHandler() { FlatDesktop.setQuitHandler(response -> { - Callable performQuit = () -> { - response.performQuit(); - setResponse(QResponse.QUIT); - return null; - }; - Callable performForceQuit = () -> { - response.performQuit(); - setResponse(QResponse.FORCE_QUIT); - return null; - }; - Callable cancelQuit = () -> { - response.cancelQuit(); - // reset - setResponse(QResponse.NULL); - return null; - }; - getQuitResponse(true, performQuit, performForceQuit, cancelQuit); + flatlafResponse = response; + Desktop.instance.desktopQuit(); }); + } - return gotQuitResponse(); + public static void startForceQuit() + { + setResponse(QResponse.FORCE_QUIT); } private static QResponse gotQuitResponse = QResponse.NULL; @@ -85,6 +76,11 @@ public class QuitHandler protected static QResponse setResponse(QResponse qresponse) { gotQuitResponse = qresponse; + if ((qresponse == QResponse.CANCEL_QUIT || qresponse == QResponse.NULL) + && flatlafResponse != null) + { + flatlafResponse.cancelQuit(); + } return qresponse; } @@ -93,25 +89,22 @@ public class QuitHandler return gotQuitResponse; } - public static final Callable defaultCancelQuit = () -> { + public static final Runnable defaultCancelQuit = () -> { Console.debug("QuitHandler: (default) Quit action CANCELLED by user"); // reset setResponse(QResponse.CANCEL_QUIT); - return null; }; - public static final Callable defaultOkQuit = () -> { + public static final Runnable defaultOkQuit = () -> { Console.debug("QuitHandler: (default) Quit action CONFIRMED by user"); setResponse(QResponse.QUIT); - return null; }; - public static final Callable defaultForceQuit = () -> { + public static final Runnable defaultForceQuit = () -> { Console.debug("QuitHandler: (default) Quit action FORCED by user"); // note that shutdown hook will not be run Runtime.getRuntime().halt(0); setResponse(QResponse.FORCE_QUIT); // this line never reached! - return null; }; public static QResponse getQuitResponse(boolean ui) @@ -120,8 +113,8 @@ public class QuitHandler defaultCancelQuit); } - public static QResponse getQuitResponse(boolean ui, Callable okQuit, - Callable forceQuit, Callable cancelQuit) + public static QResponse getQuitResponse(boolean ui, Runnable okQuit, + Runnable forceQuit, Runnable cancelQuit) { QResponse got = gotQuitResponse(); if (got != QResponse.NULL && got != QResponse.CANCEL_QUIT) @@ -169,8 +162,7 @@ public class QuitHandler qd.showDialogOnTopAsync( new StringBuilder( MessageManager.getString("label.quit_jalview")) - .append("\n").append(messageString) - .toString(), + .append("\n").append(messageString).toString(), MessageManager.getString("action.quit"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, new Object[] @@ -187,6 +179,8 @@ public class QuitHandler int count = Desktop.instance.structureViewersStillRunningCount(); if (count > 0) { + String alwaysCloseExternalViewers = Cache + .getDefault("ALWAYS_CLOSE_EXTERNAL_VIEWERS", "ask"); String prompt = MessageManager .formatMessage(count == 1 ? "label.confirm_quit_viewer" : "label.confirm_quit_viewers"); @@ -197,11 +191,22 @@ public class QuitHandler String[] buttonsText = { MessageManager.getString("action.yes"), MessageManager.getString("action.no"), cancelQuitText }; - int confirmResponse = JvOptionPane.showOptionDialog( - Desktop.instance, prompt, title, - JvOptionPane.YES_NO_CANCEL_OPTION, - JvOptionPane.WARNING_MESSAGE, null, buttonsText, - cancelQuit); + int confirmResponse = -1; + if (alwaysCloseExternalViewers == null || "ask".equals( + alwaysCloseExternalViewers.toLowerCase(Locale.ROOT))) + { + confirmResponse = JvOptionPane.showOptionDialog(Desktop.instance, + prompt, title, JvOptionPane.YES_NO_CANCEL_OPTION, + JvOptionPane.WARNING_MESSAGE, null, buttonsText, + cancelQuit); + } + else + { + confirmResponse = Cache + .getDefault("ALWAYS_CLOSE_EXTERNAL_VIEWERS", false) + ? JvOptionPane.YES_OPTION + : JvOptionPane.NO_OPTION; + } if (confirmResponse == JvOptionPane.CANCEL_OPTION) { @@ -240,7 +245,7 @@ public class QuitHandler } } - Callable next = null; + Runnable next = null; switch (gotQuitResponse()) { case QUIT: @@ -281,9 +286,8 @@ public class QuitHandler return gotQuitResponse(); } - private static QResponse waitQuit(boolean interactive, - Callable okQuit, Callable forceQuit, - Callable cancelQuit) + private static QResponse waitQuit(boolean interactive, Runnable okQuit, + Runnable forceQuit, Runnable cancelQuit) { // check for saves in progress if (!BackupFiles.hasSavesInProgress())