Skip to content

Commit 63e8a85

Browse files
committed
CAY-2948 Modeler: use native FileDialog on Mac
fixing regression causing slowness on windows
1 parent b5ff85b commit 63e8a85

3 files changed

Lines changed: 20 additions & 27 deletions

File tree

modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,13 @@ public File openFile(FileChooserPrefs prefs, FileFilter filter) {
6161
@Override
6262
public File openDir(File initialDir) {
6363
// must use custom JFileChooser, as MacOS native dialog doesn't allow to block file name selection
64-
return SwingFileChooser.showOpenDir(parent, title, c -> { if (initialDir != null) c.setCurrentDirectory(initialDir); });
64+
return SwingFileChooser.showOpenDir(parent, title, initialDir, c -> {});
6565
}
6666

6767
@Override
6868
public File openDir(FileChooserPrefs prefs) {
6969
// must use custom JFileChooser, as MacOS native dialog doesn't allow to block file name selection
70-
return SwingFileChooser.showOpenDir(parent, title, prefs::bind);
70+
return SwingFileChooser.showOpenDir(parent, title, prefs.getDir(), prefs::bind);
7171
}
7272

7373
@Override
@@ -78,7 +78,7 @@ public File saveFile(FileChooserPrefs prefs, String defaultName) {
7878
@Override
7979
public File saveDir(File initialDir) {
8080
// must use custom JFileChooser, as MacOS native dialog doesn't allow to block file name selection
81-
return SwingFileChooser.showOpenDir(parent, title, c -> { if (initialDir != null) c.setCurrentDirectory(initialDir); });
81+
return SwingFileChooser.showOpenDir(parent, title, initialDir, c -> {});
8282
}
8383

8484
private File showOpen(FilenameFilter fnFilter, Consumer<FileDialog> init) {

modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/FileChooserPrefs.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,8 @@ public FileChooserPrefs(Preferences prefs) {
3737
}
3838

3939
public void bind(JFileChooser chooser) {
40-
File startDir = loadDir();
41-
if (startDir != null) {
42-
chooser.setCurrentDirectory(startDir);
43-
}
40+
// start directory already set via the JFileChooser constructor — just attach the save listener. Setting it
41+
// again would make things very slow on Windows (setCurrentDirectory(targetDir) scans the target dir)
4442
chooser.addActionListener(e -> {
4543
if (JFileChooser.APPROVE_SELECTION.equals(e.getActionCommand())) {
4644
saveDir(chooser.getSelectedFile());
@@ -49,7 +47,7 @@ public void bind(JFileChooser chooser) {
4947
}
5048

5149
public void bind(FileDialog dialog) {
52-
File startDir = loadDir();
50+
File startDir = getDir();
5351
if (startDir != null) {
5452
dialog.setDirectory(startDir.getAbsolutePath());
5553
}
@@ -65,7 +63,7 @@ public void componentHidden(ComponentEvent e) {
6563
});
6664
}
6765

68-
private File loadDir() {
66+
public File getDir() {
6967
String path = prefs.get(PATH_PROPERTY, null);
7068

7169
if (path == null) {

modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/SwingFileChooser.java

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@
3636
import java.io.File;
3737
import java.util.function.Consumer;
3838

39-
/**
40-
* {@link CMFileChooser} implementation backed by Swing's {@link JFileChooser}.
41-
*/
4239
public class SwingFileChooser implements CMFileChooser {
4340

4441
private final Component parent;
@@ -51,43 +48,41 @@ public SwingFileChooser(Component parent, String title) {
5148

5249
@Override
5350
public File openFile(File initialDir, FileFilter filter) {
54-
return showOpen(
55-
JFileChooser.FILES_ONLY,
56-
c -> { if (initialDir != null) c.setCurrentDirectory(initialDir); },
57-
filter);
51+
return showOpen(JFileChooser.FILES_ONLY, initialDir, c -> {}, filter);
5852
}
5953

6054
@Override
6155
public File openFile(FileChooserPrefs prefs, FileFilter filter) {
62-
return showOpen(JFileChooser.FILES_ONLY, prefs::bind, filter);
56+
return showOpen(JFileChooser.FILES_ONLY, prefs.getDir(), prefs::bind, filter);
6357
}
6458

6559
@Override
6660
public File openDir(File initialDir) {
67-
return showOpenDir(parent, title, c -> { if (initialDir != null) c.setCurrentDirectory(initialDir); });
61+
return showOpenDir(parent, title, initialDir, c -> {});
6862
}
6963

7064
@Override
7165
public File openDir(FileChooserPrefs prefs) {
72-
return showOpenDir(parent, title, prefs::bind);
66+
return showOpenDir(parent, title, prefs.getDir(), prefs::bind);
7367
}
7468

7569
@Override
7670
public File saveFile(FileChooserPrefs prefs, String defaultName) {
77-
return showSave(prefs::bind, defaultName);
71+
return showSave(prefs.getDir(), prefs::bind, defaultName);
7872
}
7973

8074
@Override
8175
public File saveDir(File initialDir) {
82-
return showOpenDir(parent, title, c -> { if (initialDir != null) c.setCurrentDirectory(initialDir); });
76+
return showOpenDir(parent, title, initialDir, c -> {});
8377
}
8478

8579
// setControlButtonsAreShown(false) + custom buttons: on macOS Aqua L&F the built-in
8680
// approve button is continuously re-disabled when nothing is selected (e.g. after
8781
// navigating into a directory). The custom dialog owns its own always-enabled "Select"
8882
// button and a "New Folder" button, and is used on all platforms for consistency.
89-
public static File showOpenDir(Component parent, String title, Consumer<JFileChooser> init) {
90-
JFileChooser chooser = new JFileChooser();
83+
84+
public static File showOpenDir(Component parent, String title, File startDir, Consumer<JFileChooser> init) {
85+
JFileChooser chooser = new JFileChooser(startDir);
9186
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
9287
chooser.setControlButtonsAreShown(false);
9388
init.accept(chooser);
@@ -148,8 +143,8 @@ public static File showOpenDir(Component parent, String title, Consumer<JFileCho
148143
return selected != null ? selected : chooser.getCurrentDirectory();
149144
}
150145

151-
private File showOpen(int mode, Consumer<JFileChooser> init, FileFilter filter) {
152-
JFileChooser chooser = new JFileChooser();
146+
private File showOpen(int mode, File startDir, Consumer<JFileChooser> init, FileFilter filter) {
147+
JFileChooser chooser = new JFileChooser(startDir);
153148
chooser.setFileSelectionMode(mode);
154149
init.accept(chooser);
155150
if (title != null) {
@@ -164,8 +159,8 @@ private File showOpen(int mode, Consumer<JFileChooser> init, FileFilter filter)
164159
: null;
165160
}
166161

167-
private File showSave(Consumer<JFileChooser> init, String defaultName) {
168-
JFileChooser chooser = new JFileChooser();
162+
private File showSave(File startDir, Consumer<JFileChooser> init, String defaultName) {
163+
JFileChooser chooser = new JFileChooser(startDir);
169164
init.accept(chooser);
170165
if (title != null) {
171166
chooser.setDialogTitle(title);

0 commit comments

Comments
 (0)