* work around NSOpenPanel causing deadlocks on some machines
This commit is contained in:
parent
c0f7215bdd
commit
32fab805bb
@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user