diff --git a/CHANGELOG.md b/CHANGELOG.md index 53ce8cbe..344f6716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ FlatLaf Change Log ## 1.1-SNAPSHOT +#### New features and improvements + +- Native window decorations for Windows 10 enables dark frame/dialog title bar + and embedded menu bar with all JREs, while still having native Windows 10 + border drop shadows, resize behavior, window snapping and system window menu. + (PR #267) + #### Fixed bugs - IntelliJ Themes: Fixed text color of CheckBoxMenuItem and RadioButtonMenuItem diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java index fa6f0402..be8c27e7 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -46,7 +46,6 @@ import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; -import javax.swing.JRootPane; import javax.swing.LookAndFeel; import javax.swing.PopupFactory; import javax.swing.SwingUtilities; @@ -92,9 +91,6 @@ public abstract class FlatLaf private Consumer postInitialization; - private Boolean oldFrameWindowDecorated; - private Boolean oldDialogWindowDecorated; - /** * Sets the application look and feel to the given LaF * using {@link UIManager#setLookAndFeel(javax.swing.LookAndFeel)}. @@ -146,35 +142,20 @@ public abstract class FlatLaf * Returns whether FlatLaf supports custom window decorations. * This depends on the operating system and on the used Java runtime. *

- * To use custom window decorations in your application, enable them with - * following code (before creating any frames or dialogs). - *

-	 * JFrame.setDefaultLookAndFeelDecorated( true );
-	 * JDialog.setDefaultLookAndFeelDecorated( true );
-	 * 
- *

- * Then custom window decorations are only enabled if this method returns {@code true}. - * In this case, when creating a {@link JFrame} or {@link JDialog}, the frame/dialog will be made - * undecorated ({@link JFrame#setUndecorated(boolean)} / {@link JDialog#setUndecorated(boolean)}), - * the window decoration style of the {@link JRootPane} will - * {@link JRootPane#FRAME} / {@link JRootPane#PLAIN_DIALOG} - * (see {@link JRootPane#setWindowDecorationStyle(int)}) and the look and feel - * is responsible for the whole frame/dialog border (including window resizing). - *

* This method returns {@code true} on Windows 10 (see exception below), {@code false} otherwise. *

* Returns also {@code false} on Windows 10 if: *

- * In this case, custom decorations are enabled by the root pane - * if {@link JFrame#isDefaultLookAndFeelDecorated()} or - * {@link JDialog#isDefaultLookAndFeelDecorated()} return {@code true}. + * In this cases, custom decorations are enabled by the root pane. + * Usage of {@link JFrame#setDefaultLookAndFeelDecorated(boolean)} or + * {@link JDialog#setDefaultLookAndFeelDecorated(boolean)} is not necessary. */ @Override public boolean getSupportsWindowDecorations() { @@ -278,16 +259,6 @@ public abstract class FlatLaf String.format( "a, address { color: #%06x; }", linkColor.getRGB() & 0xffffff ) ); } }; - - // enable/disable window decorations, but only if system property is either - // "true" or "false"; in other cases it is not changed - Boolean useWindowDecorations = FlatSystemProperties.getBooleanStrict( FlatSystemProperties.USE_WINDOW_DECORATIONS, null ); - if( useWindowDecorations != null ) { - oldFrameWindowDecorated = JFrame.isDefaultLookAndFeelDecorated(); - oldDialogWindowDecorated = JDialog.isDefaultLookAndFeelDecorated(); - JFrame.setDefaultLookAndFeelDecorated( useWindowDecorations ); - JDialog.setDefaultLookAndFeelDecorated( useWindowDecorations ); - } } @Override @@ -320,14 +291,6 @@ public abstract class FlatLaf new HTMLEditorKit().getStyleSheet().addRule( "a, address { color: blue; }" ); postInitialization = null; - // restore enable/disable window decorations - if( oldFrameWindowDecorated != null ) { - JFrame.setDefaultLookAndFeelDecorated( oldFrameWindowDecorated ); - JDialog.setDefaultLookAndFeelDecorated( oldDialogWindowDecorated ); - oldFrameWindowDecorated = null; - oldDialogWindowDecorated = null; - } - super.uninitialize(); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatSystemProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatSystemProperties.java index 3e2fbed3..07f01f3c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatSystemProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatSystemProperties.java @@ -16,9 +16,6 @@ package com.formdev.flatlaf; -import javax.swing.JDialog; -import javax.swing.JFrame; - /** * Defines/documents own system properties used in FlatLaf. * @@ -57,20 +54,6 @@ public interface FlatSystemProperties */ String USE_UBUNTU_FONT = "flatlaf.useUbuntuFont"; - /** - * Specifies whether custom look and feel window decorations should be used - * when creating {@code JFrame} or {@code JDialog}. - *

- * If this system property is set, FlatLaf invokes {@link JFrame#setDefaultLookAndFeelDecorated(boolean)} - * and {@link JDialog#setDefaultLookAndFeelDecorated(boolean)} on LaF initialization. - *

- * (requires Window 10) - *

- * Allowed Values {@code false} and {@code true}
- * Default none - */ - String USE_WINDOW_DECORATIONS = "flatlaf.useWindowDecorations"; - /** * Specifies whether FlatLaf native window decorations should be used * when creating {@code JFrame} or {@code JDialog}. @@ -80,14 +63,12 @@ public interface FlatSystemProperties *

* Setting this to {@code false} disables using FlatLaf native window decorations. *

- * (requires Window 10 64bit) + * (requires Window 10 64-bit) *

* Allowed Values {@code false} and {@code true}
* Default none - * - * @since 1.1 */ - String USE_NATIVE_WINDOW_DECORATIONS = "flatlaf.useNativeWindowDecorations"; + String USE_WINDOW_DECORATIONS = "flatlaf.useWindowDecorations"; /** * Specifies whether JetBrains Runtime custom window decorations should be used diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeWindowBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeWindowBorder.java index ff895609..1d5d78c8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeWindowBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatNativeWindowBorder.java @@ -69,7 +69,7 @@ public class FlatNativeWindowBorder // It could be also be a window that is currently hidden, but may be shown later. Window window = SwingUtilities.windowForComponent( rootPane ); if( window != null && window.isDisplayable() ) { - install( window, FlatSystemProperties.USE_NATIVE_WINDOW_DECORATIONS ); + install( window, FlatSystemProperties.USE_WINDOW_DECORATIONS ); return null; } @@ -79,7 +79,7 @@ public class FlatNativeWindowBorder PropertyChangeListener ancestorListener = e -> { Object newValue = e.getNewValue(); if( newValue instanceof Window ) - install( (Window) newValue, FlatSystemProperties.USE_NATIVE_WINDOW_DECORATIONS ); + install( (Window) newValue, FlatSystemProperties.USE_WINDOW_DECORATIONS ); else if( newValue == null && e.getOldValue() instanceof Window ) uninstall( (Window) e.getOldValue() ); }; @@ -101,7 +101,8 @@ public class FlatNativeWindowBorder // do not enable native window border if JFrame should use system window decorations // and if not forced to use FlatLaf/JBR native window decorations if( !JFrame.isDefaultLookAndFeelDecorated() && - !FlatSystemProperties.getBoolean( systemPropertyKey, false )) + !UIManager.getBoolean( "TitlePane.useWindowDecorations" ) && + !FlatSystemProperties.getBoolean( systemPropertyKey, false ) ) return; // do not enable native window border if frame is undecorated @@ -120,7 +121,8 @@ public class FlatNativeWindowBorder // do not enable native window border if JDialog should use system window decorations // and if not forced to use FlatLaf/JBR native window decorations if( !JDialog.isDefaultLookAndFeelDecorated() && - !FlatSystemProperties.getBoolean( systemPropertyKey, false )) + !UIManager.getBoolean( "TitlePane.useWindowDecorations" ) && + !FlatSystemProperties.getBoolean( systemPropertyKey, false ) ) return; // do not enable native window border if dialog is undecorated @@ -223,7 +225,8 @@ public class FlatNativeWindowBorder if( !SystemInfo.isWindows_10_orLater || !SystemInfo.isX86_64 ) return; - if( !FlatSystemProperties.getBoolean( FlatSystemProperties.USE_NATIVE_WINDOW_DECORATIONS, true ) ) + // check whether disabled via system property + if( !FlatSystemProperties.getBoolean( FlatSystemProperties.USE_WINDOW_DECORATIONS, true ) ) return; try { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/JBRCustomDecorations.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/JBRCustomDecorations.java index d026a1ce..276753e4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/JBRCustomDecorations.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/JBRCustomDecorations.java @@ -166,6 +166,7 @@ public class JBRCustomDecorations if( !SystemInfo.isJetBrainsJVM_11_orLater || !SystemInfo.isWindows_10_orLater ) return; + // check whether disabled via system property if( !FlatSystemProperties.getBoolean( FlatSystemProperties.USE_JETBRAINS_CUSTOM_DECORATIONS, true ) ) return; diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties index dfe1953b..580ff417 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -685,6 +685,7 @@ TitledBorder.border = 1,1,1,1,$Separator.foreground #---- TitlePane ---- +TitlePane.useWindowDecorations = true TitlePane.menuBarEmbedded = true TitlePane.iconSize = 16,16 TitlePane.iconMargins = 3,8,3,0 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 bbb2e8c1..876e3c8e 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 @@ -155,8 +155,7 @@ class DemoFrame menuBarEmbeddedCheckBoxMenuItem.setEnabled( windowDecorations ); // enable/disable window decoration for later created frames/dialogs - JFrame.setDefaultLookAndFeelDecorated( windowDecorations ); - JDialog.setDefaultLookAndFeelDecorated( windowDecorations ); + UIManager.put( "TitlePane.useWindowDecorations", windowDecorations ); } private void menuBarEmbeddedChanged() { 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 c9c88fad..30fd861e 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 @@ -17,8 +17,6 @@ package com.formdev.flatlaf.demo; import java.awt.Dimension; -import javax.swing.JDialog; -import javax.swing.JFrame; import javax.swing.SwingUtilities; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.extras.FlatInspector; @@ -46,10 +44,6 @@ public class FlatLafDemo SwingUtilities.invokeLater( () -> { DemoPrefs.init( PREFS_ROOT_PATH ); - // enable window decorations - JFrame.setDefaultLookAndFeelDecorated( true ); - JDialog.setDefaultLookAndFeelDecorated( true ); - // application specific UI defaults FlatLaf.registerCustomDefaultsSource( "com.formdev.flatlaf.demo" ); diff --git a/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt index b78e38e2..787ed4df 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0_202.txt @@ -1143,6 +1143,7 @@ TitlePane.menuBarEmbedded true TitlePane.menuBarMargins 0,8,0,22 javax.swing.plaf.InsetsUIResource [UI] TitlePane.restoreIcon [lazy] 44,30 com.formdev.flatlaf.icons.FlatWindowRestoreIcon [UI] TitlePane.titleMargins 3,8,3,8 javax.swing.plaf.InsetsUIResource [UI] +TitlePane.useWindowDecorations true #---- TitledBorder ---- diff --git a/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt index 5a476a0d..578a317e 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0_202.txt @@ -1148,6 +1148,7 @@ TitlePane.menuBarEmbedded true TitlePane.menuBarMargins 0,8,0,22 javax.swing.plaf.InsetsUIResource [UI] TitlePane.restoreIcon [lazy] 44,30 com.formdev.flatlaf.icons.FlatWindowRestoreIcon [UI] TitlePane.titleMargins 3,8,3,8 javax.swing.plaf.InsetsUIResource [UI] +TitlePane.useWindowDecorations true #---- TitledBorder ---- diff --git a/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt b/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt index 09980acc..c89dd1a6 100644 --- a/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt +++ b/flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0_202.txt @@ -1140,6 +1140,7 @@ TitlePane.menuBarEmbedded true TitlePane.menuBarMargins 0,8,0,22 javax.swing.plaf.InsetsUIResource [UI] TitlePane.restoreIcon [lazy] 44,30 com.formdev.flatlaf.icons.FlatWindowRestoreIcon [UI] TitlePane.titleMargins 3,8,3,8 javax.swing.plaf.InsetsUIResource [UI] +TitlePane.useWindowDecorations true #---- TitledBorder ---- diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatNativeWindowBorderTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatNativeWindowBorderTest.java index 792695be..0aae3173 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatNativeWindowBorderTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatNativeWindowBorderTest.java @@ -50,9 +50,6 @@ public class FlatNativeWindowBorderTest FlatLightLaf.install(); FlatInspector.install( "ctrl shift alt X" ); - JFrame.setDefaultLookAndFeelDecorated( true ); - JDialog.setDefaultLookAndFeelDecorated( true ); - mainFrame = showFrame(); } ); } diff --git a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt index 87cf05c8..dd90b82a 100644 --- a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt +++ b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt @@ -853,6 +853,7 @@ TitlePane.menuBarEmbedded TitlePane.menuBarMargins TitlePane.restoreIcon TitlePane.titleMargins +TitlePane.useWindowDecorations TitledBorder.border TitledBorder.font TitledBorder.titleColor