From 29064ec72faeb4be0be97e3609da487a5367ac50 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 2 Aug 2021 18:36:10 +0200 Subject: [PATCH] Button and TextComponent: do not apply minimum width/height if margins are set (issue #364) --- CHANGELOG.md | 2 ++ .../com/formdev/flatlaf/ui/FlatButtonUI.java | 12 +++++++++++- .../com/formdev/flatlaf/ui/FlatEditorPaneUI.java | 15 ++++++++++++--- .../com/formdev/flatlaf/ui/FlatTextAreaUI.java | 7 ++++++- .../com/formdev/flatlaf/ui/FlatTextFieldUI.java | 16 +++++++++++++++- .../com/formdev/flatlaf/ui/FlatTextPaneUI.java | 9 +++++++-- 6 files changed, 53 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aad6c51..8318b475 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ FlatLaf Change Log #### Fixed bugs +- Button and TextComponent: Do not apply minimum width/height if margins are + set. (issue #364) - ComboBox and Spinner: Limit arrow button width if component has large preferred height. (issue #361) - InternalFrame: Limit internal frame bounds to parent bounds on resize. Also diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java index 92d3f013..0afd6eb1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java @@ -30,6 +30,7 @@ import java.awt.Insets; import java.awt.Rectangle; import java.awt.geom.RoundRectangle2D; import java.beans.PropertyChangeEvent; +import java.util.Objects; import javax.swing.AbstractButton; import javax.swing.ButtonModel; import javax.swing.Icon; @@ -129,6 +130,7 @@ public class FlatButtonUI protected Color toolbarSelectedBackground; private Icon helpButtonIcon; + private Insets defaultMargin; private boolean defaults_initialized = false; @@ -184,6 +186,7 @@ public class FlatButtonUI toolbarSelectedBackground = UIManager.getColor( prefix + "toolbar.selectedBackground" ); helpButtonIcon = UIManager.getIcon( "HelpButton.icon" ); + defaultMargin = UIManager.getInsets( prefix + "margin" ); defaults_initialized = true; } @@ -499,7 +502,9 @@ public class FlatButtonUI } else if( isIconOnlyOrSingleCharacter && ((AbstractButton)c).getIcon() == null ) { // make single-character-no-icon button square (increase width) prefSize.width = Math.max( prefSize.width, prefSize.height ); - } else if( !isIconOnlyOrSingleCharacter && !isToolBarButton( c ) && c.getBorder() instanceof FlatButtonBorder ) { + } else if( !isIconOnlyOrSingleCharacter && !isToolBarButton( c ) && + c.getBorder() instanceof FlatButtonBorder && hasDefaultMargins( c ) ) + { // apply minimum width/height int fw = Math.round( FlatUIUtils.getBorderFocusWidth( c ) * 2 ); prefSize.width = Math.max( prefSize.width, scale( FlatUIUtils.minimumWidth( c, minimumWidth ) ) + fw ); @@ -509,6 +514,11 @@ public class FlatButtonUI return prefSize; } + private boolean hasDefaultMargins( JComponent c ) { + Insets margin = ((AbstractButton)c).getMargin(); + return margin instanceof UIResource && Objects.equals( margin, defaultMargin ); + } + //---- class FlatButtonListener ------------------------------------------- protected class FlatButtonListener diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java index 0179e60d..61bbcaf2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java @@ -21,6 +21,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Insets; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; import javax.swing.JComponent; @@ -65,6 +66,8 @@ public class FlatEditorPaneUI protected boolean isIntelliJTheme; protected Color focusedBackground; + private Insets defaultMargin; + private Object oldHonorDisplayProperties; private FocusListener focusListener; @@ -81,6 +84,8 @@ public class FlatEditorPaneUI isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" ); focusedBackground = UIManager.getColor( prefix + ".focusedBackground" ); + defaultMargin = UIManager.getInsets( prefix + ".margin" ); + // use component font and foreground for HTML text oldHonorDisplayProperties = getComponent().getClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES ); getComponent().putClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES, true ); @@ -128,15 +133,19 @@ public class FlatEditorPaneUI @Override public Dimension getPreferredSize( JComponent c ) { - return applyMinimumWidth( c, super.getPreferredSize( c ), minimumWidth ); + return applyMinimumWidth( c, super.getPreferredSize( c ), minimumWidth, defaultMargin ); } @Override public Dimension getMinimumSize( JComponent c ) { - return applyMinimumWidth( c, super.getMinimumSize( c ), minimumWidth ); + return applyMinimumWidth( c, super.getMinimumSize( c ), minimumWidth, defaultMargin ); } - static Dimension applyMinimumWidth( JComponent c, Dimension size, int minimumWidth ) { + static Dimension applyMinimumWidth( JComponent c, Dimension size, int minimumWidth, Insets defaultMargin ) { + // do not apply minimum width if JTextComponent.margin is set + if( !FlatTextFieldUI.hasDefaultMargins( c, defaultMargin ) ) + return size; + // Assume that text area is in a scroll pane (that displays the border) // and subtract 1px border line width. // Using "(scale( 1 ) * 2)" instead of "scale( 2 )" to deal with rounding diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java index 21824be5..f188353f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java @@ -20,6 +20,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Insets; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; import javax.swing.JComponent; @@ -67,6 +68,8 @@ public class FlatTextAreaUI protected Color inactiveBackground; protected Color focusedBackground; + private Insets defaultMargin; + private FocusListener focusListener; public static ComponentUI createUI( JComponent c ) { @@ -90,6 +93,8 @@ public class FlatTextAreaUI disabledBackground = UIManager.getColor( "TextArea.disabledBackground" ); inactiveBackground = UIManager.getColor( "TextArea.inactiveBackground" ); focusedBackground = UIManager.getColor( "TextArea.focusedBackground" ); + + defaultMargin = UIManager.getInsets( "TextArea.margin" ); } @Override @@ -170,7 +175,7 @@ public class FlatTextAreaUI if( c instanceof JTextArea && ((JTextArea)c).getColumns() > 0 ) return size; - return FlatEditorPaneUI.applyMinimumWidth( c, size, minimumWidth ); + return FlatEditorPaneUI.applyMinimumWidth( c, size, minimumWidth, defaultMargin ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java index 874d4461..923458a0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java @@ -27,6 +27,7 @@ import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; +import java.util.Objects; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JSpinner; @@ -80,6 +81,8 @@ public class FlatTextFieldUI protected Color placeholderForeground; protected Color focusedBackground; + private Insets defaultMargin; + private FocusListener focusListener; public static ComponentUI createUI( JComponent c ) { @@ -96,6 +99,8 @@ public class FlatTextFieldUI placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" ); focusedBackground = UIManager.getColor( prefix + ".focusedBackground" ); + defaultMargin = UIManager.getInsets( prefix + ".margin" ); + LookAndFeel.installProperty( getComponent(), "opaque", false ); MigLayoutVisualPadding.install( getComponent() ); @@ -250,11 +255,15 @@ public class FlatTextFieldUI return applyMinimumWidth( c, super.getMinimumSize( c ), minimumWidth ); } - static Dimension applyMinimumWidth( JComponent c, Dimension size, int minimumWidth ) { + private Dimension applyMinimumWidth( JComponent c, Dimension size, int minimumWidth ) { // do not apply minimum width if JTextField.columns is set if( c instanceof JTextField && ((JTextField)c).getColumns() > 0 ) return size; + // do not apply minimum width if JTextComponent.margin is set + if( !hasDefaultMargins( c, defaultMargin ) ) + return size; + // do not apply minimum width if used in combobox or spinner Container parent = c.getParent(); if( parent instanceof JComboBox || @@ -268,6 +277,11 @@ public class FlatTextFieldUI return size; } + static boolean hasDefaultMargins( JComponent c, Insets defaultMargin ) { + Insets margin = ((JTextComponent)c).getMargin(); + return margin instanceof UIResource && Objects.equals( margin, defaultMargin ); + } + @Override protected Rectangle getVisibleEditorRect() { Rectangle r = super.getVisibleEditorRect(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java index 0da0c538..b2962876 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java @@ -20,6 +20,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Insets; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; import javax.swing.JComponent; @@ -62,6 +63,8 @@ public class FlatTextPaneUI protected boolean isIntelliJTheme; protected Color focusedBackground; + private Insets defaultMargin; + private Object oldHonorDisplayProperties; private FocusListener focusListener; @@ -78,6 +81,8 @@ public class FlatTextPaneUI isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" ); focusedBackground = UIManager.getColor( prefix + ".focusedBackground" ); + defaultMargin = UIManager.getInsets( prefix + ".margin" ); + // use component font and foreground for HTML text oldHonorDisplayProperties = getComponent().getClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES ); getComponent().putClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES, true ); @@ -117,12 +122,12 @@ public class FlatTextPaneUI @Override public Dimension getPreferredSize( JComponent c ) { - return FlatEditorPaneUI.applyMinimumWidth( c, super.getPreferredSize( c ), minimumWidth ); + return FlatEditorPaneUI.applyMinimumWidth( c, super.getPreferredSize( c ), minimumWidth, defaultMargin ); } @Override public Dimension getMinimumSize( JComponent c ) { - return FlatEditorPaneUI.applyMinimumWidth( c, super.getMinimumSize( c ), minimumWidth ); + return FlatEditorPaneUI.applyMinimumWidth( c, super.getMinimumSize( c ), minimumWidth, defaultMargin ); } @Override