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);

Reply via email to