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 8eb6ffaa860fb45bc61135fd6195482b9bfc03ba
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun May 24 10:30:57 2026 -0400

    Modeler cleanup
---
 .../modeler/platform/mac/MacFileChooser.java       |   4 +-
 .../modeler/pref/adapters/RecentProjectsPrefs.java |  14 ++-
 .../modeler/ui/action/OpenProjectAction.java       |  16 ++--
 .../cayenne/modeler/ui/action/ProjectOpener.java   | 101 ---------------------
 .../cayenne/modeler/ui/action/SaveAsAction.java    |  46 +++++++++-
 5 files changed, 68 insertions(+), 113 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 4913f1a1f..8c36723bd 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
@@ -105,8 +105,8 @@ public class MacFileChooser implements CMFileChooser {
         System.setProperty(DIRS_DIALOG_PROPERTY, "true");
         try {
 
-            // FileDialog.LOAD results in the "Save" button being called 
"Load". This is unfortunate, but the
-            // alternative allows the user to override the file name
+            // TODO: FileDialog.LOAD results in the "Save" button being called 
"Load". This is unfortunate, but the
+            //   alternative allows the user to override the file name
             FileDialog fd = new FileDialog(parent, title != null ? title : "", 
FileDialog.LOAD);
             init.accept(fd);
             fd.setVisible(true);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/RecentProjectsPrefs.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/RecentProjectsPrefs.java
index 41f43a557..a3acd7145 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/RecentProjectsPrefs.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/adapters/RecentProjectsPrefs.java
@@ -41,6 +41,18 @@ public final class RecentProjectsPrefs extends PrefsAdapter {
         super(prefs);
     }
 
+    public File getStartDir() {
+        List<File> files = getFiles();
+        if (!files.isEmpty()) {
+            File parent = files.getFirst().getParentFile();
+            if (parent != null && parent.isDirectory()) {
+                return parent;
+            }
+        }
+
+        return new File(System.getProperty("user.dir"));
+    }
+
     public List<File> getFiles() {
         String[] keys = keys();
         List<File> files = new ArrayList<>(keys.length);
@@ -59,7 +71,7 @@ public final class RecentProjectsPrefs extends PrefsAdapter {
     public void addFile(File file) {
         List<File> files = getFiles();
         files.remove(file);
-        files.add(0, file);
+        files.addFirst(file);
         if (files.size() > MAX_SIZE) {
             files = files.subList(0, MAX_SIZE);
         }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
index 78b4fea3d..453a26dac 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
@@ -20,7 +20,9 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.pref.adapters.RecentProjectsPrefs;
 import org.apache.cayenne.modeler.toolkit.AppAction;
+import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
 import org.apache.cayenne.modeler.ui.MainFrame;
 import org.apache.cayenne.modeler.ui.errors.ErrorDialog;
 import org.apache.cayenne.project.Project;
@@ -62,12 +64,8 @@ public class OpenProjectAction extends AppAction {
         PROJECT_TO_MODELER_VERSION = Collections.unmodifiableMap(map);
     }
 
-    private final ProjectOpener fileChooser;
-
-
     public OpenProjectAction(Application application) {
         super(application, "Open Project");
-        this.fileChooser = new ProjectOpener();
         resetClipboard();
     }
 
@@ -107,8 +105,7 @@ public class OpenProjectAction extends AppAction {
 
         if (f == null) {
             try {
-                // Get the project file name (always cayenne.xml)
-                f = fileChooser.openProjectFile(app);
+                f = openProjectFile();
             } catch (Exception ex) {
                 LOGGER.warn("Error loading project file.", ex);
             }
@@ -222,4 +219,11 @@ public class OpenProjectAction extends AppAction {
             }
         }, null);
     }
+
+    private File openProjectFile() {
+        File startDir = new 
RecentProjectsPrefs(app.getPrefsLocator().appNode(RecentProjectsPrefs.NODE)).getStartDir();
+        return app
+                .getFileChooser(app.getFrame(), "Select Project File")
+                .openFile(startDir, FileFilters.getApplicationFilter());
+    }
 }
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
deleted file mode 100644
index a79c6d89b..000000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.ui.action;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.pref.adapters.RecentProjectsPrefs;
-import org.apache.cayenne.modeler.ui.project.overwrite.OverwriteDialog;
-import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
-import org.apache.cayenne.project.Project;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.util.List;
-
-
-/**
- * Helper that shows file-chooser dialogs for opening and saving Cayenne 
projects.
- */
-class ProjectOpener {
-
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(ProjectOpener.class);
-
-    /**
-     * Selects a directory to store the project.
-     */
-    public File newProjectDir(Application application, Project p) {
-        if (p == null) {
-            throw new CayenneRuntimeException("Null project.");
-        }
-
-        StringBuilder nameProject = new StringBuilder("cayenne");
-        if (((DataChannelDescriptor) p.getRootNode()).getName() != null) {
-            nameProject.append("-").append(((DataChannelDescriptor) 
p.getRootNode()).getName());
-        }
-        nameProject.append(".xml");
-
-        File startDir = getDefaultStartDir(application);
-
-        while (true) {
-            File selectedDir = 
application.getFileChooser(application.getFrame(), "Select Project 
Directory").saveDir(startDir);
-            if (selectedDir == null) {
-                LOGGER.info("Save canceled.");
-                return null;
-            }
-
-            LOGGER.info("Selected: {}", selectedDir);
-            File projectFile = new File(selectedDir, nameProject.toString());
-            if (projectFile.exists()) {
-                OverwriteDialog dialog = new OverwriteDialog(projectFile, 
application.getFrame());
-                dialog.show();
-                if (dialog.shouldOverwrite()) {
-                    return selectedDir;
-                } else if (!dialog.shouldSelectAnother()) {
-                    return null;
-                }
-                // else loop again
-            } else {
-                return selectedDir;
-            }
-        }
-    }
-
-    /**
-     * Runs a dialog to open a Cayenne project.
-     */
-    public File openProjectFile(Application application) {
-        return application.getFileChooser(application.getFrame(), "Select 
Project File")
-                .openFile(getDefaultStartDir(application), 
FileFilters.getApplicationFilter());
-    }
-
-    private File getDefaultStartDir(Application application) {
-        List<File> recent = new 
RecentProjectsPrefs(application.getPrefsLocator().appNode(RecentProjectsPrefs.NODE)).getFiles();
-        if (!recent.isEmpty()) {
-            File parent = recent.get(0).getParentFile();
-            if (parent != null && parent.isDirectory()) {
-                return parent;
-            }
-        }
-        return new File(System.getProperty("user.dir"));
-    }
-}
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
index 437c3082f..1a5dab781 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
@@ -27,12 +27,16 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.model.ProjectBeforeSaveEvent;
 import org.apache.cayenne.modeler.event.model.ProjectAfterSaveEvent;
 import org.apache.cayenne.modeler.pref.PrefsManager;
+import org.apache.cayenne.modeler.pref.adapters.RecentProjectsPrefs;
 import org.apache.cayenne.modeler.toolkit.AppAction;
+import org.apache.cayenne.modeler.ui.project.overwrite.OverwriteDialog;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.ProjectSaver;
 import org.apache.cayenne.project.validation.ProjectValidator;
 import org.apache.cayenne.resource.URLResource;
 import org.apache.cayenne.validation.ValidationResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.swing.*;
 import java.awt.*;
@@ -46,7 +50,7 @@ import java.io.File;
  */
 public class SaveAsAction extends AppAction {
 
-    private final ProjectOpener fileChooser;
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(SaveAsAction.class);
 
     public SaveAsAction(Application application) {
         this("Save As...", application);
@@ -54,7 +58,6 @@ public class SaveAsAction extends AppAction {
 
     protected SaveAsAction(String name, Application application) {
         super(application, name);
-        this.fileChooser = new ProjectOpener();
     }
 
     @Override
@@ -70,7 +73,7 @@ public class SaveAsAction extends AppAction {
     protected boolean saveAll() throws Exception {
         Project p = getCurrentProject();
 
-        File projectDir = fileChooser.newProjectDir(app, p);
+        File projectDir = newProjectDir(p);
         if (projectDir == null) {
             return false;
         }
@@ -151,4 +154,41 @@ public class SaveAsAction extends AppAction {
         Project project = app.getFrame().getProjectSession().project();
         return project != null && project.isModified();
     }
+
+    private File newProjectDir(Project p) {
+        if (p == null) {
+            throw new CayenneRuntimeException("Null project.");
+        }
+
+        StringBuilder nameProject = new StringBuilder("cayenne");
+        if (((DataChannelDescriptor) p.getRootNode()).getName() != null) {
+            nameProject.append("-").append(((DataChannelDescriptor) 
p.getRootNode()).getName());
+        }
+        nameProject.append(".xml");
+
+        File startDir = new 
RecentProjectsPrefs(app.getPrefsLocator().appNode(RecentProjectsPrefs.NODE)).getStartDir();
+
+        while (true) {
+            File selectedDir = app.getFileChooser(app.getFrame(), "Select 
Project Directory").saveDir(startDir);
+            if (selectedDir == null) {
+                LOGGER.info("Save canceled.");
+                return null;
+            }
+
+            LOGGER.info("Selected: {}", selectedDir);
+            File projectFile = new File(selectedDir, nameProject.toString());
+            if (projectFile.exists()) {
+                OverwriteDialog dialog = new OverwriteDialog(projectFile, 
app.getFrame());
+                dialog.show();
+                if (dialog.shouldOverwrite()) {
+                    return selectedDir;
+                } else if (!dialog.shouldSelectAnother()) {
+                    return null;
+                }
+                // else loop again
+            } else {
+                return selectedDir;
+            }
+        }
+    }
 }

Reply via email to