import jalview.api.AlignViewportI;
import jalview.api.AlignmentViewPanel;
+import jalview.api.structures.JalviewStructureDisplayI;
import jalview.bin.Cache;
import jalview.bin.Jalview;
import jalview.gui.ImageExporter.ImageWriterI;
storeLastKnownDimensions("JALVIEW_RSS_WINDOW_", jvnews.getBounds());
}
+ // Frames should all close automatically. Keeping external
+ // viewers open should already be decided by user.
closeAll_actionPerformed(null);
// check for aborted quit
{
// TODO show a progress bar while closing?
JInternalFrame[] frames = desktop.getAllFrames();
- boolean quitting = QuitHandler.quitting();
for (int i = 0; i < frames.length; i++)
{
try
{
frames[i].setClosed(true);
- // check for cancelled quit
- if (quitting && QuitHandler.quitCancelled())
- {
- return;
- }
} catch (java.beans.PropertyVetoException ex)
{
}
}
}
+ public int structureViewersStillRunningCount()
+ {
+ int count = 0;
+ JInternalFrame[] frames = desktop.getAllFrames();
+ for (int i = 0; i < frames.length; i++)
+ {
+ if (frames[i] != null
+ && frames[i] instanceof JalviewStructureDisplayI)
+ {
+ if (((JalviewStructureDisplayI) frames[i]).stillRunning())
+ count++;
+ }
+ }
+ return count;
+ }
+
@Override
public void raiseRelated_actionPerformed(ActionEvent e)
{
}
got = gotQuitResponse();
+
+ // check for external viewer frames
+ if (got != QResponse.CANCEL_QUIT)
+ {
+ int count = Desktop.instance.structureViewersStillRunningCount();
+ if (count > 0)
+ {
+ String prompt = MessageManager
+ .formatMessage(count == 1 ? "label.confirm_quit_viewer"
+ : "label.confirm_quit_viewers");
+ String title = MessageManager.getString(
+ count == 1 ? "label.close_viewer" : "label.close_viewers");
+ String cancelQuitText = MessageManager
+ .getString("action.cancel_quit");
+ 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);
+
+ if (confirmResponse == JvOptionPane.CANCEL_OPTION)
+ {
+ // Cancel Quit
+ QuitHandler.setResponse(QResponse.CANCEL_QUIT);
+ }
+ else
+ {
+ // Close viewers/Leave viewers open
+ StructureViewerBase
+ .setQuitClose(confirmResponse == JvOptionPane.YES_OPTION);
+ }
+ }
+
+ }
+
+ got = gotQuitResponse();
+
boolean wait = false;
if (got == QResponse.CANCEL_QUIT)
{
import java.util.List;
import java.util.Random;
import java.util.Vector;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.TimeUnit;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
return session;
}
+ private static boolean quitClose = false;
+
+ public static void setQuitClose(boolean b)
+ {
+ quitClose = b;
+ }
+
+ @Override
+ public boolean stillRunning()
+ {
+ AAStructureBindingModel binding = getBinding();
+ return binding != null && binding.isViewerRunning();
+ }
+
/**
* Close down this instance of Jalview's Chimera viewer, giving the user the
* option to close the associated Chimera window (process). They may wish to
public void closeViewer(boolean forceClose)
{
AAStructureBindingModel binding = getBinding();
- if (binding != null && binding.isViewerRunning())
+ if (stillRunning())
{
if (!forceClose)
{
String viewerName = getViewerName();
int confirm = JvOptionPane.CANCEL_OPTION;
- String prompt = MessageManager
- .formatMessage("label.confirm_close_viewer", new Object[]
- { binding.getViewerTitle(viewerName, false), viewerName });
- prompt = JvSwingUtils.wrapTooltip(true, prompt);
- String title = MessageManager.getString("label.close_viewer");
- confirm = showCloseDialog(title, prompt);
+ if (QuitHandler.quitting())
+ {
+ // already asked about closing external windows
+ confirm = quitClose ? JvOptionPane.YES_OPTION
+ : JvOptionPane.NO_OPTION;
+ }
+ else
+ {
+ String prompt = MessageManager
+ .formatMessage("label.confirm_close_viewer", new Object[]
+ { binding.getViewerTitle(viewerName, false),
+ viewerName });
+ prompt = JvSwingUtils.wrapTooltip(true, prompt);
+ String title = MessageManager.getString("label.close_viewer");
+ confirm = showCloseDialog(title, prompt);
+ }
/*
* abort closure if user hits escape or Cancel
private int showCloseDialog(final String title, final String prompt)
{
- confirmResponse = JvOptionPane.CANCEL_OPTION;
-
- if (QuitHandler.quitting())
- {
-
- Callable<Void> yesCall = () -> {
- Console.debug("YES");
- confirmResponse = JvOptionPane.YES_OPTION;
- return null;
- };
- Callable<Void> noCall = () -> {
- Console.debug("NO");
- confirmResponse = JvOptionPane.NO_OPTION;
- return null;
- };
- Callable<Void> cancelCall = () -> {
- Console.debug("CANCEL");
- confirmResponse = JvOptionPane.CANCEL_OPTION;
- return null;
- };
- Callable<Void>[] calls = new Callable[] { yesCall, noCall,
- cancelCall };
- String cancelQuit = MessageManager.getString("action.cancel_quit");
- String[] buttonsText = { MessageManager.getString("action.yes"),
- MessageManager.getString("action.no"), cancelQuit };
- JvOptionPane dialog = JvOptionPane.frameDialog(prompt,
- MessageManager.getString("label.close_viewer"),
- JvOptionPane.WARNING_MESSAGE, buttonsText, cancelQuit, calls,
- false);
- // wait for response
- ExecutorService executor = dialog.getExecutor();
- executor.shutdown();
- try
- {
- Console.debug("### executor.awaitTermination() starting");
- executor.awaitTermination(60, TimeUnit.SECONDS);
- Console.debug("### executor.awaitTermination() finished");
- } catch (InterruptedException e)
- {
- }
- }
- else
- {
- confirmResponse = JvOptionPane.showConfirmDialog(this, prompt,
- MessageManager.getString("label.close_viewer"),
- JvOptionPane.YES_NO_CANCEL_OPTION,
- JvOptionPane.WARNING_MESSAGE);
- }
+ int confirmResponse = JvOptionPane.CANCEL_OPTION;
+ confirmResponse = JvOptionPane.showConfirmDialog(this, prompt,
+ MessageManager.getString("label.close_viewer"),
+ JvOptionPane.YES_NO_CANCEL_OPTION,
+ JvOptionPane.WARNING_MESSAGE);
return confirmResponse;
}
&& viewerActionMenu.isVisible();
}
- private static int confirmResponse = 0;
}