package net.sf.jabref.gui; import net.sf.jabref.OpenFileFilter; import net.sf.jabref.Globals; import javax.swing.*; import java.io.File; import java.io.FilenameFilter; /** * Created by IntelliJ IDEA. * User: alver * Date: Apr 14, 2009 * Time: 7:24:07 PM * To change this template use File | Settings | File Templates. */ public class FileDialogs { /** * Will return the names of multiple files selected in the given directory * and the given extensions. * * Will return an empty String array if no entry is found. * * @param owner * @param directory * @param extension * @param updateWorkingdirectory * @return an array of selected file paths, or an empty array if no selection is made. */ public static String[] getMultipleFiles(JFrame owner, File directory, String extension, boolean updateWorkingdirectory) { OpenFileFilter off = null; if (extension == null) off = new OpenFileFilter(); else if (!extension.equals(Globals.NONE)) off = new OpenFileFilter(extension); Object files = getNewFileImpl(owner, directory, extension, null, off, JFileChooser.OPEN_DIALOG, updateWorkingdirectory, false, true, null); if (files instanceof String[]) { return (String[]) files; } // Fix for: // http://sourceforge.net/tracker/index.php?func=detail&aid=1538769&group_id=92314&atid=600306 if (files != null) { return new String[] { (String) files }; } return new String[0]; } public static String getNewFile(JFrame owner, File directory, String extension, int dialogType, boolean updateWorkingDirectory) { return getNewFile(owner, directory, extension, null, dialogType, updateWorkingDirectory, false, null); } public static String getNewFile(JFrame owner, File directory, String extension, int dialogType, boolean updateWorkingDirectory, JComponent accessory) { return getNewFile(owner, directory, extension, null, dialogType, updateWorkingDirectory, false, accessory); } public static String getNewFile(JFrame owner, File directory, String extension, String description, int dialogType, boolean updateWorkingDirectory) { return getNewFile(owner, directory, extension, description, dialogType, updateWorkingDirectory, false, null); } public static String getNewDir(JFrame owner, File directory, String extension, int dialogType, boolean updateWorkingDirectory) { return getNewFile(owner, directory, extension, null, dialogType, updateWorkingDirectory, true, null); } public static String getNewDir(JFrame owner, File directory, String extension, String description, int dialogType, boolean updateWorkingDirectory) { return getNewFile(owner, directory, extension, description, dialogType, updateWorkingDirectory, true, null); } public static String getNewFile(JFrame owner, File directory, String extension, String description, int dialogType, boolean updateWorkingDirectory, boolean dirOnly, JComponent accessory) { OpenFileFilter off = null; if (extension == null) off = new OpenFileFilter(); else if (!extension.equals(Globals.NONE)) off = new OpenFileFilter(extension); return (String) getNewFileImpl(owner, directory, extension, description, off, dialogType, updateWorkingDirectory, dirOnly, false, accessory); } public static Object getNewFileImpl(JFrame owner, File directory, String extension, String description, OpenFileFilter off, int dialogType, boolean updateWorkingDirectory, boolean dirOnly, boolean multipleSelection, JComponent accessory) { // Added the !dirOnly condition below as a workaround to the native file dialog // not supporting directory selection: if (!dirOnly && Globals.prefs.getBoolean("useNativeFileDialogOnMac")) { return getNewFileForMac(owner, directory, extension, dialogType, updateWorkingDirectory, dirOnly, off); } JFileChooser fc; try { fc = new JFileChooser(directory);//JabRefFileChooser(directory); if (accessory != null) fc.setAccessory(accessory); } catch (InternalError errl) { // This try/catch clause was added because a user reported an // InternalError getting thrown on WinNT, presumably because of a // bug in JGoodies Windows PLAF. This clause can be removed if the // bug is fixed, but for now we just resort to the native file // dialog, using the same method as is always used on Mac: return getNewFileForMac(owner, directory, extension, dialogType, updateWorkingDirectory, dirOnly, off); } if (dirOnly) { fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); } fc.setMultiSelectionEnabled(multipleSelection); fc.addChoosableFileFilter(off); fc.setDialogType(dialogType); int dialogResult; if (dialogType == JFileChooser.OPEN_DIALOG) { dialogResult = fc.showOpenDialog(owner); } else if (dialogType == JFileChooser.SAVE_DIALOG) { dialogResult = fc.showSaveDialog(owner); } else { dialogResult = fc.showDialog(owner, description); } // the getSelectedFile method returns a valid fileselection // (if something is selected) indepentently from dialog return status if (dialogResult != JFileChooser.APPROVE_OPTION) return null; // okay button File selectedFile = fc.getSelectedFile(); if (selectedFile == null) { // cancel return null; } // If this is a save dialog, and the user has not chosen "All files" as // filter // we enforce the given extension. But only if extension is not null. if ((extension != null) && (dialogType == JFileChooser.SAVE_DIALOG) && (fc.getFileFilter() == off) && !off.accept(selectedFile)) { // add the first extension if there are multiple extensions selectedFile = new File(selectedFile.getPath() + extension.split("[, ]+", 0)[0]); } if (updateWorkingDirectory) { Globals.prefs.put("workingDirectory", selectedFile.getPath()); } if (!multipleSelection) return selectedFile.getAbsolutePath(); else { File[] files = fc.getSelectedFiles(); String[] filenames = new String[files.length]; for (int i = 0; i < files.length; i++) filenames[i] = files[i].getAbsolutePath(); return filenames; } } public static String getNewFileForMac(JFrame owner, File directory, String extensions, int dialogType, boolean updateWorkingDirectory, boolean dirOnly, FilenameFilter filter) { java.awt.FileDialog fc = new java.awt.FileDialog(owner); // fc.setFilenameFilter(filter); if (directory != null) { fc.setDirectory(directory.getParent()); } if (dialogType == JFileChooser.OPEN_DIALOG) { fc.setMode(java.awt.FileDialog.LOAD); } else { fc.setMode(java.awt.FileDialog.SAVE); } fc.setVisible(true); // fc.show(); -> deprecated since 1.5 if (fc.getFile() != null) { Globals.prefs.put("workingDirectory", fc.getDirectory() + fc.getFile()); return fc.getDirectory() + fc.getFile(); } else { return null; } } }