JAL-1988 Make sensible choices if only the opening file has been opened, and alter...
[jalview.git] / src / jalview / gui / QuitHandler.java
index 75ff0b0..bedddd1 100644 (file)
@@ -29,39 +29,51 @@ import jalview.util.Platform;
 
 public class QuitHandler
 {
-  private static final int MIN_WAIT_FOR_SAVE = 3000;
+  private static final int MIN_WAIT_FOR_SAVE = 1000;
 
   private static final int MAX_WAIT_FOR_SAVE = 20000;
 
-  private static final int NON_INTERACTIVE_WAIT_CYCLES = 2;
+  private static boolean interactive = true;
 
   public static enum QResponse
   {
     NULL, QUIT, CANCEL_QUIT, FORCE_QUIT
   };
 
+  public static enum Message
+  {
+    UNSAVED_CHANGES, UNSAVED_ALIGNMENTS
+  };
+
+  protected static Message message = Message.UNSAVED_CHANGES;
+
+  public static void setMessage(Message m)
+  {
+    message = m;
+  }
+
   private static ExecutorService executor = Executors.newFixedThreadPool(3);
 
   public static QResponse setQuitHandler()
   {
     FlatDesktop.setQuitHandler(response -> {
-      Callable<QResponse> performQuit = () -> {
+      Callable<Void> performQuit = () -> {
         response.performQuit();
-        return setResponse(QResponse.QUIT);
+        setResponse(QResponse.QUIT);
+        return null;
       };
-      Callable<QResponse> performForceQuit = () -> {
+      Callable<Void> performForceQuit = () -> {
         response.performQuit();
-        return setResponse(QResponse.FORCE_QUIT);
+        setResponse(QResponse.FORCE_QUIT);
+        return null;
       };
-      Callable<QResponse> cancelQuit = () -> {
+      Callable<Void> cancelQuit = () -> {
         response.cancelQuit();
         // reset
         setResponse(QResponse.NULL);
-        // but return cancel
-        return QResponse.CANCEL_QUIT;
+        return null;
       };
-      QResponse qresponse = getQuitResponse(true, performQuit,
-              performForceQuit, cancelQuit);
+      getQuitResponse(true, performQuit, performForceQuit, cancelQuit);
     });
 
     return gotQuitResponse();
@@ -69,7 +81,7 @@ public class QuitHandler
 
   private static QResponse gotQuitResponse = QResponse.NULL;
 
-  private static QResponse setResponse(QResponse qresponse)
+  protected static QResponse setResponse(QResponse qresponse)
   {
     gotQuitResponse = qresponse;
     return qresponse;
@@ -80,24 +92,25 @@ public class QuitHandler
     return gotQuitResponse;
   }
 
-  public static final Callable<QResponse> defaultCancelQuit = () -> {
+  public static final Callable<Void> defaultCancelQuit = () -> {
     Console.debug("QuitHandler: (default) Quit action CANCELLED by user");
     // reset
-    setResponse(QResponse.NULL);
-    // and return cancel
-    return QResponse.CANCEL_QUIT;
+    setResponse(QResponse.CANCEL_QUIT);
+    return null;
   };
 
-  public static final Callable<QResponse> defaultOkQuit = () -> {
+  public static final Callable<Void> defaultOkQuit = () -> {
     Console.debug("QuitHandler: (default) Quit action CONFIRMED by user");
-    return setResponse(QResponse.QUIT);
+    setResponse(QResponse.QUIT);
+    return null;
   };
 
-  public static final Callable<QResponse> defaultForceQuit = () -> {
+  public static final Callable<Void> defaultForceQuit = () -> {
     Console.debug("QuitHandler: (default) Quit action FORCED by user");
     // note that shutdown hook will not be run
     Runtime.getRuntime().halt(0);
-    return setResponse(QResponse.FORCE_QUIT); // this line never reached!
+    setResponse(QResponse.FORCE_QUIT); // this line never reached!
+    return null;
   };
 
   public static QResponse getQuitResponse(boolean ui)
@@ -106,11 +119,8 @@ public class QuitHandler
             defaultCancelQuit);
   }
 
-  private static boolean interactive = true;
-
-  public static QResponse getQuitResponse(boolean ui,
-          Callable<QResponse> okQuit, Callable<QResponse> forceQuit,
-          Callable<QResponse> cancelQuit)
+  public static QResponse getQuitResponse(boolean ui, Callable<Void> okQuit,
+          Callable<Void> forceQuit, Callable<Void> cancelQuit)
   {
     QResponse got = gotQuitResponse();
     if (got != QResponse.NULL && got != QResponse.CANCEL_QUIT)
@@ -147,16 +157,17 @@ public class QuitHandler
 
     if (confirmQuit)
     {
+      String messageString = MessageManager
+              .getString(message == Message.UNSAVED_ALIGNMENTS
+                      ? "label.unsaved_alignments"
+                      : "label.unsaved_changes");
       JvOptionPane.newOptionDialog()
               .setResponseHandler(JOptionPane.YES_OPTION, defaultOkQuit)
-              .setResponseHandler(JOptionPane.NO_OPTION, defaultCancelQuit)
+              .setResponseHandler(JOptionPane.NO_OPTION, cancelQuit)
               .showDialogOnTopAsync(
                       new StringBuilder(MessageManager
-                              .getString("label.quit_jalview"))
-                                      .append("\n")
-                                      .append(MessageManager.getString(
-                                              "label.unsaved_changes"))
-                                      .toString(),
+                              .getString("label.quit_jalview")).append("\n")
+                              .append(messageString).toString(),
                       MessageManager.getString("action.quit"),
                       JOptionPane.YES_NO_OPTION,
                       JOptionPane.QUESTION_MESSAGE, null, new Object[]
@@ -170,6 +181,7 @@ public class QuitHandler
     if (got == QResponse.CANCEL_QUIT)
     {
       // reset
+      Console.debug("Cancelling quit.  Resetting response to NULL");
       setResponse(QResponse.NULL);
       // but return cancel
       return QResponse.CANCEL_QUIT;
@@ -179,13 +191,13 @@ public class QuitHandler
       if (Cache.getDefault("WAIT_FOR_SAVE", true)
               && BackupFiles.hasSavesInProgress())
       {
-        QResponse waitResponse = waitQuit(interactive, okQuit, forceQuit,
-                cancelQuit);
+        waitQuit(interactive, okQuit, forceQuit, cancelQuit);
+        QResponse waitResponse = gotQuitResponse();
         wait = waitResponse == QResponse.QUIT;
       }
     }
 
-    Callable<QResponse> next = null;
+    Callable<Void> next = null;
     switch (gotQuitResponse())
     {
     case QUIT:
@@ -200,7 +212,8 @@ public class QuitHandler
     }
     try
     {
-      got = executor.submit(next).get();
+      executor.submit(next).get();
+      got = gotQuitResponse();
     } catch (InterruptedException | ExecutionException e)
     {
       jalview.bin.Console
@@ -208,12 +221,18 @@ public class QuitHandler
     }
     setResponse(got);
 
+    if (gotQuitResponse() == QResponse.CANCEL_QUIT)
+    {
+      // reset if cancelled
+      setResponse(QResponse.NULL);
+      return QResponse.CANCEL_QUIT;
+    }
     return gotQuitResponse();
   }
 
   private static QResponse waitQuit(boolean interactive,
-          Callable<QResponse> okQuit, Callable<QResponse> forceQuit,
-          Callable<QResponse> cancelQuit)
+          Callable<Void> okQuit, Callable<Void> forceQuit,
+          Callable<Void> cancelQuit)
   {
     // check for saves in progress
     if (!BackupFiles.hasSavesInProgress())
@@ -241,7 +260,6 @@ public class QuitHandler
     int waitTime = Math.min(MAX_WAIT_FOR_SAVE,
             Math.max(MIN_WAIT_FOR_SAVE, size / 2));
     Console.debug("Set waitForSave to " + waitTime);
-    QResponse waitResponse = QResponse.NULL;
 
     int iteration = 0;
     boolean doIterations = true; // note iterations not used in the gui now,
@@ -373,9 +391,7 @@ public class QuitHandler
       } // end if interactive
 
     } // end while wait iteration loop
-    waitResponse = gotQuitResponse();
-
-    return waitResponse;
+    return gotQuitResponse();
   };
 
   private static String waitingForSaveMessage()
@@ -400,4 +416,9 @@ public class QuitHandler
             .append(MessageManager.getString("label.quit_after_saving"));
     return messageSB.toString();
   }
+
+  public static void abortQuit()
+  {
+    setResponse(QResponse.CANCEL_QUIT);
+  }
 }
\ No newline at end of file