JAL-1988 JAL-3772 Quit confirmation dialog boxes with saving files check and wait
[jalview.git] / src / jalview / gui / Desktop.java
index 3ad5384..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,12 +116,15 @@ 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;
 import jalview.util.BrowserLauncher;
 import jalview.util.ChannelProperties;
 import jalview.util.ImageMaker.TYPE;
+import jalview.util.LaunchUtils;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.util.ShortcutKeyMaskExWrapper;
@@ -413,6 +417,11 @@ public class Desktop extends jalview.jbgui.GDesktop
      */
     if (Platform.isLinux())
     {
+      if (LaunchUtils.getJavaVersion() >= 11)
+      {
+        jalview.bin.Console.info(
+                "Linux platform only! You may have the following warning next: \"WARNING: An illegal reflective access operation has occurred\"\nThis is expected and cannot be avoided, sorry about that.");
+      }
       try
       {
         Toolkit xToolkit = Toolkit.getDefaultToolkit();
@@ -445,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();
+        }
       }
     });
 
@@ -565,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()
     {
@@ -1346,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 + "");
@@ -1379,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);
   }
 
@@ -2515,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");
+        }
       }
     });
   }