This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new 63e8a85ff CAY-2948 Modeler: use native FileDialog on Mac
63e8a85ff is described below
commit 63e8a85ff5ea223518e2c410ec7470499126bb30
Author: Andrus Adamchik <[email protected]>
AuthorDate: Mon May 25 10:54:15 2026 -0400
CAY-2948 Modeler: use native FileDialog on Mac
fixing regression causing slowness on windows
---
.../modeler/platform/mac/MacFileChooser.java | 6 ++---
.../modeler/pref/adapters/FileChooserPrefs.java | 10 +++----
.../toolkit/filechooser/SwingFileChooser.java | 31 +++++++++-------------
3 files changed, 20 insertions(+), 27 deletions(-)
diff --git
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooser.java
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooser.java
index b60bd01e5..f6c16f3e4 100644
---
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooser.java
+++
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooser.java
@@ -61,13 +61,13 @@ public class MacFileChooser implements CMFileChooser {
@Override
public File openDir(File initialDir) {
// must use custom JFileChooser, as MacOS native dialog doesn't allow
to block file name selection
- return SwingFileChooser.showOpenDir(parent, title, c -> { if
(initialDir != null) c.setCurrentDirectory(initialDir); });
+ return SwingFileChooser.showOpenDir(parent, title, initialDir, c ->
{});
}
@Override
public File openDir(FileChooserPrefs prefs) {
// must use custom JFileChooser, as MacOS native dialog doesn't allow
to block file name selection
- return SwingFileChooser.showOpenDir(parent, title, prefs::bind);
+ return SwingFileChooser.showOpenDir(parent, title, prefs.getDir(),
prefs::bind);
}
@Override
@@ -78,7 +78,7 @@ public class MacFileChooser implements CMFileChooser {
@Override
public File saveDir(File initialDir) {
// must use custom JFileChooser, as MacOS native dialog doesn't allow
to block file name selection
- return SwingFileChooser.showOpenDir(parent, title, c -> { if
(initialDir != null) c.setCurrentDirectory(initialDir); });
+ return SwingFileChooser.showOpenDir(parent, title, initialDir, c ->
{});
}
private File showOpen(FilenameFilter fnFilter, Consumer<FileDialog> init) {
diff --git
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/FileChooserPrefs.java
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/FileChooserPrefs.java
index 24780ef25..7ed1e143a 100644
---
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/FileChooserPrefs.java
+++
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/FileChooserPrefs.java
@@ -37,10 +37,8 @@ public final class FileChooserPrefs extends PrefsAdapter {
}
public void bind(JFileChooser chooser) {
- File startDir = loadDir();
- if (startDir != null) {
- chooser.setCurrentDirectory(startDir);
- }
+ // start directory already set via the JFileChooser constructor — just
attach the save listener. Setting it
+ // again would make things very slow on Windows
(setCurrentDirectory(targetDir) scans the target dir)
chooser.addActionListener(e -> {
if (JFileChooser.APPROVE_SELECTION.equals(e.getActionCommand())) {
saveDir(chooser.getSelectedFile());
@@ -49,7 +47,7 @@ public final class FileChooserPrefs extends PrefsAdapter {
}
public void bind(FileDialog dialog) {
- File startDir = loadDir();
+ File startDir = getDir();
if (startDir != null) {
dialog.setDirectory(startDir.getAbsolutePath());
}
@@ -65,7 +63,7 @@ public final class FileChooserPrefs extends PrefsAdapter {
});
}
- private File loadDir() {
+ public File getDir() {
String path = prefs.get(PATH_PROPERTY, null);
if (path == null) {
diff --git
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/SwingFileChooser.java
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/SwingFileChooser.java
index b80886661..433f1d11f 100644
---
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/SwingFileChooser.java
+++
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/SwingFileChooser.java
@@ -36,9 +36,6 @@ import java.awt.Window;
import java.io.File;
import java.util.function.Consumer;
-/**
- * {@link CMFileChooser} implementation backed by Swing's {@link JFileChooser}.
- */
public class SwingFileChooser implements CMFileChooser {
private final Component parent;
@@ -51,43 +48,41 @@ public class SwingFileChooser implements CMFileChooser {
@Override
public File openFile(File initialDir, FileFilter filter) {
- return showOpen(
- JFileChooser.FILES_ONLY,
- c -> { if (initialDir != null)
c.setCurrentDirectory(initialDir); },
- filter);
+ return showOpen(JFileChooser.FILES_ONLY, initialDir, c -> {}, filter);
}
@Override
public File openFile(FileChooserPrefs prefs, FileFilter filter) {
- return showOpen(JFileChooser.FILES_ONLY, prefs::bind, filter);
+ return showOpen(JFileChooser.FILES_ONLY, prefs.getDir(), prefs::bind,
filter);
}
@Override
public File openDir(File initialDir) {
- return showOpenDir(parent, title, c -> { if (initialDir != null)
c.setCurrentDirectory(initialDir); });
+ return showOpenDir(parent, title, initialDir, c -> {});
}
@Override
public File openDir(FileChooserPrefs prefs) {
- return showOpenDir(parent, title, prefs::bind);
+ return showOpenDir(parent, title, prefs.getDir(), prefs::bind);
}
@Override
public File saveFile(FileChooserPrefs prefs, String defaultName) {
- return showSave(prefs::bind, defaultName);
+ return showSave(prefs.getDir(), prefs::bind, defaultName);
}
@Override
public File saveDir(File initialDir) {
- return showOpenDir(parent, title, c -> { if (initialDir != null)
c.setCurrentDirectory(initialDir); });
+ return showOpenDir(parent, title, initialDir, c -> {});
}
// setControlButtonsAreShown(false) + custom buttons: on macOS Aqua L&F
the built-in
// approve button is continuously re-disabled when nothing is selected
(e.g. after
// navigating into a directory). The custom dialog owns its own
always-enabled "Select"
// button and a "New Folder" button, and is used on all platforms for
consistency.
- public static File showOpenDir(Component parent, String title,
Consumer<JFileChooser> init) {
- JFileChooser chooser = new JFileChooser();
+
+ public static File showOpenDir(Component parent, String title, File
startDir, Consumer<JFileChooser> init) {
+ JFileChooser chooser = new JFileChooser(startDir);
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setControlButtonsAreShown(false);
init.accept(chooser);
@@ -148,8 +143,8 @@ public class SwingFileChooser implements CMFileChooser {
return selected != null ? selected : chooser.getCurrentDirectory();
}
- private File showOpen(int mode, Consumer<JFileChooser> init, FileFilter
filter) {
- JFileChooser chooser = new JFileChooser();
+ private File showOpen(int mode, File startDir, Consumer<JFileChooser>
init, FileFilter filter) {
+ JFileChooser chooser = new JFileChooser(startDir);
chooser.setFileSelectionMode(mode);
init.accept(chooser);
if (title != null) {
@@ -164,8 +159,8 @@ public class SwingFileChooser implements CMFileChooser {
: null;
}
- private File showSave(Consumer<JFileChooser> init, String defaultName) {
- JFileChooser chooser = new JFileChooser();
+ private File showSave(File startDir, Consumer<JFileChooser> init, String
defaultName) {
+ JFileChooser chooser = new JFileChooser(startDir);
init.accept(chooser);
if (title != null) {
chooser.setDialogTitle(title);