Skip to content

Commit 065e6af

Browse files
committed
Use Swing dialog for choosing directories, rather than native one, for non-Mac platforms. Native (awt) dialog broken for directory selection on Windows, possibly on Linux as well.
1 parent c60abab commit 065e6af

File tree

1 file changed

+69
-1
lines changed

1 file changed

+69
-1
lines changed

src/main/java/org/broad/igv/ui/util/FileDialogUtils.java

+69-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import javax.swing.*;
3434
import java.awt.*;
3535
import java.io.File;
36+
import java.io.FileFilter;
3637
import java.io.FilenameFilter;
3738
import java.lang.reflect.Method;
3839

@@ -73,9 +74,14 @@ private static File chooseFile(String title, File initialDirectory, File initial
7374
}
7475

7576
public static File chooseDirectory(String title, File initialDirectory) {
76-
return chooseNative(title, initialDirectory, null, null, JFileChooser.DIRECTORIES_ONLY, LOAD);
77+
if (Globals.IS_MAC) {
78+
return chooseNative(title, initialDirectory, null, null, JFileChooser.DIRECTORIES_ONLY, LOAD);
79+
} else {
80+
return chooseSwing(title, initialDirectory, null, null, JFileChooser.DIRECTORIES_ONLY, LOAD);
81+
}
7782
}
7883

84+
7985
public static File[] chooseMultiple(String title, File initialDirectory, final FilenameFilter filter) {
8086

8187
File[] files = null;
@@ -130,6 +136,68 @@ private static File chooseNative(String title, File initialDirectory, File initi
130136
}
131137
}
132138

139+
140+
private static File chooseSwing(String title, File initialDirectory, File initialFile, final FilenameFilter filter,
141+
int directoryMode, int mode) {
142+
143+
UIManager.put("FileChooser.readOnly", Boolean.FALSE);
144+
JFileChooser fileChooser = getJFileChooser(title, initialDirectory, initialFile, filter, directoryMode);
145+
Frame parentFrame = getParentFrame();
146+
boolean approve;
147+
if (mode == LOAD) {
148+
approve = fileChooser.showOpenDialog(parentFrame) == JFileChooser.APPROVE_OPTION;
149+
} else {
150+
151+
approve = fileChooser.showSaveDialog(parentFrame) == JFileChooser.APPROVE_OPTION;
152+
}
153+
154+
if (approve) {
155+
return fileChooser.getSelectedFile();
156+
} else {
157+
return null;
158+
}
159+
160+
}
161+
162+
/**
163+
* @param title
164+
* @param initialDirectory
165+
* @param initialFile
166+
* @param filter
167+
* @param directoryMode either JFileChooser.DIRECTORIES_ONLY, JFileChooser.FILES_ONLY, or
168+
* JFileChooser.DIRECTORIES_ONLY : JFileChooser.FILES_AND_DIRECTORIES
169+
* @return
170+
*/
171+
private static JFileChooser getJFileChooser(String title, File initialDirectory, File initialFile,
172+
final FilenameFilter filter, int directoryMode) {
173+
JFileChooser fileChooser = new JFileChooser();
174+
if (initialDirectory != null) {
175+
fileChooser.setCurrentDirectory(initialDirectory);
176+
}
177+
if (initialFile != null) {
178+
fileChooser.setSelectedFile(initialFile);
179+
}
180+
if (filter != null) {
181+
fileChooser.setFileFilter(new javax.swing.filechooser.FileFilter() {
182+
@Override
183+
public boolean accept(File file) {
184+
return filter.accept(file.getParentFile(), file.getName());
185+
}
186+
187+
@Override
188+
public String getDescription() {
189+
return "";
190+
}
191+
});
192+
}
193+
194+
fileChooser.setDialogTitle(title);
195+
fileChooser.setFileSelectionMode(directoryMode);
196+
197+
return fileChooser;
198+
}
199+
200+
133201
/**
134202
* Reflectively call FileDialog.setMultipleMode.
135203
* Does nothing if method not available

0 commit comments

Comments
 (0)