List: cellNoFocusBorder, focusCellHighlightBorder and focusSelectedCellHighlightBorder added

This commit is contained in:
Karl Tauber
2019-08-30 17:15:08 +02:00
parent 5afacb6c1a
commit 95bd83db5e
7 changed files with 147 additions and 22 deletions

View File

@@ -28,6 +28,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.function.Function;
import javax.swing.UIDefaults; import javax.swing.UIDefaults;
import javax.swing.UIDefaults.LazyValue; import javax.swing.UIDefaults.LazyValue;
import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.ColorUIResource;
@@ -36,6 +37,8 @@ import javax.swing.plaf.FontUIResource;
import javax.swing.plaf.InsetsUIResource; import javax.swing.plaf.InsetsUIResource;
import javax.swing.plaf.basic.BasicLookAndFeel; import javax.swing.plaf.basic.BasicLookAndFeel;
import javax.swing.plaf.metal.MetalLookAndFeel; import javax.swing.plaf.metal.MetalLookAndFeel;
import com.formdev.flatlaf.ui.FlatEmptyBorder;
import com.formdev.flatlaf.ui.FlatLineBorder;
import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.SystemInfo;
/** /**
@@ -169,6 +172,10 @@ public abstract class FlatLaf
} }
} }
Function<String, String> resolver = value -> {
return resolveValue( properties, value );
};
// get globals, which override all other defaults that end with same suffix // get globals, which override all other defaults that end with same suffix
HashMap<String, Object> globals = new HashMap<>(); HashMap<String, Object> globals = new HashMap<>();
for( Map.Entry<Object, Object> e : properties.entrySet() ) { for( Map.Entry<Object, Object> e : properties.entrySet() ) {
@@ -177,7 +184,7 @@ public abstract class FlatLaf
continue; continue;
String value = resolveValue( properties, (String) e.getValue() ); 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 // override UI defaults with globals
@@ -198,7 +205,7 @@ public abstract class FlatLaf
continue; continue;
String value = resolveValue( properties, (String) e.getValue() ); String value = resolveValue( properties, (String) e.getValue() );
defaults.put( key, parseValue( key, value ) ); defaults.put( key, parseValue( key, value, resolver ) );
} }
} catch( IOException ex ) { } catch( IOException ex ) {
ex.printStackTrace(); ex.printStackTrace();
@@ -219,7 +226,7 @@ public abstract class FlatLaf
return newValue; return newValue;
} }
private Object parseValue( String key, String value ) { private Object parseValue( String key, String value, Function<String, String> resolver ) {
value = value.trim(); value = value.trim();
// null, false, true // null, false, true
@@ -230,8 +237,8 @@ public abstract class FlatLaf
} }
// borders // borders
if( key.endsWith( ".border" ) ) if( key.endsWith( ".border" ) || key.endsWith( "Border" ) )
return parseBorder( value ); return parseBorder( value, resolver );
// icons // icons
if( key.endsWith( ".icon" ) || key.endsWith( "Icon" ) ) 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" ) ) if( key.endsWith( ".margin" ) || key.endsWith( ".padding" ) || key.endsWith( "Insets" ) )
return parseInsets( value ); return parseInsets( value );
// insets // size
if( key.endsWith( "Size" ) && !key.equals( "SplitPane.dividerSize" )) if( key.endsWith( "Size" ) && !key.equals( "SplitPane.dividerSize" ))
return parseSize( value ); return parseSize( value );
// insets // width, height
if( key.endsWith( "Width" ) || key.endsWith( "Height" ) ) if( key.endsWith( "Width" ) || key.endsWith( "Height" ) )
return parseInteger( value, true ); return parseInteger( value, true );
// colors // colors
ColorUIResource color = parseColor( value ); ColorUIResource color = parseColor( value, false );
if( color != null ) if( color != null )
return color; return color;
@@ -263,8 +270,22 @@ public abstract class FlatLaf
return value; return value;
} }
private Object parseBorder( String value ) { private Object parseBorder( String value, Function<String, String> resolver ) {
return parseInstance( value ); if( value.indexOf( ',' ) >= 0 ) {
// top,left,bottom,right[,lineColor]
List<String> 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 ) { 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 { 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 ); return new ColorUIResource( rgb );
} if( value.length() == 8 )
if( value.length() == 8 ) { return new ColorUIResource( new Color( rgb, true ) );
int rgba = Integer.parseInt( value, 16 );
return new ColorUIResource( new Color( rgba, true ) ); if( reportError )
} throw new NumberFormatException( value );
} catch( NumberFormatException ex ) { } catch( NumberFormatException ex ) {
if( reportError ) {
System.err.println( "invalid color '" + value + "'" );
throw ex;
}
// not a color --> ignore // not a color --> ignore
} }
return null; return null;

View File

@@ -16,11 +16,16 @@
package com.formdev.flatlaf.ui; 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; import javax.swing.plaf.BorderUIResource;
/** /**
* Empty border for various components. * Empty border for various components.
* *
* The insets are scaled.
*
* @author Karl Tauber * @author Karl Tauber
*/ */
public class FlatEmptyBorder public class FlatEmptyBorder
@@ -29,4 +34,26 @@ public class FlatEmptyBorder
public FlatEmptyBorder() { public FlatEmptyBorder() {
super( 0, 0, 0, 0 ); 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;
}
} }

View File

@@ -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();
}
}
}

View File

@@ -22,6 +22,7 @@
@background=3c3f41 @background=3c3f41
@foreground=bbbbbb @foreground=bbbbbb
@selectionBackground=4B6EAF
@disabledText=777777 @disabledText=777777
@textComponentBackground=45494A @textComponentBackground=45494A
@icon=adadad @icon=adadad
@@ -36,7 +37,7 @@
*.caretForeground=@foreground *.caretForeground=@foreground
*.inactiveBackground=@background *.inactiveBackground=@background
*.inactiveForeground=@foreground *.inactiveForeground=@foreground
*.selectionBackground=4B6EAF *.selectionBackground=@selectionBackground
*.selectionForeground=@foreground *.selectionForeground=@foreground
*.disabledBackground=@background *.disabledBackground=@background
*.disabledForeground=@disabledText *.disabledForeground=@disabledText

View File

@@ -80,6 +80,13 @@ FormattedTextField.background=@textComponentBackground
FormattedTextField.margin=@textComponentMargin 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 ----
PasswordField.border=com.formdev.flatlaf.ui.FlatBorder PasswordField.border=com.formdev.flatlaf.ui.FlatBorder

View File

@@ -22,6 +22,7 @@
@background=f2f2f2 @background=f2f2f2
@foreground=000000 @foreground=000000
@selectionBackground=4A6EB7
@disabledText=999999 @disabledText=999999
@textComponentBackground=ffffff @textComponentBackground=ffffff
@icon=afafaf @icon=afafaf
@@ -36,7 +37,7 @@
*.caretForeground=@foreground *.caretForeground=@foreground
*.inactiveBackground=@background *.inactiveBackground=@background
*.inactiveForeground=777777 *.inactiveForeground=777777
*.selectionBackground=4A6EB7 *.selectionBackground=@selectionBackground
*.selectionForeground=ffffff *.selectionForeground=ffffff
*.disabledBackground=@background *.disabledBackground=@background
*.disabledForeground=@disabledText *.disabledForeground=@disabledText

View File

@@ -17,6 +17,7 @@
#---- variables ---- #---- variables ----
@background=ccffcc @background=ccffcc
@selectionBackground=00aa00
@textComponentBackground=ffffff @textComponentBackground=ffffff
@icon=afafaf @icon=afafaf
@@ -30,8 +31,8 @@
*.caretForeground=0000ff *.caretForeground=0000ff
*.inactiveBackground=f0f0f0 *.inactiveBackground=f0f0f0
*.inactiveForeground=000088 *.inactiveForeground=000088
*.selectionBackground=4B6EAF *.selectionBackground=@selectionBackground
*.selectionForeground=00ff00 *.selectionForeground=ffff00
*.disabledBackground=e0e0e0 *.disabledBackground=e0e0e0
*.disabledForeground=000088 *.disabledForeground=000088
*.disabledText=000088 *.disabledText=000088
@@ -94,6 +95,13 @@ Label.foreground=008800
Label.disabledForeground=000088 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 ----
ProgressBar.background=88ff88 ProgressBar.background=88ff88