1
0
mirror of https://github.com/mitb-archive/filebot synced 2024-11-13 21:05:01 -05:00
filebot/source/net/filebot/UserFiles.java

337 lines
12 KiB
Java
Raw Normal View History

package net.filebot;
import static java.util.Arrays.*;
2014-07-29 05:33:19 -04:00
import static java.util.Collections.*;
import static net.filebot.Settings.*;
2014-07-29 02:45:15 -04:00
import static net.filebot.util.ui.SwingUI.*;
2014-08-10 02:31:47 -04:00
import java.awt.Desktop;
import java.awt.Dialog;
import java.awt.FileDialog;
import java.awt.Frame;
import java.io.File;
2014-08-10 04:35:53 -04:00
import java.util.Collection;
import java.util.List;
2014-07-29 05:33:19 -04:00
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
2014-08-10 02:31:47 -04:00
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
2014-08-10 02:31:47 -04:00
import net.filebot.mac.MacAppUtilities;
import net.filebot.mac.NativeFileDialog;
import net.filebot.util.FileUtilities.ExtensionFileFilter;
public class UserFiles {
2014-08-10 04:35:53 -04:00
public static void revealFiles(Collection<File> files) {
if (isMacApp()) {
for (File it : files) {
MacAppUtilities.revealInFinder(it);
2014-08-10 02:31:47 -04:00
}
2014-08-10 04:35:53 -04:00
} else {
// if we can't reveal the file in folder, just reveal the parent folder
files.stream().map(it -> it.getParentFile()).distinct().forEach(it -> {
try {
Desktop.getDesktop().open(it);
} catch (Exception e) {
Logger.getLogger(UserFiles.class.getName()).log(Level.WARNING, e.toString());
}
});
2014-08-10 02:31:47 -04:00
}
}
private static FileChooser defaultFileChooser = getPreferredFileChooser();
public static void setDefaultFileChooser(FileChooser fileChooser) {
defaultFileChooser = fileChooser;
}
public static List<File> showLoadDialogSelectFiles(boolean folderMode, boolean multiSelection, File defaultFile, ExtensionFileFilter filter, String title, Object parent) {
String defaultFileKey = (folderMode && filter == null) ? KEY_OPEN_FOLDER : KEY_OPEN_FILE;
List<File> files = defaultFileChooser.showLoadDialogSelectFiles(folderMode, multiSelection, getFileChooserDefaultFile(defaultFileKey, defaultFile), filter, title, parent);
if (files.size() > 0) {
setFileChooserDefaultFile(defaultFileKey, files.get(0));
}
return files;
}
public static File showSaveDialogSelectFile(boolean folderMode, File defaultFile, String title, Object parent) {
File file = defaultFileChooser.showSaveDialogSelectFile(folderMode, getFileChooserDefaultFile(KEY_SAVE, defaultFile), title, parent);
if (file != null) {
setFileChooserDefaultFile(KEY_SAVE, file);
}
return file;
}
public static File showOpenDialogSelectFolder(File defaultFile, String title, Object parent) {
List<File> folder = defaultFileChooser.showLoadDialogSelectFiles(true, false, defaultFile, null, title, parent);
return folder.size() > 0 ? folder.get(0) : null;
}
2014-07-29 05:50:57 -04:00
private static final String PREF_KEY_PREFIX = "dialog.";
private static final String KEY_OPEN_FILE = "open.file";
private static final String KEY_OPEN_FOLDER = "open.folder";
private static final String KEY_SAVE = "save.file";
protected static File getFileChooserDefaultFile(String key, File userValue) {
if (userValue != null && userValue.getParentFile() != null)
return userValue;
String path = Settings.forPackage(UserFiles.class).get(PREF_KEY_PREFIX + key);
if (path == null || path.isEmpty())
return userValue;
if (userValue != null && userValue.getParentFile() == null)
return new File(new File(path).getParentFile(), userValue.getName());
return new File(path);
}
protected static void setFileChooserDefaultFile(String name, File file) {
Settings.forPackage(UserFiles.class).put(PREF_KEY_PREFIX + name, file.getPath());
}
public enum FileChooser {
Swing {
@Override
public List<File> showLoadDialogSelectFiles(boolean folderMode, boolean multiSelection, File defaultFile, ExtensionFileFilter filter, String title, Object parent) {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle(title);
chooser.setMultiSelectionEnabled(multiSelection);
chooser.setFileSelectionMode(folderMode && filter == null ? JFileChooser.DIRECTORIES_ONLY : JFileChooser.FILES_AND_DIRECTORIES);
if (defaultFile != null) {
if (defaultFile.exists()) {
chooser.setSelectedFile(defaultFile);
} else if (defaultFile.getParentFile().exists()) {
chooser.setCurrentDirectory(defaultFile.getParentFile());
}
}
if (filter != null && !filter.acceptAny()) {
chooser.setFileFilter(new javax.swing.filechooser.FileNameExtensionFilter(filter.toString(), filter.extensions()));
}
if (chooser.showOpenDialog(getWindow(parent)) == JFileChooser.APPROVE_OPTION) {
if (chooser.getSelectedFiles().length > 0)
return asList(chooser.getSelectedFiles());
if (chooser.getSelectedFile() != null)
return asList(chooser.getSelectedFile());
}
return asList(new File[0]);
}
@Override
public File showSaveDialogSelectFile(boolean folderMode, File defaultFile, String title, Object parent) {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle(title);
chooser.setMultiSelectionEnabled(false);
chooser.setFileSelectionMode(folderMode ? JFileChooser.DIRECTORIES_ONLY : JFileChooser.FILES_AND_DIRECTORIES);
chooser.setSelectedFile(defaultFile);
if (chooser.showSaveDialog(getWindow(parent)) != JFileChooser.APPROVE_OPTION) {
return null;
}
return chooser.getSelectedFile();
}
},
AWT {
@Override
public List<File> showLoadDialogSelectFiles(boolean folderMode, boolean multiSelection, File defaultFile, ExtensionFileFilter filter, String title, Object parent) {
FileDialog fileDialog = createFileDialog(parent, title, FileDialog.LOAD, folderMode);
fileDialog.setTitle(title);
fileDialog.setMultipleMode(multiSelection);
if (defaultFile != null) {
if (folderMode && defaultFile.isDirectory()) {
fileDialog.setDirectory(defaultFile.getPath());
2014-11-10 15:39:27 -05:00
} else if (defaultFile.getParentFile() != null && defaultFile.getParentFile().isDirectory()) {
fileDialog.setDirectory(defaultFile.getParentFile().getPath());
fileDialog.setFile(defaultFile.getName());
}
}
if (filter != null) {
fileDialog.setFilenameFilter(filter);
}
fileDialog.setVisible(true);
return asList(fileDialog.getFiles());
}
@Override
public File showSaveDialogSelectFile(boolean folderMode, File defaultFile, String title, Object parent) {
FileDialog fileDialog = createFileDialog(getWindow(parent), title, FileDialog.SAVE, folderMode);
fileDialog.setTitle(title);
fileDialog.setMultipleMode(false);
if (defaultFile != null) {
if (defaultFile.getParentFile() != null) {
fileDialog.setDirectory(defaultFile.getParentFile().getPath());
}
fileDialog.setFile(defaultFile.getName());
}
fileDialog.setVisible(true);
File[] files = fileDialog.getFiles();
return files.length > 0 ? files[0] : null;
}
public FileDialog createFileDialog(Object parent, String title, int mode, boolean fileDialogForDirectories) {
// By default, the AWT File Dialog lets you choose a file. Under certain circumstances, however, it may be proper for you to choose a directory instead. If that is the case, set this property to allow for directory selection in a file dialog.
System.setProperty("apple.awt.fileDialogForDirectories", String.valueOf(fileDialogForDirectories));
if (parent instanceof Frame) {
return new FileDialog((Frame) parent, title, mode);
}
if (parent instanceof Dialog) {
return new FileDialog((Dialog) parent, title, mode);
}
Frame[] frames = Frame.getFrames();
return new FileDialog(frames.length > 0 ? frames[0] : null, title, mode);
}
2014-07-29 05:33:19 -04:00
},
COCOA {
@Override
public List<File> showLoadDialogSelectFiles(boolean folderMode, boolean multiSelection, File defaultFile, ExtensionFileFilter filter, String title, Object parent) {
// directly use NSOpenPanel for via Objective-C bridge for FILES_AND_DIRECTORIES mode
if (folderMode && filter != null) {
try {
NativeFileDialog nsOpenPanel = new NativeFileDialog(title, FileDialog.LOAD);
nsOpenPanel.setMultipleMode(true);
nsOpenPanel.setCanChooseDirectories(true);
nsOpenPanel.setCanChooseFiles(true);
if (!filter.acceptAny()) {
nsOpenPanel.setAllowedFileTypes(asList(filter.extensions()));
}
nsOpenPanel.setVisible(true);
if (!nsOpenPanel.isCancelled()) {
return asList(nsOpenPanel.getFiles());
} else {
return emptyList();
}
} catch (Throwable e) {
Logger.getLogger(UserFiles.class.getName()).log(Level.WARNING, e.toString());
}
}
// default to AWT implementation
return AWT.showLoadDialogSelectFiles(folderMode, multiSelection, defaultFile, filter, title, parent);
}
@Override
public File showSaveDialogSelectFile(boolean folderMode, File defaultFile, String title, Object parent) {
// default to AWT implementation
return AWT.showSaveDialogSelectFile(folderMode, defaultFile, title, parent);
}
},
2014-07-29 05:33:19 -04:00
JavaFX {
@Override
public List<File> showLoadDialogSelectFiles(final boolean folderMode, final boolean multiSelection, final File defaultFile, final ExtensionFileFilter filter, final String title, final Object parent) {
return runAndWait(new Callable<List<File>>() {
@Override
public List<File> call() throws Exception {
2014-07-29 05:50:57 -04:00
// show DirectoryChooser
if (folderMode) {
javafx.stage.DirectoryChooser directoryChooser = new javafx.stage.DirectoryChooser();
directoryChooser.setTitle(title);
if (defaultFile != null) {
directoryChooser.setInitialDirectory(defaultFile);
}
File file = directoryChooser.showDialog(null);
if (file != null)
return singletonList(file);
else
return emptyList();
}
// show FileChooser
2014-07-29 05:33:19 -04:00
javafx.stage.FileChooser fileChooser = new javafx.stage.FileChooser();
fileChooser.setTitle(title);
if (filter != null && !filter.acceptAny()) {
2014-07-29 05:33:19 -04:00
String[] globFilter = filter.extensions();
for (int i = 0; i < globFilter.length; i++) {
globFilter[i] = "*." + globFilter[i];
}
fileChooser.getExtensionFilters().add(new javafx.stage.FileChooser.ExtensionFilter(filter.toString(), globFilter));
}
2014-11-10 15:39:27 -05:00
2014-07-29 05:33:19 -04:00
if (defaultFile != null) {
2014-11-10 15:39:27 -05:00
if (defaultFile.getParentFile() != null && defaultFile.getParentFile().isDirectory()) {
2014-07-29 05:33:19 -04:00
fileChooser.setInitialDirectory(defaultFile.getParentFile());
2014-11-10 15:39:27 -05:00
fileChooser.setInitialFileName(defaultFile.getName());
2014-07-29 05:33:19 -04:00
}
}
if (multiSelection) {
List<File> files = fileChooser.showOpenMultipleDialog(null);
if (files != null)
return files;
} else {
File file = fileChooser.showOpenDialog(null);
if (file != null)
return singletonList(file);
}
return emptyList();
}
});
}
@Override
public File showSaveDialogSelectFile(final boolean folderMode, final File defaultFile, final String title, final Object parent) {
return runAndWait(new Callable<File>() {
@Override
public File call() throws Exception {
javafx.stage.FileChooser fileChooser = new javafx.stage.FileChooser();
fileChooser.setTitle(title);
if (defaultFile != null) {
if (defaultFile.getParentFile() != null) {
fileChooser.setInitialDirectory(defaultFile.getParentFile());
}
fileChooser.setInitialFileName(defaultFile.getName());
}
return fileChooser.showSaveDialog(null);
}
});
}
public <T> T runAndWait(Callable<T> c) {
try {
// initialize JavaFX
new javafx.embed.swing.JFXPanel();
// run on FX Thread
FutureTask<T> task = new FutureTask<T>(c);
javafx.application.Platform.runLater(task);
return task.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
public abstract List<File> showLoadDialogSelectFiles(boolean folderMode, boolean multiSelection, File defaultFile, ExtensionFileFilter filter, String title, Object parent);
public abstract File showSaveDialogSelectFile(boolean folderMode, File defaultFile, String title, Object parent);
}
}