* work around NSOpenPanel causing deadlocks on some machines

This commit is contained in:
Reinhard Pointner 2015-01-02 00:48:00 +00:00
parent c0f7215bdd
commit 32fab805bb

View File

@ -16,6 +16,8 @@ import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask; import java.util.concurrent.FutureTask;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
@ -200,27 +202,42 @@ public class UserFiles {
COCOA { COCOA {
private final String KEY_NSOPENPANEL_BROKEN = "NSOPENPANEL_BROKEN";
@Override @Override
public List<File> showLoadDialogSelectFiles(boolean folderMode, boolean multiSelection, File defaultFile, ExtensionFileFilter filter, String title, Object parent) { 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 // directly use NSOpenPanel for via Objective-C bridge for FILES_AND_DIRECTORIES mode
if (folderMode && filter != null) { if (folderMode && filter != null) {
try { // NSOpenPanel causes deadlocks on some machines
NativeFileDialog nsOpenPanel = new NativeFileDialog(title, FileDialog.LOAD); Preferences persistence = Preferences.userNodeForPackage(UserFiles.class);
nsOpenPanel.setMultipleMode(true); if (!persistence.getBoolean(KEY_NSOPENPANEL_BROKEN, false)) {
nsOpenPanel.setCanChooseDirectories(true); // assume that NSOpenPanel may freeze the application until it is killed, and make sure to not use NSOpenPanel on subsequent runs
nsOpenPanel.setCanChooseFiles(true); try {
if (!filter.acceptAny()) { persistence.putBoolean(KEY_NSOPENPANEL_BROKEN, true);
nsOpenPanel.setAllowedFileTypes(asList(filter.extensions())); persistence.flush();
} catch (BackingStoreException e) {
Logger.getLogger(UserFiles.class.getName()).log(Level.WARNING, e.toString(), e);
} }
nsOpenPanel.setVisible(true);
if (!nsOpenPanel.isCancelled()) { try {
return asList(nsOpenPanel.getFiles()); NativeFileDialog nsOpenPanel = new NativeFileDialog(title, FileDialog.LOAD);
} else { nsOpenPanel.setMultipleMode(true);
return emptyList(); 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());
} finally {
persistence.putBoolean(KEY_NSOPENPANEL_BROKEN, false); // NSOpenPanel did not freeze application
} }
} catch (Throwable e) {
Logger.getLogger(UserFiles.class.getName()).log(Level.WARNING, e.toString());
} }
} }