import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
+import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
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
{
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();
private static QResponse gotQuitResponse = QResponse.NULL;
- private static QResponse setResponse(QResponse qresponse)
+ protected static QResponse setResponse(QResponse qresponse)
{
gotQuitResponse = qresponse;
return qresponse;
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)
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)
if (confirmQuit)
{
- JvOptionPane.newOptionDialog()
+ setQuitDialog(JvOptionPane.newOptionDialog()
.setResponseHandler(JOptionPane.YES_OPTION, defaultOkQuit)
- .setResponseHandler(JOptionPane.NO_OPTION, defaultCancelQuit)
- .showDialogOnTopAsync(
- new StringBuilder(MessageManager
- .getString("label.quit_jalview"))
- .append("\n")
- .append(MessageManager.getString(
- "label.unsaved_changes"))
- .toString(),
- MessageManager.getString("action.quit"),
- JOptionPane.YES_NO_OPTION,
- JOptionPane.QUESTION_MESSAGE, null, new Object[]
- { MessageManager.getString("action.quit"),
- MessageManager.getString("action.cancel") },
- MessageManager.getString("action.quit"), true);
+ .setResponseHandler(JOptionPane.NO_OPTION, cancelQuit));
+ JvOptionPane qd = getQuitDialog();
+ qd.showDialogOnTopAsync(
+ new StringBuilder(
+ MessageManager.getString("label.quit_jalview"))
+ .append("\n")
+ .append(MessageManager
+ .getString("label.unsaved_changes"))
+ .toString(),
+ MessageManager.getString("action.quit"),
+ JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null,
+ new Object[]
+ { MessageManager.getString("action.quit"),
+ MessageManager.getString("action.cancel") },
+ MessageManager.getString("action.quit"), true);
}
got = gotQuitResponse();
if (got == QResponse.CANCEL_QUIT)
{
// reset
+ Console.debug("Cancelling quit. Resetting response to NULL");
setResponse(QResponse.NULL);
// but return cancel
return QResponse.CANCEL_QUIT;
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:
}
try
{
- got = executor.submit(next).get();
+ executor.submit(next).get();
+ got = gotQuitResponse();
+ } catch (RejectedExecutionException e)
+ {
+ // QuitHander.abortQuit() probably called
+ // CANCEL_QUIT test will reset QuitHandler
+ Console.info("Quit aborted!");
+ got = QResponse.NULL;
+ setResponse(QResponse.NULL);
} catch (InterruptedException | ExecutionException e)
{
jalview.bin.Console
}
setResponse(got);
+ if (quitCancelled())
+ {
+ // reset if cancelled
+ Console.debug("Quit 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())
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,
}
else
{
- if (!(QuitHandler.gotQuitResponse() == QResponse.CANCEL_QUIT
- || QuitHandler.gotQuitResponse() == QResponse.NULL))
+ if (!(quitCancelled()))
{
for (int i = 0; i < buttons.length; i++)
{
} // end if interactive
} // end while wait iteration loop
- waitResponse = gotQuitResponse();
-
- return waitResponse;
+ return gotQuitResponse();
};
private static String waitingForSaveMessage()
.append(MessageManager.getString("label.quit_after_saving"));
return messageSB.toString();
}
+
+ public static void abortQuit()
+ {
+ setResponse(QResponse.NULL);
+ // executor.shutdownNow();
+ }
+
+ private static JvOptionPane quitDialog = null;
+
+ private static void setQuitDialog(JvOptionPane qd)
+ {
+ quitDialog = qd;
+ }
+
+ private static JvOptionPane getQuitDialog()
+ {
+ return quitDialog;
+ }
+
+ public static boolean quitCancelled()
+ {
+ return QuitHandler.gotQuitResponse() == QResponse.CANCEL_QUIT
+ || QuitHandler.gotQuitResponse() == QResponse.NULL;
+ }
+
+ public static boolean quitting()
+ {
+ return QuitHandler.gotQuitResponse() == QResponse.QUIT
+ || QuitHandler.gotQuitResponse() == QResponse.FORCE_QUIT;
+ }
}
\ No newline at end of file