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 f46acff9..6345724a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.function.Function; import javax.swing.UIDefaults; import javax.swing.UIDefaults.LazyValue; import javax.swing.plaf.ColorUIResource; @@ -36,6 +37,8 @@ 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.ui.FlatEmptyBorder; +import com.formdev.flatlaf.ui.FlatLineBorder; import com.formdev.flatlaf.util.SystemInfo; /** @@ -169,6 +172,10 @@ public abstract class FlatLaf } } + Function resolver = value -> { + return resolveValue( properties, value ); + }; + // get globals, which override all other defaults that end with same suffix HashMap globals = new HashMap<>(); for( Map.Entry e : properties.entrySet() ) { @@ -177,7 +184,7 @@ public abstract class FlatLaf continue; String value = resolveValue( properties, (String) e.getValue() ); - globals.put( key.substring( GLOBAL_PREFIX.length() ), parseValue( key, value ) ); + globals.put( key.substring( GLOBAL_PREFIX.length() ), parseValue( key, value, resolver ) ); } // override UI defaults with globals @@ -198,7 +205,7 @@ public abstract class FlatLaf continue; String value = resolveValue( properties, (String) e.getValue() ); - defaults.put( key, parseValue( key, value ) ); + defaults.put( key, parseValue( key, value, resolver ) ); } } catch( IOException ex ) { ex.printStackTrace(); @@ -219,7 +226,7 @@ public abstract class FlatLaf return newValue; } - private Object parseValue( String key, String value ) { + private Object parseValue( String key, String value, Function resolver ) { value = value.trim(); // null, false, true @@ -230,8 +237,8 @@ public abstract class FlatLaf } // borders - if( key.endsWith( ".border" ) ) - return parseBorder( value ); + if( key.endsWith( ".border" ) || key.endsWith( "Border" ) ) + return parseBorder( value, resolver ); // icons if( key.endsWith( ".icon" ) || key.endsWith( "Icon" ) ) @@ -241,16 +248,16 @@ public abstract class FlatLaf if( key.endsWith( ".margin" ) || key.endsWith( ".padding" ) || key.endsWith( "Insets" ) ) return parseInsets( value ); - // insets + // size if( key.endsWith( "Size" ) && !key.equals( "SplitPane.dividerSize" )) return parseSize( value ); - // insets + // width, height if( key.endsWith( "Width" ) || key.endsWith( "Height" ) ) return parseInteger( value, true ); // colors - ColorUIResource color = parseColor( value ); + ColorUIResource color = parseColor( value, false ); if( color != null ) return color; @@ -263,8 +270,22 @@ public abstract class FlatLaf return value; } - private Object parseBorder( String value ) { - return parseInstance( value ); + private Object parseBorder( String value, Function resolver ) { + if( value.indexOf( ',' ) >= 0 ) { + // top,left,bottom,right[,lineColor] + List parts = split( value, ',' ); + Insets insets = parseInsets( value ); + ColorUIResource lineColor = (parts.size() == 5) + ? parseColor( resolver.apply( parts.get( 4 ) ), true ) + : null; + + return (LazyValue) t -> { + return (lineColor != null) + ? new FlatLineBorder( insets, lineColor ) + : new FlatEmptyBorder( insets ); + }; + } else + return parseInstance( value ); } private Object parseInstance( String value ) { @@ -304,17 +325,21 @@ public abstract class FlatLaf } } - private ColorUIResource parseColor( String value ) { + private ColorUIResource parseColor( String value, boolean reportError ) { try { - if( value.length() == 6 ) { - int rgb = Integer.parseInt( value, 16 ); + int rgb = Integer.parseInt( value, 16 ); + if( value.length() == 6 ) return new ColorUIResource( rgb ); - } - if( value.length() == 8 ) { - int rgba = Integer.parseInt( value, 16 ); - return new ColorUIResource( new Color( rgba, true ) ); - } + if( value.length() == 8 ) + return new ColorUIResource( new Color( rgb, true ) ); + + if( reportError ) + throw new NumberFormatException( value ); } catch( NumberFormatException ex ) { + if( reportError ) { + System.err.println( "invalid color '" + value + "'" ); + throw ex; + } // not a color --> ignore } return null; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEmptyBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEmptyBorder.java index bed676e2..72d62e05 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEmptyBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatEmptyBorder.java @@ -16,11 +16,16 @@ package com.formdev.flatlaf.ui; +import static com.formdev.flatlaf.util.UIScale.scale; +import java.awt.Component; +import java.awt.Insets; import javax.swing.plaf.BorderUIResource; /** * Empty border for various components. * + * The insets are scaled. + * * @author Karl Tauber */ public class FlatEmptyBorder @@ -29,4 +34,26 @@ public class FlatEmptyBorder public FlatEmptyBorder() { super( 0, 0, 0, 0 ); } + + public FlatEmptyBorder( int top, int left, int bottom, int right ) { + super( top, left, bottom, right ); + } + + public FlatEmptyBorder( Insets insets ) { + super( insets ); + } + + @Override + public Insets getBorderInsets() { + return new Insets( scale( top ), scale( left ), scale( bottom ), scale( right ) ); + } + + @Override + public Insets getBorderInsets( Component c, Insets insets ) { + insets.left = scale( left ); + insets.top = scale( top ); + insets.right = scale( right ); + insets.bottom = scale( bottom ); + return insets; + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLineBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLineBorder.java new file mode 100644 index 00000000..5c8a3840 --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLineBorder.java @@ -0,0 +1,56 @@ +/* + * 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.scale; +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Insets; + +/** + * Line border for various components. + * + * Paints a scaled 1px thick line around the component. + * The line thickness is not included in the border insets. + * The insets should be at least 1,1,1,1. + * + * @author Karl Tauber + */ +public class FlatLineBorder + extends FlatEmptyBorder +{ + private final Color lineColor; + + public FlatLineBorder( Insets insets, Color lineColor ) { + super( insets ); + this.lineColor = lineColor; + } + + @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 ); + g2.setColor( lineColor ); + FlatUIUtils.drawRoundRectangle( g2, x, y, width, height, 0f, scale( 1f ), 0f ); + } finally { + g2.dispose(); + } + } +} 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 6fa474e6..3e3bca02 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -22,6 +22,7 @@ @background=3c3f41 @foreground=bbbbbb +@selectionBackground=4B6EAF @disabledText=777777 @textComponentBackground=45494A @icon=adadad @@ -36,7 +37,7 @@ *.caretForeground=@foreground *.inactiveBackground=@background *.inactiveForeground=@foreground -*.selectionBackground=4B6EAF +*.selectionBackground=@selectionBackground *.selectionForeground=@foreground *.disabledBackground=@background *.disabledForeground=@disabledText 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 eb0bce58..11cfe79f 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties @@ -80,6 +80,13 @@ FormattedTextField.background=@textComponentBackground FormattedTextField.margin=@textComponentMargin +#---- List ---- + +List.cellNoFocusBorder=1,6,1,6 +List.focusCellHighlightBorder=1,6,1,6,@selectionBackground +List.focusSelectedCellHighlightBorder=1,6,1,6,@selectionBackground + + #---- PasswordField ---- PasswordField.border=com.formdev.flatlaf.ui.FlatBorder 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 52483fff..62ac238b 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -22,6 +22,7 @@ @background=f2f2f2 @foreground=000000 +@selectionBackground=4A6EB7 @disabledText=999999 @textComponentBackground=ffffff @icon=afafaf @@ -36,7 +37,7 @@ *.caretForeground=@foreground *.inactiveBackground=@background *.inactiveForeground=777777 -*.selectionBackground=4A6EB7 +*.selectionBackground=@selectionBackground *.selectionForeground=ffffff *.disabledBackground=@background *.disabledForeground=@disabledText 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 db8a8f38..653fe9a9 100644 --- a/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties +++ b/flatlaf-core/src/test/resources/com/formdev/flatlaf/FlatTestLaf.properties @@ -17,6 +17,7 @@ #---- variables ---- @background=ccffcc +@selectionBackground=00aa00 @textComponentBackground=ffffff @icon=afafaf @@ -30,8 +31,8 @@ *.caretForeground=0000ff *.inactiveBackground=f0f0f0 *.inactiveForeground=000088 -*.selectionBackground=4B6EAF -*.selectionForeground=00ff00 +*.selectionBackground=@selectionBackground +*.selectionForeground=ffff00 *.disabledBackground=e0e0e0 *.disabledForeground=000088 *.disabledText=000088 @@ -94,6 +95,13 @@ Label.foreground=008800 Label.disabledForeground=000088 +#---- List ---- + +List.cellNoFocusBorder=1,6,1,6 +List.focusSelectedCellHighlightBorder=1,6,1,6,880000 +List.focusCellHighlightBorder=1,6,1,6,880000 + + #---- ProgressBar ---- ProgressBar.background=88ff88