Merge branch 'feature/JAL-3169cancelOverwrite' into trialMerge
[jalview.git] / src / jalview / io / JalviewFileChooser.java
index 6b0eba8..2419bef 100755 (executable)
@@ -25,6 +25,10 @@ import jalview.bin.Cache;
 import jalview.gui.JvOptionPane;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
+import jalview.util.dialogrunner.DialogRunner;
+import jalview.util.dialogrunner.DialogRunnerI;
+import jalview.util.dialogrunner.Response;
+import jalview.util.dialogrunner.RunResponse;
 
 import java.awt.Component;
 import java.awt.Dimension;
@@ -32,6 +36,8 @@ import java.awt.EventQueue;
 import java.awt.HeadlessException;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
@@ -44,8 +50,6 @@ import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.SpringLayout;
-import javax.swing.SwingUtilities;
-import javax.swing.border.TitledBorder;
 import javax.swing.plaf.basic.BasicFileChooserUI;
 
 /**
@@ -58,7 +62,10 @@ import javax.swing.plaf.basic.BasicFileChooserUI;
  *
  */
 public class JalviewFileChooser extends JFileChooser
+        implements PropertyChangeListener, DialogRunnerI<JalviewFileChooser>
 {
+  DialogRunner<JalviewFileChooser> runner = new DialogRunner<>(this);
+  
   /**
    * Factory method to return a file chooser that offers readable alignment file
    * formats
@@ -158,6 +165,18 @@ public class JalviewFileChooser extends JFileChooser
     }
   }
 
+  @Override
+  public void propertyChange(PropertyChangeEvent evt)
+  {
+    // TODO other properties need runners...
+    switch (evt.getPropertyName())
+    {
+    case "SelectedFile": 
+      runner.run(APPROVE_OPTION);
+      break;
+    }
+  }
+
   private static File safePath(String dir)
   {
     if (dir == null)
@@ -174,6 +193,25 @@ public class JalviewFileChooser extends JFileChooser
   }
 
   /**
+   * Overridden for JalviewJS compatibility: only one thread in Javascript, 
+   * so we can't wait for user choice in another thread and then perform the 
+   * desired action
+   */
+  @Override
+  public int showOpenDialog(Component parent)
+  {
+    runner.resetResponses();
+    int value = super.showOpenDialog(this);
+    /**
+     * @j2sNative
+     */
+    {
+      runner.firstRun(value);
+    }
+    return value;
+  }
+
+  /**
    * 
    * @param formats
    *          a list of {extensions, description} for each file format
@@ -279,7 +317,7 @@ public class JalviewFileChooser extends JFileChooser
     }
     return null;
   }
-
+  
   File ourselectedFile = null;
 
   @Override
@@ -297,7 +335,9 @@ public class JalviewFileChooser extends JFileChooser
   public int showSaveDialog(Component parent) throws HeadlessException
   {
     this.setAccessory(null);
+    // Java 9,10,11 on OSX - clear selected file so name isn't auto populated
     this.setSelectedFile(null);
+
     return super.showSaveDialog(parent);
   }
 
@@ -359,17 +399,17 @@ public class JalviewFileChooser extends JFileChooser
     }
 
     if (ourselectedFile.exists())
-      {
-        int confirm = JvOptionPane.showConfirmDialog(this,
-                MessageManager.getString("label.overwrite_existing_file"),
-                MessageManager.getString("label.file_already_exists"),
-                JvOptionPane.YES_NO_OPTION);
+    {
+      int confirm = JvOptionPane.showConfirmDialog(this,
+              MessageManager.getString("label.overwrite_existing_file"),
+              MessageManager.getString("label.file_already_exists"),
+              JvOptionPane.YES_NO_OPTION);
 
-        if (confirm != JvOptionPane.YES_OPTION)
-        {
-          return;
-        }
+      if (confirm != JvOptionPane.YES_OPTION)
+      {
+        return;
       }
+    }
 
     super.approveSelection();
   }
@@ -394,28 +434,22 @@ public class JalviewFileChooser extends JFileChooser
     }
   }
 
-  /**
-   * A panel to set as the 'accessory' component to the file chooser dialog,
-   * holding a list of recently opened files (if any). These are held as a
-   * tab-separated list of file paths under key <code>RECENT_FILE</code> in
-   * <code>.jalview_properties</code>. A click in the list calls a method in
-   * JalviewFileChooser to set the chosen file as the selection.
-   */
   class RecentlyOpened extends JPanel
   {
-    private static final long serialVersionUID = 1L;
+    JList<String> list;
 
-    private JList<String> list;
-
-    RecentlyOpened()
+    public RecentlyOpened()
     {
-      String historyItems = Cache.getProperty("RECENT_FILE");
+
+      setPreferredSize(new Dimension(300,100));
+      String historyItems = jalview.bin.Cache.getProperty("RECENT_FILE");
       StringTokenizer st;
       Vector<String> recent = new Vector<>();
 
       if (historyItems != null)
       {
         st = new StringTokenizer(historyItems, "\t");
+
         while (st.hasMoreTokens())
         {
           recent.addElement(st.nextToken());
@@ -423,9 +457,9 @@ public class JalviewFileChooser extends JFileChooser
       }
 
       list = new JList<>(recent);
-
+  
       DefaultListCellRenderer dlcr = new DefaultListCellRenderer();
-      dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT);
+//      dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT);
       list.setCellRenderer(dlcr);
 
       list.addMouseListener(new MouseAdapter()
@@ -437,7 +471,7 @@ public class JalviewFileChooser extends JFileChooser
         }
       });
 
-      this.setBorder(new TitledBorder(
+      this.setBorder(new javax.swing.border.TitledBorder(
               MessageManager.getString("label.recently_opened")));
 
       final JScrollPane scroller = new JScrollPane(list);
@@ -454,12 +488,12 @@ public class JalviewFileChooser extends JFileChooser
       }
       else
       {
-        scroller.setPreferredSize(new Dimension(130, 200));
+        scroller.setPreferredSize(new Dimension(530, 200));
       }
 
       this.add(scroller);
 
-      SwingUtilities.invokeLater(new Runnable()
+      javax.swing.SwingUtilities.invokeLater(new Runnable()
       {
         @Override
         public void run()
@@ -468,6 +502,15 @@ public class JalviewFileChooser extends JFileChooser
                   .setValue(scroller.getHorizontalScrollBar().getMaximum());
         }
       });
+
     }
+
   }
+
+  @Override
+  public JalviewFileChooser addResponse(RunResponse action)
+  {
+    return runner.addResponse(action);
+  }
+
 }