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