You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2026/05/19 23:29:35 UTC

(cayenne) branch master updated (b8eba8fd3 -> d1d7f13f1)

This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


    from b8eba8fd3 CAY-2943 release notes
     new 10dfac4f1 A more robust "universal" Main on mac
     new d1d7f13f1 A more robust "universal" Main on mac

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/cayenne/modeler/Application.java    | 20 ++++++++++++--------
 .../cayenne/modeler/platform/UIInitializer.java    | 10 +++++-----
 .../platform/generic/GenericUIInitializer.java     |  2 +-
 .../modeler/platform/mac/MacUIInitializer.java     | 22 ++++++++++++++++------
 .../modeler/platform/win/WinUIInitializer.java     |  2 +-
 .../org/apache/cayenne/modeler/ui/MainFrame.java   |  2 --
 6 files changed, 35 insertions(+), 23 deletions(-)


(cayenne) 02/02: A more robust "universal" Main on mac

Posted by aa...@apache.org.
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 d1d7f13f1f85f86b8d82e9a761f85a77d6a808ee
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Tue May 19 19:04:15 2026 -0400

    A more robust "universal" Main on mac
---
 .../java/org/apache/cayenne/modeler/Application.java | 20 ++++++++++++--------
 .../cayenne/modeler/platform/UIInitializer.java      | 10 +++++-----
 .../platform/generic/GenericUIInitializer.java       |  2 +-
 .../modeler/platform/mac/MacUIInitializer.java       | 11 +++++++----
 .../modeler/platform/win/WinUIInitializer.java       |  2 +-
 .../org/apache/cayenne/modeler/ui/MainFrame.java     |  2 --
 6 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index 5bbeeff2e..d68690917 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -64,7 +64,9 @@ public class Application {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
 
-    public static void launch(String[] args, UIInitializer platformInitializer) {
+    public static void launch(String[] args, UIInitializer platformInit) {
+
+        platformInit.beforeSwingLaunch();
 
         CliArgs cli = CliArgs.parse(args);
 
@@ -80,11 +82,11 @@ public class Application {
                 new ModelerModule());
 
         SwingUtilities.invokeLater(() ->
-                new Application(injector, platformInitializer, cli).launch(cli.initialProject()));
+                new Application(injector, platformInit, cli).launch(cli.initialProject()));
     }
 
     private final Injector injector;
-    private final UIInitializer platformInitializer;
+    private final UIInitializer platformInit;
     private final ModelerClassLoader classLoader;
     private final PreferencesRepository preferencesRepository;
     private final ProjectValidator projectValidator;
@@ -95,9 +97,9 @@ public class Application {
     private CayenneUndoManager undoManager;
     private DBConnectors dbConnectors;
 
-    public Application(Injector injector, UIInitializer platformInitializer, CliArgs cli) {
+    public Application(Injector injector, UIInitializer platformInit, CliArgs cli) {
         this.injector = injector;
-        this.platformInitializer = platformInitializer;
+        this.platformInit = platformInit;
         this.cli = cli;
 
         this.classLoader = new ModelerClassLoader();
@@ -134,8 +136,8 @@ public class Application {
         return injector.getInstance(UpgradeService.class);
     }
 
-    public UIInitializer getPlatformInitializer() {
-        return platformInitializer;
+    public UIInitializer getPlatformInit() {
+        return platformInit;
     }
 
     public ConfigurationNodeParentGetter getConfigurationNodeParentGetter() {
@@ -171,7 +173,7 @@ public class Application {
     }
 
     public void launch(File initialProject) {
-        this.platformInitializer.initLookAndFeel();
+
         this.actionManager = new GlobalActions(
                 this,
                 injector.getInstance(ConfigurationNameMapper.class),
@@ -197,6 +199,8 @@ public class Application {
 
         this.undoManager = new CayenneUndoManager(this);
         this.frame = new MainFrame(this);
+        this.platformInit.afterFrameCreated(this);
+
 
         // open up
         frame.onStartup();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/UIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/UIInitializer.java
index 7c094416e..a544193e9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/UIInitializer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/UIInitializer.java
@@ -20,22 +20,22 @@ package org.apache.cayenne.modeler.platform;
 
 import org.apache.cayenne.modeler.Application;
 
-import javax.swing.JFrame;
-
 /**
  * A base callback for platform-specific Modeler initialization.
  */
 public interface UIInitializer {
 
     /**
-     * Initializes application look and feel.
+     * Sets platform-specific system properties and initializes the application look and feel.
+     * Called before AWT/Swing is touched, so implementations may set properties that AWT reads
+     * only during its own init (e.g. {@code apple.awt.application.name}) before installing the L&F.
      */
-    default void initLookAndFeel() {
+    default void beforeSwingLaunch() {
     }
 
     /**
      * Updates default frame menus according to the platform specifics.
      */
-    default void setupMenus(Application app, JFrame frame) {
+    default void afterFrameCreated(Application app) {
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/generic/GenericUIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/generic/GenericUIInitializer.java
index 496cee539..5fbf70ea7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/generic/GenericUIInitializer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/generic/GenericUIInitializer.java
@@ -39,7 +39,7 @@ public class GenericUIInitializer implements UIInitializer {
     private static final String DEFAULT_THEME_NAME = "Sky Bluer";
 
     @Override
-    public void initLookAndFeel() {
+    public void beforeSwingLaunch() {
 
         PlasticTheme theme = findTheme();
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java
index 637370458..09f272939 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java
@@ -35,7 +35,10 @@ import java.util.Set;
 public class MacUIInitializer implements UIInitializer {
 
     @Override
-    public void initLookAndFeel() {
+    public void beforeSwingLaunch() {
+        // must be set before Aqua L&F initializes — it reads this property during init
+        System.setProperty("apple.awt.application.name", "CayenneModeler");
+
         // override some default styles and colors, assuming that Aqua theme will be used
 
         Color lightGrey = new Color(0xEEEEEE);
@@ -89,10 +92,10 @@ public class MacUIInitializer implements UIInitializer {
     }
 
     @Override
-    public void setupMenus(Application app, JFrame frame) {
+    public void afterFrameCreated(Application app) {
 
         // set additional look and feel for the window
-        frame.getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE);
+        app.getFrame().getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE);
 
         // Only relocate About/Preferences/Quit to the macOS application menu when the
         // screen menu bar is actually in use. Otherwise the JMenuBar stays inside the
@@ -119,7 +122,7 @@ public class MacUIInitializer implements UIInitializer {
         removeActions.add(globalActions.getAction(AboutAction.class));
         removeActions.add(globalActions.getAction(ConfigurePreferencesAction.class));
 
-        JMenuBar menuBar = frame.getJMenuBar();
+        JMenuBar menuBar = app.getFrame().getJMenuBar();
         for (Component c : menuBar.getComponents()) {
             if (c instanceof JMenu menu) {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/win/WinUIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/win/WinUIInitializer.java
index 197a8013d..f06e33417 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/win/WinUIInitializer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/win/WinUIInitializer.java
@@ -32,7 +32,7 @@ public class WinUIInitializer implements UIInitializer {
     private static final Logger LOGGER = LoggerFactory.getLogger(WinUIInitializer.class);
 
     @Override
-    public void initLookAndFeel() {
+    public void beforeSwingLaunch() {
         try {
             UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName());
             // override some default styles and colors
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
index 402e74ec0..9e812c344 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
@@ -135,8 +135,6 @@ public class MainFrame extends AppFrame {
 
         setProjectView(null);
 
-        this.app.getPlatformInitializer().setupMenus(this.app, this);
-
         this.session = new ProjectSession(this.app);
         this.session.addDirtyListener((wasDirty, isDirty) -> {
             if (isDirty) {


(cayenne) 01/02: A more robust "universal" Main on mac

Posted by aa...@apache.org.
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 10dfac4f15bd954ea8d85e89e49edc6059683e56
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Tue May 19 19:04:15 2026 -0400

    A more robust "universal" Main on mac
---
 .../cayenne/modeler/platform/mac/MacUIInitializer.java      | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java
index dcd14d482..637370458 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/mac/MacUIInitializer.java
@@ -91,6 +91,16 @@ public class MacUIInitializer implements UIInitializer {
     @Override
     public void setupMenus(Application app, JFrame frame) {
 
+        // set additional look and feel for the window
+        frame.getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE);
+
+        // Only relocate About/Preferences/Quit to the macOS application menu when the
+        // screen menu bar is actually in use. Otherwise the JMenuBar stays inside the
+        // window frame, and stripping these items would make them inaccessible.
+        if (!Boolean.getBoolean("apple.laf.useScreenMenuBar")) {
+            return;
+        }
+
         GlobalActions globalActions = app.getActionManager();
 
         Desktop desktop = Desktop.getDesktop();
@@ -104,9 +114,6 @@ public class MacUIInitializer implements UIInitializer {
             }
         });
 
-        // set additional look and feel for the window
-        frame.getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE);
-
         Set<Action> removeActions = new HashSet<>();
         removeActions.add(globalActions.getAction(ExitAction.class));
         removeActions.add(globalActions.getAction(AboutAction.class));