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

commit 89f0108d233a5910aef3b42ce7ed17c2171e09d5
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun May 24 09:28:46 2026 -0400

     CAY-2948 Modeler: use native FileDialog on Mac
    
    refactoring to keep FileChooserPrefs tight and easy to use
---
 .../platform/mac/MacFileChooserFactory.java        | 92 ++++++++++++----------
 .../modeler/pref/adapters/FileChooserPrefs.java    | 21 +++--
 .../toolkit/filechooser/FileChooserFactory.java    | 35 ++++----
 .../toolkit/filechooser/JFileChooserFactory.java   | 78 ++++++++++++------
 .../modeler/ui/action/ImportDataMapAction.java     |  4 +-
 .../modeler/ui/action/ImportEOModelAction.java     |  3 +-
 .../cayenne/modeler/ui/action/ProjectOpener.java   |  2 +-
 .../modeler/ui/dbgen/DBGeneratorOptionsDialog.java |  9 +--
 .../modeler/ui/dbmerge/MergerOptionsDialog.java    | 10 +--
 .../preferences/classpath/ClasspathPrefsPanel.java |  6 +-
 .../editor/datamap/cgen/CgenConfigPanel.java       |  2 +-
 11 files changed, 145 insertions(+), 117 deletions(-)

diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooserFactory.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooserFactory.java
index 5b636b82b..956efcc24 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooserFactory.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacFileChooserFactory.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.platform.mac;
 
+import org.apache.cayenne.modeler.pref.adapters.FileChooserPrefs;
 import org.apache.cayenne.modeler.toolkit.filechooser.FileChooserFactory;
 
 import javax.swing.SwingUtilities;
@@ -29,58 +30,64 @@ import java.awt.Frame;
 import java.awt.Window;
 import java.io.File;
 import java.io.FilenameFilter;
+import java.util.function.Consumer;
 
 /**
  * {@link FileChooserFactory} implementation backed by the native OS {@link 
FileDialog}.
  * On macOS this delegates to NSOpenPanel / NSSavePanel, providing Quick Look 
preview,
  * Spotlight search, and the standard Finder sidebar.
- *
- * <p>Directory picking requires {@code 
apple.awt.fileDialogForDirectories=true} to be set
- * as a global JVM property before Swing starts (set by {@code 
MacUIInitializer}).
  */
-public class MacFileChooserFactory extends FileChooserFactory {
+public class MacFileChooserFactory implements FileChooserFactory {
 
     private static final String DIRS_DIALOG_PROPERTY = 
"apple.awt.fileDialogForDirectories";
 
     @Override
     public File openFile(Component parent, String title, File initialDir, 
FileFilter filter) {
-        Frame frame = toFrame(parent);
-        String titleStr = title != null ? title : "";
-        FilenameFilter fnFilter = filter != null
-                ? (dir, name) -> filter.accept(new File(dir, name))
-                : null;
-
-        File startDir = initialDir;
-        while (true) {
-            FileDialog fd = new FileDialog(frame, titleStr, FileDialog.LOAD);
-            if (startDir != null) {
-                fd.setDirectory(startDir.getAbsolutePath());
-            }
-            if (fnFilter != null) {
-                fd.setFilenameFilter(fnFilter);
-            }
-            fd.setVisible(true);
+        return showOpen(toFrame(parent), title, toFilenameFilter(filter),
+                fd -> { if (initialDir != null) 
fd.setDirectory(initialDir.getAbsolutePath()); });
+    }
 
-            String file = fd.getFile();
-            if (file == null) {
-                return null; // canceled
-            }
-            File selected = new File(fd.getDirectory(), file);
-            if (selected.isFile()) {
-                return selected;
-            }
-            // User selected a directory (possible when 
apple.awt.fileDialogForDirectories=true);
-            // re-show starting inside it so they can navigate to a file.
-            startDir = selected;
-        }
+    @Override
+    public File openFile(Component parent, String title, FileChooserPrefs 
prefs, FileFilter filter) {
+        return showOpen(toFrame(parent), title, toFilenameFilter(filter), 
prefs::bind);
+    }
+
+    @Override
+    public File saveFile(Component parent, String title, FileChooserPrefs 
prefs, String defaultName) {
+        return showSave(toFrame(parent), title, prefs::bind, defaultName);
+    }
+
+    @Override
+    public File openDir(Component parent, String title, File initialDir) {
+        return showOpenDir(toFrame(parent), title,
+                fd -> { if (initialDir != null) 
fd.setDirectory(initialDir.getAbsolutePath()); });
+    }
+
+    @Override
+    public File openDir(Component parent, String title, FileChooserPrefs 
prefs) {
+        return showOpenDir(toFrame(parent), title, prefs::bind);
     }
 
     @Override
-    public File saveFile(Component parent, String title, File initialDir, 
String defaultName) {
-        FileDialog fd = new FileDialog(toFrame(parent), title != null ? title 
: "", FileDialog.SAVE);
-        if (initialDir != null) {
-            fd.setDirectory(initialDir.getAbsolutePath());
+    public File saveDir(Component parent, String title, File initialDir) {
+        return showOpenDir(toFrame(parent), title,
+                fd -> { if (initialDir != null) 
fd.setDirectory(initialDir.getAbsolutePath()); });
+    }
+
+    private File showOpen(Frame frame, String title, FilenameFilter fnFilter, 
Consumer<FileDialog> init) {
+        FileDialog fd = new FileDialog(frame, title != null ? title : "", 
FileDialog.LOAD);
+        init.accept(fd);
+        if (fnFilter != null) {
+            fd.setFilenameFilter(fnFilter);
         }
+        fd.setVisible(true);
+        String file = fd.getFile();
+        return file != null ? new File(fd.getDirectory(), file) : null;
+    }
+
+    private File showSave(Frame frame, String title, Consumer<FileDialog> 
init, String defaultName) {
+        FileDialog fd = new FileDialog(frame, title != null ? title : "", 
FileDialog.SAVE);
+        init.accept(fd);
         if (defaultName != null) {
             fd.setFile(defaultName);
         }
@@ -89,16 +96,13 @@ public class MacFileChooserFactory extends 
FileChooserFactory {
         return file != null ? new File(fd.getDirectory(), file) : null;
     }
 
-    @Override
-    public File openDirectory(Component parent, String title, File initialDir) 
{
+    private File showOpenDir(Frame frame, String title, Consumer<FileDialog> 
init) {
         // Toggle the property only for the duration of this modal dialog.
         // FileDialog is EDT-blocking, so no other dialog can run concurrently.
         System.setProperty(DIRS_DIALOG_PROPERTY, "true");
         try {
-            FileDialog fd = new FileDialog(toFrame(parent), title != null ? 
title : "", FileDialog.LOAD);
-            if (initialDir != null) {
-                fd.setDirectory(initialDir.getAbsolutePath());
-            }
+            FileDialog fd = new FileDialog(frame, title != null ? title : "", 
FileDialog.LOAD);
+            init.accept(fd);
             fd.setVisible(true);
             String file = fd.getFile();
             // getFile() returns the selected directory name; getDirectory() 
is its parent.
@@ -108,6 +112,10 @@ public class MacFileChooserFactory extends 
FileChooserFactory {
         }
     }
 
+    private static FilenameFilter toFilenameFilter(FileFilter filter) {
+        return filter != null ? (dir, name) -> filter.accept(new File(dir, 
name)) : null;
+    }
+
     private static Frame toFrame(Component c) {
         Window w = SwingUtilities.getWindowAncestor(c);
         while (w != null) {
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 b720bd6e3..24780ef25 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
@@ -65,18 +65,9 @@ public final class FileChooserPrefs extends PrefsAdapter {
         });
     }
 
-    public File loadDir() {
-        return resolveExistingDirectory(prefs.get(PATH_PROPERTY, null));
-    }
-
-    public void saveDir(File f) {
-        if (f != null) {
-            String dir = f.isFile() ? f.getParentFile().getAbsolutePath() : 
f.getAbsolutePath();
-            prefs.put(PATH_PROPERTY, dir);
-        }
-    }
+    private File loadDir() {
+        String path = prefs.get(PATH_PROPERTY, null);
 
-    private static File resolveExistingDirectory(String path) {
         if (path == null) {
             return null;
         }
@@ -92,4 +83,12 @@ public final class FileChooserPrefs extends PrefsAdapter {
 
         return null;
     }
+
+    private void saveDir(File f) {
+        if (f != null) {
+            String dir = f.isFile() ? f.getParentFile().getAbsolutePath() : 
f.getAbsolutePath();
+            prefs.put(PATH_PROPERTY, dir);
+        }
+    }
+
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/FileChooserFactory.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/FileChooserFactory.java
index 0362c73cb..a0e20b8d5 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/FileChooserFactory.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/FileChooserFactory.java
@@ -19,28 +19,27 @@
 
 package org.apache.cayenne.modeler.toolkit.filechooser;
 
+import org.apache.cayenne.modeler.pref.adapters.FileChooserPrefs;
+
 import javax.swing.filechooser.FileFilter;
 import java.awt.Component;
 import java.io.File;
 
 /**
- * Platform-specific factory for file and directory chooser dialogs.
- * Implementations may use either a native OS dialog or Swing's JFileChooser.
+ * Platform-specific factory for file and directory chooser dialogs. 
Implementations may use either a native OS dialog
+ * or Swing's JFileChooser.
  */
-public abstract class FileChooserFactory {
-
-    /**
-     * Shows a file-open dialog and returns the selected file, or {@code null} 
if canceled.
-     */
-    public abstract File openFile(Component parent, String title, File 
initialDir, FileFilter filter);
-
-    /**
-     * Shows a file-save dialog and returns the selected file, or {@code null} 
if canceled.
-     */
-    public abstract File saveFile(Component parent, String title, File 
initialDir, String defaultName);
-
-    /**
-     * Shows a directory-selection dialog and returns the selected directory, 
or {@code null} if canceled.
-     */
-    public abstract File openDirectory(Component parent, String title, File 
initialDir);
+public interface FileChooserFactory {
+
+    File openFile(Component parent, String title, File initialDir, FileFilter 
filter);
+
+    File openFile(Component parent, String title, FileChooserPrefs prefs, 
FileFilter filter);
+
+    File openDir(Component parent, String title, File initialDir);
+
+    File openDir(Component parent, String title, FileChooserPrefs prefs);
+
+    File saveFile(Component parent, String title, FileChooserPrefs prefs, 
String defaultName);
+
+    File saveDir(Component parent, String title, File initialDir);
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/JFileChooserFactory.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/JFileChooserFactory.java
index 9d8e89efb..e20b6d618 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/JFileChooserFactory.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/JFileChooserFactory.java
@@ -19,63 +19,95 @@
 
 package org.apache.cayenne.modeler.toolkit.filechooser;
 
+import org.apache.cayenne.modeler.pref.adapters.FileChooserPrefs;
+
 import javax.swing.JFileChooser;
 import javax.swing.filechooser.FileFilter;
 import java.awt.Component;
 import java.io.File;
+import java.util.function.Consumer;
 
 /**
  * {@link FileChooserFactory} implementation backed by Swing's {@link 
JFileChooser}.
  */
-public class JFileChooserFactory extends FileChooserFactory {
+public class JFileChooserFactory implements FileChooserFactory {
 
     @Override
     public File openFile(Component parent, String title, File initialDir, 
FileFilter filter) {
+        return showOpen(
+                parent,
+                title,
+                JFileChooser.FILES_ONLY,
+                c -> {
+                    if (initialDir != null) c.setCurrentDirectory(initialDir);
+                },
+                filter);
+    }
+
+    @Override
+    public File openFile(Component parent, String title, FileChooserPrefs 
prefs, FileFilter filter) {
+        return showOpen(parent, title, JFileChooser.FILES_ONLY, prefs::bind, 
filter);
+    }
+
+    @Override
+    public File saveFile(Component parent, String title, FileChooserPrefs 
prefs, String defaultName) {
+        return showSave(parent, title, prefs::bind, defaultName);
+    }
+
+    @Override
+    public File openDir(Component parent, String title, File initialDir) {
+        return showOpen(parent, title, JFileChooser.DIRECTORIES_ONLY,
+                c -> {
+                    if (initialDir != null) c.setCurrentDirectory(initialDir);
+                }, null);
+    }
+
+    @Override
+    public File openDir(Component parent, String title, FileChooserPrefs 
prefs) {
+        return showOpen(parent, title, JFileChooser.DIRECTORIES_ONLY, 
prefs::bind, null);
+    }
+
+    @Override
+    public File saveDir(Component parent, String title, File initialDir) {
         JFileChooser chooser = new JFileChooser();
-        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
-        if (title != null) {
-            chooser.setDialogTitle(title);
-        }
+        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
         if (initialDir != null) {
             chooser.setCurrentDirectory(initialDir);
         }
-        if (filter != null) {
-            chooser.addChoosableFileFilter(filter);
-            chooser.setFileFilter(filter);
+        if (title != null) {
+            chooser.setDialogTitle(title);
         }
-        return chooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION
+        return chooser.showDialog(parent, "Select") == 
JFileChooser.APPROVE_OPTION
                 ? chooser.getSelectedFile()
                 : null;
     }
 
-    @Override
-    public File saveFile(Component parent, String title, File initialDir, 
String defaultName) {
+    private File showOpen(Component parent, String title, int mode, 
Consumer<JFileChooser> init, FileFilter filter) {
         JFileChooser chooser = new JFileChooser();
+        chooser.setFileSelectionMode(mode);
+        init.accept(chooser);
         if (title != null) {
             chooser.setDialogTitle(title);
         }
-        if (initialDir != null) {
-            chooser.setCurrentDirectory(initialDir);
-        }
-        if (defaultName != null) {
-            chooser.setSelectedFile(new File(defaultName));
+        if (filter != null) {
+            chooser.addChoosableFileFilter(filter);
+            chooser.setFileFilter(filter);
         }
-        return chooser.showSaveDialog(parent) == JFileChooser.APPROVE_OPTION
+        return chooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION
                 ? chooser.getSelectedFile()
                 : null;
     }
 
-    @Override
-    public File openDirectory(Component parent, String title, File initialDir) 
{
+    private File showSave(Component parent, String title, 
Consumer<JFileChooser> init, String defaultName) {
         JFileChooser chooser = new JFileChooser();
-        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+        init.accept(chooser);
         if (title != null) {
             chooser.setDialogTitle(title);
         }
-        if (initialDir != null) {
-            chooser.setCurrentDirectory(initialDir);
+        if (defaultName != null) {
+            chooser.setSelectedFile(new File(defaultName));
         }
-        return chooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION
+        return chooser.showSaveDialog(parent) == JFileChooser.APPROVE_OPTION
                 ? chooser.getSelectedFile()
                 : null;
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
index 9246c236d..0fa29e972 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
@@ -99,8 +99,6 @@ public class ImportDataMapAction extends AppAction {
 
     protected File selectDataMap(Frame f) {
         FileChooserPrefs prefs = new 
FileChooserPrefs(app.getPrefsManager().uiNode("importDataMap/lastDir"));
-        File selected = app.getFileChooserFactory().openFile(f, "Select 
DataMap", prefs.loadDir(), FileFilters.getDataMapFilter());
-        prefs.saveDir(selected);
-        return selected;
+        return app.getFileChooserFactory().openFile(f, "Select DataMap", 
prefs, FileFilters.getDataMapFilter());
     }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
index 894f3812c..356fc9db7 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
@@ -124,11 +124,10 @@ public class ImportEOModelAction extends AppAction {
      */
     protected void importEOModel() {
         FileChooserPrefs prefs = new 
FileChooserPrefs(app.getPrefsManager().uiNode("importEOModel/lastDir"));
-        File selected = app.getFileChooserFactory().openFile(app.getFrame(), 
"Select EOModel", prefs.loadDir(), eomodelFilter);
+        File selected = app.getFileChooserFactory().openFile(app.getFrame(), 
"Select EOModel", prefs, eomodelFilter);
         if (selected == null) {
             return;
         }
-        prefs.saveDir(selected);
 
         File file = selected.getParentFile();
         DataMap currentMap = getProjectSession().getSelectedDataMap();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
index 32d49032e..08944b23e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
@@ -59,7 +59,7 @@ class ProjectOpener {
         File startDir = getDefaultStartDir(application);
 
         while (true) {
-            File selectedDir = factory.openDirectory(application.getFrame(), 
"Select Project Directory", startDir);
+            File selectedDir = factory.saveDir(application.getFrame(), "Select 
Project Directory", startDir);
             if (selectedDir == null) {
                 LOGGER.info("Save canceled.");
                 return null;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
index 500e7759f..b9915e21e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
@@ -30,6 +30,7 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.pref.dbconnector.DBConnector;
 import org.apache.cayenne.modeler.dbconnector.DBConnectorFactory;
 import org.apache.cayenne.modeler.pref.adapters.DBGeneratorPrefs;
+import org.apache.cayenne.modeler.pref.adapters.FileChooserPrefs;
 import org.apache.cayenne.modeler.toolkit.border.TopBorder;
 import org.apache.cayenne.modeler.toolkit.ProjectDialog;
 import org.apache.cayenne.modeler.ui.datasource.DataSourceDialog;
@@ -349,12 +350,8 @@ public class DBGeneratorOptionsDialog extends 
ProjectDialog {
     }
 
     private void storeSQLAction() {
-        File projectDir = new File(app
-                .getFrame().getProjectSession().project()
-                .getConfigurationResource()
-                .getURL()
-                .getPath());
-        File file = app.getFileChooserFactory().saveFile(this, "Save SQL 
Script", projectDir, null);
+        FileChooserPrefs prefs = new 
FileChooserPrefs(app.getPrefsManager().uiNode("dbgen/lastSqlDir"));
+        File file = app.getFileChooserFactory().saveFile(this, "Save SQL 
Script", prefs, null);
         if (file != null) {
             refreshGeneratorAction();
             try (FileWriter fw = new FileWriter(file); PrintWriter pw = new 
PrintWriter(fw)) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
index 6a18bc636..6b7d75858 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsDialog.java
@@ -46,6 +46,7 @@ import 
org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.modeler.pref.adapters.FileChooserPrefs;
 import org.apache.cayenne.modeler.pref.dbconnector.DBConnector;
 import org.apache.cayenne.modeler.dbconnector.DBConnectorFactory;
 import org.apache.cayenne.modeler.event.model.DataMapEvent;
@@ -55,7 +56,6 @@ import org.apache.cayenne.modeler.toolkit.ProjectDialog;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.ui.validation.ValidationDialog;
 import org.apache.cayenne.project.Project;
-import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.validation.ValidationResult;
 import org.slf4j.LoggerFactory;
 
@@ -236,8 +236,7 @@ public class MergerOptionsDialog extends ProjectDialog {
 
         while (it.hasNext()) {
             MergerToken token = it.next();
-            if (token instanceof AbstractToDbToken) {
-                AbstractToDbToken tdb = (AbstractToDbToken) token;
+            if (token instanceof AbstractToDbToken tdb) {
                 for (String sql : tdb.createSql(adapter)) {
                     buf.append(sql);
                     buf.append(lineEnd);
@@ -359,9 +358,8 @@ public class MergerOptionsDialog extends ProjectDialog {
     }
 
     private void storeSQLAction() {
-        Resource configRes = 
app.getFrame().getProjectSession().project().getConfigurationResource();
-        File initialDir = configRes != null ? new 
File(configRes.getURL().getPath()) : null;
-        File file = app.getFileChooserFactory().saveFile(this, "Save SQL 
Script", initialDir, null);
+        FileChooserPrefs prefs = new 
FileChooserPrefs(app.getPrefsManager().uiNode("merger/lastSqlDir"));
+        File file = app.getFileChooserFactory().saveFile(this, "Save SQL 
Script", prefs, null);
         if (file != null) {
             refreshSQLAction();
             try (FileWriter fw = new FileWriter(file); PrintWriter pw = new 
PrintWriter(fw)) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
index 34bb4d619..c8fac46de 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
@@ -132,15 +132,13 @@ public class ClasspathPrefsPanel extends AppPanel {
     private void chooseJarEntry() {
         FileChooserPrefs prefs = new 
FileChooserPrefs(app.getPrefsManager().uiNode("classpath/lastDir"));
         File selected = app.getFileChooserFactory().openFile(
-                this, "Select JAR File.", prefs.loadDir(), 
FileFilters.getExtensionFileFilter("jar", "JAR Files"));
-        prefs.saveDir(selected);
+                this, "Select JAR File.", prefs, 
FileFilters.getExtensionFileFilter("jar", "JAR Files"));
         entryAdded(selected);
     }
 
     private void chooseDirEntry() {
         FileChooserPrefs prefs = new 
FileChooserPrefs(app.getPrefsManager().uiNode("classpath/lastDir"));
-        File selected = app.getFileChooserFactory().openDirectory(this, 
"Select Java Class Directory.", prefs.loadDir());
-        prefs.saveDir(selected);
+        File selected = app.getFileChooserFactory().openDir(this, "Select Java 
Class Directory.", prefs);
         entryAdded(selected);
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
index 50ae2d49c..d1dae0295 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
@@ -401,7 +401,7 @@ public class CgenConfigPanel extends ProjectPanel {
                 ? new File(currentDir)
                 : CgenOps.baseDir(session).toFile();
 
-        File selected = app.getFileChooserFactory().openDirectory(this, 
"Select Output Folder", initialDir);
+        File selected = app.getFileChooserFactory().openDir(this, "Select 
Output Folder", initialDir);
         if (selected != null) {
             String path = selected.getAbsolutePath();
             outputFolder.setText(path);

Reply via email to