JAL-1988 JAL-3772 Quit confirmation dialog boxes with saving files check and wait
[jalview.git] / src / jalview / gui / Desktop.java
index 16603df..585537e 100644 (file)
@@ -90,6 +90,7 @@ import javax.swing.JProgressBar;
 import javax.swing.JTextField;
 import javax.swing.KeyStroke;
 import javax.swing.SwingUtilities;
+import javax.swing.WindowConstants;
 import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkEvent.EventType;
 import javax.swing.event.InternalFrameAdapter;
@@ -115,6 +116,8 @@ import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
 import jalview.jbgui.GSplitFrame;
 import jalview.jbgui.GStructureViewer;
+import jalview.jbgui.QuitHandler;
+import jalview.jbgui.QuitHandler.QResponse;
 import jalview.project.Jalview2XML;
 import jalview.structure.StructureSelectionManager;
 import jalview.urls.IdOrgSettings;
@@ -451,13 +454,17 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     setIconImages(ChannelProperties.getIconList());
 
+    this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
     addWindowListener(new WindowAdapter()
     {
-
       @Override
       public void windowClosing(WindowEvent ev)
       {
-        quit();
+        QResponse qresponse = desktopQuit();
+        if (qresponse != QResponse.CANCEL_QUIT)
+        {
+          instance.dispose();
+        }
       }
     });
 
@@ -571,15 +578,6 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));
 
-    this.addWindowListener(new WindowAdapter()
-    {
-      @Override
-      public void windowClosing(WindowEvent evt)
-      {
-        quit();
-      }
-    });
-
     MouseAdapter ma;
     this.addMouseListener(ma = new MouseAdapter()
     {
@@ -1352,11 +1350,22 @@ public class Desktop extends jalview.jbgui.GDesktop
   }
 
   /*
-   * Exit the program
+   * Check with user and saving files before actually quitting
    */
-  @Override
-  public void quit()
+  public QResponse desktopQuit()
+  {
+    return desktopQuit(true);
+  }
+
+  public QResponse desktopQuit(boolean ui)
   {
+    QuitHandler.QResponse qresponse = QuitHandler.getQuitResponse(ui);
+
+    if (qresponse == QResponse.CANCEL_QUIT)
+    {
+      return qresponse;
+    }
+
     Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
     Cache.setProperty("SCREENGEOMETRY_WIDTH", screen.width + "");
     Cache.setProperty("SCREENGEOMETRY_HEIGHT", screen.height + "");
@@ -1385,6 +1394,30 @@ public class Desktop extends jalview.jbgui.GDesktop
       groovyConsole.setDirty(false);
       groovyConsole.exit();
     }
+
+    if (qresponse == 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");
+    quit();
+
+    // unlikely to reach here!
+    return QResponse.QUIT;
+  }
+
+  /**
+   * Don't call this directly, use desktopQuit() above. Exits the program.
+   */
+  @Override
+  public void quit()
+  {
+    // this will run the shutdownHook but QuitHandler.getQuitResponse() should
+    // not run a second time if gotQuitResponse flag has been set (i.e. user
+    // confirmed quit of some kind).
     System.exit(0);
   }
 
@@ -2521,7 +2554,12 @@ public class Desktop extends jalview.jbgui.GDesktop
       @Override
       public void actionPerformed(ActionEvent e)
       {
-        quit();
+        QResponse qresponse = desktopQuit();
+        if (qresponse == QResponse.CANCEL_QUIT)
+        {
+          jalview.bin.Console
+                  .debug("Desktop: Quit action cancelled by user");
+        }
       }
     });
   }