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; + } + } + } }
