From 644e7f0a6a02a3851a68a5484a0f38c7d452d2d8 Mon Sep 17 00:00:00 2001 From: Olivier Cinquin Date: Sun, 8 Nov 2015 12:03:06 -0800 Subject: [PATCH] Use native file dialogs under Mac OS X. --- .../pathvisio/gexplugin/GexImportWizard.java | 57 +++++++++++++++---- .../org/pathvisio/gui/PathwayFileFilter.java | 11 +++- .../src/org/pathvisio/gui/SwingEngine.java | 31 ++++++++-- 3 files changed, 82 insertions(+), 17 deletions(-) diff --git a/modules/org.pathvisio.gex/src/org/pathvisio/gexplugin/GexImportWizard.java b/modules/org.pathvisio.gex/src/org/pathvisio/gexplugin/GexImportWizard.java index 9cb9a727..43969005 100644 --- a/modules/org.pathvisio.gex/src/org/pathvisio/gexplugin/GexImportWizard.java +++ b/modules/org.pathvisio.gex/src/org/pathvisio/gexplugin/GexImportWizard.java @@ -25,11 +25,14 @@ import java.awt.Color; import java.awt.Component; +import java.awt.FileDialog; +import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; +import java.io.FilenameFilter; import java.io.IOException; import javax.swing.AbstractAction; @@ -112,6 +115,9 @@ public GexImportWizard (PvDesktop standaloneEngine) setCurrentPanel(FilePage.IDENTIFIER); } + + private static final boolean useFileDialog = + System.getProperty("os.name").startsWith("Mac OS X"); private class FilePage extends WizardPanelDescriptor implements ActionListener { @@ -277,7 +283,7 @@ private String getFinalPgexFileLocation(String filepath) { count++; } } - + public void actionPerformed(ActionEvent e) { String action = e.getActionCommand(); @@ -287,18 +293,45 @@ public void actionPerformed(ActionEvent e) { PreferenceManager.getCurrent().get(GlobalPreference.DB_CONNECTSTRING_GDB) ); } else if(ACTION_INPUT.equals(action)) { - - File defaultdir = PreferenceManager.getCurrent().getFile(GlobalPreference.DIR_LAST_USED_EXPRESSION_IMPORT); - JFileChooser jfc = new JFileChooser(); - jfc.setCurrentDirectory(defaultdir); - jfc.addChoosableFileFilter(new SimpleFileFilter("Data files", "*.txt|*.csv|*.tab", true)); - int result = jfc.showDialog(null, "Select data file"); - if (result == JFileChooser.APPROVE_OPTION) + File defaultDir = PreferenceManager.getCurrent().getFile(GlobalPreference.DIR_LAST_USED_EXPRESSION_IMPORT); + final File selectedFile; + final File selectedDirectory; + if (useFileDialog) { + FileDialog fileDialog = new FileDialog(new Frame(),"Select data file", FileDialog.LOAD); + fileDialog.setDirectory(defaultDir.getAbsolutePath()); + fileDialog.setFilenameFilter(new FilenameFilter() { + + @Override + public boolean accept(File dir, String name) { + return name.endsWith(".txt") || + name.endsWith(".csv") || name.endsWith(".tab"); + } + }); + fileDialog.setVisible(true); + if (fileDialog.getDirectory() == null) { + selectedDirectory = null; + selectedFile = null; + } else { + selectedDirectory = new File(fileDialog.getDirectory()); + selectedFile = new File(fileDialog.getDirectory() + "/" + fileDialog.getFile()); + } + } else { + JFileChooser jfc = new JFileChooser(); + jfc.setCurrentDirectory(defaultDir); + jfc.addChoosableFileFilter(new SimpleFileFilter("Data files", "*.txt|*.csv|*.tab", true)); + int result = jfc.showDialog(null, "Select data file"); + if (result == JFileChooser.APPROVE_OPTION) { + selectedFile = jfc.getSelectedFile(); + selectedDirectory = jfc.getCurrentDirectory(); + } else { + selectedFile = null; + selectedDirectory = null; + } + } + if (selectedFile != null) { - File f = jfc.getSelectedFile(); - defaultdir = jfc.getCurrentDirectory(); - PreferenceManager.getCurrent().setFile(GlobalPreference.DIR_LAST_USED_EXPRESSION_IMPORT, defaultdir); - txtInput.setText("" + f); + PreferenceManager.getCurrent().setFile(GlobalPreference.DIR_LAST_USED_EXPRESSION_IMPORT, selectedDirectory); + txtInput.setText("" + selectedFile); updateTxtFile (); } } else if(ACTION_OUTPUT.equals(action)) { diff --git a/modules/org.pathvisio.gui/src/org/pathvisio/gui/PathwayFileFilter.java b/modules/org.pathvisio.gui/src/org/pathvisio/gui/PathwayFileFilter.java index 2a7c70e4..3c6aaee5 100644 --- a/modules/org.pathvisio.gui/src/org/pathvisio/gui/PathwayFileFilter.java +++ b/modules/org.pathvisio.gui/src/org/pathvisio/gui/PathwayFileFilter.java @@ -17,6 +17,8 @@ package org.pathvisio.gui; import java.io.File; +import java.io.FilenameFilter; + import javax.swing.filechooser.FileFilter; import org.pathvisio.core.model.PathwayIO; @@ -26,7 +28,7 @@ * Can be used to create a {@link FileDialog} for importers or exporters. * @author thomas */ -public class PathwayFileFilter extends FileFilter { +public class PathwayFileFilter extends FileFilter implements FilenameFilter { String[] exts; String name; @@ -39,6 +41,7 @@ public String getDefaultExtension() { return exts[0]; } + @Override public boolean accept(File f) { if(f.isDirectory()) return true; @@ -55,6 +58,7 @@ public boolean accept(File f) { return false; } + @Override public String getDescription() { StringBuilder extstr = new StringBuilder(); for(String e : exts) { @@ -65,4 +69,9 @@ public String getDescription() { String str = extstr.substring(0, extstr.length() - 2); return name + " (" + str + ")"; } + + @Override + public boolean accept(File dir, String name1) { + return accept(new File(dir.getAbsoluteFile() + "/" + name1)); + } } diff --git a/modules/org.pathvisio.gui/src/org/pathvisio/gui/SwingEngine.java b/modules/org.pathvisio.gui/src/org/pathvisio/gui/SwingEngine.java index d1b1cd6f..9de7d6c4 100644 --- a/modules/org.pathvisio.gui/src/org/pathvisio/gui/SwingEngine.java +++ b/modules/org.pathvisio.gui/src/org/pathvisio/gui/SwingEngine.java @@ -19,6 +19,8 @@ import java.awt.Component; import java.awt.Container; import java.awt.Desktop; +import java.awt.FileDialog; +import java.awt.Frame; import java.io.File; import java.net.URL; import java.util.Comparator; @@ -279,17 +281,23 @@ public boolean exportPathway() return false; } + private static final boolean useFileDialog = + System.getProperty("os.name").startsWith("Mac OS X"); + /** * A wrapper around JFileChooser that has the right defaults and File Filters. */ private class PathwayChooser { private final JFileChooser jfc; + private final FileDialog fileDialog; private final String taskName; private final Preference dirPreference; - + public PathwayChooser(String taskName, int dialogType, Preference dirPreference, Set set) { + fileDialog = new FileDialog(new Frame(), taskName + " pathway", dialogType); + fileDialog.setDirectory(PreferenceManager.getCurrent().getFile(dirPreference).getAbsolutePath()); jfc = new JFileChooser(); this.taskName = taskName; this.dirPreference = dirPreference; @@ -313,15 +321,18 @@ public int compare(PathwayIO o1, PathwayIO o2) { ); exporters.addAll(set); - FileFilter selectedFilter = null; + PathwayFileFilter selectedFilter = null; for(PathwayIO exp : exporters) { - FileFilter ff = new PathwayFileFilter(exp); + PathwayFileFilter ff = new PathwayFileFilter(exp); jfc.addChoosableFileFilter(ff); if(exp instanceof GpmlFormat) { selectedFilter = ff; } } - if(selectedFilter != null) jfc.setFileFilter(selectedFilter); + if(selectedFilter != null) { + jfc.setFileFilter(selectedFilter); + fileDialog.setFilenameFilter(selectedFilter); + } } public FileFilter getFileFilter() @@ -331,6 +342,15 @@ public FileFilter getFileFilter() public int show () { + if (useFileDialog) { + fileDialog.setVisible(true); + if (fileDialog.getDirectory() == null) { + return JFileChooser.CANCEL_OPTION; + } else { + PreferenceManager.getCurrent().setFile(dirPreference, new File(fileDialog.getDirectory())); + return JFileChooser.APPROVE_OPTION; + } + } int status = jfc.showDialog(getApplicationPanel(), taskName); if(status == JFileChooser.APPROVE_OPTION) { @@ -341,6 +361,9 @@ public int show () public File getSelectedFile() { + if (useFileDialog) { + return new File(fileDialog.getDirectory() + "/" + fileDialog.getFile()); + } return jfc.getSelectedFile(); } }