Merge branch 'feature/JAL-3169cancelOverwrite' into trialMerge
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 17 Dec 2018 16:45:11 +0000 (16:45 +0000)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 17 Dec 2018 16:45:11 +0000 (16:45 +0000)
Conflicts:
src/jalview/io/JalviewFileChooser.java

1  2 
src/jalview/io/JalviewFileChooser.java

@@@ -25,10 -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;
@@@ -36,8 -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;
@@@ -50,6 -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;
  
  /**
   *
   */
  public class JalviewFileChooser extends JFileChooser
-         implements PropertyChangeListener, DialogRunnerI
++        implements PropertyChangeListener, DialogRunnerI<JalviewFileChooser>
  {
 +  DialogRunner<JalviewFileChooser> runner = new DialogRunner<>(this);
 +  
    /**
     * Factory method to return a file chooser that offers readable alignment file
     * formats
      }
    }
  
 +  @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)
    }
  
    /**
 +   * 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
      }
      return null;
    }
 -
 +  
    File ourselectedFile = null;
  
    @Override
      return selfile;
    }
  
-   Component saveparent;
-   RunResponse overwriteCheck = new RunResponse(
-           JalviewFileChooser.APPROVE_OPTION)
+   @Override
+   public int showSaveDialog(Component parent) throws HeadlessException
    {
-     @Override
-     public void run()
+     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);
+   }
+   /**
+    * If doing a Save, and an existing file is chosen or entered, prompt for
+    * confirmation of overwrite. Proceed if Yes, else leave the file chooser
+    * open.
+    * 
+    * @see https://stackoverflow.com/questions/8581215/jfilechooser-and-checking-for-overwrite
+    */
+   @Override
+   public void approveSelection()
+   {
+     if (getDialogType() != SAVE_DIALOG)
      {
+       super.approveSelection();
+       return;
+     }
      ourselectedFile = getSelectedFile();
  
-     if (getSelectedFile() == null)
+     if (ourselectedFile == null)
      {
        // Workaround for Java 9,10 on OSX - no selected file, but there is a
        // filename typed in
                  "Unexpected exception when trying to get filename.");
          x.printStackTrace();
        }
+       // TODO: ENSURE THAT FILES SAVED WITH A ':' IN THE NAME ARE REFUSED AND
+       // THE
+       // USER PROMPTED FOR A NEW FILENAME
      }
      if (ourselectedFile == null)
      {
-       returned = new Response(JalviewFileChooser.CANCEL_OPTION);
        return;
      }
-       // JBP Note - this code was executed regardless of 'SAVE' being pressed
-       // need to see if there were side effects
-       if (getFileFilter() instanceof JalviewFileFilter)
-       {
-         JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter();
  
-         if (!jvf.accept(getSelectedFile()))
-         {
-           String withExtension = getSelectedFile() + "."
-                   + jvf.getAcceptableExtension();
-           setSelectedFile(new File(withExtension));
-         }
-       }
-       // All good, so we continue to save
-       returned = new Response(JalviewFileChooser.APPROVE_OPTION);
+     if (getFileFilter() instanceof JalviewFileFilter)
+     {
+       JalviewFileFilter jvf = (JalviewFileFilter) getFileFilter();
  
-       // TODO: ENSURE THAT FILES SAVED WITH A ':' IN THE NAME ARE REFUSED AND THE
-       // USER PROMPTED FOR A NEW FILENAME
-       /**
-        * @j2sNative
-        */
+       if (!jvf.accept(ourselectedFile))
        {
-         if (getSelectedFile().exists())
-         {
-           // JAL-3048 - may not need to raise this for browser saves
-           // yes/no cancel
-           int confirm = JvOptionPane.showConfirmDialog(saveparent,
-                   MessageManager.getString("label.overwrite_existing_file"),
-                   MessageManager.getString("label.file_already_exists"),
-                   JvOptionPane.YES_NO_OPTION);
-           if (confirm != JvOptionPane.YES_OPTION)
-           {
-             returned = new Response(JalviewFileChooser.CANCEL_OPTION);
-           }
-         }
+         String withExtension = getSelectedFile().getName() + "."
+                 + jvf.getAcceptableExtension();
+         ourselectedFile = (new File(getCurrentDirectory(), withExtension));
+         setSelectedFile(ourselectedFile);
        }
-     };
-   };
-   /**
-    * 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 showSaveDialog(Component parent) throws HeadlessException
-   {
-     this.setAccessory(null);
-     /*
-      * Save dialog is opened until user picks a file format 
-      */
-     if (!runner.isRegistered(overwriteCheck))
-     {
-       // first call for this instance
-       runner.firstResponse(overwriteCheck);
      }
-     else
-     {
-       // reset response flags
-       runner.resetResponses();
-     }
-     setDialogType(SAVE_DIALOG);
-     
-     // Java 9,10,11 on OSX - clear selected file so name isn't auto populated
-     this.setSelectedFile(null);
-  
-     saveparent = parent;
  
-     int value = showDialog(parent, MessageManager.getString("action.save"));
-     /**
-      * @j2sNative
-      */
+     if (ourselectedFile.exists())
 -      {
 -        int confirm = JvOptionPane.showConfirmDialog(this,
 -                MessageManager.getString("label.overwrite_existing_file"),
 -                MessageManager.getString("label.file_already_exists"),
 -                JvOptionPane.YES_NO_OPTION);
 +    {
-       runner.firstRun(value);
++      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;
+       }
 +    }
-     return value;
+     super.approveSelection();
    }
  
    void recentListSelectionChanged(Object selection)
      }
    }
  
 -  /**
 -   * 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());
        }
  
        list = new JList<>(recent);
 -
 +  
        DefaultListCellRenderer dlcr = new DefaultListCellRenderer();
 -      dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT);
 +//      dlcr.setHorizontalAlignment(DefaultListCellRenderer.RIGHT);
        list.setCellRenderer(dlcr);
  
        list.addMouseListener(new MouseAdapter()
          }
        });
  
 -      this.setBorder(new TitledBorder(
 +      this.setBorder(new javax.swing.border.TitledBorder(
                MessageManager.getString("label.recently_opened")));
  
        final JScrollPane scroller = new JScrollPane(list);
        }
        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()
                    .setValue(scroller.getHorizontalScrollBar().getMaximum());
          }
        });
 +
      }
 +
    }
 +
 +  @Override
 +  public JalviewFileChooser addResponse(RunResponse action)
 +  {
 +    return runner.addResponse(action);
 +  }
 +
  }