From 551cc1d76b47fc3d844821a1686f9c5a90ef2513 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 11 Sep 2019 10:17:07 +0200 Subject: [PATCH] TextField, TextArea, TextPane and EditorPane: apply minimum width of 64px --- .../formdev/flatlaf/ui/FlatEditorPaneUI.java | 35 +++++++++++++++++++ .../flatlaf/ui/FlatPasswordFieldUI.java | 19 ++++++++++ .../formdev/flatlaf/ui/FlatTextAreaUI.java | 28 +++++++++++++-- .../formdev/flatlaf/ui/FlatTextFieldUI.java | 28 +++++++++++++++ .../formdev/flatlaf/ui/FlatTextPaneUI.java | 35 +++++++++++++++++++ .../com/formdev/flatlaf/FlatLaf.properties | 2 ++ 6 files changed, 145 insertions(+), 2 deletions(-) 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 e30f4072..f386cc3c 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 @@ -16,19 +16,54 @@ package com.formdev.flatlaf.ui; +import static com.formdev.flatlaf.util.UIScale.scale; +import java.awt.Dimension; import javax.swing.JComponent; +import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicEditorPaneUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JEditorPane}. * + * TODO document used UI defaults of superclass + * + * @uiDefault Component.minimumWidth int + * * @author Karl Tauber */ public class FlatEditorPaneUI extends BasicEditorPaneUI { + protected int minimumWidth; + public static ComponentUI createUI( JComponent c ) { return new FlatEditorPaneUI(); } + + @Override + protected void installDefaults() { + super.installDefaults(); + + minimumWidth = UIManager.getInt( "Component.minimumWidth" ); + } + + @Override + public Dimension getPreferredSize( JComponent c ) { + return applyMinimumWidth( super.getPreferredSize( c ) ); + } + + @Override + public Dimension getMinimumSize( JComponent c ) { + return applyMinimumWidth( super.getMinimumSize( c ) ); + } + + private Dimension applyMinimumWidth( Dimension 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 + // issues. E.g. at scale factor 1.5 the first returns 4, but the second 3. + size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) ); + return size; + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java index 34aa5931..28e31349 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java @@ -17,6 +17,7 @@ package com.formdev.flatlaf.ui; import static com.formdev.flatlaf.util.UIScale.scale; +import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.FocusEvent; @@ -33,6 +34,7 @@ import javax.swing.text.JTextComponent; * TODO document used UI defaults of superclass * * @uiDefault Component.focusWidth int + * @uiDefault Component.minimumWidth int * * @author Karl Tauber */ @@ -40,6 +42,7 @@ public class FlatPasswordFieldUI extends BasicPasswordFieldUI { protected int focusWidth; + protected int minimumWidth; private Handler handler; @@ -52,6 +55,7 @@ public class FlatPasswordFieldUI super.installDefaults(); focusWidth = UIManager.getInt( "Component.focusWidth" ); + minimumWidth = UIManager.getInt( "Component.minimumWidth" ); } @Override @@ -95,6 +99,21 @@ public class FlatPasswordFieldUI } } + @Override + public Dimension getPreferredSize( JComponent c ) { + return applyMinimumWidth( super.getPreferredSize( c ) ); + } + + @Override + public Dimension getMinimumSize( JComponent c ) { + return applyMinimumWidth( super.getMinimumSize( c ) ); + } + + private Dimension applyMinimumWidth( Dimension size ) { + size.width = Math.max( size.width, scale( minimumWidth + (focusWidth * 2) ) ); + return size; + } + //---- class Handler ------------------------------------------------------ private class Handler 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 078200d4..51fcba49 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 @@ -16,7 +16,9 @@ package com.formdev.flatlaf.ui; +import static com.formdev.flatlaf.util.UIScale.scale; import java.awt.Color; +import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JComponent; import javax.swing.UIManager; @@ -30,14 +32,16 @@ import javax.swing.text.JTextComponent; * * TODO document used UI defaults of superclass * - * @uiDefault ComboBox.disabledBackground Color - * @uiDefault ComboBox.inactiveBackground Color + * @uiDefault Component.minimumWidth int + * @uiDefault TextArea.disabledBackground Color + * @uiDefault TextArea.inactiveBackground Color * * @author Karl Tauber */ public class FlatTextAreaUI extends BasicTextAreaUI { + protected int minimumWidth; protected Color disabledBackground; protected Color inactiveBackground; @@ -49,6 +53,7 @@ public class FlatTextAreaUI protected void installDefaults() { super.installDefaults(); + minimumWidth = UIManager.getInt( "Component.minimumWidth" ); disabledBackground = UIManager.getColor( "TextArea.disabledBackground" ); inactiveBackground = UIManager.getColor( "TextArea.inactiveBackground" ); } @@ -73,4 +78,23 @@ public class FlatTextAreaUI : (!c.isEditable() ? inactiveBackground : background)) ); g.fillRect( 0, 0, c.getWidth(), c.getHeight() ); } + + @Override + public Dimension getPreferredSize( JComponent c ) { + return applyMinimumWidth( super.getPreferredSize( c ) ); + } + + @Override + public Dimension getMinimumSize( JComponent c ) { + return applyMinimumWidth( super.getMinimumSize( c ) ); + } + + private Dimension applyMinimumWidth( Dimension 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 + // issues. E.g. at scale factor 1.5 the first returns 4, but the second 3. + size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) ); + return size; + } } 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 0e1f065d..85633c27 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 @@ -17,11 +17,15 @@ package com.formdev.flatlaf.ui; import static com.formdev.flatlaf.util.UIScale.scale; +import java.awt.Container; +import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import javax.swing.JComboBox; import javax.swing.JComponent; +import javax.swing.JSpinner; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTextFieldUI; @@ -33,6 +37,7 @@ import javax.swing.text.JTextComponent; * TODO document used UI defaults of superclass * * @uiDefault Component.focusWidth int + * @uiDefault Component.minimumWidth int * * @author Karl Tauber */ @@ -40,6 +45,7 @@ public class FlatTextFieldUI extends BasicTextFieldUI { protected int focusWidth; + protected int minimumWidth; private Handler handler; @@ -52,6 +58,7 @@ public class FlatTextFieldUI super.installDefaults(); focusWidth = UIManager.getInt( "Component.focusWidth" ); + minimumWidth = UIManager.getInt( "Component.minimumWidth" ); } @Override @@ -95,6 +102,27 @@ public class FlatTextFieldUI } } + @Override + public Dimension getPreferredSize( JComponent c ) { + return applyMinimumWidth( super.getPreferredSize( c ), c ); + } + + @Override + public Dimension getMinimumSize( JComponent c ) { + return applyMinimumWidth( super.getMinimumSize( c ), c ); + } + + private Dimension applyMinimumWidth( Dimension size, JComponent c ) { + Container parent = c.getParent(); + if( parent instanceof JComboBox || + parent instanceof JSpinner || + (parent != null && parent.getParent() instanceof JSpinner) ) + return size; + + size.width = Math.max( size.width, scale( minimumWidth + (focusWidth * 2) ) ); + return size; + } + //---- class Handler ------------------------------------------------------ private class Handler 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 cf076797..8d5457df 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 @@ -16,19 +16,54 @@ package com.formdev.flatlaf.ui; +import static com.formdev.flatlaf.util.UIScale.scale; +import java.awt.Dimension; import javax.swing.JComponent; +import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTextPaneUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JTextPane}. * + * TODO document used UI defaults of superclass + * + * @uiDefault Component.minimumWidth int + * * @author Karl Tauber */ public class FlatTextPaneUI extends BasicTextPaneUI { + protected int minimumWidth; + public static ComponentUI createUI( JComponent c ) { return new FlatTextPaneUI(); } + + @Override + protected void installDefaults() { + super.installDefaults(); + + minimumWidth = UIManager.getInt( "Component.minimumWidth" ); + } + + @Override + public Dimension getPreferredSize( JComponent c ) { + return applyMinimumWidth( super.getPreferredSize( c ) ); + } + + @Override + public Dimension getMinimumSize( JComponent c ) { + return applyMinimumWidth( super.getMinimumSize( c ) ); + } + + private Dimension applyMinimumWidth( Dimension 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 + // issues. E.g. at scale factor 1.5 the first returns 4, but the second 3. + size.width = Math.max( size.width, scale( minimumWidth ) - (scale( 1 ) * 2) ); + return size; + } } 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 21d2aa00..dc60067b 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -96,6 +96,7 @@ ComboBox.padding=1,6,1,6 Component.focusWidth=0 Component.arc=5 +Component.minimumWidth=64 #---- EditorPane ---- @@ -324,6 +325,7 @@ TextArea.border=com.formdev.flatlaf.ui.FlatMarginBorder TextArea.background=@textComponentBackground TextArea.margin=@textComponentMargin + #---- TextField ---- TextField.border=com.formdev.flatlaf.ui.FlatBorder