diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index e36b4fb4..180d90c8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -527,6 +527,21 @@ public interface FlatClientProperties */ String WINDOW_STYLE_SMALL = "small"; + /** + * Specifies whether the window should have a large title bar. + * This adds extra space around the close/minimize/zoom buttons. + * Useful if full window content + * is enabled. + *

+ * (requires macOS 10.14+, Java 17+ and client property {@code apple.awt.fullWindowContent} set to {@code true}) + *

+ * Component {@link javax.swing.JRootPane}
+ * Value type {@link java.lang.Boolean} + * + * @since 3.3 + */ + String MACOS_LARGE_WINDOW_TITLE_BAR = "FlatLaf.macOS.largeWindowTitleBar"; + //---- JScrollBar / JScrollPane ------------------------------------------- diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRootPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRootPaneUI.java index 3b6ee498..75631081 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRootPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRootPaneUI.java @@ -367,6 +367,21 @@ public class FlatRootPaneUI if( rootPane.isDisplayable() ) throw new IllegalComponentStateException( "The client property 'Window.style' must be set before the window becomes displayable." ); break; + + case FlatClientProperties.MACOS_LARGE_WINDOW_TITLE_BAR: + case "ancestor": + if( SystemInfo.isMacFullWindowContentSupported && + SystemInfo.isJava_17_orLater && + rootPane.isDisplayable() && + FlatClientProperties.clientPropertyBoolean( rootPane, "apple.awt.fullWindowContent", false ) && + FlatNativeMacLibrary.isLoaded() ) + { + Window window = SwingUtilities.windowForComponent( rootPane ); + boolean enabled = FlatClientProperties.clientPropertyBoolean( rootPane, + FlatClientProperties.MACOS_LARGE_WINDOW_TITLE_BAR, false ); + FlatNativeMacLibrary.setWindowToolbar( window, enabled ); + } + break; } } diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java index 191268c1..08adb0e1 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java @@ -46,7 +46,6 @@ import com.formdev.flatlaf.icons.FlatAbstractIcon; import com.formdev.flatlaf.themes.FlatMacDarkLaf; import com.formdev.flatlaf.themes.FlatMacLightLaf; import com.formdev.flatlaf.extras.FlatSVGUtils; -import com.formdev.flatlaf.ui.FlatNativeMacLibrary; import com.formdev.flatlaf.util.ColorFunctions; import com.formdev.flatlaf.util.FontUtils; import com.formdev.flatlaf.util.LoggingFacade; @@ -90,21 +89,23 @@ class DemoFrame // do not use HTML text in menu items because this is not supported in macOS screen menu htmlMenuItem.setText( "some text" ); + JRootPane rootPane = getRootPane(); if( SystemInfo.isMacFullWindowContentSupported ) { // expand window content into window title bar and make title bar transparent - getRootPane().putClientProperty( "apple.awt.fullWindowContent", true ); - getRootPane().putClientProperty( "apple.awt.transparentTitleBar", true ); + rootPane.putClientProperty( "apple.awt.fullWindowContent", true ); + rootPane.putClientProperty( "apple.awt.transparentTitleBar", true ); + rootPane.putClientProperty( FlatClientProperties.MACOS_LARGE_WINDOW_TITLE_BAR, true ); // hide window title if( SystemInfo.isJava_17_orLater ) - getRootPane().putClientProperty( "apple.awt.windowTitleVisible", false ); + rootPane.putClientProperty( "apple.awt.windowTitleVisible", false ); else setTitle( null ); } // enable full screen mode for this window (for Java 8 - 10; not necessary for Java 11+) if( !SystemInfo.isJava_11_orLater ) - getRootPane().putClientProperty( "apple.awt.fullscreenable", true ); + rootPane.putClientProperty( "apple.awt.fullscreenable", true ); } // integrate into macOS screen menu @@ -902,10 +903,10 @@ class DemoFrame // JFormDesigner - End of component initialization //GEN-END:initComponents backButton.addActionListener( e -> { - FlatNativeMacLibrary.setWindowToolbar( this, true ); + rootPane.putClientProperty( FlatClientProperties.MACOS_LARGE_WINDOW_TITLE_BAR, true ); }); forwardButton.addActionListener( e -> { - FlatNativeMacLibrary.setWindowToolbar( this, false ); + rootPane.putClientProperty( FlatClientProperties.MACOS_LARGE_WINDOW_TITLE_BAR, null ); }); cutButton.addActionListener( e -> System.out.println( e ) ); diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java index cfc226b8..4a55f459 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java @@ -27,7 +27,6 @@ import com.formdev.flatlaf.fonts.inter.FlatInterFont; import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; import com.formdev.flatlaf.fonts.roboto_mono.FlatRobotoMonoFont; -import com.formdev.flatlaf.ui.FlatNativeMacLibrary; import com.formdev.flatlaf.util.SystemInfo; /** @@ -118,10 +117,6 @@ public class FlatLafDemo // show frame frame.pack(); frame.setLocationRelativeTo( null ); - if( SystemInfo.isMacOS && FlatNativeMacLibrary.isLoaded() ) { - // TODO use client property - FlatNativeMacLibrary.setWindowToolbar( frame, true ); - } frame.setVisible( true ); } ); }