From 56ebd26361f81bcdd3fae982cc60ae581dbdaed7 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 6 Aug 2020 23:10:54 +0200 Subject: [PATCH] Window decorations: make embedded menu bar make smaller if horizontal space is rare to avoid that embedded menu bar overlaps buttons --- .../com/formdev/flatlaf/ui/FlatMenuUI.java | 8 +++++++ .../com/formdev/flatlaf/ui/FlatTitlePane.java | 21 ++++++++++++++++++- .../flatlaf/testing/FlatTestFrame.java | 5 ++++- .../testing/FlatWindowDecorationsTest.java | 1 + 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index 163f6ee1..503e3981 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -123,6 +123,14 @@ public class FlatMenuUI }; } + @Override + public Dimension getMinimumSize( JComponent c ) { + // avoid that top-level menus (in menu bar) are made smaller if horizontal space is rare + // same code is in BasicMenuUI since Java 10 + // see https://bugs.openjdk.java.net/browse/JDK-8178430 + return ((JMenu)menuItem).isTopLevelMenu() ? c.getPreferredSize() : null; + } + @Override protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) { return renderer.getPreferredMenuItemSize(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java index 1e0e247e..8ef90297 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java @@ -19,6 +19,7 @@ package com.formdev.flatlaf.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; +import java.awt.Container; import java.awt.Dialog; import java.awt.Dimension; import java.awt.EventQueue; @@ -165,7 +166,25 @@ public class FlatTitlePane createButtons(); - setLayout( new BorderLayout() ); + setLayout( new BorderLayout() { + @Override + public void layoutContainer( Container target ) { + super.layoutContainer( target ); + + // make left panel (with embedded menu bar) smaller if horizontal space is rare + // to avoid that embedded menu bar overlaps button bar + Insets insets = target.getInsets(); + int width = target.getWidth() - insets.left - insets.right; + if( leftPanel.getWidth() + buttonPanel.getWidth() > width ) { + int oldWidth = leftPanel.getWidth(); + int newWidth = Math.max( width - buttonPanel.getWidth(), 0 ); + leftPanel.setSize( newWidth, leftPanel.getHeight() ); + if( !getComponentOrientation().isLeftToRight() ) + leftPanel.setLocation( leftPanel.getX() + (oldWidth - newWidth), leftPanel.getY() ); + } + } + } ); + add( leftPanel, BorderLayout.LINE_START ); add( titleLabel, BorderLayout.CENTER ); add( buttonPanel, BorderLayout.LINE_END ); diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java index 5bae72c9..ee909e32 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatTestFrame.java @@ -62,6 +62,7 @@ public class FlatTestFrame private FlatInspector inspector; public boolean useApplyComponentOrientation; + public boolean applyComponentOrientationToFrame; public static FlatTestFrame create( String[] args, String title ) { DemoPrefs.init( PREFS_ROOT_PATH ); @@ -439,7 +440,9 @@ public class FlatTestFrame ? ComponentOrientation.RIGHT_TO_LEFT : ComponentOrientation.LEFT_TO_RIGHT; - if( useApplyComponentOrientation ) + if( applyComponentOrientationToFrame ) + applyComponentOrientation( orientation ); + else if( useApplyComponentOrientation ) content.applyComponentOrientation( orientation ); else { updateComponentsRecur( content, (c, type) -> { diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java index 136cafcf..dc139882 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatWindowDecorationsTest.java @@ -40,6 +40,7 @@ public class FlatWindowDecorationsTest JDialog.setDefaultLookAndFeelDecorated( true ); FlatTestFrame frame = FlatTestFrame.create( args, "FlatWindowDecorationsTest" ); + frame.applyComponentOrientationToFrame = true; // WARNING: Do not this in real-world programs. // frame.setUndecorated( true );