JAL-3130 Lots of deprecation fixes. See utils/deprecation_auto_fixes.sh for commands...
[jalview.git] / src / jalview / gui / Desktop.java
index 5071918..4c0faa8 100644 (file)
@@ -20,8 +20,6 @@
  */
 package jalview.gui;
 
-import static jalview.util.UrlConstants.SEQUENCE_ID;
-
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.bin.Cache;
@@ -64,6 +62,14 @@ import java.awt.datatransfer.Clipboard;
 import java.awt.datatransfer.ClipboardOwner;
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
+import java.awt.desktop.AboutEvent;
+import java.awt.desktop.AboutHandler;
+import java.awt.desktop.PreferencesEvent;
+import java.awt.desktop.PreferencesHandler;
+import java.awt.desktop.QuitEvent;
+import java.awt.desktop.QuitHandler;
+import java.awt.desktop.QuitResponse;
+import java.awt.desktop.QuitStrategy;
 import java.awt.dnd.DnDConstants;
 import java.awt.dnd.DropTargetDragEvent;
 import java.awt.dnd.DropTargetDropEvent;
@@ -82,9 +88,11 @@ import java.beans.PropertyChangeListener;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.FileWriter;
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.ListIterator;
@@ -107,10 +115,10 @@ import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JDesktopPane;
-import javax.swing.JFrame;
 import javax.swing.JInternalFrame;
 import javax.swing.JLabel;
 import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 import javax.swing.JProgressBar;
@@ -146,6 +154,10 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   private static final String EXPERIMENTAL_FEATURES = "EXPERIMENTAL_FEATURES";
 
+  private static final String CONFIRM_KEYBOARD_QUIT = "CONFIRM_KEYBOARD_QUIT";
+
+  public static HashMap<String, FileWriter> savingFiles = new HashMap<>();
+
   private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
 
   /**
@@ -155,6 +167,8 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   private File projectFile;
 
+  private static boolean setAPQHandlers = false;
+
   /**
    * @param listener
    * @see jalview.gui.JalviewChangeSupport#addJalviewPropertyChangeListener(java.beans.PropertyChangeListener)
@@ -347,14 +361,135 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     doConfigureStructurePrefs();
     setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
-    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+    /*
+    if (!Platform.isAMac())
+    {
+      // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+    }
+    else
+    {
+     this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+    }
+    */
+
+    // flagging this test to avoid unnecessary reflection
+    if (!setAPQHandlers)
+    {
+      // see if the Quit, About and Preferences handlers are available
+      Class desktopClass = java.awt.Desktop.class;
+      java.awt.Desktop hdesktop = java.awt.Desktop.getDesktop();
+
+      try
+      {
+
+        if (Platform.isAMac())
+        {
+          if (desktopClass.getDeclaredMethod("setAboutHandler",
+                  new Class[]
+                  { AboutHandler.class }) != null)
+          {
+
+            hdesktop.setAboutHandler(new AboutHandler()
+            {
+              @Override
+              public void handleAbout(AboutEvent e)
+              {
+                aboutMenuItem_actionPerformed(null);
+              }
+            });
+
+          }
+
+          if (desktopClass.getDeclaredMethod("setPreferencesHandler",
+                  new Class[]
+                  { PreferencesHandler.class }) != null)
+          {
+
+            hdesktop.setPreferencesHandler(new PreferencesHandler()
+            {
+              @Override
+              public void handlePreferences(PreferencesEvent e)
+              {
+                preferences_actionPerformed(null);
+              }
+            });
+
+          }
+
+          if (desktopClass.getDeclaredMethod("setQuitHandler",
+                  new Class[]
+                  { QuitHandler.class }) != null)
+          {
+
+            hdesktop.setQuitHandler(new QuitHandler()
+            {
+              @Override
+              public void handleQuitRequestWith(QuitEvent e, QuitResponse r)
+              {
+                boolean confirmQuit = jalview.bin.Cache
+                        .getDefault(CONFIRM_KEYBOARD_QUIT, true);
+                int n;
+                if (confirmQuit)
+                {
+                  n = JOptionPane.showConfirmDialog(null,
+                          MessageManager.getString("label.quit_jalview"),
+                          MessageManager.getString("action.quit"),
+                          JOptionPane.OK_CANCEL_OPTION,
+                          JOptionPane.PLAIN_MESSAGE, null);
+                }
+                else
+                {
+                  n = JOptionPane.OK_OPTION;
+                }
+                if (n == JOptionPane.OK_OPTION)
+                {
+                  System.out.println("Shortcut Quit confirmed by user");
+                  quit();
+                  r.performQuit(); // probably won't reach this line, but just
+                                   // in
+                                   // case
+                }
+                else
+                {
+                  r.cancelQuit();
+                  System.out.println("Shortcut Quit cancelled by user");
+                }
+              }
+            });
+            hdesktop.setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS);
+
+          }
+        }
+
+      } catch (NoSuchMethodException e)
+      {
+        System.out.println(
+                "NoSuchMethodException when looking for About, Preferences, Quit Handlers");
+        e.printStackTrace();
+      }
+
+      setAPQHandlers = true;
+    }
+
+    addWindowListener(new WindowAdapter()
+    {
+
+      @Override
+      public void windowClosing(WindowEvent ev)
+      {
+        quit();
+      }
+    });
+
     boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE",
             false);
+
     boolean showjconsole = jalview.bin.Cache.getDefault("SHOW_JAVA_CONSOLE",
             false);
     desktop = new MyDesktopPane(selmemusage);
     showMemusage.setSelected(selmemusage);
     desktop.setBackground(Color.white);
+
     getContentPane().setLayout(new BorderLayout());
     // alternate config - have scrollbars - see notes in JAL-153
     // JScrollPane sp = new JScrollPane();
@@ -973,7 +1108,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     KeyStroke ctrlWKey = KeyStroke.getKeyStroke(KeyEvent.VK_W,
             InputEvent.CTRL_DOWN_MASK);
     KeyStroke cmdWKey = KeyStroke.getKeyStroke(KeyEvent.VK_W,
-            Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
+            Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx());
 
     InputMap inputMap = frame
             .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
@@ -1252,6 +1387,8 @@ public class Desktop extends jalview.jbgui.GDesktop
   @Override
   public void quit()
   {
+    //System.out.println("********** Desktop.quit()");
+    //System.out.println(savingFiles.toString());
     Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
     jalview.bin.Cache.setProperty("SCREENGEOMETRY_WIDTH",
             screen.width + "");
@@ -2411,7 +2548,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           while (li.hasNext())
           {
             String link = li.next();
-            if (link.contains(SEQUENCE_ID)
+            if (link.contains(jalview.util.UrlConstants.SEQUENCE_ID)
                     && !UrlConstants.isDefaultString(link))
             {
               check = true;
@@ -2719,7 +2856,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
             .put(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
-                    Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),
+                    Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()),
                     "Quit");
     getRootPane().getActionMap().put("Quit", new AbstractAction()
     {
@@ -2776,18 +2913,18 @@ public class Desktop extends jalview.jbgui.GDesktop
       progressBarHandlers = new Hashtable<>();
     }
 
-    if (progressBars.get(new Long(id)) != null)
+    if (progressBars.get(Long.valueOf(id)) != null)
     {
-      JPanel panel = progressBars.remove(new Long(id));
-      if (progressBarHandlers.contains(new Long(id)))
+      JPanel panel = progressBars.remove(Long.valueOf(id));
+      if (progressBarHandlers.contains(Long.valueOf(id)))
       {
-        progressBarHandlers.remove(new Long(id));
+        progressBarHandlers.remove(Long.valueOf(id));
       }
       removeProgressPanel(panel);
     }
     else
     {
-      progressBars.put(new Long(id), addProgressPanel(message));
+      progressBars.put(Long.valueOf(id), addProgressPanel(message));
     }
   }
 
@@ -2802,13 +2939,13 @@ public class Desktop extends jalview.jbgui.GDesktop
           final IProgressIndicatorHandler handler)
   {
     if (progressBarHandlers == null
-            || !progressBars.containsKey(new Long(id)))
+            || !progressBars.containsKey(Long.valueOf(id)))
     {
       throw new Error(MessageManager.getString(
               "error.call_setprogressbar_before_registering_handler"));
     }
-    progressBarHandlers.put(new Long(id), handler);
-    final JPanel progressPanel = progressBars.get(new Long(id));
+    progressBarHandlers.put(Long.valueOf(id), handler);
+    final JPanel progressPanel = progressBars.get(Long.valueOf(id));
     if (handler.canCancel())
     {
       JButton cancel = new JButton(