* 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,10 +202,23 @@ 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) {
// NSOpenPanel causes deadlocks on some machines
Preferences persistence = Preferences.userNodeForPackage(UserFiles.class);
if (!persistence.getBoolean(KEY_NSOPENPANEL_BROKEN, false)) {
// assume that NSOpenPanel may freeze the application until it is killed, and make sure to not use NSOpenPanel on subsequent runs
try {
persistence.putBoolean(KEY_NSOPENPANEL_BROKEN, true);
persistence.flush();
} catch (BackingStoreException e) {
Logger.getLogger(UserFiles.class.getName()).log(Level.WARNING, e.toString(), e);
}
try { try {
NativeFileDialog nsOpenPanel = new NativeFileDialog(title, FileDialog.LOAD); NativeFileDialog nsOpenPanel = new NativeFileDialog(title, FileDialog.LOAD);
nsOpenPanel.setMultipleMode(true); nsOpenPanel.setMultipleMode(true);
@ -213,7 +228,6 @@ public class UserFiles {
nsOpenPanel.setAllowedFileTypes(asList(filter.extensions())); nsOpenPanel.setAllowedFileTypes(asList(filter.extensions()));
} }
nsOpenPanel.setVisible(true); nsOpenPanel.setVisible(true);
if (!nsOpenPanel.isCancelled()) { if (!nsOpenPanel.isCancelled()) {
return asList(nsOpenPanel.getFiles()); return asList(nsOpenPanel.getFiles());
} else { } else {
@ -221,6 +235,9 @@ public class UserFiles {
} }
} catch (Throwable e) { } catch (Throwable e) {
Logger.getLogger(UserFiles.class.getName()).log(Level.WARNING, e.toString()); Logger.getLogger(UserFiles.class.getName()).log(Level.WARNING, e.toString());
} finally {
persistence.putBoolean(KEY_NSOPENPANEL_BROKEN, false); // NSOpenPanel did not freeze application
}
} }
} }