JAL-3130 incorporating feature/JAL-3063jaxbNoCastor and new script utils/jdeps_jlink_...
[jalview.git] / src / jalview / gui / Desktop.java
index b2d63a9..7c08705 100644 (file)
@@ -36,6 +36,7 @@ import jalview.io.JalviewFileChooser;
 import jalview.io.JalviewFileView;
 import jalview.jbgui.GSplitFrame;
 import jalview.jbgui.GStructureViewer;
+import jalview.project.Jalview2XML;
 import jalview.structure.StructureSelectionManager;
 import jalview.urls.IdOrgSettings;
 import jalview.util.ImageMaker;
@@ -67,6 +68,7 @@ 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;
@@ -151,6 +153,8 @@ 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();
@@ -162,6 +166,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)
@@ -354,71 +360,122 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     doConfigureStructurePrefs();
     setTitle("Jalview " + jalview.bin.Cache.getProperty("VERSION"));
-    // setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-    /* comments
-     * galore
-     * to
-     * change the line numbers
-     */
-
+    /*
     if (!Platform.isAMac())
     {
       // this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
     }
     else
     {
-      // this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
-      java.awt.Desktop desktop = java.awt.Desktop.getDesktop();
+     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();
 
-      desktop.setAboutHandler(new AboutHandler()
+      try
       {
-        @Override
-        public void handleAbout(AboutEvent e)
+
+        if (desktopClass.getDeclaredMethod("setAboutHandler",
+                new Class[]
+                { AboutHandler.class }) != null)
         {
-          aboutMenuItem_actionPerformed(null);
+
+          hdesktop.setAboutHandler(new AboutHandler()
+          {
+            @Override
+            public void handleAbout(AboutEvent e)
+            {
+              aboutMenuItem_actionPerformed(null);
+            }
+          });
+
         }
-      });
-      desktop.setPreferencesHandler(new PreferencesHandler()
-      {
-        @Override
-        public void handlePreferences(PreferencesEvent e)
+
+        if (desktopClass.getDeclaredMethod("setPreferencesHandler",
+                new Class[]
+                { PreferencesHandler.class }) != null)
         {
-          preferences_actionPerformed(null);
-        }
-      });
-      desktop.setQuitHandler(new QuitHandler()
-      {
-        @Override
-        public void handleQuitRequestWith(QuitEvent e, QuitResponse r)
-        {
-          int n = JOptionPane.showConfirmDialog(null,
-                  MessageManager.getString("label.quit_jalview"),
-                  MessageManager.getString("action.quit"),
-                  JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE,
-                  null);
-          if (n == JOptionPane.OK_OPTION)
+
+          hdesktop.setPreferencesHandler(new PreferencesHandler()
           {
-            System.out.println("Shortcut Quit confirmed by user");
-            quit();
-          }
-          else
+            @Override
+            public void handlePreferences(PreferencesEvent e)
+            {
+              preferences_actionPerformed(null);
+            }
+          });
+
+        }
+
+        if (desktopClass.getDeclaredMethod("setQuitHandler",
+                new Class[]
+                { QuitHandler.class }) != null)
+        {
+
+          hdesktop.setQuitHandler(new QuitHandler()
           {
-            System.out.println("Shortcut Quit cancelled by user");
-          }
+            @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);
+
         }
-      });
 
-      addWindowListener(new WindowAdapter()
+      } catch (NoSuchMethodException e)
       {
+        System.out.println(
+                "NoSuchMethodException when looking for About, Preferences, Quit Handlers");
+        e.printStackTrace();
+      }
 
-        @Override
-        public void windowClosing(WindowEvent ev)
-        {
-          quit();
-        }
-      });
+      setAPQHandlers = true;
     }
 
+    addWindowListener(new WindowAdapter()
+    {
+
+      @Override
+      public void windowClosing(WindowEvent ev)
+      {
+        quit();
+      }
+    });
+
     boolean selmemusage = jalview.bin.Cache.getDefault("SHOW_MEMUSAGE",
             false);
 
@@ -1675,13 +1732,11 @@ public class Desktop extends jalview.jbgui.GDesktop
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Shows a file chooser dialog and writes out the current session as a Jalview
+   * project file
    */
   @Override
-  public void saveState_actionPerformed(ActionEvent e)
+  public void saveState_actionPerformed()
   {
     JalviewFileChooser chooser = new JalviewFileChooser("jvp",
             "Jalview Project");
@@ -1748,19 +1803,18 @@ public class Desktop extends jalview.jbgui.GDesktop
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Shows a file chooser dialog and tries to read in the selected file as a
+   * Jalview project
    */
   @Override
-  public void loadState_actionPerformed(ActionEvent e)
+  public void loadState_actionPerformed()
   {
+    final String[] suffix = new String[] { "jvp", "jar" };
+    final String[] desc = new String[] { "Jalview Project",
+        "Jalview Project (old)" };
     JalviewFileChooser chooser = new JalviewFileChooser(
-            Cache.getProperty("LAST_DIRECTORY"), new String[]
-            { "jvp", "jar" },
-            new String[]
-            { "Jalview Project", "Jalview Project (old)" },
+            Cache.getProperty("LAST_DIRECTORY"), suffix,
+            desc,
             "Jalview Project");
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(MessageManager.getString("label.restore_state"));