From fdbcb526296e1a274d7e49973b5763264f9e0f42 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 21 Aug 2019 13:24:33 +0200 Subject: [PATCH] TextField implemented --- .../java/com/formdev/flatlaf/FlatLaf.java | 35 +++++++ .../com/formdev/flatlaf/ui/FlatBorder.java | 86 ++++++++++++++++ .../formdev/flatlaf/ui/FlatTextFieldUI.java | 98 +++++++++++++++++++ .../formdev/flatlaf/FlatDarkLaf.properties | 11 ++- .../com/formdev/flatlaf/FlatLaf.properties | 7 ++ .../formdev/flatlaf/FlatLightLaf.properties | 11 ++- .../formdev/flatlaf/FlatComponentsTest.java | 29 ++++++ .../formdev/flatlaf/FlatComponentsTest.jfd | 34 +++++++ .../formdev/flatlaf/FlatTestLaf.properties | 9 ++ 9 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java 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 84419fff..210bb87a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -18,17 +18,20 @@ package com.formdev.flatlaf; import java.awt.Color; import java.awt.Font; +import java.awt.Insets; import java.awt.Toolkit; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Properties; import javax.swing.UIDefaults; import javax.swing.UIDefaults.LazyValue; import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.FontUIResource; +import javax.swing.plaf.InsetsUIResource; import javax.swing.plaf.basic.BasicLookAndFeel; import javax.swing.plaf.metal.MetalLookAndFeel; import com.formdev.flatlaf.util.SystemInfo; @@ -211,6 +214,10 @@ public abstract class FlatLaf if( key.endsWith( ".icon" ) ) return parseInstance( value ); + // insets + if( key.endsWith( ".margin" ) ) + return parseInsets( value ); + // colors ColorUIResource color = parseColor( value ); if( color != null ) @@ -240,6 +247,20 @@ public abstract class FlatLaf }; } + private Insets parseInsets( String value ) { + List numbers = split( value, ',' ); + try { + return new InsetsUIResource( + Integer.parseInt( numbers.get( 0 ) ), + Integer.parseInt( numbers.get( 1 ) ), + Integer.parseInt( numbers.get( 2 ) ), + Integer.parseInt( numbers.get( 3 ) ) ); + } catch( NumberFormatException ex ) { + System.err.println( "invalid insets '" + value + "'" ); + throw ex; + } + } + private ColorUIResource parseColor( String value ) { try { if( value.length() == 6 ) { @@ -267,4 +288,18 @@ public abstract class FlatLaf } return null; } + + private static List split( String str, char delim ) { + ArrayList strs = new ArrayList<>(); + int delimIndex = str.indexOf( delim ); + int index = 0; + while( delimIndex >= 0 ) { + strs.add( str.substring( index, delimIndex ) ); + index = delimIndex + 1; + delimIndex = str.indexOf( delim, index ); + } + strs.add( str.substring( index ) ); + + return strs; + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java new file mode 100644 index 00000000..fb1141ad --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java @@ -0,0 +1,86 @@ +/* + * Copyright 2019 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.ui; + +import static com.formdev.flatlaf.util.UIScale.*; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; +import java.awt.Paint; +import javax.swing.UIManager; +import javax.swing.plaf.basic.BasicBorders; +import javax.swing.text.JTextComponent; + +/** + * Border for various components (e.g. {@link javax.swing.JTextField}). + * + * @author Karl Tauber + */ +public class FlatBorder + extends BasicBorders.MarginBorder +{ + @Override + public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { + Graphics2D g2 = (Graphics2D) g.create(); + try { + FlatUIUtils.setRenderingHints( g2 ); + + float focusWidth = getFocusWidth(); + float lineWidth = getLineWidth(); + + if( c.hasFocus() ) { + g2.setColor( UIManager.getColor( "Component.focusColor" ) ); + FlatUIUtils.paintOutlineBorder( g2, x, y, width, height, focusWidth, lineWidth, 0 ); + } + + g2.setPaint( getBorderColor( c ) ); + FlatUIUtils.drawRoundRectangle( g2, x, y, width, height, focusWidth, lineWidth, 0 ); + } finally { + g2.dispose(); + } + } + + private Paint getBorderColor( Component c ) { + boolean editable = !(c instanceof JTextComponent) || ((JTextComponent)c).isEditable(); + return UIManager.getColor( c.isEnabled() && editable + ? (c.hasFocus() + ? "Component.focusedBorderColor" + : "Component.borderColor") + : "Component.disabledBorderColor" ); + } + + @Override + public Insets getBorderInsets( Component c, Insets insets ) { + float ow = getFocusWidth() + getLineWidth(); + + insets = super.getBorderInsets( c, insets ); + insets.top = round( scale( (float) insets.top ) + ow ); + insets.left = round( scale( (float) insets.left ) + ow ); + insets.bottom = round( scale( (float) insets.bottom ) + ow ); + insets.right = round( scale( (float) insets.right ) + ow ); + return insets; + } + + protected float getFocusWidth() { + return FlatUIUtils.getFocusWidth(); + } + + protected float getLineWidth() { + return FlatUIUtils.getLineWidth(); + } +} 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 new file mode 100644 index 00000000..5f1cb5fb --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java @@ -0,0 +1,98 @@ +/* + * Copyright 2019 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.ui; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import javax.swing.JComponent; +import javax.swing.UIManager; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicTextFieldUI; +import javax.swing.text.JTextComponent; + +/** + * Provides the Flat LaF UI delegate for {@link javax.swing.JTextField}. + * + * @author Karl Tauber + */ +public class FlatTextFieldUI + extends BasicTextFieldUI +{ + private final Handler handler = new Handler(); + + public static ComponentUI createUI( JComponent c ) { + return new FlatTextFieldUI(); + } + + @Override + protected void installListeners() { + super.installListeners(); + + getComponent().addFocusListener( handler ); + } + + @Override + protected void uninstallListeners() { + super.uninstallListeners(); + + getComponent().removeFocusListener( handler ); + } + + @Override + protected void paintBackground( Graphics g ) { + JTextComponent c = getComponent(); + + FlatUIUtils.paintParentBackground( g, c ); + + Graphics2D g2 = (Graphics2D) g.create(); + try { + FlatUIUtils.setRenderingHints( g2 ); + + float focusWidth = FlatUIUtils.getFocusWidth(); + + g2.setColor( getBackground( c ) ); + FlatUIUtils.fillRoundRectangle( g2, 0, 0, c.getWidth(), c.getHeight(), focusWidth, 0 ); + } finally { + g2.dispose(); + } + } + + private Color getBackground( JTextComponent c ) { + return c.isEditable() && c.isEnabled() + ? c.getBackground() + : UIManager.getColor( "TextField.disabledBackground" ); + } + + //---- class Handler ------------------------------------------------------ + + private class Handler + implements FocusListener + { + @Override + public void focusGained( FocusEvent e ) { + getComponent().repaint(); + } + + @Override + public void focusLost( FocusEvent e ) { + getComponent().repaint(); + } + } +} diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties index 0d182cd2..0ef778e5 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -70,7 +70,7 @@ CheckBox.icon.selectedBorderColor=6B6B6B CheckBox.icon.focusedBorderColor=466D94 CheckBox.icon.selectedFocusedBorderColor=466D94 CheckBox.icon.background=43494A -CheckBox.icon.disabledBackground=3C3F41 +CheckBox.icon.disabledBackground=@background CheckBox.icon.selectedBackground=43494A CheckBox.icon.checkmarkColor=A7A7A7 CheckBox.icon.disabledCheckmarkColor=606060 @@ -78,9 +78,18 @@ CheckBox.icon.disabledCheckmarkColor=606060 #---- Component ---- +Component.borderColor=646464 +Component.disabledBorderColor=646464 +Component.focusedBorderColor=466d94 Component.focusColor=3d6185 #---- Label ---- Label.disabledForeground=@disabledText + + +#---- TextField ---- + +TextField.background=45494A +TextField.disabledBackground=@background 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 875f3bcf..2c604a43 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -20,6 +20,7 @@ ButtonUI=com.formdev.flatlaf.ui.FlatButtonUI CheckBoxUI=com.formdev.flatlaf.ui.FlatCheckBoxUI LabelUI=com.formdev.flatlaf.ui.FlatLabelUI RadioButtonUI=com.formdev.flatlaf.ui.FlatRadioButtonUI +TextFieldUI=com.formdev.flatlaf.ui.FlatTextFieldUI #---- Button ---- @@ -44,3 +45,9 @@ Component.arc=5 RadioButton.border=com.formdev.flatlaf.ui.FlatMarginBorder RadioButton.icon=com.formdev.flatlaf.ui.FlatRadioButtonIcon + + +#---- TextField ---- + +TextField.border=com.formdev.flatlaf.ui.FlatBorder +TextField.margin=2,6,2,6 diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties index e3211bcc..d78fb7c0 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -70,7 +70,7 @@ CheckBox.icon.selectedBorderColor=4982CC CheckBox.icon.focusedBorderColor=7B9FC7 CheckBox.icon.selectedFocusedBorderColor=ACCFF7 CheckBox.icon.background=FFFFFF -CheckBox.icon.disabledBackground=F2F2F2 +CheckBox.icon.disabledBackground=@background CheckBox.icon.selectedBackground=4D89C9 CheckBox.icon.checkmarkColor=FFFFFF CheckBox.icon.disabledCheckmarkColor=ABABAB @@ -78,9 +78,18 @@ CheckBox.icon.disabledCheckmarkColor=ABABAB #---- Component ---- +Component.borderColor=c4c4c4 +Component.disabledBorderColor=cfcfcf +Component.focusedBorderColor=87afda Component.focusColor=97c3f3 #---- Label ---- Label.disabledForeground=@disabledText + + +#---- TextField ---- + +TextField.background=ffffff +TextField.disabledBackground=@background diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java index f77cbb29..af0c15b5 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.java @@ -66,6 +66,11 @@ public class FlatComponentsTest JRadioButton radioButton2 = new JRadioButton(); JRadioButton radioButton3 = new JRadioButton(); JRadioButton radioButton4 = new JRadioButton(); + JLabel textFieldLabel = new JLabel(); + JTextField textField1 = new JTextField(); + JTextField textField2 = new JTextField(); + JTextField textField3 = new JTextField(); + JTextField textField4 = new JTextField(); //======== this ======== setLayout(new MigLayout( @@ -177,6 +182,30 @@ public class FlatComponentsTest radioButton4.setSelected(true); radioButton4.setEnabled(false); add(radioButton4, "cell 4 3"); + + //---- textFieldLabel ---- + textFieldLabel.setText("JTextField:"); + add(textFieldLabel, "cell 0 4"); + + //---- textField1 ---- + textField1.setText("editable"); + add(textField1, "cell 1 4,growx"); + + //---- textField2 ---- + textField2.setText("disabled"); + textField2.setEnabled(false); + add(textField2, "cell 2 4,growx"); + + //---- textField3 ---- + textField3.setText("not editable"); + textField3.setEditable(false); + add(textField3, "cell 3 4,growx"); + + //---- textField4 ---- + textField4.setText("not editable disabled"); + textField4.setEnabled(false); + textField4.setEditable(false); + add(textField4, "cell 4 4,growx"); // JFormDesigner - End of component initialization //GEN-END:initComponents } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd index 9fc090f8..3d0423ae 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/FlatComponentsTest.jfd @@ -144,6 +144,40 @@ new FormModel { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { "value": "cell 4 3" } ) + add( new FormComponent( "javax.swing.JLabel" ) { + name: "textFieldLabel" + "text": "JTextField:" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 0 4" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField1" + "text": "editable" + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 1 4,growx" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField2" + "text": "disabled" + "enabled": false + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 2 4,growx" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField3" + "text": "not editable" + "editable": false + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 3 4,growx" + } ) + add( new FormComponent( "javax.swing.JTextField" ) { + name: "textField4" + "text": "not editable disabled" + "enabled": false + "editable": false + }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { + "value": "cell 4 4,growx" + } ) }, new FormLayoutConstraints( null ) { "location": new java.awt.Point( 0, 0 ) "size": new java.awt.Dimension( 580, 300 ) diff --git a/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties b/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties index 0d23b8d5..c890a8fc 100644 --- a/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties +++ b/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties @@ -55,6 +55,9 @@ CheckBox.icon.disabledCheckmarkColor=ABABAB #---- Component ---- +Component.borderColor=ff0000 +Component.disabledBorderColor=000088 +Component.focusedBorderColor=466d94 Component.focusColor=97c3f3 #Component.focusWidth=5 #Component.arc=8 @@ -64,3 +67,9 @@ Component.focusColor=97c3f3 Label.foreground=008800 Label.disabledForeground=000088 + + +#---- TextField ---- + +TextField.background=ffffff +TextField.disabledBackground=f2f2f2