JAL-3210 Barebones gradle/buildship/eclipse. See README
[jalview.git] / src / jalview / gui / Desktop.java
index 89499c1..9dd46d6 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;
@@ -84,9 +82,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;
@@ -108,7 +108,6 @@ 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;
@@ -148,6 +147,10 @@ public class Desktop extends jalview.jbgui.GDesktop
 
   private static final String EXPERIMENTAL_FEATURES = "EXPERIMENTAL_FEATURES";
 
+  protected static final String CONFIRM_KEYBOARD_QUIT = "CONFIRM_KEYBOARD_QUIT";
+
+  public static HashMap<String, FileWriter> savingFiles = new HashMap<>();
+
   private JalviewChangeSupport changeSupport = new JalviewChangeSupport();
 
   /**
@@ -346,10 +349,11 @@ public class Desktop extends jalview.jbgui.GDesktop
    */
   public Desktop()
   {
-         super();
+    super();
     /**
-     * A note to implementors. It is ESSENTIAL that any activities that might block
-     * are spawned off as threads rather than waited for during this constructor.
+     * A note to implementors. It is ESSENTIAL that any activities that might
+     * block are spawned off as threads rather than waited for during this
+     * constructor.
      */
     instance = this;
     if (!Platform.isJS())
@@ -359,31 +363,72 @@ 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);
+    }
+    */
+
+    try
+    {
+           if (!Platform.isJS())
+                   /*
+                    * @j2sIgnore
+                    */
+           {
+             APQHandlers.setAPQHandlers(this);
+           }
+    } catch (Exception e)
+    {
+      System.out.println("Cannot set APQHandlers");
+      // e.printStackTrace();
+    } catch (Throwable t)
+    {
+      System.out.println("Cannot set APQHandlers");
+      // t.printStackTrace();
+    }
+
+
+    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();
     // sp.getViewport().setView(desktop);
     // getContentPane().add(sp, BorderLayout.CENTER);
-    
-    // BH 2018 - just an experiment to try unclipped JInternalFrames. 
-       if (Platform.isJS()) 
-       {
-         getRootPane().putClientProperty("swingjs.overflow.hidden", "false");
-       }
-    
+
+    // BH 2018 - just an experiment to try unclipped JInternalFrames.
+    if (Platform.isJS())
+    {
+      getRootPane().putClientProperty("swingjs.overflow.hidden", "false");
+    }
+
     getContentPane().add(desktop, BorderLayout.CENTER);
     desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
-    
+
     // This line prevents Windows Look&Feel resizing all new windows to maximum
     // if previous window was maximised
     desktop.setDesktopManager(new MyDesktopManager(
@@ -405,11 +450,15 @@ public class Desktop extends jalview.jbgui.GDesktop
       int yPos = Math.max(5, (screenSize.height - 650) / 2);
       setBounds(xPos, yPos, 900, 650);
     }
-    
-    boolean doFullLoad = /** @j2sNative ! */true;
-    
-    if (doFullLoad) {
-      
+
+    if (!Platform.isJS())
+    /**
+     * Java only
+     * 
+     * @j2sIgnore
+     */
+    {
+
       jconsole = new Console(this, showjconsole);
       // add essential build information
       jconsole.setHeader("Jalview Version: "
@@ -421,7 +470,14 @@ public class Desktop extends jalview.jbgui.GDesktop
               + "Java version: " + System.getProperty("java.version") + "\n"
               + System.getProperty("os.arch") + " "
               + System.getProperty("os.name") + " "
-              + System.getProperty("os.version"));
+              + System.getProperty("os.version")
+              + (jalview.bin.Cache.getProperty("VERSION").equals("DEVELOPMENT")
+                              ? "\nJava path:"
+                                      + System.getProperty(
+                                              "java.home")
+                                      + File.separator + "bin"
+                                      + File.separator + "java"
+                              : ""));
 
       showConsole(showjconsole);
 
@@ -444,8 +500,8 @@ public class Desktop extends jalview.jbgui.GDesktop
         }
       });
 
-      // Thread off a new instance of the file chooser - this reduces the time it
-      // takes to open it later on.
+      // Thread off a new instance of the file chooser - this reduces the time
+      // it takes to open it later on.
       new Thread(new Runnable()
       {
         @Override
@@ -473,7 +529,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
               });
 
-    } 
+    }
 
     this.setDropTarget(new java.awt.dnd.DropTarget(desktop, this));
 
@@ -584,7 +640,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         }
       }
     }).start();
-    ;
+    
   }
 
   @Override
@@ -884,8 +940,7 @@ public class Desktop extends jalview.jbgui.GDesktop
     frame.setResizable(resizable);
     frame.setMaximizable(resizable);
     frame.setIconifiable(resizable);
-    frame.setOpaque(/** @j2sNative true || */
-            false);
+    frame.setOpaque(Platform.isJS());
 
     if (frame.getX() < 1 && frame.getY() < 1)
     {
@@ -936,7 +991,7 @@ public class Desktop extends jalview.jbgui.GDesktop
           menuItem.removeActionListener(menuItem.getActionListeners()[0]);
         }
         windowMenu.remove(menuItem);
-      };
+      }
     });
 
     menuItem.addActionListener(new ActionListener()
@@ -1000,7 +1055,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());
+            jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx());
 
     InputMap inputMap = frame
             .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
@@ -1092,7 +1147,10 @@ public class Desktop extends jalview.jbgui.GDesktop
           {
             format = new IdentifyFile().identify(file, protocol);
           }
-
+          if (file instanceof File)
+          {
+            Platform.cacheFileData((File) file);
+          }
           new FileLoader().LoadFile(null, file, protocol, format);
 
         }
@@ -1116,7 +1174,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     String fileFormat = Cache.getProperty("DEFAULT_FILE_FORMAT");
     JalviewFileChooser chooser = JalviewFileChooser
-            .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat, true);
+            .forRead(Cache.getProperty("LAST_DIRECTORY"), fileFormat, BackupFiles.getEnabled());
 
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(
@@ -1172,7 +1230,7 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     JPanel panel = new JPanel(new GridLayout(2, 1));
     panel.add(label);
-    
+
     /*
      * the URL to fetch is
      * Java: an editable combobox with history
@@ -1185,6 +1243,11 @@ public class Desktop extends jalview.jbgui.GDesktop
       history = new JTextField(urlBase, 35);
     }
     else
+    /**
+     * Java only
+     * 
+     * @j2sIgnore
+     */
     {
       JComboBox<String> asCombo = new JComboBox<>();
       asCombo.setPreferredSize(new Dimension(400, 20));
@@ -1204,13 +1267,16 @@ public class Desktop extends jalview.jbgui.GDesktop
 
     Object[] options = new Object[] { MessageManager.getString("action.ok"),
         MessageManager.getString("action.cancel") };
-    Runnable action = new Runnable() {
+    Runnable action = new Runnable()
+    {
       @Override
       public void run()
       {
-        String url = Platform.isJS() ? ((JTextField) history).getText()
+        @SuppressWarnings("unchecked")
+        String url = (history instanceof JTextField
+                ? ((JTextField) history).getText()
                 : ((JComboBox<String>) history).getSelectedItem()
-                        .toString();
+                        .toString());
 
         if (url.toLowerCase().endsWith(".jar"))
         {
@@ -1239,7 +1305,8 @@ public class Desktop extends jalview.jbgui.GDesktop
 
           if (format == null)
           {
-            String msg = MessageManager.formatMessage("label.couldnt_locate", url);
+            String msg = MessageManager
+                    .formatMessage("label.couldnt_locate", url);
             JvOptionPane.showInternalMessageDialog(Desktop.desktop, msg,
                     MessageManager.getString("label.url_not_found"),
                     JvOptionPane.WARNING_MESSAGE);
@@ -1257,7 +1324,8 @@ public class Desktop extends jalview.jbgui.GDesktop
             new FileLoader().LoadFile(url, DataSourceType.URL, format);
           }
         }
-      }};
+      }
+    };
     String dialogOption = MessageManager
             .getString("label.input_alignment_from_url");
     JvOptionPane.newOptionDialog(desktop).setResponseHandler(0, action)
@@ -1438,6 +1506,11 @@ public class Desktop extends jalview.jbgui.GDesktop
         BrowserLauncher.openURL("http://www.jalview.org/help.html");
       }
       else
+      /**
+       * Java only
+       * 
+       * @j2sIgnore
+       */
       {
         Help.showHelpWindow();
       }
@@ -1705,12 +1778,16 @@ public class Desktop extends jalview.jbgui.GDesktop
           // TODO prevent user from messing with the Desktop whilst we're saving
           try
           {
-            BackupFiles backupfiles = new BackupFiles(chosenFile);
+               boolean doBackup = BackupFiles.getEnabled();
+            BackupFiles backupfiles = doBackup ? new BackupFiles(chosenFile) : null;
 
-            new Jalview2XML().saveState(backupfiles.getTempFile());
+            new Jalview2XML().saveState(doBackup ? backupfiles.getTempFile() : chosenFile);
 
-            backupfiles.setWriteSuccess(true);
-            backupfiles.rollBackupsAndRenameTempFile();
+            if (doBackup)
+            {
+              backupfiles.setWriteSuccess(true);
+              backupfiles.rollBackupsAndRenameTempFile();
+            }
           } catch (OutOfMemoryError oom)
           {
             new OOMWarning("Whilst saving current state to "
@@ -1761,7 +1838,7 @@ public class Desktop extends jalview.jbgui.GDesktop
         "Jalview Project (old)" };
     JalviewFileChooser chooser = new JalviewFileChooser(
             Cache.getProperty("LAST_DIRECTORY"), suffix, desc,
-            "Jalview Project", true, true); // last two booleans: allFiles,
+            "Jalview Project", true, BackupFiles.getEnabled()); // last two booleans: allFiles,
                                             // allowBackupFiles
     chooser.setFileView(new JalviewFileView());
     chooser.setDialogTitle(MessageManager.getString("label.restore_state"));
@@ -2316,7 +2393,7 @@ public class Desktop extends jalview.jbgui.GDesktop
                 });
                 rthr.start();
               }
-            };
+            }
           });
           VamsasStMenu.add(sessit);
         }
@@ -2461,7 +2538,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;
@@ -2768,7 +2845,7 @@ public class Desktop extends jalview.jbgui.GDesktop
   {
     getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
             .put(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
-                    Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),
+                    jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx()),
                     "Quit");
     getRootPane().getActionMap().put("Quit", new AbstractAction()
     {
@@ -2827,18 +2904,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));
     }
   }
 
@@ -2853,13 +2930,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(
@@ -3213,7 +3290,6 @@ public class Desktop extends jalview.jbgui.GDesktop
           } catch (InterruptedException x)
           {
           }
-          ;
         }
         if (instance == null)
         {
@@ -3501,7 +3577,6 @@ public class Desktop extends jalview.jbgui.GDesktop
             System.err.println(
                     "Please ignore plist error - occurs due to problem with java 8 on OSX");
           }
-          ;
         }
       } catch (Throwable ex)
       {