From edade93054f855d77abcbe6c59fbfa4d61423b9d Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 15 Jun 2021 14:35:26 +0200 Subject: [PATCH 01/60] Styling: basic implementation of styling support using client property `JComponent.style` and CSS syntax only for JSlider (at the moment) e.g. `mySlider.putClientProperty( "JComponent.style", "trackValueColor: #00f; trackColor: #f00; thumbColor: #0f0; trackWidth: 6; thumbSize: 40,20; focusWidth: 20" );` (issues #117 and #340) --- .../formdev/flatlaf/FlatClientProperties.java | 10 ++ .../java/com/formdev/flatlaf/FlatLaf.java | 15 +++ .../com/formdev/flatlaf/ui/FlatSliderUI.java | 81 +++++++++++++ .../formdev/flatlaf/ui/FlatStyleSupport.java | 108 ++++++++++++++++++ 4 files changed, 214 insertions(+) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index ff6a5aa5..5318773d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -126,6 +126,16 @@ public interface FlatClientProperties //---- JComponent --------------------------------------------------------- + /** + * Specifies the style of a component in CSS syntax ("key1: value1; key2: value2; ..."). + *

+ * Components {@link javax.swing.JComponent}
+ * Value type {@link java.lang.String}
+ * + * @since TODO + */ + String COMPONENT_STYLE = "JComponent.style"; + /** * Specifies minimum width of a component. *

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 f408aaa5..c98ebf42 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -726,6 +726,21 @@ public abstract class FlatLaf customDefaultsSources.remove( folder ); } + /** + * Parses a UI defaults value string and converts it into a binary object. + *

+ * See: https://www.formdev.com/flatlaf/properties-files/ + * + * @param key the key, which is used to determine the value type + * @param value the value string + * @return the binary value + * @throws IllegalArgumentException on syntax errors + * @since TODO + */ + public static Object parseDefaultsValue( String key, String value ) throws IllegalArgumentException { + return UIDefaultsLoader.parseValue( key, value ); + } + private static void reSetLookAndFeel() { EventQueue.invokeLater( () -> { LookAndFeel lookAndFeel = UIManager.getLookAndFeel(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index b44f769f..2c0b31ba 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -27,6 +27,8 @@ import java.awt.event.MouseEvent; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.JComponent; import javax.swing.JSlider; import javax.swing.LookAndFeel; @@ -34,6 +36,8 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSliderUI; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -90,6 +94,7 @@ public class FlatSliderUI protected Color disabledTrackColor; protected Color disabledThumbColor; protected Color disabledThumbBorderColor; + protected Color tickColor; private Color defaultBackground; private Color defaultForeground; @@ -98,6 +103,7 @@ public class FlatSliderUI protected boolean thumbPressed; private Object[] oldRenderingHints; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatSliderUI(); @@ -107,6 +113,13 @@ public class FlatSliderUI super( null ); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( slider ) ); + } + @Override protected void installDefaults( JSlider slider ) { super.installDefaults( slider ); @@ -134,6 +147,7 @@ public class FlatSliderUI disabledTrackColor = UIManager.getColor( "Slider.disabledTrackColor" ); disabledThumbColor = UIManager.getColor( "Slider.disabledThumbColor" ); disabledThumbBorderColor = FlatUIUtils.getUIColor( "Slider.disabledThumbBorderColor", "Component.disabledBorderColor" ); + tickColor = FlatUIUtils.getUIColor( "Slider.tickColor", Color.BLACK ); // see BasicSliderUI.paintTicks() defaultBackground = UIManager.getColor( "Slider.background" ); defaultForeground = UIManager.getColor( "Slider.foreground" ); @@ -155,9 +169,12 @@ public class FlatSliderUI disabledTrackColor = null; disabledThumbColor = null; disabledThumbBorderColor = null; + tickColor = null; defaultBackground = null; defaultForeground = null; + + oldStyleValues = null; } @Override @@ -165,6 +182,57 @@ public class FlatSliderUI return new FlatTrackListener(); } + @Override + protected PropertyChangeListener createPropertyChangeListener( JSlider slider ) { + PropertyChangeListener superListener = super.createPropertyChangeListener( slider ); + return e -> { + superListener.propertyChange( e ); + + switch( e.getPropertyName() ) { + case FlatClientProperties.COMPONENT_STYLE: + applyStyle( FlatStyleSupport.toString( e.getNewValue() ) ); + slider.revalidate(); + slider.repaint(); + break; + } + }; + } + + /** + * @since TODO + */ + protected void applyStyle( String style ) { + oldStyleValues = FlatStyleSupport.parse( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + Object oldValue; + switch( key ) { + case "trackWidth": oldValue = trackWidth; trackWidth = (int) value; break; + case "thumbSize": oldValue = thumbSize; thumbSize = (Dimension) value; break; + case "focusWidth": oldValue = focusWidth; focusWidth = (int) value; break; + + case "trackValueColor": oldValue = trackValueColor; trackValueColor = (Color) value; break; + case "trackColor": oldValue = trackColor; trackColor = (Color) value; break; + case "thumbColor": oldValue = thumbColor; thumbColor = (Color) value; break; + case "thumbBorderColor": oldValue = thumbBorderColor; thumbBorderColor = (Color) value; break; + case "focusedColor": oldValue = focusedColor; focusedColor = (Color) value; break; + case "focusedThumbBorderColor": oldValue = focusedThumbBorderColor; focusedThumbBorderColor = (Color) value; break; + case "hoverThumbColor": oldValue = hoverThumbColor; hoverThumbColor = (Color) value; break; + case "pressedThumbColor": oldValue = pressedThumbColor; pressedThumbColor = (Color) value; break; + case "disabledTrackColor": oldValue = disabledTrackColor; disabledTrackColor = (Color) value; break; + case "disabledThumbColor": oldValue = disabledThumbColor; disabledThumbColor = (Color) value; break; + case "disabledThumbBorderColor": oldValue = disabledThumbBorderColor; disabledThumbBorderColor = (Color) value; break; + case "tickColor": oldValue = tickColor; tickColor = (Color) value; break; + + default: throw new IllegalArgumentException( "unknown style '" + key + "'" ); + } + return oldValue; + } + @Override public int getBaseline( JComponent c, int width, int height ) { if( c == null ) @@ -306,6 +374,19 @@ debug*/ ((Graphics2D)g).fill( track ); } + @Override + public void paintTicks( Graphics g ) { + // because BasicSliderUI.paintTicks() always uses + // g.setColor( UIManager.getColor("Slider.tickColor") ) + // we override this method and use our tickColor field to allow styling + super.paintTicks( new Graphics2DProxy( (Graphics2D) g ) { + @Override + public void setColor( Color c ) { + super.setColor( tickColor ); + } + } ); + } + @Override public void paintThumb( Graphics g ) { Color thumbColor = getThumbColor(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java new file mode 100644 index 00000000..0c94dccf --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -0,0 +1,108 @@ +/* + * Copyright 2021 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 + * + * https://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.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.function.BiFunction; +import javax.swing.JComponent; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.util.StringUtils; + +/** + * Support for styling components in CSS syntax. + * + * @author Karl Tauber + * @since TODO + */ +public class FlatStyleSupport +{ + /** + * Parses styles in CSS syntax ("key1: value1; key2: value2; ..."), + * converts the value strings into binary and invokes the given function + * to apply the properties. + * + * @param oldStyleValues map of old values modified by the previous invocation, or {@code null} + * @param style the style in CSS syntax + * @param applyProperty function that is invoked to apply the properties; + * first parameter is the key, second the binary value; + * the function must return the old value + * @return map of old values modified by the given style, or {@code null} + * @throws IllegalArgumentException on syntax errors + */ + public static Map parse( Map oldStyleValues, + String style, BiFunction applyProperty ) throws IllegalArgumentException + { + // restore previous values + if( oldStyleValues != null ) { + for( Entry e : oldStyleValues.entrySet() ) + applyProperty.apply( e.getKey(), e.getValue() ); + } + + // ignore empty style + if( style == null || style.trim().isEmpty() ) + return null; + + Map oldValues = null; + + // split style into parts and process them + for( String part : StringUtils.split( style, ';' ) ) { + // ignore empty parts + part = part.trim(); + if( part.isEmpty() ) + continue; + + // find separator colon + int sepIndex = part.indexOf( ':' ); + if( sepIndex < 0 ) + throw new IllegalArgumentException( "missing colon in '" + part + "'" ); + + // split into key and value + String key = part.substring( 0, sepIndex ).trim(); + String value = part.substring( sepIndex + 1 ).trim(); + if( key.isEmpty() ) + throw new IllegalArgumentException( "missing key in '" + part + "'" ); + if( value.isEmpty() ) + throw new IllegalArgumentException( "missing value in '" + part + "'" ); + + // parse value string and convert it into binary value + Object val = FlatLaf.parseDefaultsValue( key, value ); + Object oldValue = applyProperty.apply( key, val ); + + // remember previous value + if( oldValues == null ) + oldValues = new HashMap<>(); + oldValues.put( key, oldValue ); + } + + return oldValues; + } + + public static boolean hasStyle( JComponent c ) { + return getStyle( c ) != null; + } + + public static String getStyle( JComponent c ) { + return toString( c.getClientProperty( FlatClientProperties.COMPONENT_STYLE ) ); + } + + static String toString( Object style ) { + return (style instanceof String) ? (String) style : null; + } +} From 0830c78728c5e00ec299ffc5a9aa36c017f9d2fa Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 15 Jun 2021 19:44:55 +0200 Subject: [PATCH 02/60] Styling: support using simple references to UI defaults e.g. `mySlider.putClientProperty( "JComponent.style", "thumbColor: $TextField.background; thumbBorderColor: $Component.borderColor" );` --- .../com/formdev/flatlaf/ui/FlatStyleSupport.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 0c94dccf..6ae189e4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.function.BiFunction; import javax.swing.JComponent; +import javax.swing.UIManager; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.StringUtils; @@ -45,6 +46,7 @@ public class FlatStyleSupport * the function must return the old value * @return map of old values modified by the given style, or {@code null} * @throws IllegalArgumentException on syntax errors + * @throws ClassCastException if value type does not fit to expected type  */ public static Map parse( Map oldStyleValues, String style, BiFunction applyProperty ) throws IllegalArgumentException @@ -82,8 +84,8 @@ public class FlatStyleSupport throw new IllegalArgumentException( "missing value in '" + part + "'" ); // parse value string and convert it into binary value - Object val = FlatLaf.parseDefaultsValue( key, value ); - Object oldValue = applyProperty.apply( key, val ); + Object newValue = parseValue( key, value ); + Object oldValue = applyProperty.apply( key, newValue ); // remember previous value if( oldValues == null ) @@ -94,6 +96,13 @@ public class FlatStyleSupport return oldValues; } + private static Object parseValue( String key, String value ) { + if( value.startsWith( "$" ) ) + return UIManager.get( value.substring( 1 ) ); + + return FlatLaf.parseDefaultsValue( key, value ); + } + public static boolean hasStyle( JComponent c ) { return getStyle( c ) != null; } From c99be13697ad5d3802079231dcf0df3d73dd74ff Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 15 Jun 2021 23:23:11 +0200 Subject: [PATCH 03/60] Styling: support using `java.util.Map` as style e.g. `mySlider.putClientProperty( "JComponent.style", Collections.singletonMap( "thumbSize", new Dimension( 8, 24 ) ) );` --- .../formdev/flatlaf/FlatClientProperties.java | 2 +- .../com/formdev/flatlaf/ui/FlatSliderUI.java | 6 +- .../formdev/flatlaf/ui/FlatStyleSupport.java | 77 ++++++++++++++----- 3 files changed, 61 insertions(+), 24 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index 5318773d..67728871 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -130,7 +130,7 @@ public interface FlatClientProperties * Specifies the style of a component in CSS syntax ("key1: value1; key2: value2; ..."). *

* Components {@link javax.swing.JComponent}
- * Value type {@link java.lang.String}
+ * Value type {@link java.lang.String} or {@link java.util.Map}<String, Object>
* * @since TODO */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index 2c0b31ba..8bf7ea23 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -190,7 +190,7 @@ public class FlatSliderUI switch( e.getPropertyName() ) { case FlatClientProperties.COMPONENT_STYLE: - applyStyle( FlatStyleSupport.toString( e.getNewValue() ) ); + applyStyle( e.getNewValue() ); slider.revalidate(); slider.repaint(); break; @@ -201,8 +201,8 @@ public class FlatSliderUI /** * @since TODO */ - protected void applyStyle( String style ) { - oldStyleValues = FlatStyleSupport.parse( oldStyleValues, style, this::applyStyleProperty ); + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 6ae189e4..95af2920 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -17,8 +17,8 @@ package com.formdev.flatlaf.ui; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; -import java.util.Map.Entry; import java.util.function.BiFunction; import javax.swing.JComponent; import javax.swing.UIManager; @@ -40,7 +40,7 @@ public class FlatStyleSupport * to apply the properties. * * @param oldStyleValues map of old values modified by the previous invocation, or {@code null} - * @param style the style in CSS syntax + * @param style the style in CSS syntax as string, or a Map, or {@code null} * @param applyProperty function that is invoked to apply the properties; * first parameter is the key, second the binary value; * the function must return the old value @@ -48,20 +48,67 @@ public class FlatStyleSupport * @throws IllegalArgumentException on syntax errors * @throws ClassCastException if value type does not fit to expected type  */ - public static Map parse( Map oldStyleValues, - String style, BiFunction applyProperty ) throws IllegalArgumentException + public static Map parseAndApply( Map oldStyleValues, + Object style, BiFunction applyProperty ) throws IllegalArgumentException { // restore previous values if( oldStyleValues != null ) { - for( Entry e : oldStyleValues.entrySet() ) + for( Map.Entry e : oldStyleValues.entrySet() ) applyProperty.apply( e.getKey(), e.getValue() ); } // ignore empty style + if( style == null ) + return null; + + if( style instanceof String ) { + // handle style in CSS syntax + String str = (String) style; + if( str.trim().isEmpty() ) + return null; + + return applyStyle( parse( str ), applyProperty ); + } else if( style instanceof Map ) { + // handle style of type Map + @SuppressWarnings( "unchecked" ) + Map map = (Map) style; + return applyStyle( map, applyProperty ); + } else + return null; + } + + private static Map applyStyle( Map style, + BiFunction applyProperty ) + { + if( style.isEmpty() ) + return null; + + Map oldValues = new HashMap<>(); + for( Map.Entry e : style.entrySet() ) { + String key = e.getKey(); + Object newValue = e.getValue(); + + Object oldValue = applyProperty.apply( key, newValue ); + oldValues.put( key, oldValue ); + } + return oldValues; + } + + /** + * Parses styles in CSS syntax ("key1: value1; key2: value2; ..."), + * converts the value strings into binary and returns all key/value pairs as map. + * + * @param style the style in CSS syntax, or {@code null} + * @return map of parsed styles, or {@code null} + * @throws IllegalArgumentException on syntax errors + */ + public static Map parse( String style ) + throws IllegalArgumentException + { if( style == null || style.trim().isEmpty() ) return null; - Map oldValues = null; + Map map = new LinkedHashMap<>(); // split style into parts and process them for( String part : StringUtils.split( style, ';' ) ) { @@ -84,16 +131,10 @@ public class FlatStyleSupport throw new IllegalArgumentException( "missing value in '" + part + "'" ); // parse value string and convert it into binary value - Object newValue = parseValue( key, value ); - Object oldValue = applyProperty.apply( key, newValue ); - - // remember previous value - if( oldValues == null ) - oldValues = new HashMap<>(); - oldValues.put( key, oldValue ); + map.put( key, parseValue( key, value ) ); } - return oldValues; + return map; } private static Object parseValue( String key, String value ) { @@ -107,11 +148,7 @@ public class FlatStyleSupport return getStyle( c ) != null; } - public static String getStyle( JComponent c ) { - return toString( c.getClientProperty( FlatClientProperties.COMPONENT_STYLE ) ); - } - - static String toString( Object style ) { - return (style instanceof String) ? (String) style : null; + public static Object getStyle( JComponent c ) { + return c.getClientProperty( FlatClientProperties.COMPONENT_STYLE ); } } From db56486506d600faad3d3d0c43ae99eead5ab36a Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 16 Jun 2021 12:07:13 +0200 Subject: [PATCH 04/60] Styling: support CheckBox and RadioButton (without icons) --- .../formdev/flatlaf/ui/FlatCheckBoxUI.java | 11 ++- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 96 ++++++++++++++++++- .../formdev/flatlaf/ui/FlatStyleSupport.java | 8 +- .../com/formdev/flatlaf/ui/FlatUIUtils.java | 8 ++ 4 files changed, 116 insertions(+), 7 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java index e545fa66..4153d5ff 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java @@ -43,7 +43,16 @@ public class FlatCheckBoxUI extends FlatRadioButtonUI { public static ComponentUI createUI( JComponent c ) { - return FlatUIUtils.createSharedUI( FlatCheckBoxUI.class, FlatCheckBoxUI::new ); + return FlatUIUtils.canUseSharedUI( c ) + ? FlatUIUtils.createSharedUI( FlatCheckBoxUI.class, () -> new FlatCheckBoxUI( true ) ) + : new FlatCheckBoxUI( false ); + } + + /** + * @since TODO + */ + protected FlatCheckBoxUI( boolean shared ) { + super( shared ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 56450014..880d904e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -23,6 +23,8 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.Rectangle; +import java.beans.PropertyChangeEvent; +import java.util.Map; import java.util.Objects; import javax.swing.AbstractButton; import javax.swing.CellRendererPane; @@ -30,7 +32,9 @@ import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicButtonListener; import javax.swing.plaf.basic.BasicRadioButtonUI; +import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.icons.FlatCheckBoxIcon; import com.formdev.flatlaf.util.UIScale; @@ -62,10 +66,28 @@ public class FlatRadioButtonUI private Color defaultBackground; + private final boolean shared; private boolean defaults_initialized = false; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { - return FlatUIUtils.createSharedUI( FlatRadioButtonUI.class, FlatRadioButtonUI::new ); + return FlatUIUtils.canUseSharedUI( c ) + ? FlatUIUtils.createSharedUI( FlatRadioButtonUI.class, () -> new FlatRadioButtonUI( true ) ) + : new FlatRadioButtonUI( false ); + } + + /** + * @since TODO + */ + protected FlatRadioButtonUI( boolean shared ) { + this.shared = shared; + } + + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); } @Override @@ -97,6 +119,56 @@ public class FlatRadioButtonUI defaults_initialized = false; } + @Override + protected BasicButtonListener createButtonListener( AbstractButton b ) { + return new FlatRadioButtonListener( b ); + } + + /** + * @since TODO + */ + protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) { + switch( e.getPropertyName() ) { + case FlatClientProperties.COMPONENT_STYLE: + applyStyle( b, this, e.getNewValue() ); + break; + } + } + + private static void applyStyle( AbstractButton b, FlatRadioButtonUI ui, Object style ) { + // unshare component UI if necessary + if( style != null && ui.shared ) { + b.updateUI(); + ui = (FlatRadioButtonUI) b.getUI(); + } + + ui.applyStyle( style ); + b.revalidate(); + b.repaint(); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + Object oldValue; + switch( key ) { + case "disabledText": oldValue = disabledText; disabledText = (Color) value; break; + + //TODO style icon + + default: throw new IllegalArgumentException( "unknown style '" + key + "'" ); + } + return oldValue; + } + private static Insets tempInsets = new Insets( 0, 0, 0, 0 ); @Override @@ -182,4 +254,26 @@ public class FlatRadioButtonUI ? UIScale.scale( ((FlatCheckBoxIcon)getDefaultIcon()).focusWidth ) : 0; } + + //---- class FlatRadioButtonListener -------------------------------------- + + /** + * @since TODO + */ + protected class FlatRadioButtonListener + extends BasicButtonListener + { + private final AbstractButton b; + + protected FlatRadioButtonListener( AbstractButton b ) { + super( b ); + this.b = b; + } + + @Override + public void propertyChange( PropertyChangeEvent e ) { + super.propertyChange( e ); + FlatRadioButtonUI.this.propertyChange( b, e ); + } + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 95af2920..efb7853a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -108,7 +108,7 @@ public class FlatStyleSupport if( style == null || style.trim().isEmpty() ) return null; - Map map = new LinkedHashMap<>(); + Map map = null; // split style into parts and process them for( String part : StringUtils.split( style, ';' ) ) { @@ -131,6 +131,8 @@ public class FlatStyleSupport throw new IllegalArgumentException( "missing value in '" + part + "'" ); // parse value string and convert it into binary value + if( map == null ) + map = new LinkedHashMap<>(); map.put( key, parseValue( key, value ) ); } @@ -144,10 +146,6 @@ public class FlatStyleSupport return FlatLaf.parseDefaultsValue( key, value ); } - public static boolean hasStyle( JComponent c ) { - return getStyle( c ) != null; - } - public static Object getStyle( JComponent c ) { return c.getClientProperty( FlatClientProperties.COMPONENT_STYLE ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java index 8acbdc1e..4e3cf598 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java @@ -831,6 +831,14 @@ debug*/ .computeIfAbsent( key, k -> newInstanceSupplier.get() ); } + /** + * Returns whether the component UI for the given component can be shared + * with other components. This is only possible if it does not have styles. + */ + public static boolean canUseSharedUI( JComponent c ) { + return FlatStyleSupport.getStyle( c ) == null; + } + //---- class RepaintFocusListener ----------------------------------------- public static class RepaintFocusListener From e0bc93371e4b8b824c4e8e5ecf0a9daf5ac0a72d Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 16 Jun 2021 21:21:33 +0200 Subject: [PATCH 05/60] Styling: use annotation on fields to apply style properties (to avoid boilerplate code) --- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 13 ++-- .../com/formdev/flatlaf/ui/FlatSliderUI.java | 54 +++++---------- .../formdev/flatlaf/ui/FlatStyleSupport.java | 69 +++++++++++++++++++ 3 files changed, 90 insertions(+), 46 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 880d904e..60f9cdaf 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -36,6 +36,7 @@ import javax.swing.plaf.basic.BasicButtonListener; import javax.swing.plaf.basic.BasicRadioButtonUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.icons.FlatCheckBoxIcon; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.UIScale; /** @@ -62,7 +63,7 @@ public class FlatRadioButtonUI extends BasicRadioButtonUI { protected int iconTextGap; - protected Color disabledText; + @Styleable protected Color disabledText; private Color defaultBackground; @@ -158,15 +159,9 @@ public class FlatRadioButtonUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - Object oldValue; - switch( key ) { - case "disabledText": oldValue = disabledText; disabledText = (Color) value; break; + //TODO style icon - //TODO style icon - - default: throw new IllegalArgumentException( "unknown style '" + key + "'" ); - } - return oldValue; + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } private static Insets tempInsets = new Insets( 0, 0, 0, 0 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index 8bf7ea23..82005439 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -37,6 +37,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSliderUI; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -78,23 +79,23 @@ import com.formdev.flatlaf.util.UIScale; public class FlatSliderUI extends BasicSliderUI { - protected int trackWidth; - protected Dimension thumbSize; - protected int focusWidth; + @Styleable protected int trackWidth; + @Styleable protected Dimension thumbSize; + @Styleable protected int focusWidth; - protected Color trackValueColor; - protected Color trackColor; - protected Color thumbColor; - protected Color thumbBorderColor; + @Styleable protected Color trackValueColor; + @Styleable protected Color trackColor; + @Styleable protected Color thumbColor; + @Styleable protected Color thumbBorderColor; protected Color focusBaseColor; - protected Color focusedColor; - protected Color focusedThumbBorderColor; - protected Color hoverThumbColor; - protected Color pressedThumbColor; - protected Color disabledTrackColor; - protected Color disabledThumbColor; - protected Color disabledThumbBorderColor; - protected Color tickColor; + @Styleable protected Color focusedColor; + @Styleable protected Color focusedThumbBorderColor; + @Styleable protected Color hoverThumbColor; + @Styleable protected Color pressedThumbColor; + @Styleable protected Color disabledTrackColor; + @Styleable protected Color disabledThumbColor; + @Styleable protected Color disabledThumbBorderColor; + @Styleable protected Color tickColor; private Color defaultBackground; private Color defaultForeground; @@ -209,28 +210,7 @@ public class FlatSliderUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - Object oldValue; - switch( key ) { - case "trackWidth": oldValue = trackWidth; trackWidth = (int) value; break; - case "thumbSize": oldValue = thumbSize; thumbSize = (Dimension) value; break; - case "focusWidth": oldValue = focusWidth; focusWidth = (int) value; break; - - case "trackValueColor": oldValue = trackValueColor; trackValueColor = (Color) value; break; - case "trackColor": oldValue = trackColor; trackColor = (Color) value; break; - case "thumbColor": oldValue = thumbColor; thumbColor = (Color) value; break; - case "thumbBorderColor": oldValue = thumbBorderColor; thumbBorderColor = (Color) value; break; - case "focusedColor": oldValue = focusedColor; focusedColor = (Color) value; break; - case "focusedThumbBorderColor": oldValue = focusedThumbBorderColor; focusedThumbBorderColor = (Color) value; break; - case "hoverThumbColor": oldValue = hoverThumbColor; hoverThumbColor = (Color) value; break; - case "pressedThumbColor": oldValue = pressedThumbColor; pressedThumbColor = (Color) value; break; - case "disabledTrackColor": oldValue = disabledTrackColor; disabledTrackColor = (Color) value; break; - case "disabledThumbColor": oldValue = disabledThumbColor; disabledThumbColor = (Color) value; break; - case "disabledThumbBorderColor": oldValue = disabledThumbBorderColor; disabledThumbBorderColor = (Color) value; break; - case "tickColor": oldValue = tickColor; tickColor = (Color) value; break; - - default: throw new IllegalArgumentException( "unknown style '" + key + "'" ); - } - return oldValue; + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index efb7853a..f86974ab 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -16,6 +16,12 @@ package com.formdev.flatlaf.ui; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -34,6 +40,16 @@ import com.formdev.flatlaf.util.StringUtils; */ public class FlatStyleSupport { + /** + * Indicates that a field is intended to be used by FlatLaf styling support. + *

+ * Do not rename fields annotated with this annotation. + */ + @Target(ElementType.FIELD) + @Retention(RetentionPolicy.RUNTIME) + public @interface Styleable { + } + /** * Parses styles in CSS syntax ("key1: value1; key2: value2; ..."), * converts the value strings into binary and invokes the given function @@ -146,6 +162,59 @@ public class FlatStyleSupport return FlatLaf.parseDefaultsValue( key, value ); } + /** + * Applies the given value to an annotated field of the given object. + * The field must be annotated with {@link Styleable}. + * + * @param object the object + * @param key the name of the field + * @param value the new value + * @return the old value of the field + * @throws IllegalArgumentException if object does not have a annotated field with given name + * or if value type does not fit to expected type  + */ + public static Object applyToAnnotatedObject( Object obj, String key, Object value ) + throws IllegalArgumentException + { + Class cls = obj.getClass(); + + for(;;) { + try { + Field f = cls.getDeclaredField( key ); + if( f.isAnnotationPresent( Styleable.class ) ) { + if( Modifier.isFinal( f.getModifiers() ) ) + throw new IllegalArgumentException( "field '" + cls.getName() + "." + key + "' is final" ); + + try { + // necessary to access protected fields in other packages + f.setAccessible( true ); + + // get old value and set new value + Object oldValue = f.get( obj ); + f.set( obj, value ); + return oldValue; + } catch( IllegalAccessException ex ) { + throw new IllegalArgumentException( "failed to access field '" + cls.getName() + "." + key + "'" ); + } + } + } catch( NoSuchFieldException ex ) { + // field not found in class --> try superclass + } + + cls = cls.getSuperclass(); + if( cls == null ) + throw newUnknownStyleException( key ); + + String superclassName = cls.getName(); + if( superclassName.startsWith( "java." ) || superclassName.startsWith( "javax." ) ) + throw newUnknownStyleException( key ); + } + } + + public static IllegalArgumentException newUnknownStyleException( String key ) { + return new IllegalArgumentException( "unknown style '" + key + "'" ); + } + public static Object getStyle( JComponent c ) { return c.getClientProperty( FlatClientProperties.COMPONENT_STYLE ); } From 7eb642dd13d394750f466ad78dfe69f0fae2ea88 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 16 Jun 2021 21:23:57 +0200 Subject: [PATCH 06/60] Styling: added simple unit tests --- flatlaf-core/build.gradle.kts | 9 ++ .../formdev/flatlaf/ui/FlatStylingTests.java | 91 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java diff --git a/flatlaf-core/build.gradle.kts b/flatlaf-core/build.gradle.kts index 01f7576c..19db78cc 100644 --- a/flatlaf-core/build.gradle.kts +++ b/flatlaf-core/build.gradle.kts @@ -21,6 +21,11 @@ plugins { `flatlaf-publish` } +dependencies { + testImplementation( "org.junit.jupiter:junit-jupiter-api:5.7.2" ) + testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) +} + java { withSourcesJar() withJavadocJar() @@ -52,6 +57,10 @@ tasks { named( "javadocJar" ) { archiveBaseName.set( "flatlaf" ) } + + test { + useJUnitPlatform() + } } flatlafPublish { diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java new file mode 100644 index 00000000..8f232bf4 --- /dev/null +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -0,0 +1,91 @@ +/* + * Copyright 2021 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 + * + * https://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 org.junit.jupiter.api.Assertions.assertEquals; +import java.awt.Color; +import java.util.HashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; + +/** + * @author Karl Tauber + */ +public class FlatStylingTests +{ + @Test + void parse() { + assertEquals( null, FlatStyleSupport.parse( null ) ); + assertEquals( null, FlatStyleSupport.parse( "" ) ); + assertEquals( null, FlatStyleSupport.parse( " " ) ); + assertEquals( null, FlatStyleSupport.parse( ";" ) ); + assertEquals( null, FlatStyleSupport.parse( " ; ; " ) ); + + assertEquals( + expectedMap( "background", Color.WHITE ), + FlatStyleSupport.parse( "background: #fff" ) ); + assertEquals( + expectedMap( "background", Color.WHITE, "foreground", Color.BLACK ), + FlatStyleSupport.parse( "background: #fff; foreground: #000" ) ); + assertEquals( + expectedMap( "background", Color.WHITE, "foreground", Color.BLACK, "someWidth", 20 ), + FlatStyleSupport.parse( "background: #fff; foreground: #000; someWidth: 20" ) ); + } + + private Map expectedMap( Object... keyValuePairs ) { + Map map = new HashMap<>(); + for( int i = 0; i < keyValuePairs.length; i += 2 ) + map.put( keyValuePairs[i], keyValuePairs[i+1] ); + return map; + } + + @Test + void checkbox() { + FlatCheckBoxUI ui = new FlatCheckBoxUI( false ); + + ui.applyStyle( "disabledText: #fff" ); + } + + @Test + void radiobutton() { + FlatRadioButtonUI ui = new FlatRadioButtonUI( false ); + + ui.applyStyle( "disabledText: #fff" ); + } + + @Test + void slider() { + FlatSliderUI ui = new FlatSliderUI(); + + ui.applyStyle( "trackWidth: 2" ); + ui.applyStyle( "thumbSize: 12,12" ); + ui.applyStyle( "focusWidth: 4" ); + + ui.applyStyle( "trackValueColor: #fff" ); + ui.applyStyle( "trackColor: #fff" ); + ui.applyStyle( "thumbColor: #fff" ); + ui.applyStyle( "thumbBorderColor: #fff" ); + ui.applyStyle( "focusedColor: #fff" ); + ui.applyStyle( "focusedThumbBorderColor: #fff" ); + ui.applyStyle( "hoverThumbColor: #fff" ); + ui.applyStyle( "pressedThumbColor: #fff" ); + ui.applyStyle( "disabledTrackColor: #fff" ); + ui.applyStyle( "disabledThumbColor: #fff" ); + ui.applyStyle( "disabledThumbBorderColor: #fff" ); + ui.applyStyle( "tickColor: #fff" ); + } +} From a983edde1e9bcf0a7084e7a1d661487da1eb2e11 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 16 Jun 2021 22:31:56 +0200 Subject: [PATCH 07/60] Styling: support CheckBox and RadioButton icons --- .../flatlaf/icons/FlatCheckBoxIcon.java | 51 +++++--- .../flatlaf/icons/FlatRadioButtonIcon.java | 3 +- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 21 ++- .../formdev/flatlaf/ui/FlatStylingTests.java | 122 +++++++++++++++++- 4 files changed, 169 insertions(+), 28 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java index c74c6976..41106a9b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java @@ -27,6 +27,8 @@ import javax.swing.AbstractButton; import javax.swing.JComponent; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; +import com.formdev.flatlaf.ui.FlatStyleSupport; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -67,39 +69,39 @@ public class FlatCheckBoxIcon extends FlatAbstractIcon { protected final String style = UIManager.getString( "CheckBox.icon.style" ); - public final int focusWidth = getUIInt( "CheckBox.icon.focusWidth", + @Styleable public int focusWidth = getUIInt( "CheckBox.icon.focusWidth", UIManager.getInt( "Component.focusWidth" ), style ); - protected final Color focusColor = FlatUIUtils.getUIColor( "CheckBox.icon.focusColor", + @Styleable protected Color focusColor = FlatUIUtils.getUIColor( "CheckBox.icon.focusColor", UIManager.getColor( "Component.focusColor" ) ); - protected final int arc = FlatUIUtils.getUIInt( "CheckBox.arc", 2 ); + @Styleable protected int arc = FlatUIUtils.getUIInt( "CheckBox.arc", 2 ); // enabled - protected final Color borderColor = getUIColor( "CheckBox.icon.borderColor", style ); - protected final Color background = getUIColor( "CheckBox.icon.background", style ); - protected final Color selectedBorderColor = getUIColor( "CheckBox.icon.selectedBorderColor", style ); - protected final Color selectedBackground = getUIColor( "CheckBox.icon.selectedBackground", style ); - protected final Color checkmarkColor = getUIColor( "CheckBox.icon.checkmarkColor", style ); + @Styleable protected Color borderColor = getUIColor( "CheckBox.icon.borderColor", style ); + @Styleable protected Color background = getUIColor( "CheckBox.icon.background", style ); + @Styleable protected Color selectedBorderColor = getUIColor( "CheckBox.icon.selectedBorderColor", style ); + @Styleable protected Color selectedBackground = getUIColor( "CheckBox.icon.selectedBackground", style ); + @Styleable protected Color checkmarkColor = getUIColor( "CheckBox.icon.checkmarkColor", style ); // disabled - protected final Color disabledBorderColor = getUIColor( "CheckBox.icon.disabledBorderColor", style ); - protected final Color disabledBackground = getUIColor( "CheckBox.icon.disabledBackground", style ); - protected final Color disabledCheckmarkColor = getUIColor( "CheckBox.icon.disabledCheckmarkColor", style ); + @Styleable protected Color disabledBorderColor = getUIColor( "CheckBox.icon.disabledBorderColor", style ); + @Styleable protected Color disabledBackground = getUIColor( "CheckBox.icon.disabledBackground", style ); + @Styleable protected Color disabledCheckmarkColor = getUIColor( "CheckBox.icon.disabledCheckmarkColor", style ); // focused - protected final Color focusedBorderColor = getUIColor( "CheckBox.icon.focusedBorderColor", style ); - protected final Color focusedBackground = getUIColor( "CheckBox.icon.focusedBackground", style ); - protected final Color selectedFocusedBorderColor = getUIColor( "CheckBox.icon.selectedFocusedBorderColor", style ); - protected final Color selectedFocusedBackground = getUIColor( "CheckBox.icon.selectedFocusedBackground", style ); - protected final Color selectedFocusedCheckmarkColor = getUIColor( "CheckBox.icon.selectedFocusedCheckmarkColor", style ); + @Styleable protected Color focusedBorderColor = getUIColor( "CheckBox.icon.focusedBorderColor", style ); + @Styleable protected Color focusedBackground = getUIColor( "CheckBox.icon.focusedBackground", style ); + @Styleable protected Color selectedFocusedBorderColor = getUIColor( "CheckBox.icon.selectedFocusedBorderColor", style ); + @Styleable protected Color selectedFocusedBackground = getUIColor( "CheckBox.icon.selectedFocusedBackground", style ); + @Styleable protected Color selectedFocusedCheckmarkColor = getUIColor( "CheckBox.icon.selectedFocusedCheckmarkColor", style ); // hover - protected final Color hoverBorderColor = getUIColor( "CheckBox.icon.hoverBorderColor", style ); - protected final Color hoverBackground = getUIColor( "CheckBox.icon.hoverBackground", style ); - protected final Color selectedHoverBackground = getUIColor( "CheckBox.icon.selectedHoverBackground", style ); + @Styleable protected Color hoverBorderColor = getUIColor( "CheckBox.icon.hoverBorderColor", style ); + @Styleable protected Color hoverBackground = getUIColor( "CheckBox.icon.hoverBackground", style ); + @Styleable protected Color selectedHoverBackground = getUIColor( "CheckBox.icon.selectedHoverBackground", style ); // pressed - protected final Color pressedBackground = getUIColor( "CheckBox.icon.pressedBackground", style ); - protected final Color selectedPressedBackground = getUIColor( "CheckBox.icon.selectedPressedBackground", style ); + @Styleable protected Color pressedBackground = getUIColor( "CheckBox.icon.pressedBackground", style ); + @Styleable protected Color selectedPressedBackground = getUIColor( "CheckBox.icon.selectedPressedBackground", style ); protected static Color getUIColor( String key, String style ) { if( style != null ) { @@ -129,6 +131,13 @@ public class FlatCheckBoxIcon super( ICON_SIZE, ICON_SIZE, null ); } + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override protected void paintIcon( Component c, Graphics2D g ) { boolean indeterminate = isIndeterminate( c ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatRadioButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatRadioButtonIcon.java index 06095b0f..c26b1de6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatRadioButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatRadioButtonIcon.java @@ -19,6 +19,7 @@ package com.formdev.flatlaf.icons; import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Icon for {@link javax.swing.JRadioButton}. @@ -34,7 +35,7 @@ import java.awt.geom.Ellipse2D; public class FlatRadioButtonIcon extends FlatCheckBoxIcon { - protected final int centerDiameter = getUIInt( "RadioButton.icon.centerDiameter", 8, style ); + @Styleable protected int centerDiameter = getUIInt( "RadioButton.icon.centerDiameter", 8, style ); @Override protected void paintFocusBorder( Component c, Graphics2D g ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 60f9cdaf..27da0e49 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -68,6 +68,7 @@ public class FlatRadioButtonUI private Color defaultBackground; private final boolean shared; + private boolean iconShared; private boolean defaults_initialized = false; private Map oldStyleValues; @@ -82,6 +83,7 @@ public class FlatRadioButtonUI */ protected FlatRadioButtonUI( boolean shared ) { this.shared = shared; + iconShared = true; } @Override @@ -159,7 +161,24 @@ public class FlatRadioButtonUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - //TODO style icon + // style icon + if( key.startsWith( "icon." ) ) { + key = key.substring( "icon.".length() ); + + if( !(icon instanceof FlatCheckBoxIcon) ) + return null; + + if( iconShared ) { + try { + icon = icon.getClass().getDeclaredConstructor().newInstance(); + } catch( Exception ex ) { + throw new IllegalArgumentException( "failed to clone icon '" + icon.getClass().getName() + "'" ); + } + iconShared = false; + } + + return ((FlatCheckBoxIcon)icon).applyStyleProperty( key, value ); + } return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 8f232bf4..28e979b4 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -17,16 +17,28 @@ package com.formdev.flatlaf.ui; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.awt.Color; import java.util.HashMap; import java.util.Map; +import javax.swing.JCheckBox; +import javax.swing.JRadioButton; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import com.formdev.flatlaf.FlatLightLaf; +import com.formdev.flatlaf.icons.FlatCheckBoxIcon; +import com.formdev.flatlaf.icons.FlatRadioButtonIcon; /** * @author Karl Tauber */ public class FlatStylingTests { + @BeforeAll + static void setup() { + FlatLightLaf.setup(); + } + @Test void parse() { assertEquals( null, FlatStyleSupport.parse( null ) ); @@ -53,18 +65,65 @@ public class FlatStylingTests return map; } - @Test - void checkbox() { - FlatCheckBoxUI ui = new FlatCheckBoxUI( false ); + //---- components --------------------------------------------------------- - ui.applyStyle( "disabledText: #fff" ); + @Test + void checkBox() { + FlatCheckBoxUI ui = new FlatCheckBoxUI( false ); + ui.installDefaults( new JCheckBox() ); // assign icon + assertTrue( ui.getDefaultIcon() instanceof FlatCheckBoxIcon ); + + // FlatCheckBoxUI extends FlatRadioButtonUI + radioButton( ui ); } @Test - void radiobutton() { + void radioButton() { FlatRadioButtonUI ui = new FlatRadioButtonUI( false ); + ui.installDefaults( new JRadioButton() ); // assign icon + assertTrue( ui.getDefaultIcon() instanceof FlatRadioButtonIcon ); + radioButton( ui ); + + ui.applyStyle( "icon.centerDiameter: 8" ); + } + + private void radioButton( FlatRadioButtonUI ui ) { ui.applyStyle( "disabledText: #fff" ); + + //---- icon ---- + + ui.applyStyle( "icon.focusWidth: 2" ); + ui.applyStyle( "icon.focusColor: #fff" ); + ui.applyStyle( "icon.arc: 5" ); + + // enabled + ui.applyStyle( "icon.borderColor: #fff" ); + ui.applyStyle( "icon.background: #fff" ); + ui.applyStyle( "icon.selectedBorderColor: #fff" ); + ui.applyStyle( "icon.selectedBackground: #fff" ); + ui.applyStyle( "icon.checkmarkColor: #fff" ); + + // disabled + ui.applyStyle( "icon.disabledBorderColor: #fff" ); + ui.applyStyle( "icon.disabledBackground: #fff" ); + ui.applyStyle( "icon.disabledCheckmarkColor: #fff" ); + + // focused + ui.applyStyle( "icon.focusedBorderColor: #fff" ); + ui.applyStyle( "icon.focusedBackground: #fff" ); + ui.applyStyle( "icon.selectedFocusedBorderColor: #fff" ); + ui.applyStyle( "icon.selectedFocusedBackground: #fff" ); + ui.applyStyle( "icon.selectedFocusedCheckmarkColor: #fff" ); + + // hover + ui.applyStyle( "icon.hoverBorderColor: #fff" ); + ui.applyStyle( "icon.hoverBackground: #fff" ); + ui.applyStyle( "icon.selectedHoverBackground: #fff" ); + + // pressed + ui.applyStyle( "icon.pressedBackground: #fff" ); + ui.applyStyle( "icon.selectedPressedBackground: #fff" ); } @Test @@ -88,4 +147,57 @@ public class FlatStylingTests ui.applyStyle( "disabledThumbBorderColor: #fff" ); ui.applyStyle( "tickColor: #fff" ); } + + //---- icons -------------------------------------------------------------- + + @Test + void checkBoxIcon() { + FlatCheckBoxIcon icon = new FlatCheckBoxIcon(); + + checkBoxIcon( icon ); + } + + @Test + void radioButtonIcon() { + FlatRadioButtonIcon icon = new FlatRadioButtonIcon(); + + // FlatRadioButtonIcon extends FlatCheckBoxIcon + checkBoxIcon( icon ); + + icon.applyStyleProperty( "centerDiameter", 8 ); + } + + private void checkBoxIcon( FlatCheckBoxIcon icon ) { + icon.applyStyleProperty( "focusWidth", 2 ); + icon.applyStyleProperty( "focusColor", Color.WHITE ); + icon.applyStyleProperty( "arc", 5 ); + + // enabled + icon.applyStyleProperty( "borderColor", Color.WHITE ); + icon.applyStyleProperty( "background", Color.WHITE ); + icon.applyStyleProperty( "selectedBorderColor", Color.WHITE ); + icon.applyStyleProperty( "selectedBackground", Color.WHITE ); + icon.applyStyleProperty( "checkmarkColor", Color.WHITE ); + + // disabled + icon.applyStyleProperty( "disabledBorderColor", Color.WHITE ); + icon.applyStyleProperty( "disabledBackground", Color.WHITE ); + icon.applyStyleProperty( "disabledCheckmarkColor", Color.WHITE ); + + // focused + icon.applyStyleProperty( "focusedBorderColor", Color.WHITE ); + icon.applyStyleProperty( "focusedBackground", Color.WHITE ); + icon.applyStyleProperty( "selectedFocusedBorderColor", Color.WHITE ); + icon.applyStyleProperty( "selectedFocusedBackground", Color.WHITE ); + icon.applyStyleProperty( "selectedFocusedCheckmarkColor", Color.WHITE ); + + // hover + icon.applyStyleProperty( "hoverBorderColor", Color.WHITE ); + icon.applyStyleProperty( "hoverBackground", Color.WHITE ); + icon.applyStyleProperty( "selectedHoverBackground", Color.WHITE ); + + // pressed + icon.applyStyleProperty( "pressedBackground", Color.WHITE ); + icon.applyStyleProperty( "selectedPressedBackground", Color.WHITE ); + } } From 041fd0e0cd51c56b2aeee704cb8c68ec89ff4218 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 16 Jun 2021 22:57:56 +0200 Subject: [PATCH 08/60] Styling: fixed javadoc error --- .../src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index f86974ab..ab9440f6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -166,7 +166,7 @@ public class FlatStyleSupport * Applies the given value to an annotated field of the given object. * The field must be annotated with {@link Styleable}. * - * @param object the object + * @param obj the object * @param key the name of the field * @param value the new value * @return the old value of the field From b457fd634e0e13043cf25358120b77972b2406c8 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 16 Jun 2021 22:59:00 +0200 Subject: [PATCH 09/60] Styling: (try to) fix errors on GitHub Actions --- .../com/formdev/flatlaf/ui/FlatStylingTests.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 28e979b4..7f24d905 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -23,9 +23,8 @@ import java.util.HashMap; import java.util.Map; import javax.swing.JCheckBox; import javax.swing.JRadioButton; -import org.junit.jupiter.api.BeforeAll; +import javax.swing.UIManager; import org.junit.jupiter.api.Test; -import com.formdev.flatlaf.FlatLightLaf; import com.formdev.flatlaf.icons.FlatCheckBoxIcon; import com.formdev.flatlaf.icons.FlatRadioButtonIcon; @@ -34,11 +33,6 @@ import com.formdev.flatlaf.icons.FlatRadioButtonIcon; */ public class FlatStylingTests { - @BeforeAll - static void setup() { - FlatLightLaf.setup(); - } - @Test void parse() { assertEquals( null, FlatStyleSupport.parse( null ) ); @@ -70,7 +64,10 @@ public class FlatStylingTests @Test void checkBox() { FlatCheckBoxUI ui = new FlatCheckBoxUI( false ); - ui.installDefaults( new JCheckBox() ); // assign icon + + // assign icon + UIManager.put( "CheckBox.icon", new FlatCheckBoxIcon() ); + ui.installDefaults( new JCheckBox() ); assertTrue( ui.getDefaultIcon() instanceof FlatCheckBoxIcon ); // FlatCheckBoxUI extends FlatRadioButtonUI @@ -80,6 +77,9 @@ public class FlatStylingTests @Test void radioButton() { FlatRadioButtonUI ui = new FlatRadioButtonUI( false ); + + // assign icon + UIManager.put( "RadioButton.icon", new FlatRadioButtonIcon() ); ui.installDefaults( new JRadioButton() ); // assign icon assertTrue( ui.getDefaultIcon() instanceof FlatRadioButtonIcon ); From 2542c8bd53fe2cc2f8a9dc39d325205abcda56af Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 17 Jun 2021 13:56:38 +0200 Subject: [PATCH 10/60] Styling: support ScrollBar --- .../formdev/flatlaf/ui/FlatArrowButton.java | 39 +++++--- .../formdev/flatlaf/ui/FlatScrollBarUI.java | 93 +++++++++++++++---- .../formdev/flatlaf/ui/FlatStylingTests.java | 30 ++++++ 3 files changed, 131 insertions(+), 31 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java index 132e670d..0d2564da 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java @@ -39,13 +39,13 @@ public class FlatArrowButton { public static final int DEFAULT_ARROW_WIDTH = 8; - protected final boolean chevron; - protected final Color foreground; - protected final Color disabledForeground; - protected final Color hoverForeground; - protected final Color hoverBackground; - protected final Color pressedForeground; - protected final Color pressedBackground; + protected boolean chevron; + protected Color foreground; + protected Color disabledForeground; + protected Color hoverForeground; + protected Color hoverBackground; + protected Color pressedForeground; + protected Color pressedBackground; private int arrowWidth = DEFAULT_ARROW_WIDTH; private int xOffset = 0; @@ -58,14 +58,8 @@ public class FlatArrowButton Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground ) { super( direction, Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE ); - - this.chevron = FlatUIUtils.isChevron( type ); - this.foreground = foreground; - this.disabledForeground = disabledForeground; - this.hoverForeground = hoverForeground; - this.hoverBackground = hoverBackground; - this.pressedForeground = pressedForeground; - this.pressedBackground = pressedBackground; + update( type, foreground, disabledForeground, hoverForeground, hoverBackground, + pressedForeground, pressedBackground ); setOpaque( false ); setBorder( null ); @@ -101,6 +95,21 @@ public class FlatArrowButton } } + /** + * @since TODO + */ + public void update( String type, Color foreground, Color disabledForeground, + Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground ) + { + this.chevron = FlatUIUtils.isChevron( type ); + this.foreground = foreground; + this.disabledForeground = disabledForeground; + this.hoverForeground = hoverForeground; + this.hoverBackground = hoverBackground; + this.pressedForeground = pressedForeground; + this.pressedBackground = pressedBackground; + } + public int getArrowWidth() { return arrowWidth; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index bdc1d925..4bd9c239 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -24,6 +24,7 @@ import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeListener; +import java.util.Map; import java.util.Objects; import javax.swing.InputMap; import javax.swing.JButton; @@ -35,6 +36,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicScrollBarUI; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.UIScale; /** @@ -75,32 +77,44 @@ import com.formdev.flatlaf.util.UIScale; public class FlatScrollBarUI extends BasicScrollBarUI { - protected Insets trackInsets; - protected Insets thumbInsets; - protected int trackArc; - protected int thumbArc; - protected Color hoverTrackColor; - protected Color hoverThumbColor; - protected boolean hoverThumbWithTrack; - protected Color pressedTrackColor; - protected Color pressedThumbColor; - protected boolean pressedThumbWithTrack; + // overrides BasicScrollBarUI.supportsAbsolutePositioning (which is private) + @Styleable protected boolean allowsAbsolutePositioning; - protected boolean showButtons; - protected String arrowType; - protected Color buttonArrowColor; - protected Color buttonDisabledArrowColor; - protected Color hoverButtonBackground; - protected Color pressedButtonBackground; + @Styleable protected Insets trackInsets; + @Styleable protected Insets thumbInsets; + @Styleable protected int trackArc; + @Styleable protected int thumbArc; + @Styleable protected Color hoverTrackColor; + @Styleable protected Color hoverThumbColor; + @Styleable protected boolean hoverThumbWithTrack; + @Styleable protected Color pressedTrackColor; + @Styleable protected Color pressedThumbColor; + @Styleable protected boolean pressedThumbWithTrack; + + @Styleable protected boolean showButtons; + @Styleable protected String arrowType; + @Styleable protected Color buttonArrowColor; + @Styleable protected Color buttonDisabledArrowColor; + @Styleable protected Color hoverButtonBackground; + @Styleable protected Color pressedButtonBackground; private MouseAdapter hoverListener; protected boolean hoverTrack; protected boolean hoverThumb; + private Map oldStyleValues; + public static ComponentUI createUI( JComponent c ) { return new FlatScrollBarUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installListeners() { super.installListeners(); @@ -123,6 +137,8 @@ public class FlatScrollBarUI protected void installDefaults() { super.installDefaults(); + allowsAbsolutePositioning = super.getSupportsAbsolutePositioning(); + trackInsets = UIManager.getInsets( "ScrollBar.trackInsets" ); thumbInsets = UIManager.getInsets( "ScrollBar.thumbInsets" ); trackArc = UIManager.getInt( "ScrollBar.trackArc" ); @@ -177,6 +193,12 @@ public class FlatScrollBarUI scrollbar.repaint(); break; + case FlatClientProperties.COMPONENT_STYLE: + applyStyle( e.getNewValue() ); + scrollbar.revalidate(); + scrollbar.repaint(); + break; + case "componentOrientation": // this is missing in BasicScrollBarUI.Handler.propertyChange() InputMap inputMap = (InputMap) UIManager.get( "ScrollBar.ancestorInputMap" ); @@ -193,6 +215,35 @@ public class FlatScrollBarUI }; } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + if( incrButton instanceof FlatScrollBarButton ) + ((FlatScrollBarButton)incrButton).update(); + if( decrButton instanceof FlatScrollBarButton ) + ((FlatScrollBarButton)decrButton).update(); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + Object oldValue; + switch( key ) { + // BasicScrollBarUI + case "track": oldValue = trackColor; trackColor = (Color) value; return oldValue; + case "thumb": oldValue = thumbColor; thumbColor = (Color) value; return oldValue; + case "width": oldValue = scrollBarWidth; scrollBarWidth = (int) value; return oldValue; + case "minimumThumbSize": oldValue = minimumThumbSize; minimumThumbSize = (Dimension) value; return oldValue; + case "maximumThumbSize": oldValue = maximumThumbSize; maximumThumbSize = (Dimension) value; return oldValue; + } + + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override public Dimension getPreferredSize( JComponent c ) { return UIScale.scale( super.getPreferredSize( c ) ); @@ -295,6 +346,11 @@ public class FlatScrollBarUI return UIScale.scale( FlatUIUtils.addInsets( super.getMaximumThumbSize(), thumbInsets ) ); } + @Override + public boolean getSupportsAbsolutePositioning() { + return allowsAbsolutePositioning; + } + //---- class ScrollBarHoverListener --------------------------------------- // using static field to disabling hover for other scroll bars @@ -368,6 +424,11 @@ public class FlatScrollBarUI setRequestFocusEnabled( false ); } + protected void update() { + update( arrowType, buttonArrowColor, buttonDisabledArrowColor, + null, hoverButtonBackground, null, pressedButtonBackground ); + } + @Override protected Color deriveBackground( Color background ) { return FlatUIUtils.deriveColor( background, scrollbar.getBackground() ); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 7f24d905..52f7889b 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -126,6 +126,36 @@ public class FlatStylingTests ui.applyStyle( "icon.selectedPressedBackground: #fff" ); } + @Test + void scrollBar() { + FlatScrollBarUI ui = new FlatScrollBarUI(); + + ui.applyStyle( "track: #fff" ); + ui.applyStyle( "thumb: #fff" ); + ui.applyStyle( "width: 10" ); + ui.applyStyle( "minimumThumbSize: 1,2" ); + ui.applyStyle( "maximumThumbSize: 1,2" ); + ui.applyStyle( "allowsAbsolutePositioning: true" ); + + ui.applyStyle( "trackInsets: 1,2,3,4" ); + ui.applyStyle( "thumbInsets: 1,2,3,4" ); + ui.applyStyle( "trackArc: 5" ); + ui.applyStyle( "thumbArc: 10" ); + ui.applyStyle( "hoverTrackColor: #fff" ); + ui.applyStyle( "hoverThumbColor: #fff" ); + ui.applyStyle( "hoverThumbWithTrack: true" ); + ui.applyStyle( "pressedTrackColor: #fff" ); + ui.applyStyle( "pressedThumbColor: #fff" ); + ui.applyStyle( "pressedThumbWithTrack: true" ); + + ui.applyStyle( "showButtons: true" ); + ui.applyStyle( "arrowType: chevron" ); + ui.applyStyle( "buttonArrowColor: #fff" ); + ui.applyStyle( "buttonDisabledArrowColor: #fff" ); + ui.applyStyle( "hoverButtonBackground: #fff" ); + ui.applyStyle( "pressedButtonBackground: #fff" ); + } + @Test void slider() { FlatSliderUI ui = new FlatSliderUI(); From f291cc2bd3ad71c7b0ebd7d84fc19047e0117a0e Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 17 Jun 2021 14:57:10 +0200 Subject: [PATCH 11/60] Styling: support ProgressBar --- .../formdev/flatlaf/ui/FlatProgressBarUI.java | 36 +++++++++++++++++-- .../formdev/flatlaf/ui/FlatStylingTests.java | 9 +++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java index dddc87b7..d3129f8b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java @@ -25,12 +25,14 @@ import java.awt.Insets; import java.awt.geom.Area; import java.awt.geom.RoundRectangle2D; import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.JComponent; import javax.swing.JProgressBar; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicProgressBarUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -59,16 +61,24 @@ import com.formdev.flatlaf.util.UIScale; public class FlatProgressBarUI extends BasicProgressBarUI { - protected int arc; - protected Dimension horizontalSize; - protected Dimension verticalSize; + @Styleable protected int arc; + @Styleable protected Dimension horizontalSize; + @Styleable protected Dimension verticalSize; private PropertyChangeListener propertyChangeListener; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatProgressBarUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( progressBar ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -91,6 +101,12 @@ public class FlatProgressBarUI progressBar.revalidate(); progressBar.repaint(); break; + + case COMPONENT_STYLE: + applyStyle( e.getNewValue() ); + progressBar.revalidate(); + progressBar.repaint(); + break; } }; progressBar.addPropertyChangeListener( propertyChangeListener ); @@ -104,6 +120,20 @@ public class FlatProgressBarUI propertyChangeListener = null; } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override public Dimension getPreferredSize( JComponent c ) { Dimension size = super.getPreferredSize( c ); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 52f7889b..4ca2ee6c 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -74,6 +74,15 @@ public class FlatStylingTests radioButton( ui ); } + @Test + void progressBar() { + FlatProgressBarUI ui = new FlatProgressBarUI(); + + ui.applyStyle( "arc: 5" ); + ui.applyStyle( "horizontalSize: 100,12" ); + ui.applyStyle( "verticalSize: 12,100" ); + } + @Test void radioButton() { FlatRadioButtonUI ui = new FlatRadioButtonUI( false ); From 50490ece8490ba0ea3f4718e8f7ff1dde3cf2b36 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 17 Jun 2021 15:21:19 +0200 Subject: [PATCH 12/60] Styling: support Separator and PopupMenu.Separator --- .../flatlaf/ui/FlatPopupMenuSeparatorUI.java | 11 ++- .../formdev/flatlaf/ui/FlatSeparatorUI.java | 85 +++++++++++++++++-- .../formdev/flatlaf/ui/FlatStylingTests.java | 21 +++++ 3 files changed, 110 insertions(+), 7 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java index a51fcd54..ab8d163f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java @@ -39,7 +39,16 @@ public class FlatPopupMenuSeparatorUI extends FlatSeparatorUI { public static ComponentUI createUI( JComponent c ) { - return FlatUIUtils.createSharedUI( FlatPopupMenuSeparatorUI.class, FlatPopupMenuSeparatorUI::new ); + return FlatUIUtils.canUseSharedUI( c ) + ? FlatUIUtils.createSharedUI( FlatPopupMenuSeparatorUI.class, () -> new FlatPopupMenuSeparatorUI( true ) ) + : new FlatPopupMenuSeparatorUI( false ); + } + + /** + * @since TODO + */ + protected FlatPopupMenuSeparatorUI( boolean shared ) { + super( shared ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index 7ace822b..a5cfb37f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -21,11 +21,15 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.JComponent; import javax.swing.JSeparator; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSeparatorUI; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JSeparator}. @@ -46,14 +50,37 @@ import javax.swing.plaf.basic.BasicSeparatorUI; public class FlatSeparatorUI extends BasicSeparatorUI { - protected int height; - protected int stripeWidth; - protected int stripeIndent; + @Styleable protected int height; + @Styleable protected int stripeWidth; + @Styleable protected int stripeIndent; + private final boolean shared; private boolean defaults_initialized = false; + private PropertyChangeListener propertyChangeListener; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { - return FlatUIUtils.createSharedUI( FlatSeparatorUI.class, FlatSeparatorUI::new ); + return FlatUIUtils.canUseSharedUI( c ) + ? FlatUIUtils.createSharedUI( FlatSeparatorUI.class, () -> new FlatSeparatorUI( true ) ) + : new FlatSeparatorUI( false ); + } + + /** + * @since TODO + */ + protected FlatSeparatorUI( boolean shared ) { + this.shared = shared; + } + + protected String getPropertyPrefix() { + return "Separator"; + } + + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); } @Override @@ -76,8 +103,54 @@ public class FlatSeparatorUI defaults_initialized = false; } - protected String getPropertyPrefix() { - return "Separator"; + @Override + protected void installListeners( JSeparator s ) { + super.installListeners( s ); + + propertyChangeListener = e -> { + switch( e.getPropertyName() ) { + case FlatClientProperties.COMPONENT_STYLE: + applyStyle( s, this, e.getNewValue() ); + s.revalidate(); + s.repaint(); + break; + } + }; + s.addPropertyChangeListener( propertyChangeListener ); + } + + @Override + protected void uninstallListeners( JSeparator s ) { + super.uninstallListeners( s ); + + s.removePropertyChangeListener( propertyChangeListener ); + propertyChangeListener = null; + } + + private static void applyStyle( JSeparator s, FlatSeparatorUI ui, Object style ) { + // unshare component UI if necessary + if( style != null && ui.shared ) { + s.updateUI(); + ui = (FlatSeparatorUI) s.getUI(); + } + + ui.applyStyle( style ); + s.revalidate(); + s.repaint(); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } @Override diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 4ca2ee6c..6178d518 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -74,6 +74,14 @@ public class FlatStylingTests radioButton( ui ); } + @Test + void popupMenuSeparator() { + FlatPopupMenuSeparatorUI ui = new FlatPopupMenuSeparatorUI( false ); + + // FlatPopupMenuSeparatorUI extends FlatSeparatorUI + separator( ui ); + } + @Test void progressBar() { FlatProgressBarUI ui = new FlatProgressBarUI(); @@ -165,6 +173,19 @@ public class FlatStylingTests ui.applyStyle( "pressedButtonBackground: #fff" ); } + @Test + void separator() { + FlatSeparatorUI ui = new FlatSeparatorUI( false ); + + separator( ui ); + } + + private void separator( FlatSeparatorUI ui ) { + ui.applyStyle( "height: 6" ); + ui.applyStyle( "stripeWidth: 2" ); + ui.applyStyle( "stripeIndent: 10" ); + } + @Test void slider() { FlatSliderUI ui = new FlatSliderUI(); From 1938cb586dda713679f5c297b88cee558e4e3a65 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 17 Jun 2021 20:59:09 +0200 Subject: [PATCH 13/60] Styling: support SplitPane --- .../formdev/flatlaf/ui/FlatSplitPaneUI.java | 99 +++++++++++++++++-- .../formdev/flatlaf/ui/FlatStyleSupport.java | 33 +++++-- .../formdev/flatlaf/ui/FlatStylingTests.java | 20 ++++ 3 files changed, 133 insertions(+), 19 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 16ec4eba..0395af4d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -23,6 +23,8 @@ import java.awt.Graphics; import java.awt.Insets; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JSplitPane; @@ -32,6 +34,9 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** @@ -67,15 +72,25 @@ import com.formdev.flatlaf.util.UIScale; public class FlatSplitPaneUI extends BasicSplitPaneUI { - protected String arrowType; - protected Color oneTouchArrowColor; - protected Color oneTouchHoverArrowColor; - protected Color oneTouchPressedArrowColor; + @Styleable protected String arrowType; + @Styleable protected Color oneTouchArrowColor; + @Styleable protected Color oneTouchHoverArrowColor; + @Styleable protected Color oneTouchPressedArrowColor; + + private PropertyChangeListener propertyChangeListener; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatSplitPaneUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( splitPane ) ); + } + @Override protected void installDefaults() { arrowType = UIManager.getString( "Component.arrowType" ); @@ -98,21 +113,68 @@ public class FlatSplitPaneUI oneTouchPressedArrowColor = null; } + @Override + protected void installListeners() { + super.installListeners(); + + propertyChangeListener = e -> { + switch( e.getPropertyName() ) { + case FlatClientProperties.COMPONENT_STYLE: + applyStyle( e.getNewValue() ); + splitPane.revalidate(); + splitPane.repaint(); + break; + } + }; + splitPane.addPropertyChangeListener( propertyChangeListener ); + } + + @Override + protected void uninstallListeners() { + super.uninstallListeners(); + + splitPane.removePropertyChangeListener( propertyChangeListener ); + propertyChangeListener = null; + } + @Override public BasicSplitPaneDivider createDefaultDivider() { return new FlatSplitPaneDivider( this ); } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + if( divider instanceof FlatSplitPaneDivider ) + ((FlatSplitPaneDivider)divider).updateButtons(); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + try { + if( divider instanceof FlatSplitPaneDivider ) + return ((FlatSplitPaneDivider)divider).applyStyleProperty( key, value ); + } catch( UnknownStyleException ex ) { + // ignore + } + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + //---- class FlatSplitPaneDivider ----------------------------------------- protected class FlatSplitPaneDivider extends BasicSplitPaneDivider { - protected final String style = UIManager.getString( "SplitPaneDivider.style" ); - protected final Color gripColor = UIManager.getColor( "SplitPaneDivider.gripColor" ); - protected final int gripDotCount = FlatUIUtils.getUIInt( "SplitPaneDivider.gripDotCount", 3 ); - protected final int gripDotSize = FlatUIUtils.getUIInt( "SplitPaneDivider.gripDotSize", 3 ); - protected final int gripGap = FlatUIUtils.getUIInt( "SplitPaneDivider.gripGap", 2 ); + @Styleable protected String style = UIManager.getString( "SplitPaneDivider.style" ); + @Styleable protected Color gripColor = UIManager.getColor( "SplitPaneDivider.gripColor" ); + @Styleable protected int gripDotCount = FlatUIUtils.getUIInt( "SplitPaneDivider.gripDotCount", 3 ); + @Styleable protected int gripDotSize = FlatUIUtils.getUIInt( "SplitPaneDivider.gripDotSize", 3 ); + @Styleable protected int gripGap = FlatUIUtils.getUIInt( "SplitPaneDivider.gripGap", 2 ); protected FlatSplitPaneDivider( BasicSplitPaneUI ui ) { super( ui ); @@ -120,6 +182,20 @@ public class FlatSplitPaneUI setLayout( new FlatDividerLayout() ); } + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + + void updateButtons() { + if( leftButton instanceof FlatOneTouchButton ) + ((FlatOneTouchButton)leftButton).update(); + if( rightButton instanceof FlatOneTouchButton ) + ((FlatOneTouchButton)rightButton).update(); + } + @Override public void setDividerSize( int newSize ) { super.setDividerSize( UIScale.scale( newSize ) ); @@ -200,6 +276,11 @@ public class FlatSplitPaneUI this.left = left; } + protected void update() { + update( arrowType, oneTouchArrowColor, null, + oneTouchHoverArrowColor, null, oneTouchPressedArrowColor, null ); + } + @Override public int getDirection() { return (orientation == JSplitPane.VERTICAL_SPLIT) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index ab9440f6..6f37a993 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -61,11 +61,13 @@ public class FlatStyleSupport * first parameter is the key, second the binary value; * the function must return the old value * @return map of old values modified by the given style, or {@code null} + * @throws UnknownStyleException on unknown style keys * @throws IllegalArgumentException on syntax errors * @throws ClassCastException if value type does not fit to expected type  */ public static Map parseAndApply( Map oldStyleValues, - Object style, BiFunction applyProperty ) throws IllegalArgumentException + Object style, BiFunction applyProperty ) + throws UnknownStyleException, IllegalArgumentException { // restore previous values if( oldStyleValues != null ) { @@ -170,11 +172,11 @@ public class FlatStyleSupport * @param key the name of the field * @param value the new value * @return the old value of the field - * @throws IllegalArgumentException if object does not have a annotated field with given name - * or if value type does not fit to expected type  + * @throws UnknownStyleException if object does not have a annotated field with given name + * @throws IllegalArgumentException if value type does not fit to expected type  */ public static Object applyToAnnotatedObject( Object obj, String key, Object value ) - throws IllegalArgumentException + throws UnknownStyleException, IllegalArgumentException { Class cls = obj.getClass(); @@ -203,19 +205,30 @@ public class FlatStyleSupport cls = cls.getSuperclass(); if( cls == null ) - throw newUnknownStyleException( key ); + throw new UnknownStyleException( key ); String superclassName = cls.getName(); if( superclassName.startsWith( "java." ) || superclassName.startsWith( "javax." ) ) - throw newUnknownStyleException( key ); + throw new UnknownStyleException( key ); } } - public static IllegalArgumentException newUnknownStyleException( String key ) { - return new IllegalArgumentException( "unknown style '" + key + "'" ); - } - public static Object getStyle( JComponent c ) { return c.getClientProperty( FlatClientProperties.COMPONENT_STYLE ); } + + //---- class UnknownStyleException ---------------------------------------- + + public static class UnknownStyleException + extends IllegalArgumentException + { + UnknownStyleException( String key ) { + super( key ); + } + + @Override + public String getMessage() { + return "unknown style '" + super.getMessage() + "'"; + } + } } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 6178d518..23780402 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.Map; import javax.swing.JCheckBox; import javax.swing.JRadioButton; +import javax.swing.JSplitPane; import javax.swing.UIManager; import org.junit.jupiter.api.Test; import com.formdev.flatlaf.icons.FlatCheckBoxIcon; @@ -208,6 +209,25 @@ public class FlatStylingTests ui.applyStyle( "tickColor: #fff" ); } + @Test + void splitPane() { + FlatSplitPaneUI ui = new FlatSplitPaneUI(); + + // create divider and one-touch buttons + ui.installUI( new JSplitPane() ); + + ui.applyStyle( "arrowType: chevron" ); + ui.applyStyle( "oneTouchArrowColor: #fff" ); + ui.applyStyle( "oneTouchHoverArrowColor: #fff" ); + ui.applyStyle( "oneTouchPressedArrowColor: #fff" ); + + ui.applyStyle( "style: grip" ); + ui.applyStyle( "gripColor: #fff" ); + ui.applyStyle( "gripDotCount: 3" ); + ui.applyStyle( "gripDotSize: {integer}3" ); + ui.applyStyle( "gripGap: 2" ); + } + //---- icons -------------------------------------------------------------- @Test From 53abbbbe56a07819799a8d28be846a4cb712e415 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 18 Jun 2021 13:02:40 +0200 Subject: [PATCH 14/60] Styling: support TextField, FormattedTextField and PasswordField --- .../flatlaf/icons/FlatAbstractIcon.java | 2 +- .../flatlaf/icons/FlatCapsLockIcon.java | 13 ++ .../com/formdev/flatlaf/ui/FlatBorder.java | 41 ++++-- .../flatlaf/ui/FlatPasswordFieldUI.java | 65 ++++++++- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 9 +- .../formdev/flatlaf/ui/FlatStyleSupport.java | 22 ++- .../formdev/flatlaf/ui/FlatTextBorder.java | 3 +- .../formdev/flatlaf/ui/FlatTextFieldUI.java | 62 ++++++++- .../formdev/flatlaf/ui/FlatStylingTests.java | 131 +++++++++++++++++- 9 files changed, 309 insertions(+), 39 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAbstractIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAbstractIcon.java index 9675479c..8448f128 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAbstractIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAbstractIcon.java @@ -39,7 +39,7 @@ public abstract class FlatAbstractIcon { protected final int width; protected final int height; - protected final Color color; + protected Color color; public FlatAbstractIcon( int width, int height, Color color ) { this.width = width; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java index 2ceab38f..345e6184 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java @@ -16,12 +16,14 @@ package com.formdev.flatlaf.icons; +import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -38,6 +40,17 @@ public class FlatCapsLockIcon super( 16, 16, UIManager.getColor( "PasswordField.capsLockIconColor" ) ); } + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + Object oldValue; + switch( key ) { + case "capsLockIconColor": oldValue = color; color = (Color) value; return oldValue; + default: throw new UnknownStyleException( key ); + } + } + @Override protected void paintIcon( Component c, Graphics2D g ) { /* 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 index 27c8d424..eb7f93bd 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java @@ -31,6 +31,7 @@ import javax.swing.JViewport; import javax.swing.UIManager; import javax.swing.plaf.basic.BasicBorders; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.DerivedColor; /** @@ -61,19 +62,35 @@ import com.formdev.flatlaf.util.DerivedColor; public class FlatBorder extends BasicBorders.MarginBorder { - protected final int focusWidth = UIManager.getInt( "Component.focusWidth" ); - protected final float innerFocusWidth = FlatUIUtils.getUIFloat( "Component.innerFocusWidth", 0 ); - protected final float innerOutlineWidth = FlatUIUtils.getUIFloat( "Component.innerOutlineWidth", 0 ); - protected final Color focusColor = UIManager.getColor( "Component.focusColor" ); - protected final Color borderColor = UIManager.getColor( "Component.borderColor" ); - protected final Color disabledBorderColor = UIManager.getColor( "Component.disabledBorderColor" ); - protected final Color focusedBorderColor = UIManager.getColor( "Component.focusedBorderColor" ); + @Styleable protected int focusWidth = UIManager.getInt( "Component.focusWidth" ); + @Styleable protected float innerFocusWidth = FlatUIUtils.getUIFloat( "Component.innerFocusWidth", 0 ); + @Styleable protected float innerOutlineWidth = FlatUIUtils.getUIFloat( "Component.innerOutlineWidth", 0 ); + @Styleable protected Color focusColor = UIManager.getColor( "Component.focusColor" ); + @Styleable protected Color borderColor = UIManager.getColor( "Component.borderColor" ); + @Styleable protected Color disabledBorderColor = UIManager.getColor( "Component.disabledBorderColor" ); + @Styleable protected Color focusedBorderColor = UIManager.getColor( "Component.focusedBorderColor" ); - protected final Color errorBorderColor = UIManager.getColor( "Component.error.borderColor" ); - protected final Color errorFocusedBorderColor = UIManager.getColor( "Component.error.focusedBorderColor" ); - protected final Color warningBorderColor = UIManager.getColor( "Component.warning.borderColor" ); - protected final Color warningFocusedBorderColor = UIManager.getColor( "Component.warning.focusedBorderColor" ); - protected final Color customBorderColor = UIManager.getColor( "Component.custom.borderColor" ); + protected Color errorBorderColor = UIManager.getColor( "Component.error.borderColor" ); + protected Color errorFocusedBorderColor = UIManager.getColor( "Component.error.focusedBorderColor" ); + protected Color warningBorderColor = UIManager.getColor( "Component.warning.borderColor" ); + protected Color warningFocusedBorderColor = UIManager.getColor( "Component.warning.focusedBorderColor" ); + protected Color customBorderColor = UIManager.getColor( "Component.custom.borderColor" ); + + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + Object oldValue; + switch( key ) { + case "error.borderColor": oldValue = errorBorderColor; errorBorderColor = (Color) value; return oldValue; + case "error.focusedBorderColor": oldValue = errorFocusedBorderColor; errorFocusedBorderColor = (Color) value; return oldValue; + case "warning.borderColor": oldValue = warningBorderColor; warningBorderColor = (Color) value; return oldValue; + case "warning.focusedBorderColor": oldValue = warningFocusedBorderColor; warningFocusedBorderColor = (Color) value; return oldValue; + case "custom.borderColor": oldValue = customBorderColor; customBorderColor = (Color) value; return oldValue; + } + + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { 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 d338aa53..d7d9e1bb 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 @@ -26,14 +26,19 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.beans.PropertyChangeEvent; +import java.util.Map; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.UIManager; +import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicPasswordFieldUI; import javax.swing.text.Caret; import javax.swing.text.JTextComponent; +import com.formdev.flatlaf.icons.FlatCapsLockIcon; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -71,20 +76,30 @@ import com.formdev.flatlaf.util.HiDPIUtils; public class FlatPasswordFieldUI extends BasicPasswordFieldUI { - protected int minimumWidth; + @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; - protected Color placeholderForeground; - protected Color focusedBackground; - protected boolean showCapsLock; + @Styleable protected Color placeholderForeground; + @Styleable protected Color focusedBackground; + @Styleable protected boolean showCapsLock; protected Icon capsLockIcon; private FocusListener focusListener; private KeyListener capsLockListener; + private Map oldStyleValues; + private boolean borderShared = true; + private boolean capsLockIconShared = true; public static ComponentUI createUI( JComponent c ) { return new FlatPasswordFieldUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -159,7 +174,47 @@ public class FlatPasswordFieldUI @Override protected void propertyChange( PropertyChangeEvent e ) { super.propertyChange( e ); - FlatTextFieldUI.propertyChange( getComponent(), e ); + FlatTextFieldUI.propertyChange( getComponent(), e, this::applyStyle ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + if( key.equals( "capsLockIconColor" ) && capsLockIcon instanceof FlatCapsLockIcon ) { + if( capsLockIconShared ) { + capsLockIcon = FlatStyleSupport.cloneIcon( capsLockIcon ); + capsLockIconShared = false; + } + return ((FlatCapsLockIcon)capsLockIcon).applyStyleProperty( key, value ); + } + + try { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } catch( UnknownStyleException ex ) { + Border border = getComponent().getBorder(); + if( border instanceof FlatBorder ) { + if( borderShared ) { + border = FlatStyleSupport.cloneBorder( border ); + getComponent().setBorder( border ); + borderShared = false; + } + + try { + return ((FlatBorder)border).applyStyleProperty( key, value ); + } catch( UnknownStyleException ex2 ) { + // ignore + } + } + throw ex; + } } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 27da0e49..b812ffd8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -68,7 +68,7 @@ public class FlatRadioButtonUI private Color defaultBackground; private final boolean shared; - private boolean iconShared; + private boolean iconShared = true; private boolean defaults_initialized = false; private Map oldStyleValues; @@ -83,7 +83,6 @@ public class FlatRadioButtonUI */ protected FlatRadioButtonUI( boolean shared ) { this.shared = shared; - iconShared = true; } @Override @@ -169,11 +168,7 @@ public class FlatRadioButtonUI return null; if( iconShared ) { - try { - icon = icon.getClass().getDeclaredConstructor().newInstance(); - } catch( Exception ex ) { - throw new IllegalArgumentException( "failed to clone icon '" + icon.getClass().getName() + "'" ); - } + icon = FlatStyleSupport.cloneIcon( icon ); iconShared = false; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 6f37a993..8fc4459c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -26,8 +26,10 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.BiFunction; +import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.UIManager; +import javax.swing.border.Border; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.StringUtils; @@ -217,12 +219,30 @@ public class FlatStyleSupport return c.getClientProperty( FlatClientProperties.COMPONENT_STYLE ); } + static Border cloneBorder( Border border ) { + Class borderClass = border.getClass(); + try { + return borderClass.getDeclaredConstructor().newInstance(); + } catch( Exception ex ) { + throw new IllegalArgumentException( "failed to clone border '" + borderClass.getName() + "'" ); + } + } + + static Icon cloneIcon( Icon icon ) { + Class iconClass = icon.getClass(); + try { + return iconClass.getDeclaredConstructor().newInstance(); + } catch( Exception ex ) { + throw new IllegalArgumentException( "failed to clone icon '" + iconClass.getName() + "'" ); + } + } + //---- class UnknownStyleException ---------------------------------------- public static class UnknownStyleException extends IllegalArgumentException { - UnknownStyleException( String key ) { + public UnknownStyleException( String key ) { super( key ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextBorder.java index b57a1088..9ad7a5b4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextBorder.java @@ -18,6 +18,7 @@ package com.formdev.flatlaf.ui; import java.awt.Component; import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Border for various text components (e.g. {@link javax.swing.JTextField}). @@ -29,7 +30,7 @@ import javax.swing.UIManager; public class FlatTextBorder extends FlatBorder { - protected final int arc = UIManager.getInt( "TextComponent.arc" ); + @Styleable protected int arc = UIManager.getInt( "TextComponent.arc" ); @Override protected int getArc( Component c ) { 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 d80ac851..ff33eb85 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 @@ -26,18 +26,23 @@ import java.awt.Graphics2D; import java.awt.Insets; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; +import java.util.Map; +import java.util.function.Consumer; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.LookAndFeel; import javax.swing.UIManager; +import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicTextFieldUI; import javax.swing.text.Caret; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.JavaCompatibility; @@ -73,17 +78,26 @@ import com.formdev.flatlaf.util.JavaCompatibility; public class FlatTextFieldUI extends BasicTextFieldUI { - protected int minimumWidth; + @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; - protected Color placeholderForeground; - protected Color focusedBackground; + @Styleable protected Color placeholderForeground; + @Styleable protected Color focusedBackground; private FocusListener focusListener; + private Map oldStyleValues; + private boolean borderShared = true; public static ComponentUI createUI( JComponent c ) { return new FlatTextFieldUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -135,10 +149,10 @@ public class FlatTextFieldUI @Override protected void propertyChange( PropertyChangeEvent e ) { super.propertyChange( e ); - propertyChange( getComponent(), e ); + propertyChange( getComponent(), e, this::applyStyle ); } - static void propertyChange( JTextComponent c, PropertyChangeEvent e ) { + static void propertyChange( JTextComponent c, PropertyChangeEvent e, Consumer applyStyle ) { switch( e.getPropertyName() ) { case FlatClientProperties.PLACEHOLDER_TEXT: case FlatClientProperties.COMPONENT_ROUND_RECT: @@ -148,6 +162,44 @@ public class FlatTextFieldUI case FlatClientProperties.MINIMUM_WIDTH: c.revalidate(); break; + + case FlatClientProperties.COMPONENT_STYLE: + applyStyle.accept( e.getNewValue() ); + c.revalidate(); + c.repaint(); + break; + } + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + try { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } catch( UnknownStyleException ex ) { + Border border = getComponent().getBorder(); + if( border instanceof FlatBorder ) { + if( borderShared ) { + border = FlatStyleSupport.cloneBorder( border ); + getComponent().setBorder( border ); + borderShared = false; + } + + try { + return ((FlatBorder)border).applyStyleProperty( key, value ); + } catch( UnknownStyleException ex2 ) { + // ignore + } + } + throw ex; } } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 23780402..2d99d784 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -21,11 +21,16 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.awt.Color; import java.util.HashMap; import java.util.Map; +import java.util.function.Consumer; import javax.swing.JCheckBox; +import javax.swing.JFormattedTextField; +import javax.swing.JPasswordField; import javax.swing.JRadioButton; import javax.swing.JSplitPane; +import javax.swing.JTextField; import javax.swing.UIManager; import org.junit.jupiter.api.Test; +import com.formdev.flatlaf.icons.FlatCapsLockIcon; import com.formdev.flatlaf.icons.FlatCheckBoxIcon; import com.formdev.flatlaf.icons.FlatRadioButtonIcon; @@ -75,6 +80,39 @@ public class FlatStylingTests radioButton( ui ); } + @Test + void formattedTextField() { + FlatFormattedTextFieldUI ui = new FlatFormattedTextFieldUI(); + + // create border + UIManager.put( "FormattedTextField.border", new FlatTextBorder() ); + ui.installUI( new JFormattedTextField() ); + + // FlatFormattedTextFieldUI extends FlatTextFieldUI + textField( ui ); + } + + @Test + void passwordField() { + FlatPasswordFieldUI ui = new FlatPasswordFieldUI(); + + // create border and capsLockIcon + UIManager.put( "PasswordField.border", new FlatTextBorder() ); + UIManager.put( "PasswordField.capsLockIcon", new FlatCapsLockIcon() ); + ui.installUI( new JPasswordField() ); + + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "placeholderForeground: #fff" ); + ui.applyStyle( "focusedBackground: #fff" ); + ui.applyStyle( "showCapsLock: true" ); + + // capsLockIcon + ui.applyStyle( "capsLockIconColor: #fff" ); + + // border + flatTextBorder( style -> ui.applyStyle( style ) ); + } + @Test void popupMenuSeparator() { FlatPopupMenuSeparatorUI ui = new FlatPopupMenuSeparatorUI( false ); @@ -228,26 +266,105 @@ public class FlatStylingTests ui.applyStyle( "gripGap: 2" ); } - //---- icons -------------------------------------------------------------- + @Test + void textField() { + FlatTextFieldUI ui = new FlatTextFieldUI(); + + // create border + UIManager.put( "TextField.border", new FlatTextBorder() ); + ui.installUI( new JTextField() ); + + textField( ui ); + } + + private void textField( FlatTextFieldUI ui ) { + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "placeholderForeground: #fff" ); + ui.applyStyle( "focusedBackground: #fff" ); + + // border + flatTextBorder( style -> ui.applyStyle( style ) ); + } + + //---- component borders -------------------------------------------------- + + private void flatTextBorder( Consumer applyStyle ) { + flatBorder( applyStyle ); + + applyStyle.accept( "arc: 6" ); + } + + private void flatBorder( Consumer applyStyle ) { + applyStyle.accept( "focusWidth: 2" ); + applyStyle.accept( "innerFocusWidth: {float}0.5" ); + applyStyle.accept( "innerOutlineWidth: {float}1.5" ); + applyStyle.accept( "focusColor: #fff" ); + applyStyle.accept( "borderColor: #fff" ); + applyStyle.accept( "disabledBorderColor: #fff" ); + applyStyle.accept( "focusedBorderColor: #fff" ); + + applyStyle.accept( "error.borderColor: #fff" ); + applyStyle.accept( "error.focusedBorderColor: #fff" ); + applyStyle.accept( "warning.borderColor: #fff" ); + applyStyle.accept( "warning.focusedBorderColor: #fff" ); + applyStyle.accept( "custom.borderColor: desaturate(#f00,50%,relative derived noAutoInverse)" ); + } + + //---- borders ------------------------------------------------------------ @Test - void checkBoxIcon() { - FlatCheckBoxIcon icon = new FlatCheckBoxIcon(); + void flatTextBorder() { + FlatTextBorder border = new FlatTextBorder(); - checkBoxIcon( icon ); + // FlatTextBorder extends FlatBorder + flatBorder( border ); + + border.applyStyleProperty( "arc", 6 ); } @Test - void radioButtonIcon() { + void flatBorder() { + FlatBorder border = new FlatBorder(); + + flatBorder( border ); + } + + private void flatBorder( FlatBorder border ) { + border.applyStyleProperty( "focusWidth", 2 ); + border.applyStyleProperty( "innerFocusWidth", 0.5f ); + border.applyStyleProperty( "innerOutlineWidth", 1.5f ); + border.applyStyleProperty( "focusColor", Color.WHITE ); + border.applyStyleProperty( "borderColor", Color.WHITE ); + border.applyStyleProperty( "disabledBorderColor", Color.WHITE ); + border.applyStyleProperty( "focusedBorderColor", Color.WHITE ); + + border.applyStyleProperty( "error.borderColor", Color.WHITE ); + border.applyStyleProperty( "error.focusedBorderColor", Color.WHITE ); + border.applyStyleProperty( "warning.borderColor", Color.WHITE ); + border.applyStyleProperty( "warning.focusedBorderColor", Color.WHITE ); + border.applyStyleProperty( "custom.borderColor", Color.WHITE ); + } + + //---- icons -------------------------------------------------------------- + + @Test + void flatCheckBoxIcon() { + FlatCheckBoxIcon icon = new FlatCheckBoxIcon(); + + flatCheckBoxIcon( icon ); + } + + @Test + void flatRadioButtonIcon() { FlatRadioButtonIcon icon = new FlatRadioButtonIcon(); // FlatRadioButtonIcon extends FlatCheckBoxIcon - checkBoxIcon( icon ); + flatCheckBoxIcon( icon ); icon.applyStyleProperty( "centerDiameter", 8 ); } - private void checkBoxIcon( FlatCheckBoxIcon icon ) { + private void flatCheckBoxIcon( FlatCheckBoxIcon icon ) { icon.applyStyleProperty( "focusWidth", 2 ); icon.applyStyleProperty( "focusColor", Color.WHITE ); icon.applyStyleProperty( "arc", 5 ); From 5e20d50abf0dc335a7a445d57188dfb8f375e246 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 18 Jun 2021 13:53:42 +0200 Subject: [PATCH 15/60] Styling: support TextArea, TextPane and EditorPane --- .../formdev/flatlaf/ui/FlatEditorPaneUI.java | 39 +++++++++++++++++-- .../formdev/flatlaf/ui/FlatTextAreaUI.java | 30 +++++++++++--- .../formdev/flatlaf/ui/FlatTextPaneUI.java | 30 ++++++++++++-- .../formdev/flatlaf/ui/FlatStylingTests.java | 29 ++++++++++++++ 4 files changed, 115 insertions(+), 13 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 0179e60d..85524315 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 @@ -23,6 +23,8 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; +import java.util.Map; +import java.util.function.Consumer; import javax.swing.JComponent; import javax.swing.JEditorPane; import javax.swing.UIManager; @@ -30,6 +32,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicEditorPaneUI; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -61,17 +64,25 @@ import com.formdev.flatlaf.util.HiDPIUtils; public class FlatEditorPaneUI extends BasicEditorPaneUI { - protected int minimumWidth; + @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; - protected Color focusedBackground; + @Styleable protected Color focusedBackground; private Object oldHonorDisplayProperties; private FocusListener focusListener; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatEditorPaneUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -115,17 +126,37 @@ public class FlatEditorPaneUI @Override protected void propertyChange( PropertyChangeEvent e ) { super.propertyChange( e ); - propertyChange( getComponent(), e ); + propertyChange( getComponent(), e, this::applyStyle ); } - static void propertyChange( JTextComponent c, PropertyChangeEvent e ) { + static void propertyChange( JTextComponent c, PropertyChangeEvent e, Consumer applyStyle ) { switch( e.getPropertyName() ) { case FlatClientProperties.MINIMUM_WIDTH: c.revalidate(); break; + + case FlatClientProperties.COMPONENT_STYLE: + applyStyle.accept( e.getNewValue() ); + c.revalidate(); + c.repaint(); + break; } } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override public Dimension getPreferredSize( JComponent c ) { return applyMinimumWidth( c, super.getPreferredSize( c ), minimumWidth ); 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..f5ed1148 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 @@ -22,6 +22,7 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; +import java.util.Map; import javax.swing.JComponent; import javax.swing.JTextArea; import javax.swing.UIManager; @@ -29,6 +30,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicTextAreaUI; import javax.swing.text.JTextComponent; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -60,14 +62,15 @@ import com.formdev.flatlaf.util.HiDPIUtils; public class FlatTextAreaUI extends BasicTextAreaUI { - protected int minimumWidth; + @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; protected Color background; - protected Color disabledBackground; - protected Color inactiveBackground; - protected Color focusedBackground; + @Styleable protected Color disabledBackground; + @Styleable protected Color inactiveBackground; + @Styleable protected Color focusedBackground; private FocusListener focusListener; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatTextAreaUI(); @@ -77,7 +80,7 @@ public class FlatTextAreaUI public void installUI( JComponent c ) { super.installUI( c ); - updateBackground(); + applyStyle( FlatStyleSupport.getStyle( c ) ); } @Override @@ -122,7 +125,7 @@ public class FlatTextAreaUI @Override protected void propertyChange( PropertyChangeEvent e ) { super.propertyChange( e ); - FlatEditorPaneUI.propertyChange( getComponent(), e ); + FlatEditorPaneUI.propertyChange( getComponent(), e, this::applyStyle ); switch( e.getPropertyName() ) { case "editable": @@ -132,6 +135,21 @@ public class FlatTextAreaUI } } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + updateBackground(); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + private void updateBackground() { JTextComponent c = getComponent(); 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..4bd02145 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 @@ -22,11 +22,13 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; +import java.util.Map; import javax.swing.JComponent; import javax.swing.JEditorPane; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTextPaneUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -58,17 +60,25 @@ import com.formdev.flatlaf.util.HiDPIUtils; public class FlatTextPaneUI extends BasicTextPaneUI { - protected int minimumWidth; + @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; - protected Color focusedBackground; + @Styleable protected Color focusedBackground; private Object oldHonorDisplayProperties; private FocusListener focusListener; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatTextPaneUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -112,7 +122,21 @@ public class FlatTextPaneUI @Override protected void propertyChange( PropertyChangeEvent e ) { super.propertyChange( e ); - FlatEditorPaneUI.propertyChange( getComponent(), e ); + FlatEditorPaneUI.propertyChange( getComponent(), e, this::applyStyle ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } @Override diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 2d99d784..0dbb944a 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -27,6 +27,7 @@ import javax.swing.JFormattedTextField; import javax.swing.JPasswordField; import javax.swing.JRadioButton; import javax.swing.JSplitPane; +import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.UIManager; import org.junit.jupiter.api.Test; @@ -80,6 +81,14 @@ public class FlatStylingTests radioButton( ui ); } + @Test + void editorPane() { + FlatEditorPaneUI ui = new FlatEditorPaneUI(); + + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "focusedBackground: #fff" ); + } + @Test void formattedTextField() { FlatFormattedTextFieldUI ui = new FlatFormattedTextFieldUI(); @@ -266,6 +275,18 @@ public class FlatStylingTests ui.applyStyle( "gripGap: 2" ); } + @Test + void textArea() { + FlatTextAreaUI ui = new FlatTextAreaUI(); + + ui.installUI( new JTextArea() ); + + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "disabledBackground: #fff" ); + ui.applyStyle( "inactiveBackground: #fff" ); + ui.applyStyle( "focusedBackground: #fff" ); + } + @Test void textField() { FlatTextFieldUI ui = new FlatTextFieldUI(); @@ -286,6 +307,14 @@ public class FlatStylingTests flatTextBorder( style -> ui.applyStyle( style ) ); } + @Test + void textPane() { + FlatTextPaneUI ui = new FlatTextPaneUI(); + + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "focusedBackground: #fff" ); + } + //---- component borders -------------------------------------------------- private void flatTextBorder( Consumer applyStyle ) { From b4a9c9b7f502b1d3697855d52229b9d4daafb667 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 19 Jun 2021 11:11:57 +0200 Subject: [PATCH 16/60] Styling: support styling disabledBackground and inactiveBackground of text components --- .../formdev/flatlaf/ui/FlatEditorPaneUI.java | 31 ++++ .../flatlaf/ui/FlatPasswordFieldUI.java | 32 +++- .../formdev/flatlaf/ui/FlatTextAreaUI.java | 49 ++--- .../formdev/flatlaf/ui/FlatTextFieldUI.java | 59 +++++- .../formdev/flatlaf/ui/FlatTextPaneUI.java | 31 ++++ .../formdev/flatlaf/ui/FlatStylingTests.java | 17 ++ .../flatlaf/ui/FlatTextComponentTests.java | 169 ++++++++++++++++++ 7 files changed, 356 insertions(+), 32 deletions(-) create mode 100644 flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java 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 85524315..27ad3a71 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 @@ -66,8 +66,14 @@ public class FlatEditorPaneUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; + private Color background; + @Styleable protected Color disabledBackground; + @Styleable protected Color inactiveBackground; @Styleable protected Color focusedBackground; + private Color oldDisabledBackground; + private Color oldInactiveBackground; + private Object oldHonorDisplayProperties; private FocusListener focusListener; private Map oldStyleValues; @@ -90,6 +96,9 @@ public class FlatEditorPaneUI String prefix = getPropertyPrefix(); minimumWidth = UIManager.getInt( "Component.minimumWidth" ); isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" ); + background = UIManager.getColor( prefix + ".background" ); + disabledBackground = UIManager.getColor( prefix + ".disabledBackground" ); + inactiveBackground = UIManager.getColor( prefix + ".inactiveBackground" ); focusedBackground = UIManager.getColor( prefix + ".focusedBackground" ); // use component font and foreground for HTML text @@ -101,8 +110,14 @@ public class FlatEditorPaneUI protected void uninstallDefaults() { super.uninstallDefaults(); + background = null; + disabledBackground = null; + inactiveBackground = null; focusedBackground = null; + oldDisabledBackground = null; + oldInactiveBackground = null; + getComponent().putClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES, oldHonorDisplayProperties ); } @@ -125,6 +140,11 @@ public class FlatEditorPaneUI @Override protected void propertyChange( PropertyChangeEvent e ) { + // invoke updateBackground() before super.propertyChange() + String propertyName = e.getPropertyName(); + if( "editable".equals( propertyName ) || "enabled".equals( propertyName ) ) + updateBackground(); + super.propertyChange( e ); propertyChange( getComponent(), e, this::applyStyle ); } @@ -147,7 +167,12 @@ public class FlatEditorPaneUI * @since TODO */ protected void applyStyle( Object style ) { + oldDisabledBackground = disabledBackground; + oldInactiveBackground = inactiveBackground; + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + updateBackground(); } /** @@ -157,6 +182,12 @@ public class FlatEditorPaneUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + private void updateBackground() { + FlatTextFieldUI.updateBackground( getComponent(), background, + disabledBackground, inactiveBackground, + oldDisabledBackground, oldInactiveBackground ); + } + @Override public Dimension getPreferredSize( JComponent c ) { return applyMinimumWidth( c, super.getPreferredSize( c ), minimumWidth ); 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 d7d9e1bb..9de65ec6 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 @@ -78,11 +78,17 @@ public class FlatPasswordFieldUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; + private Color background; + @Styleable protected Color disabledBackground; + @Styleable protected Color inactiveBackground; @Styleable protected Color placeholderForeground; @Styleable protected Color focusedBackground; @Styleable protected boolean showCapsLock; protected Icon capsLockIcon; + private Color oldDisabledBackground; + private Color oldInactiveBackground; + private FocusListener focusListener; private KeyListener capsLockListener; private Map oldStyleValues; @@ -107,6 +113,9 @@ public class FlatPasswordFieldUI String prefix = getPropertyPrefix(); minimumWidth = UIManager.getInt( "Component.minimumWidth" ); isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" ); + background = UIManager.getColor( prefix + ".background" ); + disabledBackground = UIManager.getColor( prefix + ".disabledBackground" ); + inactiveBackground = UIManager.getColor( prefix + ".inactiveBackground" ); placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" ); focusedBackground = UIManager.getColor( prefix + ".focusedBackground" ); showCapsLock = UIManager.getBoolean( "PasswordField.showCapsLock" ); @@ -121,10 +130,16 @@ public class FlatPasswordFieldUI protected void uninstallDefaults() { super.uninstallDefaults(); + background = null; + disabledBackground = null; + inactiveBackground = null; placeholderForeground = null; focusedBackground = null; capsLockIcon = null; + oldDisabledBackground = null; + oldInactiveBackground = null; + MigLayoutVisualPadding.uninstall( getComponent() ); } @@ -173,7 +188,11 @@ public class FlatPasswordFieldUI @Override protected void propertyChange( PropertyChangeEvent e ) { - super.propertyChange( e ); + String propertyName = e.getPropertyName(); + if( "editable".equals( propertyName ) || "enabled".equals( propertyName ) ) + updateBackground(); + else + super.propertyChange( e ); FlatTextFieldUI.propertyChange( getComponent(), e, this::applyStyle ); } @@ -181,7 +200,12 @@ public class FlatPasswordFieldUI * @since TODO */ protected void applyStyle( Object style ) { + oldDisabledBackground = disabledBackground; + oldInactiveBackground = inactiveBackground; + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + updateBackground(); } /** @@ -217,6 +241,12 @@ public class FlatPasswordFieldUI } } + private void updateBackground() { + FlatTextFieldUI.updateBackground( getComponent(), background, + disabledBackground, inactiveBackground, + oldDisabledBackground, oldInactiveBackground ); + } + @Override protected void paintSafely( Graphics g ) { FlatTextFieldUI.paintBackground( g, getComponent(), isIntelliJTheme, focusedBackground ); 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 f5ed1148..ff79b8e1 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 @@ -27,9 +27,7 @@ import javax.swing.JComponent; import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; -import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicTextAreaUI; -import javax.swing.text.JTextComponent; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.HiDPIUtils; @@ -64,11 +62,14 @@ public class FlatTextAreaUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; - protected Color background; + private Color background; @Styleable protected Color disabledBackground; @Styleable protected Color inactiveBackground; @Styleable protected Color focusedBackground; + private Color oldDisabledBackground; + private Color oldInactiveBackground; + private FocusListener focusListener; private Map oldStyleValues; @@ -103,6 +104,9 @@ public class FlatTextAreaUI disabledBackground = null; inactiveBackground = null; focusedBackground = null; + + oldDisabledBackground = null; + oldInactiveBackground = null; } @Override @@ -124,22 +128,24 @@ public class FlatTextAreaUI @Override protected void propertyChange( PropertyChangeEvent e ) { + // invoke updateBackground() before super.propertyChange() + String propertyName = e.getPropertyName(); + if( "editable".equals( propertyName ) || "enabled".equals( propertyName ) ) + updateBackground(); + super.propertyChange( e ); FlatEditorPaneUI.propertyChange( getComponent(), e, this::applyStyle ); - - switch( e.getPropertyName() ) { - case "editable": - case "enabled": - updateBackground(); - break; - } } /** * @since TODO */ protected void applyStyle( Object style ) { + oldDisabledBackground = disabledBackground; + oldInactiveBackground = inactiveBackground; + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + updateBackground(); } @@ -151,26 +157,9 @@ public class FlatTextAreaUI } private void updateBackground() { - JTextComponent c = getComponent(); - - Color background = c.getBackground(); - if( !(background instanceof UIResource) ) - return; - - // do not update background if it currently has a unknown color (assigned from outside) - if( background != this.background && - background != disabledBackground && - background != inactiveBackground ) - return; - - Color newBackground = !c.isEnabled() - ? disabledBackground - : (!c.isEditable() - ? inactiveBackground - : this.background); - - if( newBackground != background ) - c.setBackground( newBackground ); + FlatTextFieldUI.updateBackground( getComponent(), background, + disabledBackground, inactiveBackground, + oldDisabledBackground, oldInactiveBackground ); } @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 ff33eb85..42df0c11 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 @@ -80,9 +80,15 @@ public class FlatTextFieldUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; + private Color background; + @Styleable protected Color disabledBackground; + @Styleable protected Color inactiveBackground; @Styleable protected Color placeholderForeground; @Styleable protected Color focusedBackground; + private Color oldDisabledBackground; + private Color oldInactiveBackground; + private FocusListener focusListener; private Map oldStyleValues; private boolean borderShared = true; @@ -105,6 +111,9 @@ public class FlatTextFieldUI String prefix = getPropertyPrefix(); minimumWidth = UIManager.getInt( "Component.minimumWidth" ); isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" ); + background = UIManager.getColor( prefix + ".background" ); + disabledBackground = UIManager.getColor( prefix + ".disabledBackground" ); + inactiveBackground = UIManager.getColor( prefix + ".inactiveBackground" ); placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" ); focusedBackground = UIManager.getColor( prefix + ".focusedBackground" ); @@ -117,9 +126,15 @@ public class FlatTextFieldUI protected void uninstallDefaults() { super.uninstallDefaults(); + background = null; + disabledBackground = null; + inactiveBackground = null; placeholderForeground = null; focusedBackground = null; + oldDisabledBackground = null; + oldInactiveBackground = null; + MigLayoutVisualPadding.uninstall( getComponent() ); } @@ -148,7 +163,11 @@ public class FlatTextFieldUI @Override protected void propertyChange( PropertyChangeEvent e ) { - super.propertyChange( e ); + String propertyName = e.getPropertyName(); + if( "editable".equals( propertyName ) || "enabled".equals( propertyName ) ) + updateBackground(); + else + super.propertyChange( e ); propertyChange( getComponent(), e, this::applyStyle ); } @@ -175,7 +194,12 @@ public class FlatTextFieldUI * @since TODO */ protected void applyStyle( Object style ) { + oldDisabledBackground = disabledBackground; + oldInactiveBackground = inactiveBackground; + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + updateBackground(); } /** @@ -203,6 +227,39 @@ public class FlatTextFieldUI } } + private void updateBackground() { + updateBackground( getComponent(), background, + disabledBackground, inactiveBackground, + oldDisabledBackground, oldInactiveBackground ); + } + + // same functionality as BasicTextUI.updateBackground() + static void updateBackground( JTextComponent c, Color background, + Color disabledBackground, Color inactiveBackground, + Color oldDisabledBackground, Color oldInactiveBackground ) + { + Color oldBackground = c.getBackground(); + if( !(oldBackground instanceof UIResource) ) + return; + + // do not update background if it currently has a unknown color (assigned from outside) + if( oldBackground != background && + oldBackground != disabledBackground && + oldBackground != inactiveBackground && + oldBackground != oldDisabledBackground && + oldBackground != oldInactiveBackground ) + return; + + Color newBackground = !c.isEnabled() + ? disabledBackground + : (!c.isEditable() + ? inactiveBackground + : background); + + if( newBackground != oldBackground ) + c.setBackground( newBackground ); + } + @Override protected void paintSafely( Graphics g ) { paintBackground( g, getComponent(), isIntelliJTheme, focusedBackground ); 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 4bd02145..ebfea2cc 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 @@ -62,8 +62,14 @@ public class FlatTextPaneUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; + private Color background; + @Styleable protected Color disabledBackground; + @Styleable protected Color inactiveBackground; @Styleable protected Color focusedBackground; + private Color oldDisabledBackground; + private Color oldInactiveBackground; + private Object oldHonorDisplayProperties; private FocusListener focusListener; private Map oldStyleValues; @@ -86,6 +92,9 @@ public class FlatTextPaneUI String prefix = getPropertyPrefix(); minimumWidth = UIManager.getInt( "Component.minimumWidth" ); isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" ); + background = UIManager.getColor( prefix + ".background" ); + disabledBackground = UIManager.getColor( prefix + ".disabledBackground" ); + inactiveBackground = UIManager.getColor( prefix + ".inactiveBackground" ); focusedBackground = UIManager.getColor( prefix + ".focusedBackground" ); // use component font and foreground for HTML text @@ -97,8 +106,14 @@ public class FlatTextPaneUI protected void uninstallDefaults() { super.uninstallDefaults(); + background = null; + disabledBackground = null; + inactiveBackground = null; focusedBackground = null; + oldDisabledBackground = null; + oldInactiveBackground = null; + getComponent().putClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES, oldHonorDisplayProperties ); } @@ -121,6 +136,11 @@ public class FlatTextPaneUI @Override protected void propertyChange( PropertyChangeEvent e ) { + // invoke updateBackground() before super.propertyChange() + String propertyName = e.getPropertyName(); + if( "editable".equals( propertyName ) || "enabled".equals( propertyName ) ) + updateBackground(); + super.propertyChange( e ); FlatEditorPaneUI.propertyChange( getComponent(), e, this::applyStyle ); } @@ -129,7 +149,12 @@ public class FlatTextPaneUI * @since TODO */ protected void applyStyle( Object style ) { + oldDisabledBackground = disabledBackground; + oldInactiveBackground = inactiveBackground; + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + updateBackground(); } /** @@ -139,6 +164,12 @@ public class FlatTextPaneUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + private void updateBackground() { + FlatTextFieldUI.updateBackground( getComponent(), background, + disabledBackground, inactiveBackground, + oldDisabledBackground, oldInactiveBackground ); + } + @Override public Dimension getPreferredSize( JComponent c ) { return FlatEditorPaneUI.applyMinimumWidth( c, super.getPreferredSize( c ), minimumWidth ); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 0dbb944a..c8d1501b 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -23,12 +23,14 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; import javax.swing.JCheckBox; +import javax.swing.JEditorPane; import javax.swing.JFormattedTextField; import javax.swing.JPasswordField; import javax.swing.JRadioButton; import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.JTextField; +import javax.swing.JTextPane; import javax.swing.UIManager; import org.junit.jupiter.api.Test; import com.formdev.flatlaf.icons.FlatCapsLockIcon; @@ -85,7 +87,12 @@ public class FlatStylingTests void editorPane() { FlatEditorPaneUI ui = new FlatEditorPaneUI(); + // for FlatEditorPaneUI.updateBackground() + ui.installUI( new JEditorPane() ); + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "disabledBackground: #fff" ); + ui.applyStyle( "inactiveBackground: #fff" ); ui.applyStyle( "focusedBackground: #fff" ); } @@ -111,6 +118,8 @@ public class FlatStylingTests ui.installUI( new JPasswordField() ); ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "disabledBackground: #fff" ); + ui.applyStyle( "inactiveBackground: #fff" ); ui.applyStyle( "placeholderForeground: #fff" ); ui.applyStyle( "focusedBackground: #fff" ); ui.applyStyle( "showCapsLock: true" ); @@ -279,6 +288,7 @@ public class FlatStylingTests void textArea() { FlatTextAreaUI ui = new FlatTextAreaUI(); + // for FlatEditorPaneUI.updateBackground() ui.installUI( new JTextArea() ); ui.applyStyle( "minimumWidth: 100" ); @@ -300,6 +310,8 @@ public class FlatStylingTests private void textField( FlatTextFieldUI ui ) { ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "disabledBackground: #fff" ); + ui.applyStyle( "inactiveBackground: #fff" ); ui.applyStyle( "placeholderForeground: #fff" ); ui.applyStyle( "focusedBackground: #fff" ); @@ -311,7 +323,12 @@ public class FlatStylingTests void textPane() { FlatTextPaneUI ui = new FlatTextPaneUI(); + // for FlatEditorPaneUI.updateBackground() + ui.installUI( new JTextPane() ); + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "disabledBackground: #fff" ); + ui.applyStyle( "inactiveBackground: #fff" ); ui.applyStyle( "focusedBackground: #fff" ); } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java new file mode 100644 index 00000000..90db77fc --- /dev/null +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java @@ -0,0 +1,169 @@ +/* + * Copyright 2021 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 + * + * https://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 org.junit.jupiter.api.Assertions.assertEquals; +import static com.formdev.flatlaf.FlatClientProperties.COMPONENT_STYLE; +import java.util.function.Supplier; +import javax.swing.JEditorPane; +import javax.swing.JFormattedTextField; +import javax.swing.JPasswordField; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.JTextPane; +import javax.swing.UIManager; +import javax.swing.plaf.ColorUIResource; +import javax.swing.plaf.basic.BasicTextFieldUI; +import javax.swing.text.JTextComponent; +import org.junit.jupiter.api.Test; + +/** + * @author Karl Tauber + */ +public class FlatTextComponentTests +{ + @Test + void editorPane_updateBackground() { + textComponent_updateBackground( "EditorPane", () -> { + JEditorPane c = new JEditorPane(); + c.setUI( new FlatEditorPaneUI() ); + return c; + } ); + } + + @Test + void formattedTextField_updateBackground() { + textComponent_updateBackground( "FormattedTextField", () -> { + JFormattedTextField c = new JFormattedTextField(); + c.setUI( new FlatFormattedTextFieldUI() ); + return c; + } ); + } + + @Test + void passwordField_updateBackground() { + textComponent_updateBackground( "PasswordField", () -> { + JPasswordField c = new JPasswordField(); + c.setUI( new FlatPasswordFieldUI() ); + return c; + } ); + } + + @Test + void textArea_updateBackground() { + textComponent_updateBackground( "TextArea", () -> { + JTextArea c = new JTextArea(); + c.setUI( new FlatTextAreaUI() ); + return c; + } ); + } + + @Test + void textField_updateBackground() { + textComponent_updateBackground( "TextField", () -> { + JTextField c = new JTextField(); + c.setUI( new FlatTextFieldUI() ); + return c; + } ); + } + + @Test + void textPane_updateBackground() { + textComponent_updateBackground( "TextPane", () -> { + JTextPane c = new JTextPane(); + c.setUI( new FlatTextPaneUI() ); + return c; + } ); + } + + @Test + void basicTextField_updateBackground() { + textComponent_updateBackground( "TextField", () -> { + JTextField c = new JTextField(); + c.setUI( new BasicTextFieldUI() ); + return c; + } ); + } + + private void textComponent_updateBackground( String prefix, Supplier createTextComponent ) { + ColorUIResource background = new ColorUIResource( 0xff0000 ); + ColorUIResource inactiveBackground = new ColorUIResource( 0x00ff00 ); + ColorUIResource disabledBackground = new ColorUIResource( 0x0000ff ); + + UIManager.put( prefix + ".background", background ); + UIManager.put( prefix + ".inactiveBackground", inactiveBackground ); + UIManager.put( prefix + ".disabledBackground", disabledBackground ); + + JTextComponent c = createTextComponent.get(); + + // without styling + assertEquals( background, c.getBackground() ); + c.setEditable( false ); assertEquals( inactiveBackground, c.getBackground() ); + c.setEnabled( false ); assertEquals( disabledBackground, c.getBackground() ); + c.setEditable( true ); assertEquals( disabledBackground, c.getBackground() ); + c.setEnabled( true ); assertEquals( background, c.getBackground() ); + + + if( !c.getUI().getClass().getSimpleName().startsWith( "Flat" ) ) + return; + + + // with styling + + ColorUIResource inactiveBackground1 = new ColorUIResource( 0x00ee00 ); + ColorUIResource disabledBackground1 = new ColorUIResource( 0x0000ee ); + ColorUIResource inactiveBackground2 = new ColorUIResource( 0x00dd00 ); + ColorUIResource disabledBackground2 = new ColorUIResource( 0x0000dd ); + String style1 = "inactiveBackground: #00ee00; disabledBackground: #0000ee"; + String style2 = "inactiveBackground: #00dd00; disabledBackground: #0000dd"; + + c.putClientProperty( COMPONENT_STYLE, style1 ); + + assertEquals( background, c.getBackground() ); + c.setEditable( false ); assertEquals( inactiveBackground1, c.getBackground() ); + c.setEnabled( false ); assertEquals( disabledBackground1, c.getBackground() ); + c.setEditable( true ); assertEquals( disabledBackground1, c.getBackground() ); + c.setEnabled( true ); assertEquals( background, c.getBackground() ); + + c.putClientProperty( COMPONENT_STYLE, null ); + assertEquals( background, c.getBackground() ); + + c.setEditable( false ); + c.putClientProperty( COMPONENT_STYLE, style1 ); + assertEquals( inactiveBackground1, c.getBackground() ); + + c.putClientProperty( COMPONENT_STYLE, null ); + assertEquals( inactiveBackground, c.getBackground() ); + + c.setEnabled( false ); + c.putClientProperty( COMPONENT_STYLE, style1 ); + assertEquals( disabledBackground1, c.getBackground() ); + + + // change from style1 to style2 + c.putClientProperty( COMPONENT_STYLE, style2 ); + assertEquals( disabledBackground2, c.getBackground() ); + + c.setEnabled( true ); + assertEquals( inactiveBackground2, c.getBackground() ); + + + // remove style + c.putClientProperty( COMPONENT_STYLE, null ); + assertEquals( inactiveBackground, c.getBackground() ); + } +} From ab4c9bdeda5abdd82227c289ec6acc46617003b9 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 19 Jun 2021 11:14:33 +0200 Subject: [PATCH 17/60] Styling: renamed client property `JComponent.style` to `FlatLaf.style` --- .../formdev/flatlaf/FlatClientProperties.java | 2 +- .../com/formdev/flatlaf/ui/FlatEditorPaneUI.java | 2 +- .../formdev/flatlaf/ui/FlatProgressBarUI.java | 2 +- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatScrollBarUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatSeparatorUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatSliderUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatSplitPaneUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatStyleSupport.java | 2 +- .../com/formdev/flatlaf/ui/FlatTextFieldUI.java | 2 +- .../flatlaf/ui/FlatTextComponentTests.java | 16 ++++++++-------- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index 67728871..52032e36 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -134,7 +134,7 @@ public interface FlatClientProperties * * @since TODO */ - String COMPONENT_STYLE = "JComponent.style"; + String STYLE = "FlatLaf.style"; /** * Specifies minimum width of a component. 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 27ad3a71..6760a412 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 @@ -155,7 +155,7 @@ public class FlatEditorPaneUI c.revalidate(); break; - case FlatClientProperties.COMPONENT_STYLE: + case FlatClientProperties.STYLE: applyStyle.accept( e.getNewValue() ); c.revalidate(); c.repaint(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java index d3129f8b..14ddaea9 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java @@ -102,7 +102,7 @@ public class FlatProgressBarUI progressBar.repaint(); break; - case COMPONENT_STYLE: + case STYLE: applyStyle( e.getNewValue() ); progressBar.revalidate(); progressBar.repaint(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index b812ffd8..82449a07 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -131,7 +131,7 @@ public class FlatRadioButtonUI */ protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) { switch( e.getPropertyName() ) { - case FlatClientProperties.COMPONENT_STYLE: + case FlatClientProperties.STYLE: applyStyle( b, this, e.getNewValue() ); break; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index 4bd9c239..98cae5a3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -193,7 +193,7 @@ public class FlatScrollBarUI scrollbar.repaint(); break; - case FlatClientProperties.COMPONENT_STYLE: + case FlatClientProperties.STYLE: applyStyle( e.getNewValue() ); scrollbar.revalidate(); scrollbar.repaint(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index a5cfb37f..d84d82b8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -109,7 +109,7 @@ public class FlatSeparatorUI propertyChangeListener = e -> { switch( e.getPropertyName() ) { - case FlatClientProperties.COMPONENT_STYLE: + case FlatClientProperties.STYLE: applyStyle( s, this, e.getNewValue() ); s.revalidate(); s.repaint(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index 82005439..dbd2d24e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -190,7 +190,7 @@ public class FlatSliderUI superListener.propertyChange( e ); switch( e.getPropertyName() ) { - case FlatClientProperties.COMPONENT_STYLE: + case FlatClientProperties.STYLE: applyStyle( e.getNewValue() ); slider.revalidate(); slider.repaint(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 0395af4d..0b56b0d3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -119,7 +119,7 @@ public class FlatSplitPaneUI propertyChangeListener = e -> { switch( e.getPropertyName() ) { - case FlatClientProperties.COMPONENT_STYLE: + case FlatClientProperties.STYLE: applyStyle( e.getNewValue() ); splitPane.revalidate(); splitPane.repaint(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 8fc4459c..404f9da9 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -216,7 +216,7 @@ public class FlatStyleSupport } public static Object getStyle( JComponent c ) { - return c.getClientProperty( FlatClientProperties.COMPONENT_STYLE ); + return c.getClientProperty( FlatClientProperties.STYLE ); } static Border cloneBorder( Border border ) { 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 42df0c11..c56cde8a 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 @@ -182,7 +182,7 @@ public class FlatTextFieldUI c.revalidate(); break; - case FlatClientProperties.COMPONENT_STYLE: + case FlatClientProperties.STYLE: applyStyle.accept( e.getNewValue() ); c.revalidate(); c.repaint(); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java index 90db77fc..f79354c9 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java @@ -17,7 +17,7 @@ package com.formdev.flatlaf.ui; import static org.junit.jupiter.api.Assertions.assertEquals; -import static com.formdev.flatlaf.FlatClientProperties.COMPONENT_STYLE; +import static com.formdev.flatlaf.FlatClientProperties.STYLE; import java.util.function.Supplier; import javax.swing.JEditorPane; import javax.swing.JFormattedTextField; @@ -131,7 +131,7 @@ public class FlatTextComponentTests String style1 = "inactiveBackground: #00ee00; disabledBackground: #0000ee"; String style2 = "inactiveBackground: #00dd00; disabledBackground: #0000dd"; - c.putClientProperty( COMPONENT_STYLE, style1 ); + c.putClientProperty( STYLE, style1 ); assertEquals( background, c.getBackground() ); c.setEditable( false ); assertEquals( inactiveBackground1, c.getBackground() ); @@ -139,23 +139,23 @@ public class FlatTextComponentTests c.setEditable( true ); assertEquals( disabledBackground1, c.getBackground() ); c.setEnabled( true ); assertEquals( background, c.getBackground() ); - c.putClientProperty( COMPONENT_STYLE, null ); + c.putClientProperty( STYLE, null ); assertEquals( background, c.getBackground() ); c.setEditable( false ); - c.putClientProperty( COMPONENT_STYLE, style1 ); + c.putClientProperty( STYLE, style1 ); assertEquals( inactiveBackground1, c.getBackground() ); - c.putClientProperty( COMPONENT_STYLE, null ); + c.putClientProperty( STYLE, null ); assertEquals( inactiveBackground, c.getBackground() ); c.setEnabled( false ); - c.putClientProperty( COMPONENT_STYLE, style1 ); + c.putClientProperty( STYLE, style1 ); assertEquals( disabledBackground1, c.getBackground() ); // change from style1 to style2 - c.putClientProperty( COMPONENT_STYLE, style2 ); + c.putClientProperty( STYLE, style2 ); assertEquals( disabledBackground2, c.getBackground() ); c.setEnabled( true ); @@ -163,7 +163,7 @@ public class FlatTextComponentTests // remove style - c.putClientProperty( COMPONENT_STYLE, null ); + c.putClientProperty( STYLE, null ); assertEquals( inactiveBackground, c.getBackground() ); } } From 6affc70a66599b2823fe109d9c15efc40216a767 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 19 Jun 2021 22:31:21 +0200 Subject: [PATCH 18/60] Styling: support Button and ToggleButton (including border) --- .../com/formdev/flatlaf/ui/FlatBorder.java | 19 +-- .../formdev/flatlaf/ui/FlatButtonBorder.java | 45 +++--- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 134 +++++++++++++----- .../formdev/flatlaf/ui/FlatStyleSupport.java | 19 ++- .../flatlaf/ui/FlatToggleButtonUI.java | 21 ++- .../formdev/flatlaf/ui/FlatStylingTests.java | 113 +++++++++++++++ 6 files changed, 270 insertions(+), 81 deletions(-) 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 index eb7f93bd..49523483 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java @@ -70,25 +70,16 @@ public class FlatBorder @Styleable protected Color disabledBorderColor = UIManager.getColor( "Component.disabledBorderColor" ); @Styleable protected Color focusedBorderColor = UIManager.getColor( "Component.focusedBorderColor" ); - protected Color errorBorderColor = UIManager.getColor( "Component.error.borderColor" ); - protected Color errorFocusedBorderColor = UIManager.getColor( "Component.error.focusedBorderColor" ); - protected Color warningBorderColor = UIManager.getColor( "Component.warning.borderColor" ); - protected Color warningFocusedBorderColor = UIManager.getColor( "Component.warning.focusedBorderColor" ); - protected Color customBorderColor = UIManager.getColor( "Component.custom.borderColor" ); + @Styleable(dot=true) protected Color errorBorderColor = UIManager.getColor( "Component.error.borderColor" ); + @Styleable(dot=true) protected Color errorFocusedBorderColor = UIManager.getColor( "Component.error.focusedBorderColor" ); + @Styleable(dot=true) protected Color warningBorderColor = UIManager.getColor( "Component.warning.borderColor" ); + @Styleable(dot=true) protected Color warningFocusedBorderColor = UIManager.getColor( "Component.warning.focusedBorderColor" ); + @Styleable(dot=true) protected Color customBorderColor = UIManager.getColor( "Component.custom.borderColor" ); /** * @since TODO */ public Object applyStyleProperty( String key, Object value ) { - Object oldValue; - switch( key ) { - case "error.borderColor": oldValue = errorBorderColor; errorBorderColor = (Color) value; return oldValue; - case "error.focusedBorderColor": oldValue = errorFocusedBorderColor; errorFocusedBorderColor = (Color) value; return oldValue; - case "warning.borderColor": oldValue = warningBorderColor; warningBorderColor = (Color) value; return oldValue; - case "warning.focusedBorderColor": oldValue = warningFocusedBorderColor; warningFocusedBorderColor = (Color) value; return oldValue; - case "custom.borderColor": oldValue = customBorderColor; customBorderColor = (Color) value; return oldValue; - } - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java index 7d3e06a3..59559f5a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java @@ -25,6 +25,7 @@ import java.awt.Paint; import javax.swing.AbstractButton; import javax.swing.UIManager; import javax.swing.plaf.UIResource; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.UIScale; /** @@ -39,9 +40,9 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault Button.default.borderColor Color * @uiDefault Button.default.startBorderColor Color optional; if set, a gradient paint is used and Button.default.borderColor is ignored * @uiDefault Button.default.endBorderColor Color optional; if set, a gradient paint is used - * @uiDefault Button.default.hoverBorderColor Color optional * @uiDefault Button.default.focusedBorderColor Color * @uiDefault Button.default.focusColor Color + * @uiDefault Button.default.hoverBorderColor Color optional * @uiDefault Button.borderWidth int * @uiDefault Button.default.borderWidth int * @uiDefault Button.innerFocusWidth int or float optional; defaults to Component.innerFocusWidth @@ -54,22 +55,27 @@ import com.formdev.flatlaf.util.UIScale; public class FlatButtonBorder extends FlatBorder { - protected final Color borderColor = FlatUIUtils.getUIColor( "Button.startBorderColor", "Button.borderColor" ); - protected final Color endBorderColor = UIManager.getColor( "Button.endBorderColor" ); - protected final Color disabledBorderColor = UIManager.getColor( "Button.disabledBorderColor" ); - protected final Color focusedBorderColor = UIManager.getColor( "Button.focusedBorderColor" ); - protected final Color hoverBorderColor = UIManager.getColor( "Button.hoverBorderColor" ); - protected final Color defaultBorderColor = FlatUIUtils.getUIColor( "Button.default.startBorderColor", "Button.default.borderColor" ); - protected final Color defaultEndBorderColor = UIManager.getColor( "Button.default.endBorderColor" ); - protected final Color defaultHoverBorderColor = UIManager.getColor( "Button.default.hoverBorderColor" ); - protected final Color defaultFocusedBorderColor = UIManager.getColor( "Button.default.focusedBorderColor" ); - protected final Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" ); - protected final int borderWidth = UIManager.getInt( "Button.borderWidth" ); - protected final int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" ); - protected final float buttonInnerFocusWidth = FlatUIUtils.getUIFloat( "Button.innerFocusWidth", innerFocusWidth ); - protected final Insets toolbarMargin = UIManager.getInsets( "Button.toolbar.margin" ); - protected final Insets toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" ); - protected final int arc = UIManager.getInt( "Button.arc" ); + @Styleable protected Color borderColor = FlatUIUtils.getUIColor( "Button.startBorderColor", "Button.borderColor" ); + protected Color endBorderColor = UIManager.getColor( "Button.endBorderColor" ); + @Styleable protected Color disabledBorderColor = UIManager.getColor( "Button.disabledBorderColor" ); + @Styleable protected Color focusedBorderColor = UIManager.getColor( "Button.focusedBorderColor" ); + @Styleable protected Color hoverBorderColor = UIManager.getColor( "Button.hoverBorderColor" ); + + @Styleable(dot=true) protected Color defaultBorderColor = FlatUIUtils.getUIColor( "Button.default.startBorderColor", "Button.default.borderColor" ); + protected Color defaultEndBorderColor = UIManager.getColor( "Button.default.endBorderColor" ); + @Styleable(dot=true) protected Color defaultFocusedBorderColor = UIManager.getColor( "Button.default.focusedBorderColor" ); + @Styleable(dot=true) protected Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" ); + @Styleable(dot=true) protected Color defaultHoverBorderColor = UIManager.getColor( "Button.default.hoverBorderColor" ); + + @Styleable protected int borderWidth = UIManager.getInt( "Button.borderWidth" ); + @Styleable(dot=true) protected int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" ); + @Styleable(dot=true) protected Insets toolbarMargin = UIManager.getInsets( "Button.toolbar.margin" ); + @Styleable(dot=true) protected Insets toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" ); + @Styleable protected int arc = UIManager.getInt( "Button.arc" ); + + public FlatButtonBorder() { + innerFocusWidth = FlatUIUtils.getUIFloat( "Button.innerFocusWidth", innerFocusWidth ); + } @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { @@ -137,11 +143,6 @@ public class FlatButtonBorder return FlatToggleButtonUI.isTabButton( c ) ? 0 : super.getFocusWidth( c ); } - @Override - protected float getInnerFocusWidth( Component c ) { - return buttonInnerFocusWidth; - } - @Override protected int getBorderWidth( Component c ) { return FlatButtonUI.isDefaultButton( c ) ? defaultBorderWidth : borderWidth; 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 45b6f402..d8a0878a 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.Map; import javax.swing.AbstractButton; import javax.swing.ButtonModel; import javax.swing.Icon; @@ -39,11 +40,14 @@ import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.LookAndFeel; import javax.swing.UIManager; +import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicButtonListener; import javax.swing.plaf.basic.BasicButtonUI; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** @@ -94,7 +98,7 @@ import com.formdev.flatlaf.util.UIScale; public class FlatButtonUI extends BasicButtonUI { - protected int minimumWidth; + @Styleable protected int minimumWidth; protected int iconTextGap; protected Color background; @@ -102,38 +106,55 @@ public class FlatButtonUI protected Color startBackground; protected Color endBackground; - protected Color focusedBackground; - protected Color hoverBackground; - protected Color pressedBackground; - protected Color selectedBackground; - protected Color selectedForeground; - protected Color disabledBackground; - protected Color disabledText; - protected Color disabledSelectedBackground; + @Styleable protected Color focusedBackground; + @Styleable protected Color hoverBackground; + @Styleable protected Color pressedBackground; + @Styleable protected Color selectedBackground; + @Styleable protected Color selectedForeground; + @Styleable protected Color disabledBackground; + @Styleable protected Color disabledText; + @Styleable protected Color disabledSelectedBackground; - protected Color defaultBackground; + @Styleable(dot=true) protected Color defaultBackground; protected Color defaultEndBackground; - protected Color defaultForeground; - protected Color defaultFocusedBackground; - protected Color defaultHoverBackground; - protected Color defaultPressedBackground; - protected boolean defaultBoldText; + @Styleable(dot=true) protected Color defaultForeground; + @Styleable(dot=true) protected Color defaultFocusedBackground; + @Styleable(dot=true) protected Color defaultHoverBackground; + @Styleable(dot=true) protected Color defaultPressedBackground; + @Styleable(dot=true) protected boolean defaultBoldText; - protected int shadowWidth; - protected Color shadowColor; - protected Color defaultShadowColor; + @Styleable protected boolean paintShadow; + @Styleable protected int shadowWidth; + @Styleable protected Color shadowColor; + @Styleable(dot=true) protected Color defaultShadowColor; - protected Insets toolbarSpacingInsets; - protected Color toolbarHoverBackground; - protected Color toolbarPressedBackground; - protected Color toolbarSelectedBackground; + @Styleable(dot=true) protected Insets toolbarSpacingInsets; + @Styleable(dot=true) protected Color toolbarHoverBackground; + @Styleable(dot=true) protected Color toolbarPressedBackground; + @Styleable(dot=true) protected Color toolbarSelectedBackground; private Icon helpButtonIcon; + private final boolean shared; + private boolean borderShared = true; private boolean defaults_initialized = false; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { - return FlatUIUtils.createSharedUI( FlatButtonUI.class, FlatButtonUI::new ); + return FlatUIUtils.canUseSharedUI( c ) + ? FlatUIUtils.createSharedUI( FlatButtonUI.class, () -> new FlatButtonUI( true ) ) + : new FlatButtonUI( false ); + } + + protected FlatButtonUI( boolean shared ) { + this.shared = shared; + } + + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( (AbstractButton) c, FlatStyleSupport.getStyle( c ) ); } @Override @@ -160,16 +181,6 @@ public class FlatButtonUI disabledText = UIManager.getColor( prefix + "disabledText" ); disabledSelectedBackground = UIManager.getColor( prefix + "disabledSelectedBackground" ); - if( UIManager.getBoolean( "Button.paintShadow" ) ) { - shadowWidth = FlatUIUtils.getUIInt( "Button.shadowWidth", 2 ); - shadowColor = UIManager.getColor( "Button.shadowColor" ); - defaultShadowColor = UIManager.getColor( "Button.default.shadowColor" ); - } else { - shadowWidth = 0; - shadowColor = null; - defaultShadowColor = null; - } - defaultBackground = FlatUIUtils.getUIColor( "Button.default.startBackground", "Button.default.background" ); defaultEndBackground = UIManager.getColor( "Button.default.endBackground" ); defaultForeground = UIManager.getColor( "Button.default.foreground" ); @@ -178,6 +189,11 @@ public class FlatButtonUI defaultPressedBackground = UIManager.getColor( "Button.default.pressedBackground" ); defaultBoldText = UIManager.getBoolean( "Button.default.boldText" ); + paintShadow = UIManager.getBoolean( "Button.paintShadow" ); + shadowWidth = FlatUIUtils.getUIInt( "Button.shadowWidth", 2 ); + shadowColor = UIManager.getColor( "Button.shadowColor" ); + defaultShadowColor = UIManager.getColor( "Button.default.shadowColor" ); + toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" ); toolbarHoverBackground = UIManager.getColor( prefix + "toolbar.hoverBackground" ); toolbarPressedBackground = UIManager.getColor( prefix + "toolbar.pressedBackground" ); @@ -225,6 +241,55 @@ public class FlatButtonUI b.revalidate(); b.repaint(); break; + + case STYLE: + applyStyle( b, this, e.getNewValue() ); + break; + } + } + + private static void applyStyle( AbstractButton b, FlatButtonUI ui, Object style ) { + // unshare component UI if necessary + if( style != null && ui.shared ) { + b.updateUI(); + ui = (FlatButtonUI) b.getUI(); + } + + ui.applyStyle( b, style ); + b.revalidate(); + b.repaint(); + } + + /** + * @since TODO + */ + protected void applyStyle( AbstractButton b, Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, + (key, value) -> applyStyleProperty( b, key, value ) ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( AbstractButton b, String key, Object value ) { + try { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } catch( UnknownStyleException ex ) { + Border border = b.getBorder(); + if( border instanceof FlatBorder ) { + if( borderShared ) { + border = FlatStyleSupport.cloneBorder( border ); + b.setBorder( border ); + borderShared = false; + } + + try { + return ((FlatBorder)border).applyStyleProperty( key, value ); + } catch( UnknownStyleException ex2 ) { + // ignore + } + } + throw ex; } } @@ -336,7 +401,8 @@ public class FlatButtonUI // paint shadow Color shadowColor = def ? defaultShadowColor : this.shadowColor; - if( shadowColor != null && shadowWidth > 0 && focusWidth > 0 && c.isEnabled() && + if( paintShadow && + shadowColor != null && shadowWidth > 0 && focusWidth > 0 && c.isEnabled() && !isToolBarButton && !isBorderlessButton( c ) && !(isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c )) ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 404f9da9..763e40e4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -50,6 +50,7 @@ public class FlatStyleSupport @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Styleable { + boolean dot() default false; } /** @@ -180,14 +181,24 @@ public class FlatStyleSupport public static Object applyToAnnotatedObject( Object obj, String key, Object value ) throws UnknownStyleException, IllegalArgumentException { + String fieldName = key; + int dotIndex = key.indexOf( '.' ); + if( dotIndex >= 0 ) { + // remove first dot in key and change subsequent character to uppercase + fieldName = key.substring( 0, dotIndex ) + + Character.toUpperCase( key.charAt( dotIndex + 1 ) ) + + key.substring( dotIndex + 2 ); + } + Class cls = obj.getClass(); for(;;) { try { - Field f = cls.getDeclaredField( key ); - if( f.isAnnotationPresent( Styleable.class ) ) { + Field f = cls.getDeclaredField( fieldName ); + Styleable styleable = f.getAnnotation( Styleable.class ); + if( styleable != null && styleable.dot() == (dotIndex >= 0) ) { if( Modifier.isFinal( f.getModifiers() ) ) - throw new IllegalArgumentException( "field '" + cls.getName() + "." + key + "' is final" ); + throw new IllegalArgumentException( "field '" + cls.getName() + "." + fieldName + "' is final" ); try { // necessary to access protected fields in other packages @@ -198,7 +209,7 @@ public class FlatStyleSupport f.set( obj, value ); return oldValue; } catch( IllegalAccessException ex ) { - throw new IllegalArgumentException( "failed to access field '" + cls.getName() + "." + key + "'" ); + throw new IllegalArgumentException( "failed to access field '" + cls.getName() + "." + fieldName + "'" ); } } } catch( NoSuchFieldException ex ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java index 2d1a5f24..cc14d423 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java @@ -26,6 +26,7 @@ import javax.swing.JComponent; import javax.swing.JToggleButton; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.UIScale; /** @@ -73,17 +74,23 @@ import com.formdev.flatlaf.util.UIScale; public class FlatToggleButtonUI extends FlatButtonUI { - protected int tabUnderlineHeight; - protected Color tabUnderlineColor; - protected Color tabDisabledUnderlineColor; - protected Color tabSelectedBackground; - protected Color tabHoverBackground; - protected Color tabFocusBackground; + @Styleable(dot=true) protected int tabUnderlineHeight; + @Styleable(dot=true) protected Color tabUnderlineColor; + @Styleable(dot=true) protected Color tabDisabledUnderlineColor; + @Styleable(dot=true) protected Color tabSelectedBackground; + @Styleable(dot=true) protected Color tabHoverBackground; + @Styleable(dot=true) protected Color tabFocusBackground; private boolean defaults_initialized = false; public static ComponentUI createUI( JComponent c ) { - return FlatUIUtils.createSharedUI( FlatToggleButtonUI.class, FlatToggleButtonUI::new ); + return FlatUIUtils.canUseSharedUI( c ) + ? FlatUIUtils.createSharedUI( FlatToggleButtonUI.class, () -> new FlatToggleButtonUI( true ) ) + : new FlatToggleButtonUI( false ); + } + + protected FlatToggleButtonUI( boolean shared ) { + super( shared ); } @Override diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index c8d1501b..2a1a4170 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -19,9 +19,12 @@ package com.formdev.flatlaf.ui; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.awt.Color; +import java.awt.Insets; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; +import javax.swing.AbstractButton; +import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JEditorPane; import javax.swing.JFormattedTextField; @@ -31,6 +34,7 @@ import javax.swing.JSplitPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.JTextPane; +import javax.swing.JToggleButton; import javax.swing.UIManager; import org.junit.jupiter.api.Test; import com.formdev.flatlaf.icons.FlatCapsLockIcon; @@ -70,6 +74,51 @@ public class FlatStylingTests //---- components --------------------------------------------------------- + @Test + void button() { + FlatButtonUI ui = new FlatButtonUI( false ); + + // create border + UIManager.put( "Button.border", new FlatButtonBorder() ); + JButton b = new JButton(); + ui.installUI( b ); + + button( b, ui ); + } + + private void button( AbstractButton b, FlatButtonUI ui ) { + ui.applyStyle( b, "minimumWidth: 100" ); + + ui.applyStyle( b, "focusedBackground: #fff" ); + ui.applyStyle( b, "hoverBackground: #fff" ); + ui.applyStyle( b, "pressedBackground: #fff" ); + ui.applyStyle( b, "selectedBackground: #fff" ); + ui.applyStyle( b, "selectedForeground: #fff" ); + ui.applyStyle( b, "disabledBackground: #fff" ); + ui.applyStyle( b, "disabledText: #fff" ); + ui.applyStyle( b, "disabledSelectedBackground: #fff" ); + + ui.applyStyle( b, "default.background: #fff" ); + ui.applyStyle( b, "default.foreground: #fff" ); + ui.applyStyle( b, "default.focusedBackground: #fff" ); + ui.applyStyle( b, "default.hoverBackground: #fff" ); + ui.applyStyle( b, "default.pressedBackground: #fff" ); + ui.applyStyle( b, "default.boldText: true" ); + + ui.applyStyle( b, "paintShadow: true" ); + ui.applyStyle( b, "shadowWidth: 2" ); + ui.applyStyle( b, "shadowColor: #fff" ); + ui.applyStyle( b, "default.shadowColor: #fff" ); + + ui.applyStyle( b, "toolbar.spacingInsets: 1,2,3,4" ); + ui.applyStyle( b, "toolbar.hoverBackground: #fff" ); + ui.applyStyle( b, "toolbar.pressedBackground: #fff" ); + ui.applyStyle( b, "toolbar.selectedBackground: #fff" ); + + // border + flatButtonBorder( style -> ui.applyStyle( b, style ) ); + } + @Test void checkBox() { FlatCheckBoxUI ui = new FlatCheckBoxUI( false ); @@ -332,8 +381,48 @@ public class FlatStylingTests ui.applyStyle( "focusedBackground: #fff" ); } + @Test + void toggleButton() { + FlatToggleButtonUI ui = new FlatToggleButtonUI( false ); + + // create border + UIManager.put( "ToggleButton.border", new FlatButtonBorder() ); + JToggleButton b = new JToggleButton(); + ui.installUI( b ); + + // FlatToggleButtonUI extends FlatButtonUI + button( b, ui ); + + ui.applyStyle( b, "tab.underlineHeight: 3" ); + ui.applyStyle( b, "tab.underlineColor: #fff" ); + ui.applyStyle( b, "tab.disabledUnderlineColor: #fff" ); + ui.applyStyle( b, "tab.selectedBackground: #fff" ); + ui.applyStyle( b, "tab.hoverBackground: #fff" ); + ui.applyStyle( b, "tab.focusBackground: #fff" ); + } + //---- component borders -------------------------------------------------- + private void flatButtonBorder( Consumer applyStyle ) { + flatBorder( applyStyle ); + + applyStyle.accept( "borderColor: #fff" ); + applyStyle.accept( "disabledBorderColor: #fff" ); + applyStyle.accept( "focusedBorderColor: #fff" ); + applyStyle.accept( "hoverBorderColor: #fff" ); + + applyStyle.accept( "default.borderColor: #fff" ); + applyStyle.accept( "default.focusedBorderColor: #fff" ); + applyStyle.accept( "default.focusColor: #fff" ); + applyStyle.accept( "default.hoverBorderColor: #fff" ); + + applyStyle.accept( "borderWidth: 1" ); + applyStyle.accept( "default.borderWidth: 2" ); + applyStyle.accept( "toolbar.margin: 1,2,3,4" ); + applyStyle.accept( "toolbar.spacingInsets: 1,2,3,4" ); + applyStyle.accept( "arc: 6" ); + } + private void flatTextBorder( Consumer applyStyle ) { flatBorder( applyStyle ); @@ -358,6 +447,30 @@ public class FlatStylingTests //---- borders ------------------------------------------------------------ + @Test + void flatButtonBorder() { + FlatButtonBorder border = new FlatButtonBorder(); + + // FlatButtonBorder extends FlatBorder + flatBorder( border ); + + border.applyStyleProperty( "borderColor", Color.WHITE ); + border.applyStyleProperty( "disabledBorderColor", Color.WHITE ); + border.applyStyleProperty( "focusedBorderColor", Color.WHITE ); + border.applyStyleProperty( "hoverBorderColor", Color.WHITE ); + + border.applyStyleProperty( "default.borderColor", Color.WHITE ); + border.applyStyleProperty( "default.focusedBorderColor", Color.WHITE ); + border.applyStyleProperty( "default.focusColor", Color.WHITE ); + border.applyStyleProperty( "default.hoverBorderColor", Color.WHITE ); + + border.applyStyleProperty( "borderWidth", 1 ); + border.applyStyleProperty( "default.borderWidth", 2 ); + border.applyStyleProperty( "toolbar.margin", new Insets( 1, 2, 3, 4 ) ); + border.applyStyleProperty( "toolbar.spacingInsets", new Insets( 1, 2, 3, 4 ) ); + border.applyStyleProperty( "arc", 6 ); + } + @Test void flatTextBorder() { FlatTextBorder border = new FlatTextBorder(); From 20027c2db7a83d434823f676e963a3e9354159ed Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sat, 19 Jun 2021 22:56:16 +0200 Subject: [PATCH 19/60] Styling: support platform and light/dark theme specific styling with key prefixes `[win]`, `[mac]`, `[linux]`, `[light]` and `[dark]` e.g. `mySlider.putClientProperty( "FlatLaf.style", "[light]trackColor: #00f; [dark]trackColor: #f00" );` --- .../com/formdev/flatlaf/ui/FlatStyleSupport.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 763e40e4..3fb6b7de 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -33,6 +33,7 @@ import javax.swing.border.Border; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.StringUtils; +import com.formdev.flatlaf.util.SystemInfo; /** * Support for styling components in CSS syntax. @@ -109,6 +110,19 @@ public class FlatStyleSupport String key = e.getKey(); Object newValue = e.getValue(); + if( key.startsWith( "[" ) ) { + if( (SystemInfo.isWindows && key.startsWith( "[win]" )) || + (SystemInfo.isMacOS && key.startsWith( "[mac]" )) || + (SystemInfo.isLinux && key.startsWith( "[linux]" )) || + (key.startsWith( "[light]" ) && !FlatLaf.isLafDark()) || + (key.startsWith( "[dark]" ) && FlatLaf.isLafDark()) ) + { + // prefix is known and enabled --> remove prefix + key = key.substring( key.indexOf( ']' ) + 1 ); + } else + continue; + } + Object oldValue = applyProperty.apply( key, newValue ); oldValues.put( key, oldValue ); } From 28fb2e2a0845c288c8dc89c042afd7d39933bd03 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 21 Jun 2021 17:24:45 +0200 Subject: [PATCH 20/60] Styling: support Menu, MenuItem, CheckBoxMenuItem and RadioButtonMenuItem --- .../icons/FlatCheckBoxMenuItemIcon.java | 15 +- .../flatlaf/icons/FlatMenuArrowIcon.java | 19 ++- .../flatlaf/ui/FlatCheckBoxMenuItemUI.java | 36 +++++ .../flatlaf/ui/FlatMenuItemRenderer.java | 85 ++++++++-- .../formdev/flatlaf/ui/FlatMenuItemUI.java | 49 ++++++ .../com/formdev/flatlaf/ui/FlatMenuUI.java | 36 +++++ .../flatlaf/ui/FlatRadioButtonMenuItemUI.java | 36 +++++ .../formdev/flatlaf/ui/FlatStyleSupport.java | 55 ++++++- .../formdev/flatlaf/ui/FlatStylingTests.java | 150 ++++++++++++++++-- 9 files changed, 435 insertions(+), 46 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java index 501602b6..97c76300 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java @@ -24,6 +24,8 @@ import java.awt.geom.Path2D; import javax.swing.AbstractButton; import javax.swing.JMenuItem; import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatStyleSupport; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Icon for {@link javax.swing.JCheckBoxMenuItem}. @@ -38,14 +40,21 @@ import javax.swing.UIManager; public class FlatCheckBoxMenuItemIcon extends FlatAbstractIcon { - protected final Color checkmarkColor = UIManager.getColor( "MenuItemCheckBox.icon.checkmarkColor" ); - protected final Color disabledCheckmarkColor = UIManager.getColor( "MenuItemCheckBox.icon.disabledCheckmarkColor" ); - protected final Color selectionForeground = UIManager.getColor( "MenuItem.selectionForeground" ); + @Styleable protected Color checkmarkColor = UIManager.getColor( "MenuItemCheckBox.icon.checkmarkColor" ); + @Styleable protected Color disabledCheckmarkColor = UIManager.getColor( "MenuItemCheckBox.icon.disabledCheckmarkColor" ); + @Styleable protected Color selectionForeground = UIManager.getColor( "MenuItem.selectionForeground" ); public FlatCheckBoxMenuItemIcon() { super( 15, 15, null ); } + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override protected void paintIcon( Component c, Graphics2D g2 ) { boolean selected = (c instanceof AbstractButton) && ((AbstractButton)c).isSelected(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java index 2afb8faf..b71e5c53 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java @@ -23,7 +23,9 @@ import java.awt.Graphics2D; import java.awt.geom.Path2D; import javax.swing.JMenu; import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatStyleSupport; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * "arrow" icon for {@link javax.swing.JMenu}. @@ -39,22 +41,29 @@ import com.formdev.flatlaf.ui.FlatUIUtils; public class FlatMenuArrowIcon extends FlatAbstractIcon { - protected final boolean chevron = FlatUIUtils.isChevron( UIManager.getString( "Component.arrowType" ) ); - protected final Color arrowColor = UIManager.getColor( "Menu.icon.arrowColor" ); - protected final Color disabledArrowColor = UIManager.getColor( "Menu.icon.disabledArrowColor" ); - protected final Color selectionForeground = UIManager.getColor( "Menu.selectionForeground" ); + @Styleable protected String arrowType = UIManager.getString( "Component.arrowType" ); + @Styleable protected Color arrowColor = UIManager.getColor( "Menu.icon.arrowColor" ); + @Styleable protected Color disabledArrowColor = UIManager.getColor( "Menu.icon.disabledArrowColor" ); + @Styleable protected Color selectionForeground = UIManager.getColor( "Menu.selectionForeground" ); public FlatMenuArrowIcon() { super( 6, 10, null ); } + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override protected void paintIcon( Component c, Graphics2D g ) { if( !c.getComponentOrientation().isLeftToRight() ) g.rotate( Math.toRadians( 180 ), width / 2., height / 2. ); g.setColor( getArrowColor( c ) ); - if( chevron ) { + if( FlatUIUtils.isChevron( arrowType ) ) { // chevron arrow Path2D path = FlatUIUtils.createPath( false, 1,1, 5,5, 1,9 ); g.setStroke( new BasicStroke( 1f ) ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java index 5bcb2f88..08bbd167 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java @@ -18,11 +18,14 @@ package com.formdev.flatlaf.ui; import java.awt.Dimension; import java.awt.Graphics; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JCheckBoxMenuItem}. @@ -56,11 +59,19 @@ public class FlatCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI { private FlatMenuItemRenderer renderer; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatCheckBoxMenuItemUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( menuItem ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -81,6 +92,31 @@ public class FlatCheckBoxMenuItemUI return new FlatMenuItemRenderer( menuItem, checkIcon, arrowIcon, acceleratorFont, acceleratorDelimiter ); } + @Override + protected PropertyChangeListener createPropertyChangeListener( JComponent c ) { + return FlatStyleSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + try { + return renderer.applyStyleProperty( key, value ); + } catch ( UnknownStyleException ex ) { + // ignore + } + + return FlatMenuItemUI.applyStyleProperty( this, key, value ); + } + @Override protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) { return renderer.getPreferredMenuItemSize(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java index 3d4deb21..79580de1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java @@ -39,6 +39,10 @@ import javax.swing.UIManager; import javax.swing.plaf.basic.BasicHTML; import javax.swing.text.View; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon; +import com.formdev.flatlaf.icons.FlatMenuArrowIcon; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.DerivedColor; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; @@ -57,33 +61,32 @@ import com.formdev.flatlaf.util.SystemInfo; * @uiDefault MenuItem.underlineSelectionCheckBackground Color * @uiDefault MenuItem.underlineSelectionColor Color * @uiDefault MenuItem.underlineSelectionHeight int - * @uiDefault MenuItem.selectionBackground Color * * @author Karl Tauber */ public class FlatMenuItemRenderer { protected final JMenuItem menuItem; - protected final Icon checkIcon; - protected final Icon arrowIcon; + protected Icon checkIcon; + protected Icon arrowIcon; protected final Font acceleratorFont; protected final String acceleratorDelimiter; - protected final int minimumWidth = UIManager.getInt( "MenuItem.minimumWidth" ); - protected final Dimension minimumIconSize; - protected final int textAcceleratorGap = FlatUIUtils.getUIInt( "MenuItem.textAcceleratorGap", 28 ); - protected final int textNoAcceleratorGap = FlatUIUtils.getUIInt( "MenuItem.textNoAcceleratorGap", 6 ); - protected final int acceleratorArrowGap = FlatUIUtils.getUIInt( "MenuItem.acceleratorArrowGap", 2 ); + @Styleable protected int minimumWidth = UIManager.getInt( "MenuItem.minimumWidth" ); + @Styleable protected Dimension minimumIconSize; + @Styleable protected int textAcceleratorGap = FlatUIUtils.getUIInt( "MenuItem.textAcceleratorGap", 28 ); + @Styleable protected int textNoAcceleratorGap = FlatUIUtils.getUIInt( "MenuItem.textNoAcceleratorGap", 6 ); + @Styleable protected int acceleratorArrowGap = FlatUIUtils.getUIInt( "MenuItem.acceleratorArrowGap", 2 ); - protected final Color checkBackground = UIManager.getColor( "MenuItem.checkBackground" ); - protected final Insets checkMargins = UIManager.getInsets( "MenuItem.checkMargins" ); + @Styleable protected Color checkBackground = UIManager.getColor( "MenuItem.checkBackground" ); + @Styleable protected Insets checkMargins = UIManager.getInsets( "MenuItem.checkMargins" ); - protected final Color underlineSelectionBackground = UIManager.getColor( "MenuItem.underlineSelectionBackground" ); - protected final Color underlineSelectionCheckBackground = UIManager.getColor( "MenuItem.underlineSelectionCheckBackground" ); - protected final Color underlineSelectionColor = UIManager.getColor( "MenuItem.underlineSelectionColor" ); - protected final int underlineSelectionHeight = UIManager.getInt( "MenuItem.underlineSelectionHeight" ); + @Styleable protected Color underlineSelectionBackground = UIManager.getColor( "MenuItem.underlineSelectionBackground" ); + @Styleable protected Color underlineSelectionCheckBackground = UIManager.getColor( "MenuItem.underlineSelectionCheckBackground" ); + @Styleable protected Color underlineSelectionColor = UIManager.getColor( "MenuItem.underlineSelectionColor" ); + @Styleable protected int underlineSelectionHeight = UIManager.getInt( "MenuItem.underlineSelectionHeight" ); - protected final Color selectionBackground = UIManager.getColor( "MenuItem.selectionBackground" ); + private boolean iconsShared = true; protected FlatMenuItemRenderer( JMenuItem menuItem, Icon checkIcon, Icon arrowIcon, Font acceleratorFont, String acceleratorDelimiter ) @@ -98,6 +101,54 @@ public class FlatMenuItemRenderer this.minimumIconSize = (minimumIconSize != null) ? minimumIconSize : new Dimension( 16, 16 ); } + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + // style icon + if( key.startsWith( "icon." ) || key.equals( "selectionForeground" ) ) { + if( iconsShared ) { + if( checkIcon instanceof FlatCheckBoxMenuItemIcon ) + checkIcon = FlatStyleSupport.cloneIcon( checkIcon ); + if( arrowIcon instanceof FlatMenuArrowIcon ) + arrowIcon = FlatStyleSupport.cloneIcon( arrowIcon ); + iconsShared = false; + } + + if( key.startsWith( "icon." ) ) { + String key2 = key.substring( "icon.".length() ); + + try { + if( checkIcon instanceof FlatCheckBoxMenuItemIcon ) + return ((FlatCheckBoxMenuItemIcon)checkIcon).applyStyleProperty( key2, value ); + } catch ( UnknownStyleException ex ) { + // ignore + } + + try { + if( arrowIcon instanceof FlatMenuArrowIcon ) + return ((FlatMenuArrowIcon)arrowIcon).applyStyleProperty( key2, value ); + } catch ( UnknownStyleException ex ) { + // ignore + } + + // keys with prefix "icon." are only for icons + throw new UnknownStyleException( key ); + } else if( key.equals( "selectionForeground" ) ) { + // special case: same key is used in icons and in menuitem + if( checkIcon instanceof FlatCheckBoxMenuItemIcon ) + ((FlatCheckBoxMenuItemIcon)checkIcon).applyStyleProperty( key, value ); + if( arrowIcon instanceof FlatMenuArrowIcon ) + ((FlatMenuArrowIcon)arrowIcon).applyStyleProperty( key, value ); + + // throw exception because the caller should also apply this key + throw new UnknownStyleException( key ); + } + } + + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + protected Dimension getPreferredMenuItemSize() { int width = 0; int height = 0; @@ -254,7 +305,7 @@ debug*/ paintBackground( g, underlineSelection ? underlineSelectionBackground : selectionBackground ); if( underlineSelection && isArmedOrSelected( menuItem ) ) paintUnderlineSelection( g, underlineSelectionColor, underlineSelectionHeight ); - paintIcon( g, iconRect, getIconForPainting(), underlineSelection ? underlineSelectionCheckBackground : checkBackground ); + paintIcon( g, iconRect, getIconForPainting(), underlineSelection ? underlineSelectionCheckBackground : checkBackground, selectionBackground ); paintText( g, textRect, menuItem.getText(), selectionForeground, disabledForeground ); paintAccelerator( g, accelRect, getAcceleratorText(), acceleratorForeground, acceleratorSelectionForeground, disabledForeground ); if( !isTopLevelMenu( menuItem ) ) @@ -301,7 +352,7 @@ debug*/ return FlatUIUtils.deriveColor( background, baseColor ); } - protected void paintIcon( Graphics g, Rectangle iconRect, Icon icon, Color checkBackground ) { + protected void paintIcon( Graphics g, Rectangle iconRect, Icon icon, Color checkBackground, Color selectionBackground ) { // if checkbox/radiobutton menu item is selected and also has a custom icon, // then use filled icon background to indicate selection (instead of using checkIcon) if( menuItem.isSelected() && checkIcon != null && icon != checkIcon ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java index 78ae0d9e..db500433 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java @@ -18,11 +18,14 @@ package com.formdev.flatlaf.ui; import java.awt.Dimension; import java.awt.Graphics; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicMenuItemUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JMenuItem}. @@ -56,11 +59,19 @@ public class FlatMenuItemUI extends BasicMenuItemUI { private FlatMenuItemRenderer renderer; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatMenuItemUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( menuItem ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -81,6 +92,44 @@ public class FlatMenuItemUI return new FlatMenuItemRenderer( menuItem, checkIcon, arrowIcon, acceleratorFont, acceleratorDelimiter ); } + @Override + protected PropertyChangeListener createPropertyChangeListener( JComponent c ) { + return FlatStyleSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + try { + return renderer.applyStyleProperty( key, value ); + } catch ( UnknownStyleException ex ) { + // ignore + } + + return applyStyleProperty( this, key, value ); + } + + static Object applyStyleProperty( BasicMenuItemUI ui, String key, Object value ) { + switch( key ) { + case "selectionBackground": + case "selectionForeground": + case "disabledForeground": + case "acceleratorForeground": + case "acceleratorSelectionForeground": + return FlatStyleSupport.applyToField( ui, key, key, value ); + + default: throw new UnknownStyleException( key ); + } + } + @Override protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) { return renderer.getPreferredMenuItemSize(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index 8f80c6c2..cc5366b4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -21,6 +21,8 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.event.MouseEvent; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.ButtonModel; import javax.swing.Icon; import javax.swing.JComponent; @@ -31,6 +33,7 @@ import javax.swing.UIManager; import javax.swing.event.MouseInputListener; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicMenuUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JMenu}. @@ -75,11 +78,19 @@ public class FlatMenuUI { private Color hoverBackground; private FlatMenuItemRenderer renderer; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatMenuUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( menuItem ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -129,6 +140,31 @@ public class FlatMenuUI }; } + @Override + protected PropertyChangeListener createPropertyChangeListener( JComponent c ) { + return FlatStyleSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + try { + return renderer.applyStyleProperty( key, value ); + } catch ( UnknownStyleException ex ) { + // ignore + } + + return FlatMenuItemUI.applyStyleProperty( this, key, value ); + } + @Override public Dimension getMinimumSize( JComponent c ) { // avoid that top-level menus (in menu bar) are made smaller if horizontal space is rare diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java index 5f65012c..1908f4ec 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java @@ -18,11 +18,14 @@ package com.formdev.flatlaf.ui; import java.awt.Dimension; import java.awt.Graphics; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JRadioButtonMenuItem}. @@ -56,11 +59,19 @@ public class FlatRadioButtonMenuItemUI extends BasicRadioButtonMenuItemUI { private FlatMenuItemRenderer renderer; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatRadioButtonMenuItemUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( menuItem ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -81,6 +92,31 @@ public class FlatRadioButtonMenuItemUI return new FlatMenuItemRenderer( menuItem, checkIcon, arrowIcon, acceleratorFont, acceleratorDelimiter ); } + @Override + protected PropertyChangeListener createPropertyChangeListener( JComponent c ) { + return FlatStyleSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + try { + return renderer.applyStyleProperty( key, value ); + } catch ( UnknownStyleException ex ) { + // ignore + } + + return FlatMenuItemUI.applyStyleProperty( this, key, value ); + } + @Override protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) { return renderer.getPreferredMenuItemSize(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 3fb6b7de..23ad2c3f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -16,6 +16,7 @@ package com.formdev.flatlaf.ui; +import java.beans.PropertyChangeListener; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -26,6 +27,8 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Predicate; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.UIManager; @@ -204,13 +207,38 @@ public class FlatStyleSupport + key.substring( dotIndex + 2 ); } + return applyToField( obj, fieldName, key, value, field -> { + Styleable styleable = field.getAnnotation( Styleable.class ); + return styleable != null && styleable.dot() == (dotIndex >= 0); + } ); + } + + /** + * Applies the given value to a field of the given object. + * + * @param obj the object + * @param fieldName the name of the field + * @param key the key (only used for error reporting) + * @param value the new value + * @return the old value of the field + * @throws UnknownStyleException if object does not have a field with given name + * @throws IllegalArgumentException if value type does not fit to expected type  + */ + static Object applyToField( Object obj, String fieldName, String key, Object value ) + throws UnknownStyleException, IllegalArgumentException + { + return applyToField( obj, fieldName, key, value, null ); + } + + private static Object applyToField( Object obj, String fieldName, String key, Object value, Predicate predicate ) + throws UnknownStyleException, IllegalArgumentException + { Class cls = obj.getClass(); for(;;) { try { Field f = cls.getDeclaredField( fieldName ); - Styleable styleable = f.getAnnotation( Styleable.class ); - if( styleable != null && styleable.dot() == (dotIndex >= 0) ) { + if( predicate == null || predicate.test( f ) ) { if( Modifier.isFinal( f.getModifiers() ) ) throw new IllegalArgumentException( "field '" + cls.getName() + "." + fieldName + "' is final" ); @@ -234,9 +262,11 @@ public class FlatStyleSupport if( cls == null ) throw new UnknownStyleException( key ); - String superclassName = cls.getName(); - if( superclassName.startsWith( "java." ) || superclassName.startsWith( "javax." ) ) - throw new UnknownStyleException( key ); + if( predicate != null ) { + String superclassName = cls.getName(); + if( superclassName.startsWith( "java." ) || superclassName.startsWith( "javax." ) ) + throw new UnknownStyleException( key ); + } } } @@ -244,6 +274,21 @@ public class FlatStyleSupport return c.getClientProperty( FlatClientProperties.STYLE ); } + static PropertyChangeListener createPropertyChangeListener( JComponent c, + Consumer applyStyle, PropertyChangeListener superListener ) + { + return e -> { + if( superListener != null ) + superListener.propertyChange( e ); + + if( FlatClientProperties.STYLE.equals( e.getPropertyName() ) ) { + applyStyle.accept( e.getNewValue() ); + c.revalidate(); + c.repaint(); + } + }; + } + static Border cloneBorder( Border border ) { Class borderClass = border.getClass(); try { diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 2a1a4170..96086f48 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -23,23 +23,9 @@ import java.awt.Insets; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; -import javax.swing.AbstractButton; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JEditorPane; -import javax.swing.JFormattedTextField; -import javax.swing.JPasswordField; -import javax.swing.JRadioButton; -import javax.swing.JSplitPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.JTextPane; -import javax.swing.JToggleButton; -import javax.swing.UIManager; +import javax.swing.*; import org.junit.jupiter.api.Test; -import com.formdev.flatlaf.icons.FlatCapsLockIcon; -import com.formdev.flatlaf.icons.FlatCheckBoxIcon; -import com.formdev.flatlaf.icons.FlatRadioButtonIcon; +import com.formdev.flatlaf.icons.*; /** * @author Karl Tauber @@ -157,6 +143,95 @@ public class FlatStylingTests textField( ui ); } + @Test + void menu() { + UIManager.put( "Menu.arrowIcon", new FlatMenuArrowIcon() ); + UIManager.put( "Menu.checkIcon", null ); + FlatMenuUI ui = new FlatMenuUI(); + ui.installUI( new JMenu() ); + + Consumer applyStyle = style -> ui.applyStyle( style ); + menuItem( applyStyle ); + menuItem_arrowIcon( applyStyle ); + } + + @Test + void menuItem() { + UIManager.put( "MenuItem.arrowIcon", new FlatMenuItemArrowIcon() ); + UIManager.put( "MenuItem.checkIcon", null ); + FlatMenuItemUI ui = new FlatMenuItemUI(); + ui.installUI( new JMenuItem() ); + + Consumer applyStyle = style -> ui.applyStyle( style ); + menuItem( applyStyle ); + menuItem_arrowIcon( applyStyle ); + } + + @Test + void checkBoxMenuItem() { + UIManager.put( "CheckBoxMenuItem.arrowIcon", new FlatMenuItemArrowIcon() ); + UIManager.put( "CheckBoxMenuItem.checkIcon", new FlatCheckBoxMenuItemIcon() ); + FlatCheckBoxMenuItemUI ui = new FlatCheckBoxMenuItemUI(); + ui.installUI( new JCheckBoxMenuItem() ); + + Consumer applyStyle = style -> ui.applyStyle( style ); + menuItem( applyStyle ); + menuItem_arrowIcon( applyStyle ); + menuItem_checkIcon( applyStyle ); + } + + @Test + void radioButtonMenuItem() { + UIManager.put( "RadioButtonMenuItem.arrowIcon", new FlatMenuItemArrowIcon() ); + UIManager.put( "RadioButtonMenuItem.checkIcon", new FlatRadioButtonMenuItemIcon() ); + FlatRadioButtonMenuItemUI ui = new FlatRadioButtonMenuItemUI(); + ui.installUI( new JRadioButtonMenuItem() ); + + Consumer applyStyle = style -> ui.applyStyle( style ); + menuItem( applyStyle ); + menuItem_arrowIcon( applyStyle ); + menuItem_checkIcon( applyStyle ); + } + + private void menuItem( Consumer applyStyle ) { + applyStyle.accept( "selectionBackground: #fff" ); + applyStyle.accept( "selectionForeground: #fff" ); + applyStyle.accept( "disabledForeground: #fff" ); + applyStyle.accept( "acceleratorForeground: #fff" ); + applyStyle.accept( "acceleratorSelectionForeground: #fff" ); + + menuItemRenderer( applyStyle ); + } + + private void menuItemRenderer( Consumer applyStyle ) { + applyStyle.accept( "minimumWidth: 10" ); + applyStyle.accept( "minimumIconSize: 16,16" ); + applyStyle.accept( "textAcceleratorGap: 28" ); + applyStyle.accept( "textNoAcceleratorGap: 6" ); + applyStyle.accept( "acceleratorArrowGap: 2" ); + + applyStyle.accept( "checkBackground: #fff" ); + applyStyle.accept( "checkMargins: 1,2,3,4" ); + + applyStyle.accept( "underlineSelectionBackground: #fff" ); + applyStyle.accept( "underlineSelectionCheckBackground: #fff" ); + applyStyle.accept( "underlineSelectionColor: #fff" ); + applyStyle.accept( "underlineSelectionHeight: 3" ); + } + + private void menuItem_checkIcon( Consumer applyStyle ) { + applyStyle.accept( "icon.checkmarkColor: #fff" ); + applyStyle.accept( "icon.disabledCheckmarkColor: #fff" ); + applyStyle.accept( "icon.selectionForeground: #fff" ); + } + + private void menuItem_arrowIcon( Consumer applyStyle ) { + applyStyle.accept( "icon.arrowType: chevron" ); + applyStyle.accept( "icon.arrowColor: #fff" ); + applyStyle.accept( "icon.disabledArrowColor: #fff" ); + applyStyle.accept( "selectionForeground: #fff" ); + } + @Test void passwordField() { FlatPasswordFieldUI ui = new FlatPasswordFieldUI(); @@ -556,4 +631,47 @@ public class FlatStylingTests icon.applyStyleProperty( "pressedBackground", Color.WHITE ); icon.applyStyleProperty( "selectedPressedBackground", Color.WHITE ); } + + @Test + void flatCheckBoxMenuItemIcon() { + FlatCheckBoxMenuItemIcon icon = new FlatCheckBoxMenuItemIcon(); + + flatCheckBoxMenuItemIcon( icon ); + } + + @Test + void flatRadioButtonMenuItemIcon() { + FlatRadioButtonMenuItemIcon icon = new FlatRadioButtonMenuItemIcon(); + + // FlatRadioButtonMenuItemIcon extends FlatCheckBoxMenuItemIcon + flatCheckBoxMenuItemIcon( icon ); + } + + private void flatCheckBoxMenuItemIcon( FlatCheckBoxMenuItemIcon icon ) { + icon.applyStyleProperty( "checkmarkColor", Color.WHITE ); + icon.applyStyleProperty( "disabledCheckmarkColor", Color.WHITE ); + icon.applyStyleProperty( "selectionForeground", Color.WHITE ); + } + + @Test + void flatMenuArrowIcon() { + FlatMenuArrowIcon icon = new FlatMenuArrowIcon(); + + flatMenuArrowIcon( icon ); + } + + @Test + void flatMenuItemArrowIcon() { + FlatMenuItemArrowIcon icon = new FlatMenuItemArrowIcon(); + + // FlatMenuItemArrowIcon extends FlatMenuArrowIcon + flatMenuArrowIcon( icon ); + } + + private void flatMenuArrowIcon( FlatMenuArrowIcon icon ) { + icon.applyStyleProperty( "arrowType", "chevron" ); + icon.applyStyleProperty( "arrowColor", Color.WHITE ); + icon.applyStyleProperty( "disabledArrowColor", Color.WHITE ); + icon.applyStyleProperty( "selectionForeground", Color.WHITE ); + } } From b46233087bf536ff9861c5a8d7b1276ed5566e48 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 21 Jun 2021 17:27:46 +0200 Subject: [PATCH 21/60] Styling: use FlatStyleSupport.createPropertyChangeListener() where possible/useful --- .../com/formdev/flatlaf/ui/FlatSeparatorUI.java | 12 ++---------- .../java/com/formdev/flatlaf/ui/FlatSliderUI.java | 15 ++------------- .../com/formdev/flatlaf/ui/FlatSplitPaneUI.java | 11 +---------- 3 files changed, 5 insertions(+), 33 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index d84d82b8..9529f046 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -28,7 +28,6 @@ import javax.swing.JSeparator; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSeparatorUI; -import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** @@ -107,15 +106,8 @@ public class FlatSeparatorUI protected void installListeners( JSeparator s ) { super.installListeners( s ); - propertyChangeListener = e -> { - switch( e.getPropertyName() ) { - case FlatClientProperties.STYLE: - applyStyle( s, this, e.getNewValue() ); - s.revalidate(); - s.repaint(); - break; - } - }; + propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( + s, style -> applyStyle( s, this, style ), null ); s.addPropertyChangeListener( propertyChangeListener ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index dbd2d24e..b382e94c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -36,7 +36,6 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSliderUI; -import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; @@ -185,18 +184,8 @@ public class FlatSliderUI @Override protected PropertyChangeListener createPropertyChangeListener( JSlider slider ) { - PropertyChangeListener superListener = super.createPropertyChangeListener( slider ); - return e -> { - superListener.propertyChange( e ); - - switch( e.getPropertyName() ) { - case FlatClientProperties.STYLE: - applyStyle( e.getNewValue() ); - slider.revalidate(); - slider.repaint(); - break; - } - }; + return FlatStyleSupport.createPropertyChangeListener( slider, this::applyStyle, + super.createPropertyChangeListener( slider ) ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 0b56b0d3..0ef83595 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -34,7 +34,6 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; -import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; @@ -117,15 +116,7 @@ public class FlatSplitPaneUI protected void installListeners() { super.installListeners(); - propertyChangeListener = e -> { - switch( e.getPropertyName() ) { - case FlatClientProperties.STYLE: - applyStyle( e.getNewValue() ); - splitPane.revalidate(); - splitPane.repaint(); - break; - } - }; + propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( splitPane, this::applyStyle, null ); splitPane.addPropertyChangeListener( propertyChangeListener ); } From 14b06507cb6c57242179a96bcc02f37cca097796 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 21 Jun 2021 19:08:41 +0200 Subject: [PATCH 22/60] Styling: support Spinner --- .../com/formdev/flatlaf/UIDefaultsLoader.java | 7 +- .../com/formdev/flatlaf/ui/FlatSpinnerUI.java | 76 ++++++++++++++----- .../formdev/flatlaf/ui/FlatStylingTests.java | 23 ++++++ 3 files changed, 86 insertions(+), 20 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java index 7ef295a0..38ecb4ec 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -351,14 +351,15 @@ class UIDefaultsLoader valueType = ValueType.STRING; else if( key.endsWith( "Color" ) || (key.endsWith( "ground" ) && - (key.endsWith( ".background" ) || key.endsWith( "Background" ) || - key.endsWith( ".foreground" ) || key.endsWith( "Foreground" ))) ) + (key.endsWith( ".background" ) || key.endsWith( "Background" ) || key.equals( "background" ) || + key.endsWith( ".foreground" ) || key.endsWith( "Foreground" ) || key.equals( "foreground" ))) ) valueType = ValueType.COLOR; else if( key.endsWith( ".border" ) || key.endsWith( "Border" ) ) valueType = ValueType.BORDER; else if( key.endsWith( ".icon" ) || key.endsWith( "Icon" ) ) valueType = ValueType.ICON; - else if( key.endsWith( ".margin" ) || key.endsWith( ".padding" ) || + else if( key.endsWith( ".margin" ) || key.equals( "margin" ) || + key.endsWith( ".padding" ) || key.equals( "padding" ) || key.endsWith( "Margins" ) || key.endsWith( "Insets" ) ) valueType = ValueType.INSETS; else if( key.endsWith( "Size" ) ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index a341d0a9..a8efa036 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -32,6 +32,7 @@ import java.awt.event.FocusListener; import java.awt.geom.Rectangle2D; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.JComponent; import javax.swing.JSpinner; import javax.swing.JTextField; @@ -42,6 +43,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicSpinnerUI; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JSpinner}. @@ -81,26 +83,35 @@ public class FlatSpinnerUI { private Handler handler; - protected int minimumWidth; - protected String buttonStyle; - protected String arrowType; + @Styleable protected int minimumWidth; + @Styleable protected String buttonStyle; + @Styleable protected String arrowType; protected boolean isIntelliJTheme; - protected Color borderColor; - protected Color disabledBorderColor; - protected Color disabledBackground; - protected Color disabledForeground; - protected Color focusedBackground; - protected Color buttonBackground; - protected Color buttonArrowColor; - protected Color buttonDisabledArrowColor; - protected Color buttonHoverArrowColor; - protected Color buttonPressedArrowColor; - protected Insets padding; + @Styleable protected Color borderColor; + @Styleable protected Color disabledBorderColor; + @Styleable protected Color disabledBackground; + @Styleable protected Color disabledForeground; + @Styleable protected Color focusedBackground; + @Styleable protected Color buttonBackground; + @Styleable protected Color buttonArrowColor; + @Styleable protected Color buttonDisabledArrowColor; + @Styleable protected Color buttonHoverArrowColor; + @Styleable protected Color buttonPressedArrowColor; + @Styleable protected Insets padding; + + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatSpinnerUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( spinner ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -123,9 +134,6 @@ public class FlatSpinnerUI buttonPressedArrowColor = UIManager.getColor( "Spinner.buttonPressedArrowColor" ); padding = UIManager.getInsets( "Spinner.padding" ); - // scale - padding = scale( padding ); - MigLayoutVisualPadding.install( spinner ); } @@ -145,6 +153,8 @@ public class FlatSpinnerUI buttonPressedArrowColor = null; padding = null; + oldStyleValues = null; + MigLayoutVisualPadding.uninstall( spinner ); } @@ -174,6 +184,21 @@ public class FlatSpinnerUI return handler; } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + updateArrowButtons(); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override protected JComponent createEditor() { JComponent editor = super.createEditor(); @@ -284,6 +309,15 @@ public class FlatSpinnerUI return button; } + private void updateArrowButtons() { + for( Component c : spinner.getComponents() ) { + if( c instanceof FlatArrowButton ) { + ((FlatArrowButton)c).update( arrowType, buttonArrowColor, + buttonDisabledArrowColor, buttonHoverArrowColor, null, buttonPressedArrowColor, null ); + } + } + } + @Override public void update( Graphics g, JComponent c ) { float focusWidth = FlatUIUtils.getBorderFocusWidth( c ); @@ -370,6 +404,7 @@ public class FlatSpinnerUI @Override public Dimension preferredLayoutSize( Container parent ) { Insets insets = parent.getInsets(); + Insets padding = scale( FlatSpinnerUI.this.padding ); Dimension editorSize = (editor != null) ? editor.getPreferredSize() : new Dimension( 0, 0 ); // the arrows width is the same as the inner height so that the arrows area is square @@ -390,6 +425,7 @@ public class FlatSpinnerUI public void layoutContainer( Container parent ) { Dimension size = parent.getSize(); Insets insets = parent.getInsets(); + Insets padding = scale( FlatSpinnerUI.this.padding ); Rectangle r = FlatUIUtils.subtractInsets( new Rectangle( size ), insets ); if( nextButton == null && previousButton == null ) { @@ -465,6 +501,12 @@ public class FlatSpinnerUI case FlatClientProperties.MINIMUM_WIDTH: spinner.revalidate(); break; + + case FlatClientProperties.STYLE: + applyStyle( e.getNewValue() ); + spinner.revalidate(); + spinner.repaint(); + break; } } } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 96086f48..03b18f91 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -389,6 +389,29 @@ public class FlatStylingTests ui.applyStyle( "tickColor: #fff" ); } + @Test + void spinner() { + FlatSpinnerUI ui = new FlatSpinnerUI(); + + // create arrow buttons + ui.installUI( new JSpinner() ); + + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "buttonStyle: button" ); + ui.applyStyle( "arrowType: chevron" ); + ui.applyStyle( "borderColor: #fff" ); + ui.applyStyle( "disabledBorderColor: #fff" ); + ui.applyStyle( "disabledBackground: #fff" ); + ui.applyStyle( "disabledForeground: #fff" ); + ui.applyStyle( "focusedBackground: #fff" ); + ui.applyStyle( "buttonBackground: #fff" ); + ui.applyStyle( "buttonArrowColor: #fff" ); + ui.applyStyle( "buttonDisabledArrowColor: #fff" ); + ui.applyStyle( "buttonHoverArrowColor: #fff" ); + ui.applyStyle( "buttonPressedArrowColor: #fff" ); + ui.applyStyle( "padding: 1,2,3,4" ); + } + @Test void splitPane() { FlatSplitPaneUI ui = new FlatSplitPaneUI(); From 24a9fa1ccc4dde5dce5f99ceae28c41a060d1594 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 21 Jun 2021 20:49:31 +0200 Subject: [PATCH 23/60] Styling: renamed "update" methods --- .../java/com/formdev/flatlaf/ui/FlatArrowButton.java | 4 ++-- .../java/com/formdev/flatlaf/ui/FlatScrollBarUI.java | 8 ++++---- .../java/com/formdev/flatlaf/ui/FlatSpinnerUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java | 12 ++++++------ 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java index 0d2564da..288ef851 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java @@ -58,7 +58,7 @@ public class FlatArrowButton Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground ) { super( direction, Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE ); - update( type, foreground, disabledForeground, hoverForeground, hoverBackground, + updateStyle( type, foreground, disabledForeground, hoverForeground, hoverBackground, pressedForeground, pressedBackground ); setOpaque( false ); @@ -98,7 +98,7 @@ public class FlatArrowButton /** * @since TODO */ - public void update( String type, Color foreground, Color disabledForeground, + public void updateStyle( String type, Color foreground, Color disabledForeground, Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground ) { this.chevron = FlatUIUtils.isChevron( type ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index 98cae5a3..9da99902 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -222,9 +222,9 @@ public class FlatScrollBarUI oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); if( incrButton instanceof FlatScrollBarButton ) - ((FlatScrollBarButton)incrButton).update(); + ((FlatScrollBarButton)incrButton).updateStyle(); if( decrButton instanceof FlatScrollBarButton ) - ((FlatScrollBarButton)decrButton).update(); + ((FlatScrollBarButton)decrButton).updateStyle(); } /** @@ -424,8 +424,8 @@ public class FlatScrollBarUI setRequestFocusEnabled( false ); } - protected void update() { - update( arrowType, buttonArrowColor, buttonDisabledArrowColor, + protected void updateStyle() { + updateStyle( arrowType, buttonArrowColor, buttonDisabledArrowColor, null, hoverButtonBackground, null, pressedButtonBackground ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index a8efa036..84e53e6a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -189,7 +189,7 @@ public class FlatSpinnerUI */ protected void applyStyle( Object style ) { oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); - updateArrowButtons(); + updateArrowButtonsStyle(); } /** @@ -309,10 +309,10 @@ public class FlatSpinnerUI return button; } - private void updateArrowButtons() { + private void updateArrowButtonsStyle() { for( Component c : spinner.getComponents() ) { if( c instanceof FlatArrowButton ) { - ((FlatArrowButton)c).update( arrowType, buttonArrowColor, + ((FlatArrowButton)c).updateStyle( arrowType, buttonArrowColor, buttonDisabledArrowColor, buttonHoverArrowColor, null, buttonPressedArrowColor, null ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 0ef83595..9bcf948d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -140,7 +140,7 @@ public class FlatSplitPaneUI oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); if( divider instanceof FlatSplitPaneDivider ) - ((FlatSplitPaneDivider)divider).updateButtons(); + ((FlatSplitPaneDivider)divider).updateStyle(); } /** @@ -180,11 +180,11 @@ public class FlatSplitPaneUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } - void updateButtons() { + void updateStyle() { if( leftButton instanceof FlatOneTouchButton ) - ((FlatOneTouchButton)leftButton).update(); + ((FlatOneTouchButton)leftButton).updateStyle(); if( rightButton instanceof FlatOneTouchButton ) - ((FlatOneTouchButton)rightButton).update(); + ((FlatOneTouchButton)rightButton).updateStyle(); } @Override @@ -267,8 +267,8 @@ public class FlatSplitPaneUI this.left = left; } - protected void update() { - update( arrowType, oneTouchArrowColor, null, + protected void updateStyle() { + updateStyle( arrowType, oneTouchArrowColor, null, oneTouchHoverArrowColor, null, oneTouchPressedArrowColor, null ); } From 0c51dfe19c327f42bc6943939fd809c910400a1e Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 21 Jun 2021 20:58:04 +0200 Subject: [PATCH 24/60] Styling: support ComboBox --- .../formdev/flatlaf/ui/FlatComboBoxUI.java | 85 +++++++++++++++---- .../formdev/flatlaf/ui/FlatStylingTests.java | 30 +++++++ 2 files changed, 97 insertions(+), 18 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java index 1f585521..de802eee 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java @@ -40,6 +40,7 @@ import java.awt.event.MouseListener; import java.awt.geom.Rectangle2D; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; +import java.util.Map; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.CellRendererPane; @@ -67,6 +68,7 @@ import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.plaf.basic.ComboPopup; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.UIScale; @@ -110,39 +112,47 @@ import com.formdev.flatlaf.util.UIScale; public class FlatComboBoxUI extends BasicComboBoxUI { - protected int minimumWidth; - protected int editorColumns; - protected String buttonStyle; - protected String arrowType; + @Styleable protected int minimumWidth; + @Styleable protected int editorColumns; + @Styleable protected String buttonStyle; + @Styleable protected String arrowType; protected boolean isIntelliJTheme; - protected Color borderColor; - protected Color disabledBorderColor; + @Styleable protected Color borderColor; + @Styleable protected Color disabledBorderColor; - protected Color editableBackground; - protected Color focusedBackground; - protected Color disabledBackground; - protected Color disabledForeground; + @Styleable protected Color editableBackground; + @Styleable protected Color focusedBackground; + @Styleable protected Color disabledBackground; + @Styleable protected Color disabledForeground; - protected Color buttonBackground; - protected Color buttonEditableBackground; - protected Color buttonFocusedBackground; - protected Color buttonArrowColor; - protected Color buttonDisabledArrowColor; - protected Color buttonHoverArrowColor; - protected Color buttonPressedArrowColor; + @Styleable protected Color buttonBackground; + @Styleable protected Color buttonEditableBackground; + @Styleable protected Color buttonFocusedBackground; + @Styleable protected Color buttonArrowColor; + @Styleable protected Color buttonDisabledArrowColor; + @Styleable protected Color buttonHoverArrowColor; + @Styleable protected Color buttonPressedArrowColor; - protected Color popupFocusedBackground; + @Styleable protected Color popupFocusedBackground; private MouseListener hoverListener; protected boolean hover; protected boolean pressed; private WeakReference lastRendererComponent; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatComboBoxUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( comboBox ) ); + } + @Override protected void installListeners() { super.installListeners(); @@ -250,6 +260,8 @@ public class FlatComboBoxUI popupFocusedBackground = null; + oldStyleValues = null; + MigLayoutVisualPadding.uninstall( comboBox ); } @@ -329,6 +341,11 @@ public class FlatComboBoxUI comboBox.repaint(); else if( FlatClientProperties.MINIMUM_WIDTH.equals( propertyName ) ) comboBox.revalidate(); + else if( FlatClientProperties.STYLE.equals( propertyName ) ) { + applyStyle( e.getNewValue() ); + comboBox.revalidate(); + comboBox.repaint(); + } }; } @@ -403,6 +420,29 @@ public class FlatComboBoxUI return new FlatComboBoxButton(); } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + int oldEditorColumns = editorColumns; + + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + if( arrowButton instanceof FlatComboBoxButton ) + ((FlatComboBoxButton)arrowButton).updateStyle(); + if( popup instanceof FlatComboPopup ) + ((FlatComboPopup)popup).updateStyle(); + if( editorColumns != oldEditorColumns && editor instanceof JTextField ) + ((JTextField)editor).setColumns( editorColumns ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override public void update( Graphics g, JComponent c ) { float focusWidth = FlatUIUtils.getBorderFocusWidth( c ); @@ -632,6 +672,11 @@ public class FlatComboBoxUI hoverForeground, hoverBackground, pressedForeground, pressedBackground ); } + protected void updateStyle() { + updateStyle( arrowType, buttonArrowColor, buttonDisabledArrowColor, + buttonHoverArrowColor, null, buttonPressedArrowColor, null ); + } + @Override protected boolean isHover() { return super.isHover() || (!comboBox.isEditable() ? hover : false); @@ -727,6 +772,10 @@ public class FlatComboBoxUI super.configureList(); list.setCellRenderer( new PopupListCellRenderer() ); + updateStyle(); + } + + void updateStyle() { if( popupFocusedBackground != null ) list.setBackground( popupFocusedBackground ); } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 03b18f91..fe15d12c 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -118,6 +118,36 @@ public class FlatStylingTests radioButton( ui ); } + @Test + void comboBox() { + FlatComboBoxUI ui = new FlatComboBoxUI(); + + // create arrow button + ui.installUI( new JComboBox<>() ); + + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "editorColumns: 10" ); + ui.applyStyle( "buttonStyle: auto" ); + ui.applyStyle( "arrowType: chevron" ); + ui.applyStyle( "borderColor: #fff" ); + ui.applyStyle( "disabledBorderColor: #fff" ); + + ui.applyStyle( "editableBackground: #fff" ); + ui.applyStyle( "focusedBackground: #fff" ); + ui.applyStyle( "disabledBackground: #fff" ); + ui.applyStyle( "disabledForeground: #fff" ); + + ui.applyStyle( "buttonBackground: #fff" ); + ui.applyStyle( "buttonFocusedBackground: #fff" ); + ui.applyStyle( "buttonEditableBackground: #fff" ); + ui.applyStyle( "buttonArrowColor: #fff" ); + ui.applyStyle( "buttonDisabledArrowColor: #fff" ); + ui.applyStyle( "buttonHoverArrowColor: #fff" ); + ui.applyStyle( "buttonPressedArrowColor: #fff" ); + + ui.applyStyle( "popupFocusedBackground: #fff" ); + } + @Test void editorPane() { FlatEditorPaneUI ui = new FlatEditorPaneUI(); From 82192bef913254755f43752a5e74c7f4a65b3957 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 21 Jun 2021 21:06:39 +0200 Subject: [PATCH 25/60] Styling: clear field oldStyleValues on UI delegate uninstall --- .../src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java | 2 ++ .../com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java | 1 + .../main/java/com/formdev/flatlaf/ui/FlatEditorPaneUI.java | 2 ++ .../main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java | 1 + .../src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java | 1 + .../java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java | 2 ++ .../java/com/formdev/flatlaf/ui/FlatProgressBarUI.java | 7 +++++++ .../com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java | 1 + .../java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java | 2 ++ .../main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java | 2 ++ .../main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java | 2 ++ .../main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java | 2 ++ .../main/java/com/formdev/flatlaf/ui/FlatTextAreaUI.java | 2 ++ .../main/java/com/formdev/flatlaf/ui/FlatTextFieldUI.java | 2 ++ .../main/java/com/formdev/flatlaf/ui/FlatTextPaneUI.java | 2 ++ 15 files changed, 31 insertions(+) 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 d8a0878a..34ea010b 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 @@ -220,6 +220,8 @@ public class FlatButtonUI protected void uninstallDefaults( AbstractButton b ) { super.uninstallDefaults( b ); + oldStyleValues = null; + MigLayoutVisualPadding.uninstall( b ); defaults_initialized = false; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java index 08bbd167..879c23b7 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java @@ -86,6 +86,7 @@ public class FlatCheckBoxMenuItemUI super.uninstallDefaults(); renderer = null; + oldStyleValues = null; } protected FlatMenuItemRenderer createRenderer() { 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 6760a412..80d5cce3 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 @@ -118,6 +118,8 @@ public class FlatEditorPaneUI oldDisabledBackground = null; oldInactiveBackground = null; + oldStyleValues = null; + getComponent().putClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES, oldHonorDisplayProperties ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java index db500433..fb4abf96 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java @@ -86,6 +86,7 @@ public class FlatMenuItemUI super.uninstallDefaults(); renderer = null; + oldStyleValues = null; } protected FlatMenuItemRenderer createRenderer() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index cc5366b4..acb08a35 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -109,6 +109,7 @@ public class FlatMenuUI hoverBackground = null; renderer = null; + oldStyleValues = null; } protected FlatMenuItemRenderer createRenderer() { 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 9de65ec6..822a9b34 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 @@ -140,6 +140,8 @@ public class FlatPasswordFieldUI oldDisabledBackground = null; oldInactiveBackground = null; + oldStyleValues = null; + MigLayoutVisualPadding.uninstall( getComponent() ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java index 14ddaea9..e7e5080c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java @@ -90,6 +90,13 @@ public class FlatProgressBarUI verticalSize = UIManager.getDimension( "ProgressBar.verticalSize" ); } + @Override + protected void uninstallDefaults() { + super.uninstallDefaults(); + + oldStyleValues = null; + } + @Override protected void installListeners() { super.installListeners(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java index 1908f4ec..3860319e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java @@ -86,6 +86,7 @@ public class FlatRadioButtonMenuItemUI super.uninstallDefaults(); renderer = null; + oldStyleValues = null; } protected FlatMenuItemRenderer createRenderer() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 82449a07..d28b2907 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -117,6 +117,8 @@ public class FlatRadioButtonUI protected void uninstallDefaults( AbstractButton b ) { super.uninstallDefaults( b ); + oldStyleValues = null; + MigLayoutVisualPadding.uninstall( b ); defaults_initialized = false; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index 9da99902..8b0dcbef 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -179,6 +179,8 @@ public class FlatScrollBarUI buttonDisabledArrowColor = null; hoverButtonBackground = null; pressedButtonBackground = null; + + oldStyleValues = null; } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index 9529f046..e0b5c289 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -99,7 +99,9 @@ public class FlatSeparatorUI @Override protected void uninstallDefaults( JSeparator s ) { super.uninstallDefaults( s ); + defaults_initialized = false; + oldStyleValues = null; } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 9bcf948d..5f012cf3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -110,6 +110,8 @@ public class FlatSplitPaneUI oneTouchArrowColor = null; oneTouchHoverArrowColor = null; oneTouchPressedArrowColor = null; + + oldStyleValues = null; } @Override 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 ff79b8e1..b17f8d14 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 @@ -107,6 +107,8 @@ public class FlatTextAreaUI oldDisabledBackground = null; oldInactiveBackground = null; + + oldStyleValues = null; } @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 c56cde8a..650a8ae2 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 @@ -135,6 +135,8 @@ public class FlatTextFieldUI oldDisabledBackground = null; oldInactiveBackground = null; + oldStyleValues = null; + MigLayoutVisualPadding.uninstall( getComponent() ); } 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 ebfea2cc..25cf45cf 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 @@ -114,6 +114,8 @@ public class FlatTextPaneUI oldDisabledBackground = null; oldInactiveBackground = null; + oldStyleValues = null; + getComponent().putClientProperty( JEditorPane.HONOR_DISPLAY_PROPERTIES, oldHonorDisplayProperties ); } From 007ee38cb4ef3febd224795885e5483aaac74792 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 22 Jun 2021 17:34:31 +0200 Subject: [PATCH 26/60] Styling: support List, Table and Tree --- .../com/formdev/flatlaf/ui/FlatListUI.java | 65 ++++++++- .../com/formdev/flatlaf/ui/FlatTableUI.java | 77 ++++++++++- .../com/formdev/flatlaf/ui/FlatTreeUI.java | 129 ++++++++++++++---- .../formdev/flatlaf/ui/FlatStylingTests.java | 36 +++++ 4 files changed, 271 insertions(+), 36 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java index d639ecb3..1d4f13db 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java @@ -20,10 +20,13 @@ import java.awt.Color; import java.awt.EventQueue; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.JComponent; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicListUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JList}. @@ -64,15 +67,24 @@ import javax.swing.plaf.basic.BasicListUI; public class FlatListUI extends BasicListUI { - protected Color selectionBackground; - protected Color selectionForeground; - protected Color selectionInactiveBackground; - protected Color selectionInactiveForeground; + @Styleable protected Color selectionBackground; + @Styleable protected Color selectionForeground; + @Styleable protected Color selectionInactiveBackground; + @Styleable protected Color selectionInactiveForeground; + + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatListUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -93,6 +105,8 @@ public class FlatListUI selectionForeground = null; selectionInactiveBackground = null; selectionInactiveForeground = null; + + oldStyleValues = null; } @Override @@ -116,6 +130,49 @@ public class FlatListUI }; } + @Override + protected PropertyChangeListener createPropertyChangeListener() { + return FlatStyleSupport.createPropertyChangeListener( list, this::applyStyle, + super.createPropertyChangeListener() ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + Color oldSelectionBackground = selectionBackground; + Color oldSelectionForeground = selectionForeground; + Color oldSelectionInactiveBackground = selectionInactiveBackground; + Color oldSelectionInactiveForeground = selectionInactiveForeground; + + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + // update selection background + if( selectionBackground != oldSelectionBackground ) { + Color selBg = list.getSelectionBackground(); + if( selBg == oldSelectionBackground ) + list.setSelectionBackground( selectionBackground ); + else if( selBg == oldSelectionInactiveBackground ) + list.setSelectionBackground( selectionInactiveBackground ); + } + + // update selection foreground + if( selectionForeground != oldSelectionForeground ) { + Color selFg = list.getSelectionForeground(); + if( selFg == oldSelectionForeground ) + list.setSelectionForeground( selectionForeground ); + else if( selFg == oldSelectionInactiveForeground ) + list.setSelectionForeground( selectionInactiveForeground ); + } + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + /** * Toggle selection colors from focused to inactive and vice versa. * diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index 84e4edfa..a422986d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -25,6 +25,8 @@ import java.awt.Graphics2D; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.geom.Rectangle2D; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.JComponent; import javax.swing.JScrollPane; import javax.swing.JViewport; @@ -34,6 +36,8 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTableUI; import javax.swing.table.JTableHeader; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.UIScale; @@ -92,19 +96,29 @@ public class FlatTableUI protected boolean showVerticalLines; protected Dimension intercellSpacing; - protected Color selectionBackground; - protected Color selectionForeground; - protected Color selectionInactiveBackground; - protected Color selectionInactiveForeground; + @Styleable protected Color selectionBackground; + @Styleable protected Color selectionForeground; + @Styleable protected Color selectionInactiveBackground; + @Styleable protected Color selectionInactiveForeground; private boolean oldShowHorizontalLines; private boolean oldShowVerticalLines; private Dimension oldIntercellSpacing; + private PropertyChangeListener propertyChangeListener; + private Map oldStyleValues; + public static ComponentUI createUI( JComponent c ) { return new FlatTableUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -148,6 +162,8 @@ public class FlatTableUI selectionInactiveBackground = null; selectionInactiveForeground = null; + oldStyleValues = null; + // restore old show horizontal/vertical lines (if not modified) if( !showHorizontalLines && oldShowHorizontalLines && !table.getShowHorizontalLines() ) table.setShowHorizontalLines( true ); @@ -159,6 +175,22 @@ public class FlatTableUI table.setIntercellSpacing( oldIntercellSpacing ); } + @Override + protected void installListeners() { + super.installListeners(); + + propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( table, this::applyStyle, null ); + table.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + } + + @Override + protected void uninstallListeners() { + super.uninstallListeners(); + + table.removePropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + propertyChangeListener = null; + } + @Override protected FocusListener createFocusListener() { return new BasicTableUI.FocusHandler() { @@ -180,6 +212,43 @@ public class FlatTableUI }; } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + Color oldSelectionBackground = selectionBackground; + Color oldSelectionForeground = selectionForeground; + Color oldSelectionInactiveBackground = selectionInactiveBackground; + Color oldSelectionInactiveForeground = selectionInactiveForeground; + + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + // update selection background + if( selectionBackground != oldSelectionBackground ) { + Color selBg = table.getSelectionBackground(); + if( selBg == oldSelectionBackground ) + table.setSelectionBackground( selectionBackground ); + else if( selBg == oldSelectionInactiveBackground ) + table.setSelectionBackground( selectionInactiveBackground ); + } + + // update selection foreground + if( selectionForeground != oldSelectionForeground ) { + Color selFg = table.getSelectionForeground(); + if( selFg == oldSelectionForeground ) + table.setSelectionForeground( selectionForeground ); + else if( selFg == oldSelectionInactiveForeground ) + table.setSelectionForeground( selectionInactiveForeground ); + } + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + /** * Toggle selection colors from focused to inactive and vice versa. * diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java index 6dd2c9c4..147e608c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java @@ -26,6 +26,7 @@ import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.CellRendererPane; import javax.swing.Icon; import javax.swing.JComponent; @@ -39,6 +40,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.UIScale; /** @@ -99,20 +101,31 @@ import com.formdev.flatlaf.util.UIScale; public class FlatTreeUI extends BasicTreeUI { - protected Color selectionBackground; - protected Color selectionForeground; - protected Color selectionInactiveBackground; - protected Color selectionInactiveForeground; - protected Color selectionBorderColor; - protected boolean wideSelection; - protected boolean showCellFocusIndicator; + @Styleable protected Color selectionBackground; + @Styleable protected Color selectionForeground; + @Styleable protected Color selectionInactiveBackground; + @Styleable protected Color selectionInactiveForeground; + @Styleable protected Color selectionBorderColor; + @Styleable protected boolean wideSelection; + @Styleable protected boolean showCellFocusIndicator; private Color defaultCellNonSelectionBackground; + private Color defaultSelectionBackground; + private Color defaultSelectionForeground; + private Color defaultSelectionBorderColor; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatTreeUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -128,6 +141,9 @@ public class FlatTreeUI showCellFocusIndicator = UIManager.getBoolean( "Tree.showCellFocusIndicator" ); defaultCellNonSelectionBackground = UIManager.getColor( "Tree.textBackground" ); + defaultSelectionBackground = selectionBackground; + defaultSelectionForeground = selectionForeground; + defaultSelectionBorderColor = selectionBorderColor; // scale int rowHeight = FlatUIUtils.getUIInt( "Tree.rowHeight", 16 ); @@ -150,6 +166,10 @@ public class FlatTreeUI selectionBorderColor = null; defaultCellNonSelectionBackground = null; + defaultSelectionBackground = null; + defaultSelectionForeground = null; + defaultSelectionBorderColor = null; + oldStyleValues = null; } @Override @@ -216,6 +236,12 @@ public class FlatTreeUI repaintWideDropLocation( tree.getDropLocation() ); } break; + + case STYLE: + applyStyle( e.getNewValue() ); + tree.revalidate(); + tree.repaint(); + break; } } }; @@ -230,6 +256,20 @@ public class FlatTreeUI tree.repaint( 0, r.y, tree.getWidth(), r.height ); } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + /** * Same as super.paintRow(), but supports wide selection and uses * inactive selection background/foreground if tree is not focused. @@ -259,35 +299,32 @@ public class FlatTreeUI Component rendererComponent = currentCellRenderer.getTreeCellRendererComponent( tree, path.getLastPathComponent(), isSelected, isExpanded, isLeaf, row, cellHasFocus ); - // apply inactive selection background/foreground if tree is not focused + // renderer background/foreground Color oldBackgroundSelectionColor = null; if( isSelected && !hasFocus && !isDropRow ) { - if( rendererComponent instanceof DefaultTreeCellRenderer ) { - DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) rendererComponent; - if( renderer.getBackgroundSelectionColor() == selectionBackground ) { - oldBackgroundSelectionColor = renderer.getBackgroundSelectionColor(); - renderer.setBackgroundSelectionColor( selectionInactiveBackground ); - } - } else { - if( rendererComponent.getBackground() == selectionBackground ) - rendererComponent.setBackground( selectionInactiveBackground ); - } + // apply inactive selection background/foreground if tree is not focused + oldBackgroundSelectionColor = setRendererBackgroundSelectionColor( rendererComponent, selectionInactiveBackground ); + setRendererForeground( rendererComponent, selectionInactiveForeground ); - if( rendererComponent.getForeground() == selectionForeground ) - rendererComponent.setForeground( selectionInactiveForeground ); + } else if( isSelected ) { + // update background/foreground if set via style + if( selectionBackground != defaultSelectionBackground ) + oldBackgroundSelectionColor = setRendererBackgroundSelectionColor( rendererComponent, selectionBackground ); + if( selectionForeground != defaultSelectionForeground ) + setRendererForeground( rendererComponent, selectionForeground ); } - // remove focus selection border if exactly one item is selected + // update focus selection border Color oldBorderSelectionColor = null; if( isSelected && hasFocus && - (!showCellFocusIndicator || tree.getMinSelectionRow() == tree.getMaxSelectionRow()) && - rendererComponent instanceof DefaultTreeCellRenderer ) + (!showCellFocusIndicator || tree.getMinSelectionRow() == tree.getMaxSelectionRow()) ) { - DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) rendererComponent; - if( renderer.getBorderSelectionColor() == selectionBorderColor ) { - oldBorderSelectionColor = renderer.getBorderSelectionColor(); - renderer.setBorderSelectionColor( null ); - } + // remove focus selection border if exactly one item is selected or if showCellFocusIndicator is false + oldBorderSelectionColor = setRendererBorderSelectionColor( rendererComponent, null ); + + } else if( hasFocus && selectionBorderColor != defaultSelectionBorderColor ) { + // update focus selection border if set via style + oldBorderSelectionColor = setRendererBorderSelectionColor( rendererComponent, selectionBorderColor ); } // paint selection background @@ -343,6 +380,42 @@ public class FlatTreeUI ((DefaultTreeCellRenderer)rendererComponent).setBorderSelectionColor( oldBorderSelectionColor ); } + private Color setRendererBackgroundSelectionColor( Component rendererComponent, Color color ) { + Color oldColor = null; + + if( rendererComponent instanceof DefaultTreeCellRenderer ) { + DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) rendererComponent; + if( renderer.getBackgroundSelectionColor() == defaultSelectionBackground ) { + oldColor = renderer.getBackgroundSelectionColor(); + renderer.setBackgroundSelectionColor( color ); + } + } else { + if( rendererComponent.getBackground() == defaultSelectionBackground ) + rendererComponent.setBackground( color ); + } + + return oldColor; + } + + private void setRendererForeground( Component rendererComponent, Color color ) { + if( rendererComponent.getForeground() == defaultSelectionForeground ) + rendererComponent.setForeground( color ); + } + + private Color setRendererBorderSelectionColor( Component rendererComponent, Color color ) { + Color oldColor = null; + + if( rendererComponent instanceof DefaultTreeCellRenderer ) { + DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) rendererComponent; + if( renderer.getBorderSelectionColor() == defaultSelectionBorderColor ) { + oldColor = renderer.getBorderSelectionColor(); + renderer.setBorderSelectionColor( color ); + } + } + + return oldColor; + } + private void paintCellBackground( Graphics g, Component rendererComponent, Rectangle bounds ) { int xOffset = 0; int imageOffset = 0; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index fe15d12c..74ad4946 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -173,6 +173,17 @@ public class FlatStylingTests textField( ui ); } + @Test + void list() { + FlatListUI ui = new FlatListUI(); + ui.installUI( new JList<>() ); + + ui.applyStyle( "selectionBackground: #fff" ); + ui.applyStyle( "selectionForeground: #fff" ); + ui.applyStyle( "selectionInactiveBackground: #fff" ); + ui.applyStyle( "selectionInactiveForeground: #fff" ); + } + @Test void menu() { UIManager.put( "Menu.arrowIcon", new FlatMenuArrowIcon() ); @@ -461,6 +472,17 @@ public class FlatStylingTests ui.applyStyle( "gripGap: 2" ); } + @Test + void table() { + FlatTableUI ui = new FlatTableUI(); + ui.installUI( new JTable() ); + + ui.applyStyle( "selectionBackground: #fff" ); + ui.applyStyle( "selectionForeground: #fff" ); + ui.applyStyle( "selectionInactiveBackground: #fff" ); + ui.applyStyle( "selectionInactiveForeground: #fff" ); + } + @Test void textArea() { FlatTextAreaUI ui = new FlatTextAreaUI(); @@ -529,6 +551,20 @@ public class FlatStylingTests ui.applyStyle( b, "tab.focusBackground: #fff" ); } + @Test + void tree() { + FlatTreeUI ui = new FlatTreeUI(); + ui.installUI( new JTree() ); + + ui.applyStyle( "selectionBackground: #fff" ); + ui.applyStyle( "selectionForeground: #fff" ); + ui.applyStyle( "selectionInactiveBackground: #fff" ); + ui.applyStyle( "selectionInactiveForeground: #fff" ); + ui.applyStyle( "selectionBorderColor: #fff" ); + ui.applyStyle( "wideSelection: true" ); + ui.applyStyle( "showCellFocusIndicator: true" ); + } + //---- component borders -------------------------------------------------- private void flatButtonBorder( Consumer applyStyle ) { From 06bc53692a6601066dacda4fe702ab1720d13c36 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 24 Jun 2021 10:45:48 +0200 Subject: [PATCH 27/60] Styling: support cell borders of List and Table --- .../formdev/flatlaf/ui/FlatLineBorder.java | 4 +- .../flatlaf/ui/FlatListCellBorder.java | 56 +++++++++++++++++- .../com/formdev/flatlaf/ui/FlatListUI.java | 6 ++ .../flatlaf/ui/FlatTableCellBorder.java | 57 ++++++++++++++++++- .../com/formdev/flatlaf/ui/FlatTableUI.java | 6 ++ .../formdev/flatlaf/ui/FlatStylingTests.java | 10 ++++ 6 files changed, 135 insertions(+), 4 deletions(-) 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 index a529f096..d8e3ea69 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLineBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLineBorder.java @@ -61,8 +61,8 @@ public class FlatLineBorder Graphics2D g2 = (Graphics2D) g.create(); try { FlatUIUtils.setRenderingHints( g2 ); - g2.setColor( lineColor ); - FlatUIUtils.paintComponentBorder( g2, x, y, width, height, 0f, scale( lineThickness ), 0f ); + g2.setColor( getLineColor() ); + FlatUIUtils.paintComponentBorder( g2, x, y, width, height, 0f, scale( getLineThickness() ), 0f ); } finally { g2.dispose(); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListCellBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListCellBorder.java index 16d3a23d..f70c071a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListCellBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListCellBorder.java @@ -16,11 +16,16 @@ 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.Insets; +import java.util.function.Function; import javax.swing.JList; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.plaf.ListUI; /** * Cell border for {@link javax.swing.DefaultListCellRenderer} @@ -33,12 +38,59 @@ import javax.swing.UIManager; public class FlatListCellBorder extends FlatLineBorder { - final boolean showCellFocusIndicator = UIManager.getBoolean( "List.showCellFocusIndicator" ); + protected boolean showCellFocusIndicator = UIManager.getBoolean( "List.showCellFocusIndicator" ); + + private Component c; protected FlatListCellBorder() { super( UIManager.getInsets( "List.cellMargins" ), UIManager.getColor( "List.cellFocusColor" ) ); } + @Override + public Insets getBorderInsets( Component c, Insets insets ) { + Insets margins = getStyleFromListUI( c, ui -> ui.cellMargins ); + if( margins != null ) { + boolean leftToRight = margins.left == margins.right || c.getComponentOrientation().isLeftToRight(); + insets.left = scale( leftToRight ? margins.left : margins.right ); + insets.top = scale( margins.top ); + insets.right = scale( leftToRight ? margins.right : margins.left ); + insets.bottom = scale( margins.bottom ); + return insets; + } + return super.getBorderInsets( c, insets ); + } + + @Override + public Color getLineColor() { + if( c != null ) { + Color color = getStyleFromListUI( c, ui -> ui.cellFocusColor ); + if( color != null ) + return color; + } + return super.getLineColor(); + } + + @Override + public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { + this.c = c; + super.paintBorder( c, g, x, y, width, height ); + this.c = null; + } + + /** + * Because this borders are always shared for all lists, + * get border specific style from FlatListUI. + */ + static T getStyleFromListUI( Component c, Function f ) { + JList list = (JList) SwingUtilities.getAncestorOfClass( JList.class, c ); + if( list != null ) { + ListUI ui = list.getUI(); + if( ui instanceof FlatListUI ) + return f.apply( (FlatListUI) ui ); + } + return null; + } + //---- class Default ------------------------------------------------------ /** @@ -74,6 +126,8 @@ public class FlatListCellBorder { @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { + Boolean b = getStyleFromListUI( c, ui -> ui.showCellFocusIndicator ); + boolean showCellFocusIndicator = (b != null) ? b : this.showCellFocusIndicator; if( !showCellFocusIndicator ) return; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java index 1d4f13db..6bebe094 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java @@ -18,6 +18,7 @@ package com.formdev.flatlaf.ui; import java.awt.Color; import java.awt.EventQueue; +import java.awt.Insets; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.beans.PropertyChangeListener; @@ -72,6 +73,11 @@ public class FlatListUI @Styleable protected Color selectionInactiveBackground; @Styleable protected Color selectionInactiveForeground; + // for FlatListCellBorder + @Styleable protected Insets cellMargins; + @Styleable protected Color cellFocusColor; + @Styleable protected boolean showCellFocusIndicator; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableCellBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableCellBorder.java index cd25abae..71427496 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableCellBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableCellBorder.java @@ -16,11 +16,16 @@ 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.Insets; +import java.util.function.Function; import javax.swing.JTable; import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.plaf.TableUI; /** * Cell border for {@link javax.swing.table.DefaultTableCellRenderer} @@ -33,12 +38,59 @@ import javax.swing.UIManager; public class FlatTableCellBorder extends FlatLineBorder { - final boolean showCellFocusIndicator = UIManager.getBoolean( "Table.showCellFocusIndicator" ); + protected boolean showCellFocusIndicator = UIManager.getBoolean( "Table.showCellFocusIndicator" ); + + private Component c; protected FlatTableCellBorder() { super( UIManager.getInsets( "Table.cellMargins" ), UIManager.getColor( "Table.cellFocusColor" ) ); } + @Override + public Insets getBorderInsets( Component c, Insets insets ) { + Insets margins = getStyleFromTableUI( c, ui -> ui.cellMargins ); + if( margins != null ) { + boolean leftToRight = margins.left == margins.right || c.getComponentOrientation().isLeftToRight(); + insets.left = scale( leftToRight ? margins.left : margins.right ); + insets.top = scale( margins.top ); + insets.right = scale( leftToRight ? margins.right : margins.left ); + insets.bottom = scale( margins.bottom ); + return insets; + } + return super.getBorderInsets( c, insets ); + } + + @Override + public Color getLineColor() { + if( c != null ) { + Color color = getStyleFromTableUI( c, ui -> ui.cellFocusColor ); + if( color != null ) + return color; + } + return super.getLineColor(); + } + + @Override + public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { + this.c = c; + super.paintBorder( c, g, x, y, width, height ); + this.c = null; + } + + /** + * Because this borders are always shared for all tables, + * get border specific style from FlatTableUI. + */ + static T getStyleFromTableUI( Component c, Function f ) { + JTable table = (JTable) SwingUtilities.getAncestorOfClass( JTable.class, c ); + if( table != null ) { + TableUI ui = table.getUI(); + if( ui instanceof FlatTableUI ) + return f.apply( (FlatTableUI) ui ); + } + return null; + } + //---- class Default ------------------------------------------------------ /** @@ -74,6 +126,9 @@ public class FlatTableCellBorder { @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { + Boolean b = getStyleFromTableUI( c, ui -> ui.showCellFocusIndicator ); + boolean showCellFocusIndicator = (b != null) ? b : this.showCellFocusIndicator; + if( !showCellFocusIndicator ) { JTable table = (JTable) SwingUtilities.getAncestorOfClass( JTable.class, c ); if( table != null && !isSelectionEditable( table ) ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index a422986d..7711b6f2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -22,6 +22,7 @@ import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Insets; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.geom.Rectangle2D; @@ -101,6 +102,11 @@ public class FlatTableUI @Styleable protected Color selectionInactiveBackground; @Styleable protected Color selectionInactiveForeground; + // for FlatTableCellBorder + @Styleable protected Insets cellMargins; + @Styleable protected Color cellFocusColor; + @Styleable protected boolean showCellFocusIndicator; + private boolean oldShowHorizontalLines; private boolean oldShowVerticalLines; private Dimension oldIntercellSpacing; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 74ad4946..2d7c3d27 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -182,6 +182,11 @@ public class FlatStylingTests ui.applyStyle( "selectionForeground: #fff" ); ui.applyStyle( "selectionInactiveBackground: #fff" ); ui.applyStyle( "selectionInactiveForeground: #fff" ); + + // FlatListCellBorder + ui.applyStyle( "cellMargins: 1,2,3,4" ); + ui.applyStyle( "cellFocusColor: #fff" ); + ui.applyStyle( "showCellFocusIndicator: true" ); } @Test @@ -481,6 +486,11 @@ public class FlatStylingTests ui.applyStyle( "selectionForeground: #fff" ); ui.applyStyle( "selectionInactiveBackground: #fff" ); ui.applyStyle( "selectionInactiveForeground: #fff" ); + + // FlatTableCellBorder + ui.applyStyle( "cellMargins: 1,2,3,4" ); + ui.applyStyle( "cellFocusColor: #fff" ); + ui.applyStyle( "showCellFocusIndicator: true" ); } @Test From 4e7b0d11d0fe6db1d9b4a13b576468a404bb9fb9 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 24 Jun 2021 13:43:19 +0200 Subject: [PATCH 28/60] Styling: support Tree icons --- .../flatlaf/icons/FlatTreeClosedIcon.java | 2 ++ .../flatlaf/icons/FlatTreeCollapsedIcon.java | 35 +++++++++++++++++++ .../flatlaf/icons/FlatTreeExpandedIcon.java | 5 +++ .../flatlaf/icons/FlatTreeLeafIcon.java | 2 ++ .../flatlaf/icons/FlatTreeOpenIcon.java | 2 ++ .../com/formdev/flatlaf/ui/FlatTreeUI.java | 31 ++++++++++++++++ .../formdev/flatlaf/ui/FlatStylingTests.java | 8 +++++ 7 files changed, 85 insertions(+) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java index df160011..c149bb9c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java @@ -37,6 +37,8 @@ public class FlatTreeClosedIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + FlatTreeCollapsedIcon.setStyleColorFromTreeUI( c, g, ui -> ui.iconClosedColor ); + /* diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java index 481b2e42..d245f79c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java @@ -19,7 +19,12 @@ package com.formdev.flatlaf.icons; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; +import java.util.function.Function; +import javax.swing.JTree; +import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.plaf.TreeUI; +import com.formdev.flatlaf.ui.FlatTreeUI; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -46,8 +51,12 @@ public class FlatTreeCollapsedIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + setStyleColorFromTreeUI( c, g ); rotate( c, g ); + String arrowType = getStyleFromTreeUI( c, ui -> ui.iconArrowType ); + boolean chevron = (arrowType != null) ? FlatUIUtils.isChevron( arrowType ) : this.chevron; + if( chevron ) { // chevron arrow g.fill( FlatUIUtils.createPath( 3,1, 3,2.5, 6,5.5, 3,8.5, 3,10, 4.5,10, 9,5.5, 4.5,1 ) ); @@ -57,8 +66,34 @@ public class FlatTreeCollapsedIcon } } + void setStyleColorFromTreeUI( Component c, Graphics2D g ) { + setStyleColorFromTreeUI( c, g, ui -> ui.iconCollapsedColor ); + } + void rotate( Component c, Graphics2D g ) { if( !c.getComponentOrientation().isLeftToRight() ) g.rotate( Math.toRadians( 180 ), width / 2., height / 2. ); } + + /** + * Because this icons are always shared for all trees, + * get icon specific style from FlatTreeUI. + */ + static T getStyleFromTreeUI( Component c, Function f ) { + JTree tree = (c instanceof JTree) + ? (JTree) c + : (JTree) SwingUtilities.getAncestorOfClass( JTree.class, c ); + if( tree != null ) { + TreeUI ui = tree.getUI(); + if( ui instanceof FlatTreeUI ) + return f.apply( (FlatTreeUI) ui ); + } + return null; + } + + static void setStyleColorFromTreeUI( Component c, Graphics2D g, Function f ) { + Color color = getStyleFromTreeUI( c, f ); + if( color != null ) + g.setColor( color ); + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeExpandedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeExpandedIcon.java index 113139e9..3e99f3ef 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeExpandedIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeExpandedIcon.java @@ -34,6 +34,11 @@ public class FlatTreeExpandedIcon super( UIManager.getColor( "Tree.icon.expandedColor" ) ); } + @Override + void setStyleColorFromTreeUI( Component c, Graphics2D g ) { + setStyleColorFromTreeUI( c, g, ui -> ui.iconExpandedColor ); + } + @Override void rotate( Component c, Graphics2D g ) { g.rotate( Math.toRadians( 90 ), width / 2., height / 2. ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java index 6ec8900d..b85ccbb1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java @@ -37,6 +37,8 @@ public class FlatTreeLeafIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + FlatTreeCollapsedIcon.setStyleColorFromTreeUI( c, g, ui -> ui.iconLeafColor ); + /* diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java index f8754d9e..e2ca5213 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java @@ -37,6 +37,8 @@ public class FlatTreeOpenIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + FlatTreeCollapsedIcon.setStyleColorFromTreeUI( c, g, ui -> ui.iconOpenColor ); + /* diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java index 147e608c..cfd8b724 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java @@ -96,6 +96,28 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault Tree.wideSelection boolean * @uiDefault Tree.showCellFocusIndicator boolean * + * + * + * @uiDefault Component.arrowType String chevron (default) or triangle + * @uiDefault Tree.icon.expandedColor Color + * + * + * + * @uiDefault Component.arrowType String chevron (default) or triangle + * @uiDefault Tree.icon.collapsedColor Color + * + * + * + * @uiDefault Tree.icon.leafColor Color + * + * + * + * @uiDefault Tree.icon.closedColor Color + * + * + * + * @uiDefault Tree.icon.openColor Color + * * @author Karl Tauber */ public class FlatTreeUI @@ -109,6 +131,15 @@ public class FlatTreeUI @Styleable protected boolean wideSelection; @Styleable protected boolean showCellFocusIndicator; + // for icons + // (needs to be public because icon classes are in another package) + @Styleable(dot=true) public String iconArrowType; + @Styleable(dot=true) public Color iconExpandedColor; + @Styleable(dot=true) public Color iconCollapsedColor; + @Styleable(dot=true) public Color iconLeafColor; + @Styleable(dot=true) public Color iconClosedColor; + @Styleable(dot=true) public Color iconOpenColor; + private Color defaultCellNonSelectionBackground; private Color defaultSelectionBackground; private Color defaultSelectionForeground; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 2d7c3d27..4016852a 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -573,6 +573,14 @@ public class FlatStylingTests ui.applyStyle( "selectionBorderColor: #fff" ); ui.applyStyle( "wideSelection: true" ); ui.applyStyle( "showCellFocusIndicator: true" ); + + // icons + ui.applyStyle( "icon.arrowType: chevron" ); + ui.applyStyle( "icon.expandedColor: #fff" ); + ui.applyStyle( "icon.collapsedColor: #fff" ); + ui.applyStyle( "icon.leafColor: #fff" ); + ui.applyStyle( "icon.closedColor: #fff" ); + ui.applyStyle( "icon.openColor: #fff" ); } //---- component borders -------------------------------------------------- From 551f5fc929c4214fedc4594067c164fca536bfa4 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 24 Jun 2021 14:02:32 +0200 Subject: [PATCH 29/60] Styling: support Label --- .../com/formdev/flatlaf/ui/FlatLabelUI.java | 57 ++++++++++++++++++- .../com/formdev/flatlaf/ui/FlatTitlePane.java | 4 ++ .../formdev/flatlaf/ui/FlatStylingTests.java | 7 +++ 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index ae629b55..5ed7fd49 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -24,6 +24,7 @@ import java.awt.Rectangle; import java.beans.PropertyChangeEvent; import java.util.Arrays; import java.util.HashSet; +import java.util.Map; import java.util.Set; import javax.swing.Icon; import javax.swing.JComponent; @@ -33,7 +34,9 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicHTML; import javax.swing.plaf.basic.BasicLabelUI; +import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -55,12 +58,30 @@ import com.formdev.flatlaf.util.UIScale; public class FlatLabelUI extends BasicLabelUI { - private Color disabledForeground; + @Styleable protected Color disabledForeground; + private final boolean shared; private boolean defaults_initialized = false; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { - return FlatUIUtils.createSharedUI( FlatLabelUI.class, FlatLabelUI::new ); + return FlatUIUtils.canUseSharedUI( c ) + ? FlatUIUtils.createSharedUI( FlatLabelUI.class, () -> new FlatLabelUI( true ) ) + : new FlatLabelUI( false ); + } + + /** + * @since TODO + */ + protected FlatLabelUI( boolean shared ) { + this.shared = shared; + } + + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); } @Override @@ -77,7 +98,9 @@ public class FlatLabelUI @Override protected void uninstallDefaults( JLabel c ) { super.uninstallDefaults( c ); + defaults_initialized = false; + oldStyleValues = null; } @Override @@ -94,10 +117,38 @@ public class FlatLabelUI if( name == "text" || name == "font" || name == "foreground" ) { JLabel label = (JLabel) e.getSource(); updateHTMLRenderer( label, label.getText(), true ); - } else + } else if( name.equals( FlatClientProperties.STYLE ) ) + applyStyle( (JLabel) e.getSource(), this, e.getNewValue() ); + else super.propertyChange( e ); } + private static void applyStyle( JLabel c, FlatLabelUI ui, Object style ) { + // unshare component UI if necessary + if( style != null && ui.shared ) { + c.updateUI(); + ui = (FlatLabelUI) c.getUI(); + } + + ui.applyStyle( style ); + c.revalidate(); + c.repaint(); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + /** * Checks whether text contains HTML tags that use "absolute-size" keywords * (e.g. "x-large") for font-size in default style sheet diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java index 207b05b2..b7ca5baf 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java @@ -877,6 +877,10 @@ debug*/ protected class FlatTitleLabelUI extends FlatLabelUI { + protected FlatTitleLabelUI() { + super( false ); + } + @Override protected void paintEnabledText( JLabel l, Graphics g, String s, int textX, int textY ) { boolean hasEmbeddedMenuBar = hasVisibleEmbeddedMenuBar( rootPane.getJMenuBar() ); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 4016852a..1cd771c6 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -173,6 +173,13 @@ public class FlatStylingTests textField( ui ); } + @Test + void label() { + FlatLabelUI ui = new FlatLabelUI( false ); + + ui.applyStyle( "disabledForeground: #fff" ); + } + @Test void list() { FlatListUI ui = new FlatListUI(); From 5e5aa17e14e30147de8514b67075688f8d5df4d0 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 24 Jun 2021 14:05:24 +0200 Subject: [PATCH 30/60] Styling: add property change listener only for `FlatLaf.style` (where possible) --- .../main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java | 5 +++-- .../main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index e0b5c289..5d8fd01b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -28,6 +28,7 @@ import javax.swing.JSeparator; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSeparatorUI; +import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** @@ -110,14 +111,14 @@ public class FlatSeparatorUI propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( s, style -> applyStyle( s, this, style ), null ); - s.addPropertyChangeListener( propertyChangeListener ); + s.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @Override protected void uninstallListeners( JSeparator s ) { super.uninstallListeners( s ); - s.removePropertyChangeListener( propertyChangeListener ); + s.removePropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); propertyChangeListener = null; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 5f012cf3..47dfad80 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -34,6 +34,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; +import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; @@ -119,14 +120,14 @@ public class FlatSplitPaneUI super.installListeners(); propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( splitPane, this::applyStyle, null ); - splitPane.addPropertyChangeListener( propertyChangeListener ); + splitPane.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @Override protected void uninstallListeners() { super.uninstallListeners(); - splitPane.removePropertyChangeListener( propertyChangeListener ); + splitPane.removePropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); propertyChangeListener = null; } From 8ba7f7f96184f868b6606f1f38b003a6bf1a1c0d Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 24 Jun 2021 17:53:19 +0200 Subject: [PATCH 31/60] Styling: reduce duplicate code in list and table cell borders --- .../com/formdev/flatlaf/ui/FlatEmptyBorder.java | 6 ++++++ .../com/formdev/flatlaf/ui/FlatListCellBorder.java | 14 ++++---------- .../formdev/flatlaf/ui/FlatTableCellBorder.java | 14 ++++---------- 3 files changed, 14 insertions(+), 20 deletions(-) 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 55d08c72..455d7445 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 @@ -50,6 +50,12 @@ public class FlatEmptyBorder @Override public Insets getBorderInsets( Component c, Insets insets ) { + return scaleInsets( c, insets, top, left, bottom, right ); + } + + protected static Insets scaleInsets( Component c, Insets insets, + int top, int left, int bottom, int right ) + { boolean leftToRight = left == right || c.getComponentOrientation().isLeftToRight(); insets.left = scale( leftToRight ? left : right ); insets.top = scale( top ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListCellBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListCellBorder.java index f70c071a..4e87570e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListCellBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListCellBorder.java @@ -16,7 +16,6 @@ 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; @@ -48,15 +47,10 @@ public class FlatListCellBorder @Override public Insets getBorderInsets( Component c, Insets insets ) { - Insets margins = getStyleFromListUI( c, ui -> ui.cellMargins ); - if( margins != null ) { - boolean leftToRight = margins.left == margins.right || c.getComponentOrientation().isLeftToRight(); - insets.left = scale( leftToRight ? margins.left : margins.right ); - insets.top = scale( margins.top ); - insets.right = scale( leftToRight ? margins.right : margins.left ); - insets.bottom = scale( margins.bottom ); - return insets; - } + Insets m = getStyleFromListUI( c, ui -> ui.cellMargins ); + if( m != null ) + return scaleInsets( c, insets, m.top, m.left, m.bottom, m.right ); + return super.getBorderInsets( c, insets ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableCellBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableCellBorder.java index 71427496..76263b12 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableCellBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableCellBorder.java @@ -16,7 +16,6 @@ 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; @@ -48,15 +47,10 @@ public class FlatTableCellBorder @Override public Insets getBorderInsets( Component c, Insets insets ) { - Insets margins = getStyleFromTableUI( c, ui -> ui.cellMargins ); - if( margins != null ) { - boolean leftToRight = margins.left == margins.right || c.getComponentOrientation().isLeftToRight(); - insets.left = scale( leftToRight ? margins.left : margins.right ); - insets.top = scale( margins.top ); - insets.right = scale( leftToRight ? margins.right : margins.left ); - insets.bottom = scale( margins.bottom ); - return insets; - } + Insets m = getStyleFromTableUI( c, ui -> ui.cellMargins ); + if( m != null ) + return scaleInsets( c, insets, m.top, m.left, m.bottom, m.right ); + return super.getBorderInsets( c, insets ); } From 69061cd41c908d0b0784c8c78e542c67f9614ca9 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 24 Jun 2021 17:57:12 +0200 Subject: [PATCH 32/60] Styling: support TableHeader --- .../flatlaf/icons/FlatAscendingSortIcon.java | 29 +++++- .../flatlaf/icons/FlatDescendingSortIcon.java | 12 +-- .../flatlaf/ui/FlatTableHeaderBorder.java | 29 ++++++ .../formdev/flatlaf/ui/FlatTableHeaderUI.java | 91 ++++++++++++++++--- .../formdev/flatlaf/ui/FlatStylingTests.java | 17 ++++ 5 files changed, 156 insertions(+), 22 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java index 77ee805a..8456dc0c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatAscendingSortIcon.java @@ -21,7 +21,11 @@ import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Path2D; +import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.plaf.TableHeaderUI; +import javax.swing.table.JTableHeader; +import com.formdev.flatlaf.ui.FlatTableHeaderUI; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -35,8 +39,8 @@ import com.formdev.flatlaf.ui.FlatUIUtils; public class FlatAscendingSortIcon extends FlatAbstractIcon { - protected final boolean chevron = FlatUIUtils.isChevron( UIManager.getString( "Component.arrowType" ) ); - protected final Color sortIconColor = UIManager.getColor( "Table.sortIconColor" ); + protected boolean chevron = FlatUIUtils.isChevron( UIManager.getString( "Component.arrowType" ) ); + protected Color sortIconColor = UIManager.getColor( "Table.sortIconColor" ); public FlatAscendingSortIcon() { super( 10, 5, null ); @@ -44,7 +48,28 @@ public class FlatAscendingSortIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + boolean chevron = this.chevron; + Color sortIconColor = this.sortIconColor; + + // Because this icons are always shared for all table headers, + // get icon specific style from FlatTableHeaderUI. + JTableHeader tableHeader = (JTableHeader) SwingUtilities.getAncestorOfClass( JTableHeader.class, c ); + if( tableHeader != null ) { + TableHeaderUI ui = tableHeader.getUI(); + if( ui instanceof FlatTableHeaderUI ) { + FlatTableHeaderUI fui = (FlatTableHeaderUI) ui; + if( fui.arrowType != null ) + chevron = FlatUIUtils.isChevron( fui.arrowType ); + if( fui.sortIconColor != null ) + sortIconColor = fui.sortIconColor; + } + } + g.setColor( sortIconColor ); + paintArrow( c, g, chevron ); + } + + protected void paintArrow( Component c, Graphics2D g, boolean chevron ) { if( chevron ) { // chevron arrow Path2D path = FlatUIUtils.createPath( false, 1,4, 5,0, 9,4 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatDescendingSortIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatDescendingSortIcon.java index c43f751d..0ae9ac4c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatDescendingSortIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatDescendingSortIcon.java @@ -17,11 +17,9 @@ package com.formdev.flatlaf.icons; import java.awt.BasicStroke; -import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -33,18 +31,14 @@ import com.formdev.flatlaf.ui.FlatUIUtils; * @author Karl Tauber */ public class FlatDescendingSortIcon - extends FlatAbstractIcon + extends FlatAscendingSortIcon { - protected final boolean chevron = FlatUIUtils.isChevron( UIManager.getString( "Component.arrowType" ) ); - protected final Color sortIconColor = UIManager.getColor( "Table.sortIconColor" ); - public FlatDescendingSortIcon() { - super( 10, 5, null ); + super(); } @Override - protected void paintIcon( Component c, Graphics2D g ) { - g.setColor( sortIconColor ); + protected void paintArrow( Component c, Graphics2D g, boolean chevron ) { if( chevron ) { // chevron arrow Path2D path = FlatUIUtils.createPath( false, 1,0, 5,4, 9,0 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java index d8e6e87c..2237d6fb 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java @@ -21,6 +21,7 @@ import java.awt.Component; import java.awt.Container; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.Insets; import java.awt.geom.Rectangle2D; import javax.swing.JScrollBar; import javax.swing.JScrollPane; @@ -49,12 +50,30 @@ public class FlatTableHeaderBorder super( UIManager.getInsets( "TableHeader.cellMargins" ) ); } + @Override + public Insets getBorderInsets( Component c, Insets insets ) { + JTableHeader header = (JTableHeader) SwingUtilities.getAncestorOfClass( JTableHeader.class, c ); + if( header != null ) { + if( header.getUI() instanceof FlatTableHeaderUI ) { + FlatTableHeaderUI ui = (FlatTableHeaderUI) header.getUI(); + if( ui.cellMargins != null ) { + Insets m = ui.cellMargins; + return scaleInsets( c, insets, m.top, m.left, m.bottom, m.right ); + } + } + } + + return super.getBorderInsets( c, insets ); + } + @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { JTableHeader header = (JTableHeader) SwingUtilities.getAncestorOfClass( JTableHeader.class, c ); boolean leftToRight = (header != null ? header : c).getComponentOrientation().isLeftToRight(); boolean paintLeft = !leftToRight; boolean paintRight = leftToRight; + Color separatorColor = this.separatorColor; + Color bottomSeparatorColor = this.bottomSeparatorColor; if( header != null ) { int hx = SwingUtilities.convertPoint( c, x, y, header ).x; @@ -66,6 +85,16 @@ public class FlatTableHeaderBorder if( hx + width >= header.getWidth() && leftToRight && hideTrailingVerticalLine( header ) ) paintRight = false; } + + // Because this border is always shared for all table headers, + // get border specific style from FlatTableHeaderUI. + if( header.getUI() instanceof FlatTableHeaderUI ) { + FlatTableHeaderUI ui = (FlatTableHeaderUI) header.getUI(); + if( ui.separatorColor != null ) + separatorColor = ui.separatorColor; + if( ui.bottomSeparatorColor != null ) + bottomSeparatorColor = ui.bottomSeparatorColor; + } } float lineWidth = UIScale.scale( 1f ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index f19b5202..0d5f45ea 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java @@ -23,7 +23,8 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.geom.Rectangle2D; -import java.util.Objects; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JLabel; @@ -36,6 +37,8 @@ import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicTableHeaderUI; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.UIScale; /** @@ -59,32 +62,50 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault TableHeader.separatorColor Color * @uiDefault TableHeader.bottomSeparatorColor Color * + * + * + * @uiDefault Component.arrowType String chevron (default) or triangle + * @uiDefault Table.sortIconColor Color + * * @author Karl Tauber */ public class FlatTableHeaderUI extends BasicTableHeaderUI { - protected Color bottomSeparatorColor; - protected int height; - protected int sortIconPosition; + @Styleable protected Color bottomSeparatorColor; + @Styleable protected int height; + @Styleable protected int sortIconPosition; + + // for FlatTableHeaderBorder + @Styleable protected Insets cellMargins; + @Styleable protected Color separatorColor; + + // for FlatAscendingSortIcon and FlatDescendingSortIcon + // (needs to be public because icon classes are in another package) + @Styleable public String arrowType; + @Styleable public Color sortIconColor; + + private PropertyChangeListener propertyChangeListener; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatTableHeaderUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); bottomSeparatorColor = UIManager.getColor( "TableHeader.bottomSeparatorColor" ); height = UIManager.getInt( "TableHeader.height" ); - switch( Objects.toString( UIManager.getString( "TableHeader.sortIconPosition" ), "right" ) ) { - default: - case "right": sortIconPosition = SwingConstants.RIGHT; break; - case "left": sortIconPosition = SwingConstants.LEFT; break; - case "top": sortIconPosition = SwingConstants.TOP; break; - case "bottom": sortIconPosition = SwingConstants.BOTTOM; break; - } + sortIconPosition = parseSortIconPosition( UIManager.getString( "TableHeader.sortIconPosition" ) ); } @Override @@ -92,6 +113,54 @@ public class FlatTableHeaderUI super.uninstallDefaults(); bottomSeparatorColor = null; + + oldStyleValues = null; + } + + @Override + protected void installListeners() { + super.installListeners(); + + propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( header, this::applyStyle, null ); + header.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + } + + @Override + protected void uninstallListeners() { + super.uninstallListeners(); + + header.removePropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + propertyChangeListener = null; + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + if( key.equals( "sortIconPosition" ) && value instanceof String ) + value = parseSortIconPosition( (String) value ); + + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + + private static int parseSortIconPosition( String str ) { + if( str == null ) + str = ""; + + switch( str ) { + default: + case "right": return SwingConstants.RIGHT; + case "left": return SwingConstants.LEFT; + case "top": return SwingConstants.TOP; + case "bottom": return SwingConstants.BOTTOM; + } } @Override diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 1cd771c6..92f219e0 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -500,6 +500,23 @@ public class FlatStylingTests ui.applyStyle( "showCellFocusIndicator: true" ); } + @Test + void tableHeader() { + FlatTableHeaderUI ui = new FlatTableHeaderUI(); + + ui.applyStyle( "bottomSeparatorColor: #fff" ); + ui.applyStyle( "height: 20" ); + ui.applyStyle( "sortIconPosition: top" ); + + // FlatTableHeaderBorder + ui.applyStyle( "cellMargins: 1,2,3,4" ); + ui.applyStyle( "separatorColor: #fff" ); + + // FlatAscendingSortIcon and FlatDescendingSortIcon + ui.applyStyle( "arrowType: chevron" ); + ui.applyStyle( "sortIconColor: #fff" ); + } + @Test void textArea() { FlatTextAreaUI ui = new FlatTextAreaUI(); From b4f7b1d71df3e743fb5ee9a1d573a0d54c558357 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 24 Jun 2021 20:06:00 +0200 Subject: [PATCH 33/60] Styling: support ToolBar and ToolBar.Separator --- .../formdev/flatlaf/ui/FlatMarginBorder.java | 2 +- .../formdev/flatlaf/ui/FlatToolBarBorder.java | 29 +++++++- .../flatlaf/ui/FlatToolBarSeparatorUI.java | 74 ++++++++++++++++++- .../com/formdev/flatlaf/ui/FlatToolBarUI.java | 48 ++++++++++++ .../formdev/flatlaf/ui/FlatStylingTests.java | 16 ++++ 5 files changed, 162 insertions(+), 7 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMarginBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMarginBorder.java index 27240fef..36b58f00 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMarginBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMarginBorder.java @@ -29,7 +29,7 @@ import javax.swing.plaf.basic.BasicBorders; public class FlatMarginBorder extends BasicBorders.MarginBorder { - private final int left, right, top, bottom; + protected int left, right, top, bottom; public FlatMarginBorder() { left = right = top = bottom = 0; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarBorder.java index 5f7ffa57..68b9325d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarBorder.java @@ -22,9 +22,11 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Rectangle; +import java.util.function.Function; import javax.swing.JToolBar; import javax.swing.SwingConstants; import javax.swing.UIManager; +import javax.swing.plaf.ToolBarUI; import com.formdev.flatlaf.util.UIScale; /** @@ -42,7 +44,7 @@ public class FlatToolBarBorder private static final int DOT_SIZE = 2; private static final int GRIP_SIZE = DOT_SIZE * 3; - protected final Color gripColor = UIManager.getColor( "ToolBar.gripColor" ); + protected Color gripColor = UIManager.getColor( "ToolBar.gripColor" ); public FlatToolBarBorder() { super( UIManager.getInsets( "ToolBar.borderMargins" ) ); @@ -56,7 +58,8 @@ public class FlatToolBarBorder try { FlatUIUtils.setRenderingHints( g2 ); - g2.setColor( gripColor ); + Color color = getStyleFromToolBarUI( c, ui -> ui.gripColor ); + g2.setColor( (color != null) ? color : gripColor ); paintGrip( c, g2, x, y, width, height ); } finally { g2.dispose(); @@ -90,7 +93,14 @@ public class FlatToolBarBorder @Override public Insets getBorderInsets( Component c, Insets insets ) { - insets = super.getBorderInsets( c, insets ); + Insets m = getStyleFromToolBarUI( c, ui -> ui.borderMargins ); + if( m != null ) { + int t = top, l = left, b = bottom, r = right; + top = m.top; left = m.left; bottom = m.bottom; right = m.right; + insets = super.getBorderInsets( c, insets ); + top = t; left = l; bottom = b; right = r; + } else + insets = super.getBorderInsets( c, insets ); // add grip inset if floatable if( c instanceof JToolBar && ((JToolBar)c).isFloatable() ) { @@ -106,4 +116,17 @@ public class FlatToolBarBorder return insets; } + + /** + * Because this border is shared for all toolbars, + * get border specific style from FlatToolBarUI. + */ + static T getStyleFromToolBarUI( Component c, Function f ) { + if( c instanceof JToolBar ) { + ToolBarUI ui = ((JToolBar)c).getUI(); + if( ui instanceof FlatToolBarUI ) + return f.apply( (FlatToolBarUI) ui ); + } + return null; + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java index d30eb30c..578879ab 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java @@ -22,6 +22,8 @@ import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.JComponent; import javax.swing.JSeparator; import javax.swing.JToolBar; @@ -29,6 +31,8 @@ import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicToolBarSeparatorUI; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JToolBar.Separator}. @@ -45,13 +49,32 @@ public class FlatToolBarSeparatorUI { private static final int LINE_WIDTH = 1; - protected int separatorWidth; - protected Color separatorColor; + @Styleable protected int separatorWidth; + @Styleable protected Color separatorColor; + private final boolean shared; private boolean defaults_initialized = false; + private PropertyChangeListener propertyChangeListener; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { - return FlatUIUtils.createSharedUI( FlatToolBarSeparatorUI.class, FlatToolBarSeparatorUI::new ); + return FlatUIUtils.canUseSharedUI( c ) + ? FlatUIUtils.createSharedUI( FlatToolBarSeparatorUI.class, () -> new FlatToolBarSeparatorUI( true ) ) + : new FlatToolBarSeparatorUI( false ); + } + + /** + * @since TODO + */ + protected FlatToolBarSeparatorUI( boolean shared ) { + this.shared = shared; + } + + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); } @Override @@ -73,7 +96,52 @@ public class FlatToolBarSeparatorUI @Override protected void uninstallDefaults( JSeparator s ) { super.uninstallDefaults( s ); + defaults_initialized = false; + oldStyleValues = null; + } + + @Override + protected void installListeners( JSeparator s ) { + super.installListeners( s ); + + propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( + s, style -> applyStyle( s, this, style ), null ); + s.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + } + + @Override + protected void uninstallListeners( JSeparator s ) { + super.uninstallListeners( s ); + + s.removePropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + propertyChangeListener = null; + } + + private static void applyStyle( JSeparator s, FlatToolBarSeparatorUI ui, Object style ) { + // unshare component UI if necessary + if( style != null && ui.shared ) { + s.updateUI(); + ui = (FlatToolBarSeparatorUI) s.getUI(); + } + + ui.applyStyle( style ); + s.revalidate(); + s.repaint(); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java index 49b00e49..8bb31aff 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java @@ -16,15 +16,19 @@ package com.formdev.flatlaf.ui; +import java.awt.Color; import java.awt.Component; import java.awt.Insets; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; +import java.beans.PropertyChangeListener; +import java.util.Map; import javax.swing.AbstractButton; import javax.swing.JComponent; import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicToolBarUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JToolBar}. @@ -41,15 +45,40 @@ import javax.swing.plaf.basic.BasicToolBarUI; * @uiDefault ToolBar.floatingForeground Color * @uiDefault ToolBar.isRollover boolean * + * + * + * @uiDefault ToolBar.borderMargins Insets + * @uiDefault ToolBar.gripColor Color + * * @author Karl Tauber */ public class FlatToolBarUI extends BasicToolBarUI { + // for FlatToolBarBorder + @Styleable protected Insets borderMargins; + @Styleable protected Color gripColor; + + private Map oldStyleValues; + public static ComponentUI createUI( JComponent c ) { return new FlatToolBarUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + + @Override + public void uninstallUI( JComponent c ) { + super.uninstallUI( c ); + + oldStyleValues = null; + } + @Override protected ContainerListener createToolBarContListener() { return new ToolBarContListener() { @@ -73,6 +102,25 @@ public class FlatToolBarUI }; } + @Override + protected PropertyChangeListener createPropertyListener() { + return FlatStyleSupport.createPropertyChangeListener( toolBar, this::applyStyle, super.createPropertyListener() ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + // disable rollover border @Override protected void setBorderToRollover( Component c ) {} @Override protected void setBorderToNonRollover( Component c ) {} diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 92f219e0..40ed3a4b 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -585,6 +585,22 @@ public class FlatStylingTests ui.applyStyle( b, "tab.focusBackground: #fff" ); } + @Test + void toolBar() { + FlatToolBarUI ui = new FlatToolBarUI(); + + ui.applyStyle( "borderMargins: 1,2,3,4" ); + ui.applyStyle( "gripColor: #fff" ); + } + + @Test + void toolBarSeparator() { + FlatToolBarSeparatorUI ui = new FlatToolBarSeparatorUI( false ); + + ui.applyStyle( "separatorWidth: 6" ); + ui.applyStyle( "separatorColor: #fff" ); + } + @Test void tree() { FlatTreeUI ui = new FlatTreeUI(); From afdbf711f77d723c401fecabbd01c084c9c6d3cd Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 25 Jun 2021 14:27:44 +0200 Subject: [PATCH 34/60] Styling: support Help button --- .../flatlaf/icons/FlatHelpButtonIcon.java | 51 +++++++++++-------- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 15 ++++++ .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 6 +-- .../formdev/flatlaf/ui/FlatStylingTests.java | 40 +++++++++++++++ 4 files changed, 89 insertions(+), 23 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java index 9283b49d..9faee940 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java @@ -24,7 +24,9 @@ import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; +import com.formdev.flatlaf.ui.FlatStyleSupport; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Help button icon for {@link javax.swing.JButton}. @@ -50,29 +52,34 @@ import com.formdev.flatlaf.ui.FlatUIUtils; public class FlatHelpButtonIcon extends FlatAbstractIcon { - protected final int focusWidth = UIManager.getInt( "Component.focusWidth" ); - protected final Color focusColor = UIManager.getColor( "Component.focusColor" ); - protected final float innerFocusWidth = FlatUIUtils.getUIFloat( "HelpButton.innerFocusWidth", FlatUIUtils.getUIFloat( "Component.innerFocusWidth", 0 ) ); - protected final int borderWidth = FlatUIUtils.getUIInt( "HelpButton.borderWidth", 1 ); + @Styleable protected int focusWidth = UIManager.getInt( "Component.focusWidth" ); + @Styleable protected Color focusColor = UIManager.getColor( "Component.focusColor" ); + @Styleable protected float innerFocusWidth = FlatUIUtils.getUIFloat( "HelpButton.innerFocusWidth", FlatUIUtils.getUIFloat( "Component.innerFocusWidth", 0 ) ); + @Styleable protected int borderWidth = FlatUIUtils.getUIInt( "HelpButton.borderWidth", 1 ); - protected final Color borderColor = UIManager.getColor( "HelpButton.borderColor" ); - protected final Color disabledBorderColor = UIManager.getColor( "HelpButton.disabledBorderColor" ); - protected final Color focusedBorderColor = UIManager.getColor( "HelpButton.focusedBorderColor" ); - protected final Color hoverBorderColor = UIManager.getColor( "HelpButton.hoverBorderColor" ); - protected final Color background = UIManager.getColor( "HelpButton.background" ); - protected final Color disabledBackground = UIManager.getColor( "HelpButton.disabledBackground" ); - protected final Color focusedBackground = UIManager.getColor( "HelpButton.focusedBackground" ); - protected final Color hoverBackground = UIManager.getColor( "HelpButton.hoverBackground" ); - protected final Color pressedBackground = UIManager.getColor( "HelpButton.pressedBackground" ); - protected final Color questionMarkColor = UIManager.getColor( "HelpButton.questionMarkColor" ); - protected final Color disabledQuestionMarkColor = UIManager.getColor( "HelpButton.disabledQuestionMarkColor" ); - - protected final int iconSize = 22 + (focusWidth * 2); + @Styleable protected Color borderColor = UIManager.getColor( "HelpButton.borderColor" ); + @Styleable protected Color disabledBorderColor = UIManager.getColor( "HelpButton.disabledBorderColor" ); + @Styleable protected Color focusedBorderColor = UIManager.getColor( "HelpButton.focusedBorderColor" ); + @Styleable protected Color hoverBorderColor = UIManager.getColor( "HelpButton.hoverBorderColor" ); + @Styleable protected Color background = UIManager.getColor( "HelpButton.background" ); + @Styleable protected Color disabledBackground = UIManager.getColor( "HelpButton.disabledBackground" ); + @Styleable protected Color focusedBackground = UIManager.getColor( "HelpButton.focusedBackground" ); + @Styleable protected Color hoverBackground = UIManager.getColor( "HelpButton.hoverBackground" ); + @Styleable protected Color pressedBackground = UIManager.getColor( "HelpButton.pressedBackground" ); + @Styleable protected Color questionMarkColor = UIManager.getColor( "HelpButton.questionMarkColor" ); + @Styleable protected Color disabledQuestionMarkColor = UIManager.getColor( "HelpButton.disabledQuestionMarkColor" ); public FlatHelpButtonIcon() { super( 0, 0, null ); } + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override protected void paintIcon( Component c, Graphics2D g2 ) { /* @@ -89,7 +96,7 @@ public class FlatHelpButtonIcon boolean focused = FlatUIUtils.isPermanentFocusOwner( c ); float xy = 0.5f; - float wh = iconSize - 1; + float wh = iconSize() - 1; // paint outer focus border if( focused && FlatButtonUI.isFocusPainted( c ) ) { @@ -151,11 +158,15 @@ public class FlatHelpButtonIcon @Override public int getIconWidth() { - return scale( iconSize ); + return scale( iconSize() ); } @Override public int getIconHeight() { - return scale( iconSize ); + return scale( iconSize() ); + } + + private int iconSize() { + return 22 + (focusWidth * 2); } } 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 34ea010b..77d3b5fa 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 @@ -46,6 +46,7 @@ import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicButtonListener; import javax.swing.plaf.basic.BasicButtonUI; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.icons.FlatHelpButtonIcon; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; @@ -137,6 +138,7 @@ public class FlatButtonUI private final boolean shared; private boolean borderShared = true; + private boolean helpButtonIconShared = true; private boolean defaults_initialized = false; private Map oldStyleValues; @@ -274,6 +276,19 @@ public class FlatButtonUI * @since TODO */ protected Object applyStyleProperty( AbstractButton b, String key, Object value ) { + if( key.startsWith( "help." ) ) { + if( !(helpButtonIcon instanceof FlatHelpButtonIcon) ) + return new UnknownStyleException( key ); + + if( helpButtonIconShared ) { + helpButtonIcon = FlatStyleSupport.cloneIcon( helpButtonIcon ); + helpButtonIconShared = false; + } + + key = key.substring( "help.".length() ); + return ((FlatHelpButtonIcon)helpButtonIcon).applyStyleProperty( key, value ); + } + try { return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } catch( UnknownStyleException ex ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index d28b2907..0f0de186 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -37,6 +37,7 @@ import javax.swing.plaf.basic.BasicRadioButtonUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.icons.FlatCheckBoxIcon; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** @@ -164,16 +165,15 @@ public class FlatRadioButtonUI protected Object applyStyleProperty( String key, Object value ) { // style icon if( key.startsWith( "icon." ) ) { - key = key.substring( "icon.".length() ); - if( !(icon instanceof FlatCheckBoxIcon) ) - return null; + return new UnknownStyleException( key ); if( iconShared ) { icon = FlatStyleSupport.cloneIcon( icon ); iconShared = false; } + key = key.substring( "icon.".length() ); return ((FlatCheckBoxIcon)icon).applyStyleProperty( key, value ); } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 40ed3a4b..635f5da2 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -70,6 +70,25 @@ public class FlatStylingTests ui.installUI( b ); button( b, ui ); + + //---- FlatHelpButtonIcon ---- + + ui.applyStyle( b, "help.focusWidth: 2" ); + ui.applyStyle( b, "help.focusColor: #fff" ); + ui.applyStyle( b, "help.innerFocusWidth: {float}0.5" ); + ui.applyStyle( b, "help.borderWidth: 1" ); + + ui.applyStyle( b, "help.borderColor: #fff" ); + ui.applyStyle( b, "help.disabledBorderColor: #fff" ); + ui.applyStyle( b, "help.focusedBorderColor: #fff" ); + ui.applyStyle( b, "help.hoverBorderColor: #fff" ); + ui.applyStyle( b, "help.background: #fff" ); + ui.applyStyle( b, "help.disabledBackground: #fff" ); + ui.applyStyle( b, "help.focusedBackground: #fff" ); + ui.applyStyle( b, "help.hoverBackground: #fff" ); + ui.applyStyle( b, "help.pressedBackground: #fff" ); + ui.applyStyle( b, "help.questionMarkColor: #fff" ); + ui.applyStyle( b, "help.disabledQuestionMarkColor: #fff" ); } private void button( AbstractButton b, FlatButtonUI ui ) { @@ -821,4 +840,25 @@ public class FlatStylingTests icon.applyStyleProperty( "disabledArrowColor", Color.WHITE ); icon.applyStyleProperty( "selectionForeground", Color.WHITE ); } + @Test + void flatHelpButtonIcon() { + FlatHelpButtonIcon icon = new FlatHelpButtonIcon(); + + icon.applyStyleProperty( "focusWidth", 2 ); + icon.applyStyleProperty( "focusColor", Color.WHITE ); + icon.applyStyleProperty( "innerFocusWidth", 0.5f ); + icon.applyStyleProperty( "borderWidth", 1 ); + + icon.applyStyleProperty( "borderColor", Color.WHITE ); + icon.applyStyleProperty( "disabledBorderColor", Color.WHITE ); + icon.applyStyleProperty( "focusedBorderColor", Color.WHITE ); + icon.applyStyleProperty( "hoverBorderColor", Color.WHITE ); + icon.applyStyleProperty( "background", Color.WHITE ); + icon.applyStyleProperty( "disabledBackground", Color.WHITE ); + icon.applyStyleProperty( "focusedBackground", Color.WHITE ); + icon.applyStyleProperty( "hoverBackground", Color.WHITE ); + icon.applyStyleProperty( "pressedBackground", Color.WHITE ); + icon.applyStyleProperty( "questionMarkColor", Color.WHITE ); + icon.applyStyleProperty( "disabledQuestionMarkColor", Color.WHITE ); + } } From d502406fa2470d2118ae89ace83ed7bb300a9bd0 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 25 Jun 2021 21:22:44 +0200 Subject: [PATCH 35/60] Styling: support borders of ComboBox and Spinner reduced code size of Button, TextField and PasswordField --- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 27 ++++-------------- .../formdev/flatlaf/ui/FlatComboBoxUI.java | 7 ++++- .../flatlaf/ui/FlatPasswordFieldUI.java | 28 ++++--------------- .../formdev/flatlaf/ui/FlatRoundBorder.java | 3 +- .../com/formdev/flatlaf/ui/FlatSpinnerUI.java | 7 ++++- .../formdev/flatlaf/ui/FlatStyleSupport.java | 25 +++++++++++++++++ .../formdev/flatlaf/ui/FlatTextFieldUI.java | 28 ++++--------------- .../formdev/flatlaf/ui/FlatStylingTests.java | 18 ++++++++++-- 8 files changed, 73 insertions(+), 70 deletions(-) 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 77d3b5fa..4daf92d7 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 @@ -31,6 +31,7 @@ import java.awt.Rectangle; import java.awt.geom.RoundRectangle2D; import java.beans.PropertyChangeEvent; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.AbstractButton; import javax.swing.ButtonModel; import javax.swing.Icon; @@ -40,7 +41,6 @@ import javax.swing.JToggleButton; import javax.swing.JToolBar; import javax.swing.LookAndFeel; import javax.swing.UIManager; -import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicButtonListener; @@ -137,10 +137,10 @@ public class FlatButtonUI private Icon helpButtonIcon; private final boolean shared; - private boolean borderShared = true; private boolean helpButtonIconShared = true; private boolean defaults_initialized = false; private Map oldStyleValues; + private AtomicBoolean borderShared; public static ComponentUI createUI( JComponent c ) { return FlatUIUtils.canUseSharedUI( c ) @@ -223,6 +223,7 @@ public class FlatButtonUI super.uninstallDefaults( b ); oldStyleValues = null; + borderShared = null; MigLayoutVisualPadding.uninstall( b ); defaults_initialized = false; @@ -289,25 +290,9 @@ public class FlatButtonUI return ((FlatHelpButtonIcon)helpButtonIcon).applyStyleProperty( key, value ); } - try { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); - } catch( UnknownStyleException ex ) { - Border border = b.getBorder(); - if( border instanceof FlatBorder ) { - if( borderShared ) { - border = FlatStyleSupport.cloneBorder( border ); - b.setBorder( border ); - borderShared = false; - } - - try { - return ((FlatBorder)border).applyStyleProperty( key, value ); - } catch( UnknownStyleException ex2 ) { - // ignore - } - } - throw ex; - } + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, b, borderShared ); } static boolean isContentAreaFilled( Component c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java index de802eee..146c4414 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java @@ -41,6 +41,7 @@ import java.awt.geom.Rectangle2D; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.CellRendererPane; @@ -141,6 +142,7 @@ public class FlatComboBoxUI private WeakReference lastRendererComponent; private Map oldStyleValues; + private AtomicBoolean borderShared; public static ComponentUI createUI( JComponent c ) { return new FlatComboBoxUI(); @@ -261,6 +263,7 @@ public class FlatComboBoxUI popupFocusedBackground = null; oldStyleValues = null; + borderShared = null; MigLayoutVisualPadding.uninstall( comboBox ); } @@ -440,7 +443,9 @@ public class FlatComboBoxUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, comboBox, borderShared ); } @Override 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 822a9b34..d81c267a 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 @@ -27,18 +27,17 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.beans.PropertyChangeEvent; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.UIManager; -import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicPasswordFieldUI; import javax.swing.text.Caret; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.icons.FlatCapsLockIcon; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -92,7 +91,7 @@ public class FlatPasswordFieldUI private FocusListener focusListener; private KeyListener capsLockListener; private Map oldStyleValues; - private boolean borderShared = true; + private AtomicBoolean borderShared; private boolean capsLockIconShared = true; public static ComponentUI createUI( JComponent c ) { @@ -141,6 +140,7 @@ public class FlatPasswordFieldUI oldInactiveBackground = null; oldStyleValues = null; + borderShared = null; MigLayoutVisualPadding.uninstall( getComponent() ); } @@ -222,25 +222,9 @@ public class FlatPasswordFieldUI return ((FlatCapsLockIcon)capsLockIcon).applyStyleProperty( key, value ); } - try { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); - } catch( UnknownStyleException ex ) { - Border border = getComponent().getBorder(); - if( border instanceof FlatBorder ) { - if( borderShared ) { - border = FlatStyleSupport.cloneBorder( border ); - getComponent().setBorder( border ); - borderShared = false; - } - - try { - return ((FlatBorder)border).applyStyleProperty( key, value ); - } catch( UnknownStyleException ex2 ) { - // ignore - } - } - throw ex; - } + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, getComponent(), borderShared ); } private void updateBackground() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRoundBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRoundBorder.java index 3703be9c..975c71e0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRoundBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRoundBorder.java @@ -18,6 +18,7 @@ package com.formdev.flatlaf.ui; import java.awt.Component; import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Border for various components (e.g. {@link javax.swing.JComboBox}). @@ -29,7 +30,7 @@ import javax.swing.UIManager; public class FlatRoundBorder extends FlatBorder { - protected final int arc = UIManager.getInt( "Component.arc" ); + @Styleable protected int arc = UIManager.getInt( "Component.arc" ); @Override protected int getArc( Component c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index 84e53e6a..c230a82f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -33,6 +33,7 @@ import java.awt.geom.Rectangle2D; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JComponent; import javax.swing.JSpinner; import javax.swing.JTextField; @@ -100,6 +101,7 @@ public class FlatSpinnerUI @Styleable protected Insets padding; private Map oldStyleValues; + private AtomicBoolean borderShared; public static ComponentUI createUI( JComponent c ) { return new FlatSpinnerUI(); @@ -154,6 +156,7 @@ public class FlatSpinnerUI padding = null; oldStyleValues = null; + borderShared = null; MigLayoutVisualPadding.uninstall( spinner ); } @@ -196,7 +199,9 @@ public class FlatSpinnerUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, spinner, borderShared ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 23ad2c3f..902f79b3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -26,6 +26,7 @@ import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Predicate; @@ -270,6 +271,30 @@ public class FlatStyleSupport } } + static Object applyToAnnotatedObjectOrBorder( Object obj, String key, Object value, + JComponent c, AtomicBoolean borderShared ) + { + try { + return applyToAnnotatedObject( obj, key, value ); + } catch( UnknownStyleException ex ) { + Border border = c.getBorder(); + if( border instanceof FlatBorder ) { + if( borderShared.get() ) { + border = cloneBorder( border ); + c.setBorder( border ); + borderShared.set( false ); + } + + try { + return ((FlatBorder)border).applyStyleProperty( key, value ); + } catch( UnknownStyleException ex2 ) { + // ignore + } + } + throw ex; + } + } + public static Object getStyle( JComponent c ) { return c.getClientProperty( FlatClientProperties.STYLE ); } 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 650a8ae2..fce393f2 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.event.FocusListener; import java.beans.PropertyChangeEvent; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import javax.swing.JComboBox; import javax.swing.JComponent; @@ -34,7 +35,6 @@ import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.LookAndFeel; import javax.swing.UIManager; -import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicTextFieldUI; @@ -42,7 +42,6 @@ import javax.swing.text.Caret; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.JavaCompatibility; @@ -91,7 +90,7 @@ public class FlatTextFieldUI private FocusListener focusListener; private Map oldStyleValues; - private boolean borderShared = true; + private AtomicBoolean borderShared; public static ComponentUI createUI( JComponent c ) { return new FlatTextFieldUI(); @@ -136,6 +135,7 @@ public class FlatTextFieldUI oldInactiveBackground = null; oldStyleValues = null; + borderShared = null; MigLayoutVisualPadding.uninstall( getComponent() ); } @@ -208,25 +208,9 @@ public class FlatTextFieldUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - try { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); - } catch( UnknownStyleException ex ) { - Border border = getComponent().getBorder(); - if( border instanceof FlatBorder ) { - if( borderShared ) { - border = FlatStyleSupport.cloneBorder( border ); - getComponent().setBorder( border ); - borderShared = false; - } - - try { - return ((FlatBorder)border).applyStyleProperty( key, value ); - } catch( UnknownStyleException ex2 ) { - // ignore - } - } - throw ex; - } + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, getComponent(), borderShared ); } private void updateBackground() { diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 635f5da2..58bc68c8 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -141,7 +141,8 @@ public class FlatStylingTests void comboBox() { FlatComboBoxUI ui = new FlatComboBoxUI(); - // create arrow button + // create border and arrow button + UIManager.put( "ComboBox.border", new FlatRoundBorder() ); ui.installUI( new JComboBox<>() ); ui.applyStyle( "minimumWidth: 100" ); @@ -165,6 +166,9 @@ public class FlatStylingTests ui.applyStyle( "buttonPressedArrowColor: #fff" ); ui.applyStyle( "popupFocusedBackground: #fff" ); + + // border + flatRoundBorder( style -> ui.applyStyle( style ) ); } @Test @@ -465,7 +469,8 @@ public class FlatStylingTests void spinner() { FlatSpinnerUI ui = new FlatSpinnerUI(); - // create arrow buttons + // create border and arrow buttons + UIManager.put( "Spinner.border", new FlatRoundBorder() ); ui.installUI( new JSpinner() ); ui.applyStyle( "minimumWidth: 100" ); @@ -482,6 +487,9 @@ public class FlatStylingTests ui.applyStyle( "buttonHoverArrowColor: #fff" ); ui.applyStyle( "buttonPressedArrowColor: #fff" ); ui.applyStyle( "padding: 1,2,3,4" ); + + // border + flatRoundBorder( style -> ui.applyStyle( style ) ); } @Test @@ -664,6 +672,12 @@ public class FlatStylingTests applyStyle.accept( "arc: 6" ); } + private void flatRoundBorder( Consumer applyStyle ) { + flatBorder( applyStyle ); + + applyStyle.accept( "arc: 6" ); + } + private void flatTextBorder( Consumer applyStyle ) { flatBorder( applyStyle ); From 2b60b18d47e92ffad555f6ba16439621d612cddc Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 25 Jun 2021 21:39:52 +0200 Subject: [PATCH 36/60] Styling: support ScrollPane --- .../formdev/flatlaf/ui/FlatScrollPaneUI.java | 39 ++++++++++++++++++- .../formdev/flatlaf/ui/FlatStylingTests.java | 12 ++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java index bd8ba14d..38627b54 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java @@ -29,6 +29,8 @@ import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; @@ -69,6 +71,9 @@ public class FlatScrollPaneUI { private Handler handler; + private Map oldStyleValues; + private AtomicBoolean borderShared; + public static ComponentUI createUI( JComponent c ) { return new FlatScrollPaneUI(); } @@ -80,6 +85,8 @@ public class FlatScrollPaneUI int focusWidth = UIManager.getInt( "Component.focusWidth" ); LookAndFeel.installProperty( c, "opaque", focusWidth == 0 ); + applyStyle( FlatStyleSupport.getStyle( c ) ); + MigLayoutVisualPadding.install( scrollpane ); } @@ -88,6 +95,9 @@ public class FlatScrollPaneUI MigLayoutVisualPadding.uninstall( scrollpane ); super.uninstallUI( c ); + + oldStyleValues = null; + borderShared = null; } @Override @@ -272,7 +282,13 @@ public class FlatScrollPaneUI ((JButton)corner).setBorder( BorderFactory.createEmptyBorder() ); ((JButton)corner).setFocusable( false ); } - break; + break; + + case FlatClientProperties.STYLE: + applyStyle( e.getNewValue() ); + scrollpane.revalidate(); + scrollpane.repaint(); + break; } }; } @@ -283,6 +299,27 @@ public class FlatScrollPaneUI return handler; } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + if( key.equals( "focusWidth" ) ) { + int focusWidth = (value instanceof Integer) ? (int) value : UIManager.getInt( "Component.focusWidth" ); + LookAndFeel.installProperty( scrollpane, "opaque", focusWidth == 0 ); + } + + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, scrollpane, borderShared ); + } + @Override protected void updateViewport( PropertyChangeEvent e ) { super.updateViewport( e ); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 58bc68c8..a1da30a9 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -430,6 +430,18 @@ public class FlatStylingTests ui.applyStyle( "pressedButtonBackground: #fff" ); } + @Test + void scrollPane() { + FlatScrollPaneUI ui = new FlatScrollPaneUI(); + + // create border + UIManager.put( "ScrollPane.border", new FlatBorder() ); + ui.installUI( new JScrollPane() ); + + // border + flatBorder( style -> ui.applyStyle( style ) ); + } + @Test void separator() { FlatSeparatorUI ui = new FlatSeparatorUI( false ); From 925ddaa63aff489436b1d7d704599cdaf6c4fbb7 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 25 Jun 2021 21:40:19 +0200 Subject: [PATCH 37/60] Styling: update MigLayout visual padding --- .../java/com/formdev/flatlaf/ui/MigLayoutVisualPadding.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/MigLayoutVisualPadding.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/MigLayoutVisualPadding.java index 6148f718..7df37989 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/MigLayoutVisualPadding.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/MigLayoutVisualPadding.java @@ -21,6 +21,7 @@ import java.awt.Insets; import java.beans.PropertyChangeListener; import java.util.function.Function; import javax.swing.JComponent; +import com.formdev.flatlaf.FlatClientProperties; /** * Support for MigLayout visual paddings. @@ -80,7 +81,7 @@ public class MigLayoutVisualPadding return new Insets( focusWidth, focusWidth, focusWidth, focusWidth ); } else return null; - }, "border" ); + }, "border", FlatClientProperties.STYLE ); } /** From 2b1c55ee67f402bbdf98da437dc88e10dfd9d92a Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 27 Jun 2021 17:12:46 +0200 Subject: [PATCH 38/60] Styling: support TabbedPane --- .../icons/FlatTabbedPaneCloseIcon.java | 41 +++-- .../formdev/flatlaf/ui/FlatTabbedPaneUI.java | 142 ++++++++++++++---- .../formdev/flatlaf/ui/FlatStylingTests.java | 62 ++++++++ 3 files changed, 198 insertions(+), 47 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java index 39e90587..006fd13f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java @@ -25,6 +25,8 @@ import java.awt.geom.Line2D; import java.awt.geom.Path2D; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; +import com.formdev.flatlaf.ui.FlatStyleSupport; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -47,39 +49,46 @@ import com.formdev.flatlaf.ui.FlatUIUtils; public class FlatTabbedPaneCloseIcon extends FlatAbstractIcon { - protected final Dimension size = UIManager.getDimension( "TabbedPane.closeSize" ); - protected final int arc = UIManager.getInt( "TabbedPane.closeArc" ); - protected final float crossPlainSize = FlatUIUtils.getUIFloat( "TabbedPane.closeCrossPlainSize", 7.5f ); - protected final float crossFilledSize = FlatUIUtils.getUIFloat( "TabbedPane.closeCrossFilledSize", crossPlainSize ); - protected final float closeCrossLineWidth = FlatUIUtils.getUIFloat( "TabbedPane.closeCrossLineWidth", 1f ); - protected final Color background = UIManager.getColor( "TabbedPane.closeBackground" ); - protected final Color foreground = UIManager.getColor( "TabbedPane.closeForeground" ); - protected final Color hoverBackground = UIManager.getColor( "TabbedPane.closeHoverBackground" ); - protected final Color hoverForeground = UIManager.getColor( "TabbedPane.closeHoverForeground" ); - protected final Color pressedBackground = UIManager.getColor( "TabbedPane.closePressedBackground" ); - protected final Color pressedForeground = UIManager.getColor( "TabbedPane.closePressedForeground" ); + @Styleable protected Dimension closeSize = UIManager.getDimension( "TabbedPane.closeSize" ); + @Styleable protected int closeArc = UIManager.getInt( "TabbedPane.closeArc" ); + @Styleable protected float closeCrossPlainSize = FlatUIUtils.getUIFloat( "TabbedPane.closeCrossPlainSize", 7.5f ); + @Styleable protected float closeCrossFilledSize = FlatUIUtils.getUIFloat( "TabbedPane.closeCrossFilledSize", closeCrossPlainSize ); + @Styleable protected float closeCrossLineWidth = FlatUIUtils.getUIFloat( "TabbedPane.closeCrossLineWidth", 1f ); + @Styleable protected Color closeBackground = UIManager.getColor( "TabbedPane.closeBackground" ); + @Styleable protected Color closeForeground = UIManager.getColor( "TabbedPane.closeForeground" ); + @Styleable protected Color closeHoverBackground = UIManager.getColor( "TabbedPane.closeHoverBackground" ); + @Styleable protected Color closeHoverForeground = UIManager.getColor( "TabbedPane.closeHoverForeground" ); + @Styleable protected Color closePressedBackground = UIManager.getColor( "TabbedPane.closePressedBackground" ); + @Styleable protected Color closePressedForeground = UIManager.getColor( "TabbedPane.closePressedForeground" ); public FlatTabbedPaneCloseIcon() { super( 16, 16, null ); } + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override protected void paintIcon( Component c, Graphics2D g ) { // paint background - Color bg = FlatButtonUI.buttonStateColor( c, background, null, null, hoverBackground, pressedBackground ); + Color bg = FlatButtonUI.buttonStateColor( c, closeBackground, null, null, closeHoverBackground, closePressedBackground ); if( bg != null ) { g.setColor( FlatUIUtils.deriveColor( bg, c.getBackground() ) ); - g.fillRoundRect( (width - size.width) / 2, (height - size.height) / 2, - size.width, size.height, arc, arc ); + g.fillRoundRect( (width - closeSize.width) / 2, (height - closeSize.height) / 2, + closeSize.width, closeSize.height, closeArc, closeArc ); } // set cross color - Color fg = FlatButtonUI.buttonStateColor( c, foreground, null, null, hoverForeground, pressedForeground ); + Color fg = FlatButtonUI.buttonStateColor( c, closeForeground, null, null, closeHoverForeground, closePressedForeground ); g.setColor( FlatUIUtils.deriveColor( fg, c.getForeground() ) ); float mx = width / 2; float my = height / 2; - float r = ((bg != null) ? crossFilledSize : crossPlainSize) / 2; + float r = ((bg != null) ? closeCrossFilledSize : closeCrossPlainSize) / 2; // paint cross Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index c4f79435..ee884a8b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -53,6 +53,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collections; import java.util.Locale; +import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.IntConsumer; @@ -84,6 +85,9 @@ import javax.swing.plaf.basic.BasicTabbedPaneUI; import javax.swing.text.JTextComponent; import javax.swing.text.View; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.icons.FlatTabbedPaneCloseIcon; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.Animator; import com.formdev.flatlaf.util.CubicBezierEasing; import com.formdev.flatlaf.util.JavaCompatibility; @@ -101,7 +105,7 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault TabbedPane.font Font * @uiDefault TabbedPane.background Color * @uiDefault TabbedPane.foreground Color - * @uiDefault TabbedPane.shadow Color used for scroll arrows and cropped line + * @uiDefault TabbedPane.shadow Color used for cropped line * @uiDefault TabbedPane.textIconGap int * @uiDefault TabbedPane.tabInsets Insets * @uiDefault TabbedPane.selectedTabPadInsets Insets unused @@ -177,43 +181,43 @@ public class FlatTabbedPaneUI private static Set focusBackwardTraversalKeys; protected Color foreground; - protected Color disabledForeground; - protected Color selectedBackground; - protected Color selectedForeground; - protected Color underlineColor; - protected Color disabledUnderlineColor; - protected Color hoverColor; - protected Color focusColor; - protected Color tabSeparatorColor; - protected Color contentAreaColor; + @Styleable protected Color disabledForeground; + @Styleable protected Color selectedBackground; + @Styleable protected Color selectedForeground; + @Styleable protected Color underlineColor; + @Styleable protected Color disabledUnderlineColor; + @Styleable protected Color hoverColor; + @Styleable protected Color focusColor; + @Styleable protected Color tabSeparatorColor; + @Styleable protected Color contentAreaColor; private int textIconGapUnscaled; - protected int minimumTabWidth; - protected int maximumTabWidth; - protected int tabHeight; - protected int tabSelectionHeight; - protected int contentSeparatorHeight; - protected boolean showTabSeparators; - protected boolean tabSeparatorsFullHeight; - protected boolean hasFullBorder; - protected boolean tabsOpaque = true; + @Styleable protected int minimumTabWidth; + @Styleable protected int maximumTabWidth; + @Styleable protected int tabHeight; + @Styleable protected int tabSelectionHeight; + @Styleable protected int contentSeparatorHeight; + @Styleable protected boolean showTabSeparators; + @Styleable protected boolean tabSeparatorsFullHeight; + @Styleable protected boolean hasFullBorder; + @Styleable protected boolean tabsOpaque = true; - private int tabsPopupPolicy; - private int scrollButtonsPolicy; - private int scrollButtonsPlacement; + @Styleable private int tabsPopupPolicy; + @Styleable private int scrollButtonsPolicy; + @Styleable private int scrollButtonsPlacement; - private int tabAreaAlignment; - private int tabAlignment; - private int tabWidthMode; + @Styleable private int tabAreaAlignment; + @Styleable private int tabAlignment; + @Styleable private int tabWidthMode; protected Icon closeIcon; - protected String arrowType; - protected Insets buttonInsets; - protected int buttonArc; - protected Color buttonHoverBackground; - protected Color buttonPressedBackground; + @Styleable protected String arrowType; + @Styleable protected Insets buttonInsets; + @Styleable protected int buttonArc; + @Styleable protected Color buttonHoverBackground; + @Styleable protected Color buttonPressedBackground; - protected String moreTabsButtonToolTipText; + @Styleable protected String moreTabsButtonToolTipText; protected JViewport tabViewport; protected FlatWheelTabScroller wheelTabScroller; @@ -231,6 +235,8 @@ public class FlatTabbedPaneUI private boolean pressedTabClose; private Object[] oldRenderingHints; + private Map oldStyleValues; + private boolean closeIconShared = true; public static ComponentUI createUI( JComponent c ) { return new FlatTabbedPaneUI(); @@ -259,6 +265,8 @@ public class FlatTabbedPaneUI buttonPressedBackground = UIManager.getColor( "TabbedPane.buttonPressedBackground" ); super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); } @Override @@ -313,6 +321,7 @@ public class FlatTabbedPaneUI tabAlignment = parseAlignment( UIManager.getString( "TabbedPane.tabAlignment" ), CENTER ); tabWidthMode = parseTabWidthMode( UIManager.getString( "TabbedPane.tabWidthMode" ) ); closeIcon = UIManager.getIcon( "TabbedPane.closeIcon" ); + closeIconShared = true; buttonInsets = UIManager.getInsets( "TabbedPane.buttonInsets" ); buttonArc = UIManager.getInt( "TabbedPane.buttonArc" ); @@ -361,6 +370,8 @@ public class FlatTabbedPaneUI buttonHoverBackground = null; buttonPressedBackground = null; + oldStyleValues = null; + MigLayoutVisualPadding.uninstall( tabPane ); } @@ -558,6 +569,63 @@ public class FlatTabbedPaneUI return new FlatScrollableTabButton( direction ); } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + // update buttons + for( Component c : tabPane.getComponents() ) { + if( c instanceof FlatTabAreaButton ) + ((FlatTabAreaButton)c).updateStyle(); + } + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + // close icon + if( key.startsWith( "close" ) ) { + if( !(closeIcon instanceof FlatTabbedPaneCloseIcon) ) + return new UnknownStyleException( key ); + + if( closeIconShared ) { + closeIcon = FlatStyleSupport.cloneIcon( closeIcon ); + closeIconShared = false; + } + + return ((FlatTabbedPaneCloseIcon)closeIcon).applyStyleProperty( key, value ); + } + + if( value instanceof String ) { + switch( key ) { + case "tabsPopupPolicy": value = parseTabsPopupPolicy( (String) value ); break; + case "scrollButtonsPolicy": value = parseScrollButtonsPolicy( (String) value ); break; + case "scrollButtonsPlacement": value = parseScrollButtonsPlacement( (String) value ); break; + + case "tabAreaAlignment": value = parseAlignment( (String) value, LEADING ); break; + case "tabAlignment": value = parseAlignment( (String) value, CENTER ); break; + case "tabWidthMode": value = parseTabWidthMode( (String) value ); break; + } + } else { + Object oldValue = null; + switch( key ) { + // BasicTabbedPaneUI + case "tabInsets": oldValue = tabInsets; tabInsets = (Insets) value; return oldValue; + case "tabAreaInsets": oldValue = tabAreaInsets; tabAreaInsets = (Insets) value; return oldValue; + case "textIconGap": + oldValue = textIconGapUnscaled; + textIconGapUnscaled = (int) value; + textIconGap = scale( textIconGapUnscaled ); + return oldValue; + } + } + + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + protected void setRolloverTab( int x, int y ) { setRolloverTab( tabForCoordinate( tabPane, x, y ) ); } @@ -1556,6 +1624,12 @@ public class FlatTabbedPaneUI setArrowWidth( 10 ); } + protected void updateStyle() { + updateStyle( arrowType, + FlatTabbedPaneUI.this.foreground, FlatTabbedPaneUI.this.disabledForeground, + null, buttonHoverBackground, null, buttonPressedBackground ); + } + @Override protected Color deriveBackground( Color background ) { return FlatUIUtils.deriveColor( background, tabPane.getBackground() ); @@ -2340,6 +2414,12 @@ public class FlatTabbedPaneUI tabPane.repaint(); ensureSelectedTabIsVisibleLater(); break; + + case STYLE: + applyStyle( e.getNewValue() ); + tabPane.revalidate(); + tabPane.repaint(); + break; } } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index a1da30a9..9bddda13 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -523,6 +523,68 @@ public class FlatStylingTests ui.applyStyle( "gripGap: 2" ); } + @Test + void tabbedPane() { + FlatTabbedPaneUI ui = new FlatTabbedPaneUI(); + + UIManager.put( "TabbedPane.closeIcon", new FlatTabbedPaneCloseIcon() ); + ui.installUI( new JTabbedPane() ); + + ui.applyStyle( "tabInsets: 1,2,3,4" ); + ui.applyStyle( "tabAreaInsets: 1,2,3,4" ); + + ui.applyStyle( "disabledForeground: #fff" ); + + ui.applyStyle( "selectedBackground: #fff" ); + ui.applyStyle( "selectedForeground: #fff" ); + ui.applyStyle( "underlineColor: #fff" ); + ui.applyStyle( "disabledUnderlineColor: #fff" ); + ui.applyStyle( "hoverColor: #fff" ); + ui.applyStyle( "focusColor: #fff" ); + ui.applyStyle( "tabSeparatorColor: #fff" ); + ui.applyStyle( "contentAreaColor: #fff" ); + + ui.applyStyle( "textIconGap: 4" ); + ui.applyStyle( "minimumTabWidth: 50" ); + ui.applyStyle( "maximumTabWidth: 100" ); + ui.applyStyle( "tabHeight: 30" ); + ui.applyStyle( "tabSelectionHeight: 3" ); + ui.applyStyle( "contentSeparatorHeight: 1" ); + ui.applyStyle( "showTabSeparators: false" ); + ui.applyStyle( "tabSeparatorsFullHeight: false" ); + ui.applyStyle( "hasFullBorder: false" ); + ui.applyStyle( "tabsOpaque: false" ); + + ui.applyStyle( "tabsPopupPolicy: asNeeded" ); + ui.applyStyle( "scrollButtonsPolicy: asNeeded" ); + ui.applyStyle( "scrollButtonsPlacement: both" ); + + ui.applyStyle( "tabAreaAlignment: leading" ); + ui.applyStyle( "tabAlignment: center" ); + ui.applyStyle( "tabWidthMode: preferred" ); + + ui.applyStyle( "arrowType: chevron" ); + ui.applyStyle( "buttonInsets: 1,2,3,4" ); + ui.applyStyle( "buttonArc: 3" ); + ui.applyStyle( "buttonHoverBackground: #fff" ); + ui.applyStyle( "buttonPressedBackground: #fff" ); + + ui.applyStyle( "moreTabsButtonToolTipText: Gimme more" ); + + // FlatTabbedPaneCloseIcon + ui.applyStyle( "closeSize: 16,16" ); + ui.applyStyle( "closeArc: 4" ); + ui.applyStyle( "closeCrossPlainSize: {float}7.5" ); + ui.applyStyle( "closeCrossFilledSize: {float}7.5" ); + ui.applyStyle( "closeCrossLineWidth: {float}1" ); + ui.applyStyle( "closeBackground: #fff" ); + ui.applyStyle( "closeForeground: #fff" ); + ui.applyStyle( "closeHoverBackground: #fff" ); + ui.applyStyle( "closeHoverForeground: #fff" ); + ui.applyStyle( "closePressedBackground: #fff" ); + ui.applyStyle( "closePressedForeground: #fff" ); + } + @Test void table() { FlatTableUI ui = new FlatTableUI(); From 5801bf3bdfc9e5e412068ee3ccabce5f423924a2 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 4 Jul 2021 10:43:08 +0200 Subject: [PATCH 39/60] Styling: use FlatLightLaf in unit tests and get UI delegates from components --- flatlaf-core/build.gradle.kts | 1 + .../com/formdev/flatlaf/LinuxFontPolicy.java | 3 + .../formdev/flatlaf/ui/FlatStylingTests.java | 168 +++++++----------- 3 files changed, 72 insertions(+), 100 deletions(-) diff --git a/flatlaf-core/build.gradle.kts b/flatlaf-core/build.gradle.kts index 19db78cc..8ba273ee 100644 --- a/flatlaf-core/build.gradle.kts +++ b/flatlaf-core/build.gradle.kts @@ -60,6 +60,7 @@ tasks { test { useJUnitPlatform() + testLogging.exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/LinuxFontPolicy.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/LinuxFontPolicy.java index a9a90ee2..b6417f13 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/LinuxFontPolicy.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/LinuxFontPolicy.java @@ -309,6 +309,9 @@ class LinuxFontPolicy * - running on JetBrains Runtime 11 or later and scaling is enabled in system Settings */ private static boolean isSystemScaling() { + if( GraphicsEnvironment.isHeadless() ) + return true; + GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice().getDefaultConfiguration(); return UIScale.getSystemScaleFactor( gc ) > 1; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 9bddda13..58645e39 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -24,7 +24,10 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; import javax.swing.*; +import javax.swing.table.JTableHeader; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import com.formdev.flatlaf.FlatLightLaf; import com.formdev.flatlaf.icons.*; /** @@ -32,6 +35,11 @@ import com.formdev.flatlaf.icons.*; */ public class FlatStylingTests { + @BeforeAll + static void setup() { + FlatLightLaf.setup(); + } + @Test void parse() { assertEquals( null, FlatStyleSupport.parse( null ) ); @@ -62,12 +70,8 @@ public class FlatStylingTests @Test void button() { - FlatButtonUI ui = new FlatButtonUI( false ); - - // create border - UIManager.put( "Button.border", new FlatButtonBorder() ); JButton b = new JButton(); - ui.installUI( b ); + FlatButtonUI ui = (FlatButtonUI) b.getUI(); button( b, ui ); @@ -126,11 +130,9 @@ public class FlatStylingTests @Test void checkBox() { - FlatCheckBoxUI ui = new FlatCheckBoxUI( false ); + JCheckBox c = new JCheckBox(); + FlatCheckBoxUI ui = (FlatCheckBoxUI) c.getUI(); - // assign icon - UIManager.put( "CheckBox.icon", new FlatCheckBoxIcon() ); - ui.installDefaults( new JCheckBox() ); assertTrue( ui.getDefaultIcon() instanceof FlatCheckBoxIcon ); // FlatCheckBoxUI extends FlatRadioButtonUI @@ -139,11 +141,8 @@ public class FlatStylingTests @Test void comboBox() { - FlatComboBoxUI ui = new FlatComboBoxUI(); - - // create border and arrow button - UIManager.put( "ComboBox.border", new FlatRoundBorder() ); - ui.installUI( new JComboBox<>() ); + JComboBox c = new JComboBox<>(); + FlatComboBoxUI ui = (FlatComboBoxUI) c.getUI(); ui.applyStyle( "minimumWidth: 100" ); ui.applyStyle( "editorColumns: 10" ); @@ -173,10 +172,8 @@ public class FlatStylingTests @Test void editorPane() { - FlatEditorPaneUI ui = new FlatEditorPaneUI(); - - // for FlatEditorPaneUI.updateBackground() - ui.installUI( new JEditorPane() ); + JEditorPane c = new JEditorPane(); + FlatEditorPaneUI ui = (FlatEditorPaneUI) c.getUI(); ui.applyStyle( "minimumWidth: 100" ); ui.applyStyle( "disabledBackground: #fff" ); @@ -186,11 +183,8 @@ public class FlatStylingTests @Test void formattedTextField() { - FlatFormattedTextFieldUI ui = new FlatFormattedTextFieldUI(); - - // create border - UIManager.put( "FormattedTextField.border", new FlatTextBorder() ); - ui.installUI( new JFormattedTextField() ); + JFormattedTextField c = new JFormattedTextField(); + FlatFormattedTextFieldUI ui = (FlatFormattedTextFieldUI) c.getUI(); // FlatFormattedTextFieldUI extends FlatTextFieldUI textField( ui ); @@ -198,15 +192,16 @@ public class FlatStylingTests @Test void label() { - FlatLabelUI ui = new FlatLabelUI( false ); + JLabel c = new JLabel(); + FlatLabelUI ui = (FlatLabelUI) c.getUI(); ui.applyStyle( "disabledForeground: #fff" ); } @Test void list() { - FlatListUI ui = new FlatListUI(); - ui.installUI( new JList<>() ); + JList c = new JList<>(); + FlatListUI ui = (FlatListUI) c.getUI(); ui.applyStyle( "selectionBackground: #fff" ); ui.applyStyle( "selectionForeground: #fff" ); @@ -221,10 +216,8 @@ public class FlatStylingTests @Test void menu() { - UIManager.put( "Menu.arrowIcon", new FlatMenuArrowIcon() ); - UIManager.put( "Menu.checkIcon", null ); - FlatMenuUI ui = new FlatMenuUI(); - ui.installUI( new JMenu() ); + JMenu c = new JMenu(); + FlatMenuUI ui = (FlatMenuUI) c.getUI(); Consumer applyStyle = style -> ui.applyStyle( style ); menuItem( applyStyle ); @@ -233,10 +226,8 @@ public class FlatStylingTests @Test void menuItem() { - UIManager.put( "MenuItem.arrowIcon", new FlatMenuItemArrowIcon() ); - UIManager.put( "MenuItem.checkIcon", null ); - FlatMenuItemUI ui = new FlatMenuItemUI(); - ui.installUI( new JMenuItem() ); + JMenuItem c = new JMenuItem(); + FlatMenuItemUI ui = (FlatMenuItemUI) c.getUI(); Consumer applyStyle = style -> ui.applyStyle( style ); menuItem( applyStyle ); @@ -245,10 +236,8 @@ public class FlatStylingTests @Test void checkBoxMenuItem() { - UIManager.put( "CheckBoxMenuItem.arrowIcon", new FlatMenuItemArrowIcon() ); - UIManager.put( "CheckBoxMenuItem.checkIcon", new FlatCheckBoxMenuItemIcon() ); - FlatCheckBoxMenuItemUI ui = new FlatCheckBoxMenuItemUI(); - ui.installUI( new JCheckBoxMenuItem() ); + JCheckBoxMenuItem c = new JCheckBoxMenuItem(); + FlatCheckBoxMenuItemUI ui = (FlatCheckBoxMenuItemUI) c.getUI(); Consumer applyStyle = style -> ui.applyStyle( style ); menuItem( applyStyle ); @@ -258,10 +247,8 @@ public class FlatStylingTests @Test void radioButtonMenuItem() { - UIManager.put( "RadioButtonMenuItem.arrowIcon", new FlatMenuItemArrowIcon() ); - UIManager.put( "RadioButtonMenuItem.checkIcon", new FlatRadioButtonMenuItemIcon() ); - FlatRadioButtonMenuItemUI ui = new FlatRadioButtonMenuItemUI(); - ui.installUI( new JRadioButtonMenuItem() ); + JRadioButtonMenuItem c = new JRadioButtonMenuItem(); + FlatRadioButtonMenuItemUI ui = (FlatRadioButtonMenuItemUI) c.getUI(); Consumer applyStyle = style -> ui.applyStyle( style ); menuItem( applyStyle ); @@ -310,12 +297,8 @@ public class FlatStylingTests @Test void passwordField() { - FlatPasswordFieldUI ui = new FlatPasswordFieldUI(); - - // create border and capsLockIcon - UIManager.put( "PasswordField.border", new FlatTextBorder() ); - UIManager.put( "PasswordField.capsLockIcon", new FlatCapsLockIcon() ); - ui.installUI( new JPasswordField() ); + JPasswordField c = new JPasswordField(); + FlatPasswordFieldUI ui = (FlatPasswordFieldUI) c.getUI(); ui.applyStyle( "minimumWidth: 100" ); ui.applyStyle( "disabledBackground: #fff" ); @@ -333,7 +316,8 @@ public class FlatStylingTests @Test void popupMenuSeparator() { - FlatPopupMenuSeparatorUI ui = new FlatPopupMenuSeparatorUI( false ); + JPopupMenu.Separator c = new JPopupMenu.Separator(); + FlatPopupMenuSeparatorUI ui = (FlatPopupMenuSeparatorUI) c.getUI(); // FlatPopupMenuSeparatorUI extends FlatSeparatorUI separator( ui ); @@ -341,7 +325,8 @@ public class FlatStylingTests @Test void progressBar() { - FlatProgressBarUI ui = new FlatProgressBarUI(); + JProgressBar c = new JProgressBar(); + FlatProgressBarUI ui = (FlatProgressBarUI) c.getUI(); ui.applyStyle( "arc: 5" ); ui.applyStyle( "horizontalSize: 100,12" ); @@ -350,11 +335,9 @@ public class FlatStylingTests @Test void radioButton() { - FlatRadioButtonUI ui = new FlatRadioButtonUI( false ); + JRadioButton c = new JRadioButton(); + FlatRadioButtonUI ui = (FlatRadioButtonUI) c.getUI(); - // assign icon - UIManager.put( "RadioButton.icon", new FlatRadioButtonIcon() ); - ui.installDefaults( new JRadioButton() ); // assign icon assertTrue( ui.getDefaultIcon() instanceof FlatRadioButtonIcon ); radioButton( ui ); @@ -402,7 +385,8 @@ public class FlatStylingTests @Test void scrollBar() { - FlatScrollBarUI ui = new FlatScrollBarUI(); + JScrollBar c = new JScrollBar(); + FlatScrollBarUI ui = (FlatScrollBarUI) c.getUI(); ui.applyStyle( "track: #fff" ); ui.applyStyle( "thumb: #fff" ); @@ -432,11 +416,8 @@ public class FlatStylingTests @Test void scrollPane() { - FlatScrollPaneUI ui = new FlatScrollPaneUI(); - - // create border - UIManager.put( "ScrollPane.border", new FlatBorder() ); - ui.installUI( new JScrollPane() ); + JScrollPane c = new JScrollPane(); + FlatScrollPaneUI ui = (FlatScrollPaneUI) c.getUI(); // border flatBorder( style -> ui.applyStyle( style ) ); @@ -444,7 +425,8 @@ public class FlatStylingTests @Test void separator() { - FlatSeparatorUI ui = new FlatSeparatorUI( false ); + JSeparator c = new JSeparator(); + FlatSeparatorUI ui = (FlatSeparatorUI) c.getUI(); separator( ui ); } @@ -457,7 +439,8 @@ public class FlatStylingTests @Test void slider() { - FlatSliderUI ui = new FlatSliderUI(); + JSlider c = new JSlider(); + FlatSliderUI ui = (FlatSliderUI) c.getUI(); ui.applyStyle( "trackWidth: 2" ); ui.applyStyle( "thumbSize: 12,12" ); @@ -479,11 +462,8 @@ public class FlatStylingTests @Test void spinner() { - FlatSpinnerUI ui = new FlatSpinnerUI(); - - // create border and arrow buttons - UIManager.put( "Spinner.border", new FlatRoundBorder() ); - ui.installUI( new JSpinner() ); + JSpinner c = new JSpinner(); + FlatSpinnerUI ui = (FlatSpinnerUI) c.getUI(); ui.applyStyle( "minimumWidth: 100" ); ui.applyStyle( "buttonStyle: button" ); @@ -506,10 +486,8 @@ public class FlatStylingTests @Test void splitPane() { - FlatSplitPaneUI ui = new FlatSplitPaneUI(); - - // create divider and one-touch buttons - ui.installUI( new JSplitPane() ); + JSplitPane c = new JSplitPane(); + FlatSplitPaneUI ui = (FlatSplitPaneUI) c.getUI(); ui.applyStyle( "arrowType: chevron" ); ui.applyStyle( "oneTouchArrowColor: #fff" ); @@ -525,10 +503,8 @@ public class FlatStylingTests @Test void tabbedPane() { - FlatTabbedPaneUI ui = new FlatTabbedPaneUI(); - - UIManager.put( "TabbedPane.closeIcon", new FlatTabbedPaneCloseIcon() ); - ui.installUI( new JTabbedPane() ); + JTabbedPane c = new JTabbedPane(); + FlatTabbedPaneUI ui = (FlatTabbedPaneUI) c.getUI(); ui.applyStyle( "tabInsets: 1,2,3,4" ); ui.applyStyle( "tabAreaInsets: 1,2,3,4" ); @@ -587,8 +563,8 @@ public class FlatStylingTests @Test void table() { - FlatTableUI ui = new FlatTableUI(); - ui.installUI( new JTable() ); + JTable c = new JTable(); + FlatTableUI ui = (FlatTableUI) c.getUI(); ui.applyStyle( "selectionBackground: #fff" ); ui.applyStyle( "selectionForeground: #fff" ); @@ -603,7 +579,8 @@ public class FlatStylingTests @Test void tableHeader() { - FlatTableHeaderUI ui = new FlatTableHeaderUI(); + JTableHeader c = new JTableHeader(); + FlatTableHeaderUI ui = (FlatTableHeaderUI) c.getUI(); ui.applyStyle( "bottomSeparatorColor: #fff" ); ui.applyStyle( "height: 20" ); @@ -620,10 +597,8 @@ public class FlatStylingTests @Test void textArea() { - FlatTextAreaUI ui = new FlatTextAreaUI(); - - // for FlatEditorPaneUI.updateBackground() - ui.installUI( new JTextArea() ); + JTextArea c = new JTextArea(); + FlatTextAreaUI ui = (FlatTextAreaUI) c.getUI(); ui.applyStyle( "minimumWidth: 100" ); ui.applyStyle( "disabledBackground: #fff" ); @@ -633,11 +608,8 @@ public class FlatStylingTests @Test void textField() { - FlatTextFieldUI ui = new FlatTextFieldUI(); - - // create border - UIManager.put( "TextField.border", new FlatTextBorder() ); - ui.installUI( new JTextField() ); + JTextField c = new JTextField(); + FlatTextFieldUI ui = (FlatTextFieldUI) c.getUI(); textField( ui ); } @@ -655,10 +627,8 @@ public class FlatStylingTests @Test void textPane() { - FlatTextPaneUI ui = new FlatTextPaneUI(); - - // for FlatEditorPaneUI.updateBackground() - ui.installUI( new JTextPane() ); + JTextPane c = new JTextPane(); + FlatTextPaneUI ui = (FlatTextPaneUI) c.getUI(); ui.applyStyle( "minimumWidth: 100" ); ui.applyStyle( "disabledBackground: #fff" ); @@ -668,12 +638,8 @@ public class FlatStylingTests @Test void toggleButton() { - FlatToggleButtonUI ui = new FlatToggleButtonUI( false ); - - // create border - UIManager.put( "ToggleButton.border", new FlatButtonBorder() ); JToggleButton b = new JToggleButton(); - ui.installUI( b ); + FlatToggleButtonUI ui = (FlatToggleButtonUI) b.getUI(); // FlatToggleButtonUI extends FlatButtonUI button( b, ui ); @@ -688,7 +654,8 @@ public class FlatStylingTests @Test void toolBar() { - FlatToolBarUI ui = new FlatToolBarUI(); + JToolBar c = new JToolBar(); + FlatToolBarUI ui = (FlatToolBarUI) c.getUI(); ui.applyStyle( "borderMargins: 1,2,3,4" ); ui.applyStyle( "gripColor: #fff" ); @@ -696,7 +663,8 @@ public class FlatStylingTests @Test void toolBarSeparator() { - FlatToolBarSeparatorUI ui = new FlatToolBarSeparatorUI( false ); + JToolBar.Separator c = new JToolBar.Separator(); + FlatToolBarSeparatorUI ui = (FlatToolBarSeparatorUI) c.getUI(); ui.applyStyle( "separatorWidth: 6" ); ui.applyStyle( "separatorColor: #fff" ); @@ -704,8 +672,8 @@ public class FlatStylingTests @Test void tree() { - FlatTreeUI ui = new FlatTreeUI(); - ui.installUI( new JTree() ); + JTree c = new JTree(); + FlatTreeUI ui = (FlatTreeUI) c.getUI(); ui.applyStyle( "selectionBackground: #fff" ); ui.applyStyle( "selectionForeground: #fff" ); From 9cfd4d27e91892267929894b8f73e0b0eb2892cb Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 5 Jul 2021 21:48:41 +0200 Subject: [PATCH 40/60] Styling: renamed unit tests (so that all unit test classes start with `Test`) --- .../flatlaf/ui/{FlatStylingTests.java => TestFlatStyling.java} | 2 +- ...{FlatTextComponentTests.java => TestFlatTextComponents.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename flatlaf-core/src/test/java/com/formdev/flatlaf/ui/{FlatStylingTests.java => TestFlatStyling.java} (99%) rename flatlaf-core/src/test/java/com/formdev/flatlaf/ui/{FlatTextComponentTests.java => TestFlatTextComponents.java} (99%) diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java similarity index 99% rename from flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java rename to flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 687ffa2e..392ebba2 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -33,7 +33,7 @@ import com.formdev.flatlaf.icons.*; /** * @author Karl Tauber */ -public class FlatStylingTests +public class TestFlatStyling { @BeforeAll static void setup() { diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatTextComponents.java similarity index 99% rename from flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java rename to flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatTextComponents.java index f79354c9..cfe27e31 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatTextComponentTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatTextComponents.java @@ -34,7 +34,7 @@ import org.junit.jupiter.api.Test; /** * @author Karl Tauber */ -public class FlatTextComponentTests +public class TestFlatTextComponents { @Test void editorPane_updateBackground() { From 4a8207f3676e55789242a18e2cb8bd89304c6c89 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 5 Jul 2021 21:58:48 +0200 Subject: [PATCH 41/60] Styling: use TestUtils.setup() in unit tests; --- .../formdev/flatlaf/ui/TestFlatStyling.java | 9 +++- .../flatlaf/ui/TestFlatTextComponents.java | 48 +++++++------------ 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 392ebba2..2ed75493 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -25,9 +25,9 @@ import java.util.Map; import java.util.function.Consumer; import javax.swing.*; import javax.swing.table.JTableHeader; +import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import com.formdev.flatlaf.FlatLightLaf; import com.formdev.flatlaf.icons.*; /** @@ -37,7 +37,12 @@ public class TestFlatStyling { @BeforeAll static void setup() { - FlatLightLaf.setup(); + TestUtils.setup( false ); + } + + @AfterAll + static void cleanup() { + TestUtils.cleanup(); } @Test diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatTextComponents.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatTextComponents.java index cfe27e31..7b70d134 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatTextComponents.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatTextComponents.java @@ -29,6 +29,8 @@ import javax.swing.UIManager; import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.basic.BasicTextFieldUI; import javax.swing.text.JTextComponent; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; /** @@ -36,58 +38,44 @@ import org.junit.jupiter.api.Test; */ public class TestFlatTextComponents { + @BeforeAll + static void setup() { + TestUtils.setup( false ); + } + + @AfterAll + static void cleanup() { + TestUtils.cleanup(); + } + @Test void editorPane_updateBackground() { - textComponent_updateBackground( "EditorPane", () -> { - JEditorPane c = new JEditorPane(); - c.setUI( new FlatEditorPaneUI() ); - return c; - } ); + textComponent_updateBackground( "EditorPane", JEditorPane::new ); } @Test void formattedTextField_updateBackground() { - textComponent_updateBackground( "FormattedTextField", () -> { - JFormattedTextField c = new JFormattedTextField(); - c.setUI( new FlatFormattedTextFieldUI() ); - return c; - } ); + textComponent_updateBackground( "FormattedTextField", JFormattedTextField::new ); } @Test void passwordField_updateBackground() { - textComponent_updateBackground( "PasswordField", () -> { - JPasswordField c = new JPasswordField(); - c.setUI( new FlatPasswordFieldUI() ); - return c; - } ); + textComponent_updateBackground( "PasswordField", JPasswordField::new ); } @Test void textArea_updateBackground() { - textComponent_updateBackground( "TextArea", () -> { - JTextArea c = new JTextArea(); - c.setUI( new FlatTextAreaUI() ); - return c; - } ); + textComponent_updateBackground( "TextArea", JTextArea::new ); } @Test void textField_updateBackground() { - textComponent_updateBackground( "TextField", () -> { - JTextField c = new JTextField(); - c.setUI( new FlatTextFieldUI() ); - return c; - } ); + textComponent_updateBackground( "TextField", JTextField::new ); } @Test void textPane_updateBackground() { - textComponent_updateBackground( "TextPane", () -> { - JTextPane c = new JTextPane(); - c.setUI( new FlatTextPaneUI() ); - return c; - } ); + textComponent_updateBackground( "TextPane", JTextPane::new ); } @Test From 84f7e244f2a2015a868da95a878ad26d56be7daa Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 5 Jul 2021 22:36:57 +0200 Subject: [PATCH 42/60] Styling: - support ComboBox.padding - fixed updating of Spinner.padding --- .../com/formdev/flatlaf/ui/FlatComboBoxUI.java | 14 +++++++++++++- .../java/com/formdev/flatlaf/ui/FlatSpinnerUI.java | 2 +- .../com/formdev/flatlaf/ui/TestFlatStyling.java | 2 ++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java index 9064a227..d184a752 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java @@ -447,10 +447,15 @@ public class FlatComboBoxUI * @since TODO */ protected void applyStyle( Object style ) { + Insets oldPadding = padding; int oldEditorColumns = editorColumns; oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + if( !padding.equals( oldPadding ) ) { + paddingBorder.padding = padding; + updateEditorPadding(); + } if( arrowButton instanceof FlatComboBoxButton ) ((FlatComboBoxButton)arrowButton).updateStyle(); if( popup instanceof FlatComboPopup ) @@ -463,6 +468,13 @@ public class FlatComboBoxUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { + // BasicComboBoxUI + if( key.equals( "padding" ) ) { + Object oldValue = padding; + padding = (Insets) value; + return oldValue; + } + if( borderShared == null ) borderShared = new AtomicBoolean( true ); return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, comboBox, borderShared ); @@ -834,7 +846,7 @@ public class FlatComboBoxUI private static class CellPaddingBorder extends AbstractBorder { - private final Insets padding; + private Insets padding; private JComponent rendererComponent; private Border rendererBorder; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index c37691fc..5cce41c7 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -192,6 +192,7 @@ public class FlatSpinnerUI */ protected void applyStyle( Object style ) { oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + updateEditorPadding(); updateArrowButtonsStyle(); } @@ -442,7 +443,6 @@ public class FlatSpinnerUI public void layoutContainer( Container parent ) { Dimension size = parent.getSize(); Insets insets = parent.getInsets(); - Insets padding = scale( FlatSpinnerUI.this.padding ); Rectangle r = FlatUIUtils.subtractInsets( new Rectangle( size ), insets ); if( nextButton == null && previousButton == null ) { diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 2ed75493..4402ae7e 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -149,6 +149,8 @@ public class TestFlatStyling JComboBox c = new JComboBox<>(); FlatComboBoxUI ui = (FlatComboBoxUI) c.getUI(); + ui.applyStyle( "padding: 1,2,3,4" ); + ui.applyStyle( "minimumWidth: 100" ); ui.applyStyle( "editorColumns: 10" ); ui.applyStyle( "buttonStyle: auto" ); From ac291b688df442061dd63f10237b94c7c5a6bc8b Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 5 Jul 2021 22:40:55 +0200 Subject: [PATCH 43/60] Styling: fixed detection of value type if key prefix ix given (e.g. `[light]padding`) --- .../main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 902f79b3..2108c077 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -114,6 +114,7 @@ public class FlatStyleSupport String key = e.getKey(); Object newValue = e.getValue(); + // handle key prefix if( key.startsWith( "[" ) ) { if( (SystemInfo.isWindows && key.startsWith( "[win]" )) || (SystemInfo.isMacOS && key.startsWith( "[mac]" )) || @@ -182,6 +183,11 @@ public class FlatStyleSupport if( value.startsWith( "$" ) ) return UIManager.get( value.substring( 1 ) ); + // remove key prefix for correct value type detection + // (e.g. "[light]padding" would not parse to Insets) + if( key.startsWith( "[" ) ) + key = key.substring( key.indexOf( ']' ) + 1 ); + return FlatLaf.parseDefaultsValue( key, value ); } From 713a01bfa9d40ac0e331ac83edcd4918625b1269 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 5 Jul 2021 23:12:45 +0200 Subject: [PATCH 44/60] Styling: set "shared" flag to true when shared icon is assigned --- .../src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java | 1 + .../main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java | 1 + .../src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java | 1 + 3 files changed, 3 insertions(+) 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 f4134ea3..07839597 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 @@ -202,6 +202,7 @@ public class FlatButtonUI toolbarSelectedBackground = UIManager.getColor( prefix + "toolbar.selectedBackground" ); helpButtonIcon = UIManager.getIcon( "HelpButton.icon" ); + helpButtonIconShared = true; defaults_initialized = true; } 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 f14cf1f7..c037883a 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 @@ -102,6 +102,7 @@ public class FlatPasswordFieldUI showCapsLock = UIManager.getBoolean( "PasswordField.showCapsLock" ); capsLockIcon = UIManager.getIcon( "PasswordField.capsLockIcon" ); + capsLockIconShared = true; } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 0f0de186..bd135cad 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -105,6 +105,7 @@ public class FlatRadioButtonUI defaultBackground = UIManager.getColor( prefix + "background" ); + iconShared = true; defaults_initialized = true; } From 943dfe0619a08d3cd0f960683b44681a689f08c3 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 11 Jul 2021 01:41:52 +0200 Subject: [PATCH 45/60] Styling: support styling for recently merged changes --- .../main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java | 4 ++-- .../main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java | 7 ++++++- .../test/java/com/formdev/flatlaf/ui/TestFlatStyling.java | 6 ++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java index a3ca4dc8..b29dece6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java @@ -70,14 +70,14 @@ public class FlatButtonBorder @Styleable(dot=true) protected Color defaultFocusColor = UIManager.getColor( "Button.default.focusColor" ); @Styleable(dot=true) protected Color defaultHoverBorderColor = UIManager.getColor( "Button.default.hoverBorderColor" ); /** @since 1.4 */ - protected final Color toolbarFocusColor = UIManager.getColor( "Button.toolbar.focusColor" ); + @Styleable(dot=true) protected Color toolbarFocusColor = UIManager.getColor( "Button.toolbar.focusColor" ); @Styleable protected int borderWidth = UIManager.getInt( "Button.borderWidth" ); @Styleable(dot=true) protected int defaultBorderWidth = UIManager.getInt( "Button.default.borderWidth" ); @Styleable(dot=true) protected Insets toolbarMargin = UIManager.getInsets( "Button.toolbar.margin" ); @Styleable(dot=true) protected Insets toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" ); /** @since 1.4 */ - protected final float toolbarFocusWidth = FlatUIUtils.getUIFloat( "Button.toolbar.focusWidth", 1.5f ); + @Styleable(dot=true) protected float toolbarFocusWidth = FlatUIUtils.getUIFloat( "Button.toolbar.focusWidth", 1.5f ); @Styleable protected int arc = UIManager.getInt( "Button.arc" ); public FlatButtonBorder() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java index 5c3f4d04..ca27d66b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java @@ -61,7 +61,7 @@ public class FlatToolBarUI extends BasicToolBarUI { /** @since 1.4 */ - protected boolean focusableButtons; + @Styleable protected boolean focusableButtons; // for FlatToolBarBorder @Styleable protected Insets borderMargins; @@ -138,7 +138,12 @@ public class FlatToolBarUI * @since TODO */ protected void applyStyle( Object style ) { + boolean oldFocusableButtons = focusableButtons; + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + if( focusableButtons != oldFocusableButtons ) + setButtonsFocusable( focusableButtons ); } /** diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 4402ae7e..06f24abd 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -664,6 +664,8 @@ public class TestFlatStyling JToolBar c = new JToolBar(); FlatToolBarUI ui = (FlatToolBarUI) c.getUI(); + ui.applyStyle( "focusableButtons: true" ); + ui.applyStyle( "borderMargins: 1,2,3,4" ); ui.applyStyle( "gripColor: #fff" ); } @@ -713,11 +715,13 @@ public class TestFlatStyling applyStyle.accept( "default.focusedBorderColor: #fff" ); applyStyle.accept( "default.focusColor: #fff" ); applyStyle.accept( "default.hoverBorderColor: #fff" ); + applyStyle.accept( "toolbar.focusColor: #fff" ); applyStyle.accept( "borderWidth: 1" ); applyStyle.accept( "default.borderWidth: 2" ); applyStyle.accept( "toolbar.margin: 1,2,3,4" ); applyStyle.accept( "toolbar.spacingInsets: 1,2,3,4" ); + applyStyle.accept( "toolbar.focusWidth: {float}1.5" ); applyStyle.accept( "arc: 6" ); } @@ -767,11 +771,13 @@ public class TestFlatStyling border.applyStyleProperty( "default.focusedBorderColor", Color.WHITE ); border.applyStyleProperty( "default.focusColor", Color.WHITE ); border.applyStyleProperty( "default.hoverBorderColor", Color.WHITE ); + border.applyStyleProperty( "toolbar.focusColor", Color.WHITE ); border.applyStyleProperty( "borderWidth", 1 ); border.applyStyleProperty( "default.borderWidth", 2 ); border.applyStyleProperty( "toolbar.margin", new Insets( 1, 2, 3, 4 ) ); border.applyStyleProperty( "toolbar.spacingInsets", new Insets( 1, 2, 3, 4 ) ); + border.applyStyleProperty( "toolbar.focusWidth", 1.5f ); border.applyStyleProperty( "arc", 6 ); } From e3e8765b91be27c828a06177856af288eaa7b8ef Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 19 Jul 2021 14:39:57 +0200 Subject: [PATCH 46/60] Styling: support MenuBar --- .../com/formdev/flatlaf/ui/FlatBorder.java | 3 + .../formdev/flatlaf/ui/FlatMenuBarBorder.java | 13 +++- .../com/formdev/flatlaf/ui/FlatMenuBarUI.java | 59 +++++++++++++++++++ .../formdev/flatlaf/ui/FlatStyleSupport.java | 8 ++- .../formdev/flatlaf/ui/TestFlatStyling.java | 9 +++ 5 files changed, 89 insertions(+), 3 deletions(-) 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 index 25dc83cc..36454720 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java @@ -32,6 +32,7 @@ import javax.swing.UIManager; import javax.swing.plaf.basic.BasicBorders; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; import com.formdev.flatlaf.util.DerivedColor; /** @@ -61,6 +62,7 @@ import com.formdev.flatlaf.util.DerivedColor; */ public class FlatBorder extends BasicBorders.MarginBorder + implements StyleableBorder { @Styleable protected int focusWidth = UIManager.getInt( "Component.focusWidth" ); @Styleable protected float innerFocusWidth = FlatUIUtils.getUIFloat( "Component.innerFocusWidth", 0 ); @@ -79,6 +81,7 @@ public class FlatBorder /** * @since TODO */ + @Override public Object applyStyleProperty( String key, Object value ) { return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java index 5701f935..10d2026d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java @@ -23,6 +23,8 @@ import java.awt.Graphics; import java.awt.Insets; import javax.swing.JMenuBar; import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; /** * Border for {@link javax.swing.JMenuBar}. @@ -33,8 +35,17 @@ import javax.swing.UIManager; */ public class FlatMenuBarBorder extends FlatMarginBorder + implements StyleableBorder { - private final Color borderColor = UIManager.getColor( "MenuBar.borderColor" ); + @Styleable protected Color borderColor = UIManager.getColor( "MenuBar.borderColor" ); + + /** + * @since TODO + */ + @Override + public Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java index d5e34fe7..5077ce76 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java @@ -20,6 +20,9 @@ import java.awt.Color; import java.awt.Graphics; import java.awt.Window; import java.awt.event.ActionEvent; +import java.beans.PropertyChangeListener; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.JComponent; @@ -35,6 +38,7 @@ import javax.swing.plaf.ActionMapUIResource; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicMenuBarUI; +import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.util.SystemInfo; @@ -47,6 +51,9 @@ import com.formdev.flatlaf.util.SystemInfo; * @uiDefault MenuBar.background Color * @uiDefault MenuBar.foreground Color * @uiDefault MenuBar.border Border + * + * + * * @uiDefault TitlePane.unifiedBackground boolean * * @author Karl Tauber @@ -54,6 +61,10 @@ import com.formdev.flatlaf.util.SystemInfo; public class FlatMenuBarUI extends BasicMenuBarUI { + private PropertyChangeListener propertyChangeListener; + private Map oldStyleValues; + private AtomicBoolean borderShared; + public static ComponentUI createUI( JComponent c ) { return new FlatMenuBarUI(); } @@ -63,6 +74,13 @@ public class FlatMenuBarUI * Do not add any functionality here. */ + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + @Override protected void installDefaults() { super.installDefaults(); @@ -70,6 +88,31 @@ public class FlatMenuBarUI LookAndFeel.installProperty( menuBar, "opaque", false ); } + @Override + protected void uninstallDefaults() { + super.uninstallDefaults(); + + oldStyleValues = null; + borderShared = null; + } + + @Override + protected void installListeners() { + super.installListeners(); + + propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( + menuBar, this::applyStyle, null ); + menuBar.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + } + + @Override + protected void uninstallListeners() { + super.uninstallListeners(); + + menuBar.removePropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + propertyChangeListener = null; + } + @Override protected void installKeyboardActions() { super.installKeyboardActions(); @@ -82,6 +125,22 @@ public class FlatMenuBarUI map.put( "takeFocus", new TakeFocus() ); } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, menuBar, borderShared ); + } + @Override public void update( Graphics g, JComponent c ) { // paint background diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 2108c077..317c76d8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -58,6 +58,10 @@ public class FlatStyleSupport boolean dot() default false; } + public interface StyleableBorder { + Object applyStyleProperty( String key, Object value ); + } + /** * Parses styles in CSS syntax ("key1: value1; key2: value2; ..."), * converts the value strings into binary and invokes the given function @@ -284,7 +288,7 @@ public class FlatStyleSupport return applyToAnnotatedObject( obj, key, value ); } catch( UnknownStyleException ex ) { Border border = c.getBorder(); - if( border instanceof FlatBorder ) { + if( border instanceof StyleableBorder ) { if( borderShared.get() ) { border = cloneBorder( border ); c.setBorder( border ); @@ -292,7 +296,7 @@ public class FlatStyleSupport } try { - return ((FlatBorder)border).applyStyleProperty( key, value ); + return ((StyleableBorder)border).applyStyleProperty( key, value ); } catch( UnknownStyleException ex2 ) { // ignore } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 06f24abd..09db1f2b 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -221,6 +221,15 @@ public class TestFlatStyling ui.applyStyle( "showCellFocusIndicator: true" ); } + @Test + void menuBar() { + JMenuBar c = new JMenuBar(); + FlatMenuBarUI ui = (FlatMenuBarUI) c.getUI(); + + // FlatMenuBarBorder + ui.applyStyle( "borderColor: #fff" ); + } + @Test void menu() { JMenu c = new JMenu(); From 7fd64a1b736580b8752af759017d06f342db8223 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 20 Jul 2021 08:57:21 +0200 Subject: [PATCH 47/60] Styling: support InternalFrame --- .../flatlaf/ui/FlatDropShadowBorder.java | 42 ++++++++++--- .../formdev/flatlaf/ui/FlatEmptyBorder.java | 9 +++ .../flatlaf/ui/FlatInternalFrameUI.java | 60 +++++++++++++++++-- .../formdev/flatlaf/ui/TestFlatStyling.java | 19 ++++++ 4 files changed, 119 insertions(+), 11 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java index 505b9276..977c97cb 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java @@ -24,6 +24,8 @@ import java.awt.Image; import java.awt.Insets; import java.awt.RadialGradientPaint; import java.awt.image.BufferedImage; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -40,14 +42,17 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatDropShadowBorder extends FlatEmptyBorder + implements StyleableBorder { - private final Color shadowColor; - private final Insets shadowInsets; - private final float shadowOpacity; + @Styleable protected Color shadowColor; + @Styleable protected Insets shadowInsets; + @Styleable protected float shadowOpacity; - private final int shadowSize; + private int shadowSize; private Image shadowImage; private Color lastShadowColor; + private float lastShadowOpacity; + private int lastShadowSize; private double lastSystemScaleFactor; private float lastUserScaleFactor; @@ -64,17 +69,36 @@ public class FlatDropShadowBorder } public FlatDropShadowBorder( Color shadowColor, Insets shadowInsets, float shadowOpacity ) { - super( Math.max( shadowInsets.top, 0 ), Math.max( shadowInsets.left, 0 ), - Math.max( shadowInsets.bottom, 0 ), Math.max( shadowInsets.right, 0 ) ); + super( nonNegativeInsets( shadowInsets ) ); + this.shadowColor = shadowColor; this.shadowInsets = shadowInsets; this.shadowOpacity = shadowOpacity; - shadowSize = Math.max( + shadowSize = maxInset( shadowInsets ); + } + + private static Insets nonNegativeInsets( Insets shadowInsets ) { + return new Insets( Math.max( shadowInsets.top, 0 ), Math.max( shadowInsets.left, 0 ), + Math.max( shadowInsets.bottom, 0 ), Math.max( shadowInsets.right, 0 ) ); + } + + private int maxInset( Insets shadowInsets ) { + return Math.max( Math.max( shadowInsets.left, shadowInsets.right ), Math.max( shadowInsets.top, shadowInsets.bottom ) ); } + @Override + public Object applyStyleProperty( String key, Object value ) { + Object oldValue = FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + if( key.equals( "shadowInsets" ) ) { + applyStyleProperty( nonNegativeInsets( shadowInsets ) ); + shadowSize = maxInset( shadowInsets ); + } + return oldValue; + } + @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { if( shadowSize <= 0 ) @@ -91,12 +115,16 @@ public class FlatDropShadowBorder float userScaleFactor = UIScale.getUserScaleFactor(); if( shadowImage == null || !shadowColor.equals( lastShadowColor ) || + lastShadowOpacity != shadowOpacity || + lastShadowSize != shadowSize || lastSystemScaleFactor != scaleFactor || lastUserScaleFactor != userScaleFactor ) { shadowImage = createShadowImage( shadowColor, shadowSize, shadowOpacity, (float) (scaleFactor * userScaleFactor) ); lastShadowColor = shadowColor; + lastShadowOpacity = shadowOpacity; + lastShadowSize = shadowSize; lastSystemScaleFactor = scaleFactor; lastUserScaleFactor = userScaleFactor; } 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 455d7445..34e5fb04 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 @@ -67,4 +67,13 @@ public class FlatEmptyBorder public Insets getUnscaledBorderInsets() { return super.getBorderInsets(); } + + public Object applyStyleProperty( Insets insets ) { + Insets oldInsets = getUnscaledBorderInsets(); + top = insets.top; + left = insets.left; + bottom = insets.bottom; + right = insets.right; + return oldInsets; + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java index efc3bfaf..5a1d9020 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java @@ -22,12 +22,17 @@ import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; +import java.beans.PropertyChangeListener; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JComponent; import javax.swing.JInternalFrame; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicInternalFrameUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JInternalFrame}. @@ -86,6 +91,9 @@ public class FlatInternalFrameUI { protected FlatWindowResizer windowResizer; + private Map oldStyleValues; + private AtomicBoolean borderShared; + public static ComponentUI createUI( JComponent c ) { return new FlatInternalFrameUI( (JInternalFrame) c ); } @@ -101,6 +109,8 @@ public class FlatInternalFrameUI LookAndFeel.installProperty( frame, "opaque", false ); windowResizer = createWindowResizer(); + + applyStyle( FlatStyleSupport.getStyle( c ) ); } @Override @@ -111,6 +121,9 @@ public class FlatInternalFrameUI windowResizer.uninstall(); windowResizer = null; } + + oldStyleValues = null; + borderShared = null; } @Override @@ -122,15 +135,38 @@ public class FlatInternalFrameUI return new FlatWindowResizer.InternalFrameResizer( frame, this::getDesktopManager ); } + @Override + protected PropertyChangeListener createPropertyChangeListener() { + return FlatStyleSupport.createPropertyChangeListener( frame, this::applyStyle, + super.createPropertyChangeListener() ); + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, frame, borderShared ); + } + //---- class FlatInternalFrameBorder -------------------------------------- public static class FlatInternalFrameBorder extends FlatEmptyBorder + implements StyleableBorder { - private final Color activeBorderColor = UIManager.getColor( "InternalFrame.activeBorderColor" ); - private final Color inactiveBorderColor = UIManager.getColor( "InternalFrame.inactiveBorderColor" ); - private final int borderLineWidth = FlatUIUtils.getUIInt( "InternalFrame.borderLineWidth", 1 ); - private final boolean dropShadowPainted = UIManager.getBoolean( "InternalFrame.dropShadowPainted" ); + @Styleable protected Color activeBorderColor = UIManager.getColor( "InternalFrame.activeBorderColor" ); + @Styleable protected Color inactiveBorderColor = UIManager.getColor( "InternalFrame.inactiveBorderColor" ); + @Styleable protected int borderLineWidth = FlatUIUtils.getUIInt( "InternalFrame.borderLineWidth", 1 ); + @Styleable protected boolean dropShadowPainted = UIManager.getBoolean( "InternalFrame.dropShadowPainted" ); private final FlatDropShadowBorder activeDropShadowBorder = new FlatDropShadowBorder( UIManager.getColor( "InternalFrame.activeDropShadowColor" ), @@ -145,6 +181,22 @@ public class FlatInternalFrameUI super( UIManager.getInsets( "InternalFrame.borderMargins" ) ); } + @Override + public Object applyStyleProperty( String key, Object value ) { + switch( key ) { + case "borderMargins": return applyStyleProperty( (Insets) value ); + + case "activeDropShadowColor": return activeDropShadowBorder.applyStyleProperty( "shadowColor", value ); + case "activeDropShadowInsets": return activeDropShadowBorder.applyStyleProperty( "shadowInsets", value ); + case "activeDropShadowOpacity": return activeDropShadowBorder.applyStyleProperty( "shadowOpacity", value ); + case "inactiveDropShadowColor": return inactiveDropShadowBorder.applyStyleProperty( "shadowColor", value ); + case "inactiveDropShadowInsets": return inactiveDropShadowBorder.applyStyleProperty( "shadowInsets", value ); + case "inactiveDropShadowOpacity": return inactiveDropShadowBorder.applyStyleProperty( "shadowOpacity", value ); + } + + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override public Insets getBorderInsets( Component c, Insets insets ) { if( c instanceof JInternalFrame && ((JInternalFrame)c).isMaximum() ) { diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 09db1f2b..47747e1a 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -197,6 +197,25 @@ public class TestFlatStyling textField( ui ); } + @Test + void internalFrame() { + JInternalFrame c = new JInternalFrame(); + FlatInternalFrameUI ui = (FlatInternalFrameUI) c.getUI(); + + ui.applyStyle( "activeBorderColor: #fff" ); + ui.applyStyle( "inactiveBorderColor: #fff" ); + ui.applyStyle( "borderLineWidth: 123" ); + ui.applyStyle( "dropShadowPainted: false" ); + ui.applyStyle( "borderMargins: 1,2,3,4" ); + + ui.applyStyle( "activeDropShadowColor: #fff" ); + ui.applyStyle( "activeDropShadowInsets: 1,2,3,4" ); + ui.applyStyle( "activeDropShadowOpacity: 0.5" ); + ui.applyStyle( "inactiveDropShadowColor: #fff" ); + ui.applyStyle( "inactiveDropShadowInsets: 1,2,3,4" ); + ui.applyStyle( "inactiveDropShadowOpacity: 0.5" ); + } + @Test void label() { JLabel c = new JLabel(); From 4d4bb3fd7f5c93a40ac7f45607ecf90b0fa4fbec Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 21 Jul 2021 11:51:19 +0200 Subject: [PATCH 48/60] Styling: added `StyleableUI.getStyleableInfos()` for tooling (e.g. GUI builder) --- .../flatlaf/icons/FlatCheckBoxIcon.java | 8 + .../icons/FlatCheckBoxMenuItemIcon.java | 8 + .../flatlaf/icons/FlatHelpButtonIcon.java | 8 + .../flatlaf/icons/FlatMenuArrowIcon.java | 8 + .../icons/FlatTabbedPaneCloseIcon.java | 8 + .../com/formdev/flatlaf/ui/FlatBorder.java | 9 + .../com/formdev/flatlaf/ui/FlatButtonUI.java | 13 + .../flatlaf/ui/FlatCheckBoxMenuItemUI.java | 10 + .../formdev/flatlaf/ui/FlatComboBoxUI.java | 15 + .../flatlaf/ui/FlatDropShadowBorder.java | 12 + .../formdev/flatlaf/ui/FlatEditorPaneUI.java | 10 + .../flatlaf/ui/FlatInternalFrameUI.java | 25 + .../com/formdev/flatlaf/ui/FlatLabelUI.java | 10 + .../com/formdev/flatlaf/ui/FlatListUI.java | 10 + .../formdev/flatlaf/ui/FlatMenuBarBorder.java | 6 + .../com/formdev/flatlaf/ui/FlatMenuBarUI.java | 10 + .../flatlaf/ui/FlatMenuItemRenderer.java | 14 + .../formdev/flatlaf/ui/FlatMenuItemUI.java | 24 + .../com/formdev/flatlaf/ui/FlatMenuUI.java | 10 + .../flatlaf/ui/FlatPasswordFieldUI.java | 15 + .../formdev/flatlaf/ui/FlatProgressBarUI.java | 10 + .../flatlaf/ui/FlatRadioButtonMenuItemUI.java | 10 + .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 15 + .../formdev/flatlaf/ui/FlatScrollBarUI.java | 18 + .../formdev/flatlaf/ui/FlatScrollPaneUI.java | 10 + .../formdev/flatlaf/ui/FlatSeparatorUI.java | 10 + .../com/formdev/flatlaf/ui/FlatSliderUI.java | 10 + .../com/formdev/flatlaf/ui/FlatSpinnerUI.java | 10 + .../formdev/flatlaf/ui/FlatSplitPaneUI.java | 20 + .../formdev/flatlaf/ui/FlatStyleSupport.java | 89 +- .../formdev/flatlaf/ui/FlatTabbedPaneUI.java | 30 +- .../formdev/flatlaf/ui/FlatTableHeaderUI.java | 12 +- .../com/formdev/flatlaf/ui/FlatTableUI.java | 10 + .../formdev/flatlaf/ui/FlatTextAreaUI.java | 10 + .../formdev/flatlaf/ui/FlatTextFieldUI.java | 10 + .../formdev/flatlaf/ui/FlatTextPaneUI.java | 10 + .../flatlaf/ui/FlatToggleButtonUI.java | 28 + .../flatlaf/ui/FlatToolBarSeparatorUI.java | 10 + .../com/formdev/flatlaf/ui/FlatToolBarUI.java | 10 + .../com/formdev/flatlaf/ui/FlatTreeUI.java | 10 + .../flatlaf/ui/TestFlatStyleableInfo.java | 1105 +++++++++++++++++ .../formdev/flatlaf/ui/TestFlatStyling.java | 27 +- .../com/formdev/flatlaf/ui/TestUtils.java | 14 + 43 files changed, 1703 insertions(+), 18 deletions(-) create mode 100644 flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java index 41106a9b..0d73b165 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java @@ -23,6 +23,7 @@ import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; +import java.util.Map; import javax.swing.AbstractButton; import javax.swing.JComponent; import javax.swing.UIManager; @@ -138,6 +139,13 @@ public class FlatCheckBoxIcon return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override protected void paintIcon( Component c, Graphics2D g ) { boolean indeterminate = isIndeterminate( c ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java index 97c76300..99eab2b2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java @@ -21,6 +21,7 @@ import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Path2D; +import java.util.Map; import javax.swing.AbstractButton; import javax.swing.JMenuItem; import javax.swing.UIManager; @@ -55,6 +56,13 @@ public class FlatCheckBoxMenuItemIcon return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override protected void paintIcon( Component c, Graphics2D g2 ) { boolean selected = (c instanceof AbstractButton) && ((AbstractButton)c).isSelected(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java index 9faee940..756858b0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java @@ -22,6 +22,7 @@ import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; +import java.util.Map; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; import com.formdev.flatlaf.ui.FlatStyleSupport; @@ -80,6 +81,13 @@ public class FlatHelpButtonIcon return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override protected void paintIcon( Component c, Graphics2D g2 ) { /* diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java index b71e5c53..13260c76 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java @@ -21,6 +21,7 @@ import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Path2D; +import java.util.Map; import javax.swing.JMenu; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatStyleSupport; @@ -57,6 +58,13 @@ public class FlatMenuArrowIcon return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override protected void paintIcon( Component c, Graphics2D g ) { if( !c.getComponentOrientation().isLeftToRight() ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java index 006fd13f..b5cf5cd8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java @@ -23,6 +23,7 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.geom.Line2D; import java.awt.geom.Path2D; +import java.util.Map; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; import com.formdev.flatlaf.ui.FlatStyleSupport; @@ -72,6 +73,13 @@ public class FlatTabbedPaneCloseIcon return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override protected void paintIcon( Component c, Graphics2D g ) { // paint background 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 index 36454720..ac12fe9d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java @@ -23,6 +23,7 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.Paint; +import java.util.Map; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JScrollPane; @@ -86,6 +87,14 @@ public class FlatBorder return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { Graphics2D g2 = (Graphics2D) g.create(); 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 07839597..b4bad010 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 @@ -48,6 +48,7 @@ import javax.swing.plaf.basic.BasicButtonUI; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.icons.FlatHelpButtonIcon; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; @@ -98,6 +99,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatButtonUI extends BasicButtonUI + implements StyleableUI { @Styleable protected int minimumWidth; protected int iconTextGap; @@ -296,6 +298,17 @@ public class FlatButtonUI return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, b, borderShared ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + Map> infos = FlatStyleSupport.getAnnotatedStyleableInfos( this, c.getBorder() ); + if( helpButtonIcon instanceof FlatHelpButtonIcon ) + FlatStyleSupport.putAllPrefixKey( infos, "help.", ((FlatHelpButtonIcon)helpButtonIcon).getStyleableInfos() ); + return infos; + } + static boolean isContentAreaFilled( Component c ) { return !(c instanceof AbstractButton) || ((AbstractButton)c).isContentAreaFilled(); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java index 879c23b7..27f422a0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java @@ -25,6 +25,7 @@ import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; /** @@ -57,6 +58,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; */ public class FlatCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI + implements StyleableUI { private FlatMenuItemRenderer renderer; private Map oldStyleValues; @@ -118,6 +120,14 @@ public class FlatCheckBoxMenuItemUI return FlatMenuItemUI.applyStyleProperty( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatMenuItemUI.getStyleableInfos( renderer ); + } + @Override protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) { return renderer.getPreferredMenuItemSize(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java index 6fc47546..5e5e6a1c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java @@ -40,6 +40,7 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.Rectangle2D; import java.beans.PropertyChangeListener; +import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.AbstractAction; @@ -70,6 +71,7 @@ import javax.swing.plaf.basic.ComboPopup; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.SystemInfo; /** @@ -111,6 +113,7 @@ import com.formdev.flatlaf.util.SystemInfo; */ public class FlatComboBoxUI extends BasicComboBoxUI + implements StyleableUI { @Styleable protected int minimumWidth; @Styleable protected int editorColumns; @@ -476,6 +479,18 @@ public class FlatComboBoxUI return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, comboBox, borderShared ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + Map> infos = new LinkedHashMap<>(); + infos.put( "padding", Insets.class ); + FlatStyleSupport.collectAnnotatedStyleableInfos( this, infos ); + FlatStyleSupport.collectStyleableInfos( comboBox.getBorder(), infos ); + return infos; + } + @Override public void update( Graphics g, JComponent c ) { float focusWidth = FlatUIUtils.getBorderFocusWidth( c ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java index 977c97cb..ede1bc4f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java @@ -24,6 +24,7 @@ import java.awt.Image; import java.awt.Insets; import java.awt.RadialGradientPaint; import java.awt.image.BufferedImage; +import java.util.Map; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; import com.formdev.flatlaf.util.HiDPIUtils; @@ -89,6 +90,9 @@ public class FlatDropShadowBorder Math.max( shadowInsets.top, shadowInsets.bottom ) ); } + /** + * @since TODO + */ @Override public Object applyStyleProperty( String key, Object value ) { Object oldValue = FlatStyleSupport.applyToAnnotatedObject( this, key, value ); @@ -99,6 +103,14 @@ public class FlatDropShadowBorder return oldValue; } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { if( shadowSize <= 0 ) 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 80d5cce3..01e24725 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 @@ -33,6 +33,7 @@ import javax.swing.plaf.basic.BasicEditorPaneUI; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -63,6 +64,7 @@ import com.formdev.flatlaf.util.HiDPIUtils; */ public class FlatEditorPaneUI extends BasicEditorPaneUI + implements StyleableUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; @@ -184,6 +186,14 @@ public class FlatEditorPaneUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + private void updateBackground() { FlatTextFieldUI.updateBackground( getComponent(), background, disabledBackground, inactiveBackground, diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java index 5a1d9020..3e3bf482 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java @@ -23,6 +23,7 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; import java.beans.PropertyChangeListener; +import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JComponent; @@ -33,6 +34,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicInternalFrameUI; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JInternalFrame}. @@ -88,6 +90,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; */ public class FlatInternalFrameUI extends BasicInternalFrameUI + implements StyleableUI { protected FlatWindowResizer windowResizer; @@ -157,6 +160,14 @@ public class FlatInternalFrameUI return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, frame, borderShared ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this, frame.getBorder() ); + } + //---- class FlatInternalFrameBorder -------------------------------------- public static class FlatInternalFrameBorder @@ -197,6 +208,20 @@ public class FlatInternalFrameUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + @Override + public Map> getStyleableInfos() { + Map> infos = new LinkedHashMap<>(); + FlatStyleSupport.collectAnnotatedStyleableInfos( this, infos ); + infos.put( "borderMargins", Insets.class ); + infos.put( "activeDropShadowColor", Color.class ); + infos.put( "activeDropShadowInsets", Insets.class ); + infos.put( "activeDropShadowOpacity", float.class ); + infos.put( "inactiveDropShadowColor", Color.class ); + infos.put( "inactiveDropShadowInsets", Insets.class ); + infos.put( "inactiveDropShadowOpacity", float.class ); + return infos; + } + @Override public Insets getBorderInsets( Component c, Insets insets ) { if( c instanceof JInternalFrame && ((JInternalFrame)c).isMaximum() ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index 5ed7fd49..f7f25afc 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -37,6 +37,7 @@ import javax.swing.plaf.basic.BasicLabelUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -57,6 +58,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatLabelUI extends BasicLabelUI + implements StyleableUI { @Styleable protected Color disabledForeground; @@ -149,6 +151,14 @@ public class FlatLabelUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + /** * Checks whether text contains HTML tags that use "absolute-size" keywords * (e.g. "x-large") for font-size in default style sheet diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java index 6bebe094..5dfce689 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java @@ -28,6 +28,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicListUI; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JList}. @@ -67,6 +68,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; */ public class FlatListUI extends BasicListUI + implements StyleableUI { @Styleable protected Color selectionBackground; @Styleable protected Color selectionForeground; @@ -179,6 +181,14 @@ public class FlatListUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + /** * Toggle selection colors from focused to inactive and vice versa. * diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java index 10d2026d..dadf531f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java @@ -21,6 +21,7 @@ import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; +import java.util.Map; import javax.swing.JMenuBar; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; @@ -47,6 +48,11 @@ public class FlatMenuBarBorder return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + @Override + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override public void paintBorder( Component c, Graphics g, int x, int y, int width, int height ) { float lineHeight = scale( (float) 1 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java index 5077ce76..135dbd72 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java @@ -40,6 +40,7 @@ import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicMenuBarUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.SystemInfo; /** @@ -60,6 +61,7 @@ import com.formdev.flatlaf.util.SystemInfo; */ public class FlatMenuBarUI extends BasicMenuBarUI + implements StyleableUI { private PropertyChangeListener propertyChangeListener; private Map oldStyleValues; @@ -141,6 +143,14 @@ public class FlatMenuBarUI return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, menuBar, borderShared ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this, menuBar.getBorder() ); + } + @Override public void update( Graphics g, JComponent c ) { // paint background diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java index 79580de1..a3f2c5d9 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java @@ -30,6 +30,7 @@ import java.awt.Rectangle; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.text.AttributedCharacterIterator; +import java.util.Map; import javax.swing.Icon; import javax.swing.JMenu; import javax.swing.JMenuItem; @@ -149,6 +150,19 @@ public class FlatMenuItemRenderer return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + public Map> getStyleableInfos() { + Map> infos = FlatStyleSupport.getAnnotatedStyleableInfos( this ); + if( checkIcon instanceof FlatCheckBoxMenuItemIcon ) + FlatStyleSupport.putAllPrefixKey( infos, "icon.", ((FlatCheckBoxMenuItemIcon)checkIcon).getStyleableInfos() ); + if( arrowIcon instanceof FlatMenuArrowIcon ) + FlatStyleSupport.putAllPrefixKey( infos, "icon.", ((FlatMenuArrowIcon)arrowIcon).getStyleableInfos() ); + infos.remove( "icon.selectionForeground" ); + return infos; + } + protected Dimension getPreferredMenuItemSize() { int width = 0; int height = 0; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java index fb4abf96..946b91e4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java @@ -16,15 +16,18 @@ package com.formdev.flatlaf.ui; +import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.beans.PropertyChangeListener; +import java.util.LinkedHashMap; import java.util.Map; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicMenuItemUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; /** @@ -57,6 +60,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; */ public class FlatMenuItemUI extends BasicMenuItemUI + implements StyleableUI { private FlatMenuItemRenderer renderer; private Map oldStyleValues; @@ -120,6 +124,7 @@ public class FlatMenuItemUI static Object applyStyleProperty( BasicMenuItemUI ui, String key, Object value ) { switch( key ) { + // BasicMenuItemUI case "selectionBackground": case "selectionForeground": case "disabledForeground": @@ -131,6 +136,25 @@ public class FlatMenuItemUI } } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return getStyleableInfos( renderer ); + } + + static Map> getStyleableInfos( FlatMenuItemRenderer renderer ) { + Map> infos = new LinkedHashMap<>(); + infos.put( "selectionBackground", Color.class ); + infos.put( "selectionForeground", Color.class ); + infos.put( "disabledForeground", Color.class ); + infos.put( "acceleratorForeground", Color.class ); + infos.put( "acceleratorSelectionForeground", Color.class ); + infos.putAll( renderer.getStyleableInfos() ); + return infos; + } + @Override protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) { return renderer.getPreferredMenuItemSize(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index acb08a35..1b976879 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -33,6 +33,7 @@ import javax.swing.UIManager; import javax.swing.event.MouseInputListener; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicMenuUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; /** @@ -75,6 +76,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; */ public class FlatMenuUI extends BasicMenuUI + implements StyleableUI { private Color hoverBackground; private FlatMenuItemRenderer renderer; @@ -166,6 +168,14 @@ public class FlatMenuUI return FlatMenuItemUI.applyStyleProperty( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatMenuItemUI.getStyleableInfos( renderer ); + } + @Override public Dimension getMinimumSize( JComponent c ) { // avoid that top-level menus (in menu bar) are made smaller if horizontal space is rare 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 bd16095e..adfbd0d6 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 @@ -16,6 +16,7 @@ package com.formdev.flatlaf.ui; +import java.awt.Color; import java.awt.Graphics; import java.awt.Insets; import java.awt.Shape; @@ -23,6 +24,7 @@ import java.awt.Toolkit; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.util.Map; import javax.swing.Action; import javax.swing.ActionMap; import javax.swing.Icon; @@ -159,6 +161,9 @@ public class FlatPasswordFieldUI } } + /** + * @since TODO + */ @Override protected Object applyStyleProperty( String key, Object value ) { if( key.equals( "capsLockIconColor" ) && capsLockIcon instanceof FlatCapsLockIcon ) { @@ -172,6 +177,16 @@ public class FlatPasswordFieldUI return super.applyStyleProperty( key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + Map> infos = super.getStyleableInfos( c ); + infos.put( "capsLockIconColor", Color.class ); + return infos; + } + @Override public View create( Element elem ) { return new PasswordView( elem ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java index e7e5080c..072abd36 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java @@ -33,6 +33,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicProgressBarUI; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -60,6 +61,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatProgressBarUI extends BasicProgressBarUI + implements StyleableUI { @Styleable protected int arc; @Styleable protected Dimension horizontalSize; @@ -141,6 +143,14 @@ public class FlatProgressBarUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override public Dimension getPreferredSize( JComponent c ) { Dimension size = super.getPreferredSize( c ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java index 3860319e..cfa7dcb3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java @@ -25,6 +25,7 @@ import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; /** @@ -57,6 +58,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; */ public class FlatRadioButtonMenuItemUI extends BasicRadioButtonMenuItemUI + implements StyleableUI { private FlatMenuItemRenderer renderer; private Map oldStyleValues; @@ -118,6 +120,14 @@ public class FlatRadioButtonMenuItemUI return FlatMenuItemUI.applyStyleProperty( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatMenuItemUI.getStyleableInfos( renderer ); + } + @Override protected Dimension getPreferredMenuItemSize( JComponent c, Icon checkIcon, Icon arrowIcon, int defaultTextIconGap ) { return renderer.getPreferredMenuItemSize(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index bd135cad..d26de632 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -37,6 +37,7 @@ import javax.swing.plaf.basic.BasicRadioButtonUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.icons.FlatCheckBoxIcon; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; @@ -62,6 +63,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatRadioButtonUI extends BasicRadioButtonUI + implements StyleableUI { protected int iconTextGap; @Styleable protected Color disabledText; @@ -181,6 +183,19 @@ public class FlatRadioButtonUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + Map> infos = FlatStyleSupport.getAnnotatedStyleableInfos( this ); + if( icon instanceof FlatCheckBoxIcon ) { + for( Map.Entry> e : ((FlatCheckBoxIcon)icon).getStyleableInfos().entrySet() ) + infos.put( "icon.".concat( e.getKey() ), e.getValue() ); + } + return infos; + } + private static Insets tempInsets = new Insets( 0, 0, 0, 0 ); @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index 8b0dcbef..937ed1d1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -24,6 +24,7 @@ import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeListener; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; import javax.swing.InputMap; @@ -37,6 +38,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicScrollBarUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.UIScale; /** @@ -76,6 +78,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatScrollBarUI extends BasicScrollBarUI + implements StyleableUI { // overrides BasicScrollBarUI.supportsAbsolutePositioning (which is private) @Styleable protected boolean allowsAbsolutePositioning; @@ -246,6 +249,21 @@ public class FlatScrollBarUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + Map> infos = new LinkedHashMap<>(); + infos.put( "track", Color.class ); + infos.put( "thumb", Color.class ); + infos.put( "width", int.class ); + infos.put( "minimumThumbSize", Dimension.class ); + infos.put( "maximumThumbSize", Dimension.class ); + FlatStyleSupport.collectAnnotatedStyleableInfos( this, infos ); + return infos; + } + @Override public Dimension getPreferredSize( JComponent c ) { return UIScale.scale( super.getPreferredSize( c ) ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java index bd406d4a..6532d5aa 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java @@ -48,6 +48,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicScrollPaneUI; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JScrollPane}. @@ -68,6 +69,7 @@ import com.formdev.flatlaf.FlatClientProperties; */ public class FlatScrollPaneUI extends BasicScrollPaneUI + implements StyleableUI { private Handler handler; @@ -320,6 +322,14 @@ public class FlatScrollPaneUI return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, scrollpane, borderShared ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this, scrollpane.getBorder() ); + } + @Override protected void updateViewport( PropertyChangeEvent e ) { super.updateViewport( e ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index 5d8fd01b..b6cb9aae 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -30,6 +30,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSeparatorUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JSeparator}. @@ -49,6 +50,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; */ public class FlatSeparatorUI extends BasicSeparatorUI + implements StyleableUI { @Styleable protected int height; @Styleable protected int stripeWidth; @@ -148,6 +150,14 @@ public class FlatSeparatorUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override public void paint( Graphics g, JComponent c ) { Graphics2D g2 = (Graphics2D) g.create(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index b382e94c..4db7abd3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -37,6 +37,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSliderUI; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -77,6 +78,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatSliderUI extends BasicSliderUI + implements StyleableUI { @Styleable protected int trackWidth; @Styleable protected Dimension thumbSize; @@ -202,6 +204,14 @@ public class FlatSliderUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override public int getBaseline( JComponent c, int width, int height ) { if( c == null ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index 5cce41c7..a59d924b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -45,6 +45,7 @@ import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicSpinnerUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JSpinner}. @@ -81,6 +82,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; */ public class FlatSpinnerUI extends BasicSpinnerUI + implements StyleableUI { private Handler handler; @@ -205,6 +207,14 @@ public class FlatSpinnerUI return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, spinner, borderShared ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this, spinner.getBorder() ); + } + @Override protected JComponent createEditor() { JComponent editor = super.createEditor(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 47dfad80..c238a01c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -36,6 +36,7 @@ import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; @@ -71,6 +72,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatSplitPaneUI extends BasicSplitPaneUI + implements StyleableUI { @Styleable protected String arrowType; @Styleable protected Color oneTouchArrowColor; @@ -159,6 +161,17 @@ public class FlatSplitPaneUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + Map> infos = FlatStyleSupport.getAnnotatedStyleableInfos( this ); + if( divider instanceof FlatSplitPaneDivider ) + infos.putAll( ((FlatSplitPaneDivider)divider).getStyleableInfos() ); + return infos; + } + //---- class FlatSplitPaneDivider ----------------------------------------- protected class FlatSplitPaneDivider @@ -183,6 +196,13 @@ public class FlatSplitPaneUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + void updateStyle() { if( leftButton instanceof FlatOneTouchButton ) ((FlatOneTouchButton)leftButton).updateStyle(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 317c76d8..882dd7e6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -56,10 +56,16 @@ public class FlatStyleSupport @Retention(RetentionPolicy.RUNTIME) public @interface Styleable { boolean dot() default false; + Class type() default Void.class; + } + + public interface StyleableUI { + Map> getStyleableInfos( JComponent c ); } public interface StyleableBorder { Object applyStyleProperty( String key, Object value ); + Map> getStyleableInfos(); } /** @@ -250,8 +256,8 @@ public class FlatStyleSupport try { Field f = cls.getDeclaredField( fieldName ); if( predicate == null || predicate.test( f ) ) { - if( Modifier.isFinal( f.getModifiers() ) ) - throw new IllegalArgumentException( "field '" + cls.getName() + "." + fieldName + "' is final" ); + if( !isValidField( f ) ) + throw new IllegalArgumentException( "field '" + cls.getName() + "." + fieldName + "' is final or static" ); try { // necessary to access protected fields in other packages @@ -281,6 +287,11 @@ public class FlatStyleSupport } } + private static boolean isValidField( Field f ) { + int modifiers = f.getModifiers(); + return (modifiers & (Modifier.FINAL|Modifier.STATIC)) == 0 && !f.isSynthetic(); + } + static Object applyToAnnotatedObjectOrBorder( Object obj, String key, Object value, JComponent c, AtomicBoolean borderShared ) { @@ -342,6 +353,80 @@ public class FlatStyleSupport } } + /** + * Returns a map of all fields annotated with {@link Styleable}. + * The key is the name of the field and the value the type of the field. + */ + public static Map> getAnnotatedStyleableInfos( Object obj ) { + return getAnnotatedStyleableInfos( obj, null ); + } + + public static Map> getAnnotatedStyleableInfos( Object obj, Border border ) { + Map> infos = new LinkedHashMap<>(); + collectAnnotatedStyleableInfos( obj, infos ); + collectStyleableInfos( border, infos ); + return infos; + } + + /** + * Search for all fields annotated with {@link Styleable} and add them to the given map. + * The key is the name of the field and the value the type of the field. + */ + public static void collectAnnotatedStyleableInfos( Object obj, Map> infos ) { + Class cls = obj.getClass(); + + for(;;) { + for( Field f : cls.getDeclaredFields() ) { + if( !isValidField( f ) ) + continue; + + Styleable styleable = f.getAnnotation( Styleable.class ); + if( styleable == null ) + continue; + + String name = f.getName(); + Class type = f.getType(); + + // handle "dot" keys (e.g. change field name "iconArrowType" to style key "icon.arrowType") + if( styleable.dot() ) { + int len = name.length(); + for( int i = 0; i < len; i++ ) { + if( Character.isUpperCase( name.charAt( i ) ) ) { + name = name.substring( 0, i ) + '.' + + Character.toLowerCase( name.charAt( i ) ) + + name.substring( i + 1 ); + break; + } + } + } + + // field has a different type + if( styleable.type() != Void.class ) + type = styleable.type(); + + infos.put( name, type ); + } + + cls = cls.getSuperclass(); + if( cls == null ) + return; + + String superclassName = cls.getName(); + if( superclassName.startsWith( "java." ) || superclassName.startsWith( "javax." ) ) + return; + } + } + + public static void collectStyleableInfos( Border border, Map> infos ) { + if( border instanceof StyleableBorder ) + infos.putAll( ((StyleableBorder)border).getStyleableInfos() ); + } + + public static void putAllPrefixKey( Map> infos, String keyPrefix, Map> infos2 ) { + for( Map.Entry> e : infos2.entrySet() ) + infos.put( keyPrefix.concat( e.getKey() ), e.getValue() ); + } + //---- class UnknownStyleException ---------------------------------------- public static class UnknownStyleException diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index ee884a8b..9bf6f17f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -52,6 +52,7 @@ import java.awt.geom.Rectangle2D; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import java.util.Set; @@ -87,6 +88,7 @@ import javax.swing.text.View; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.icons.FlatTabbedPaneCloseIcon; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.Animator; import com.formdev.flatlaf.util.CubicBezierEasing; @@ -160,6 +162,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatTabbedPaneUI extends BasicTabbedPaneUI + implements StyleableUI { // tabs popup policy / scroll arrows policy protected static final int NEVER = 0; @@ -202,13 +205,13 @@ public class FlatTabbedPaneUI @Styleable protected boolean hasFullBorder; @Styleable protected boolean tabsOpaque = true; - @Styleable private int tabsPopupPolicy; - @Styleable private int scrollButtonsPolicy; - @Styleable private int scrollButtonsPlacement; + @Styleable(type=String.class) private int tabsPopupPolicy; + @Styleable(type=String.class) private int scrollButtonsPolicy; + @Styleable(type=String.class) private int scrollButtonsPlacement; - @Styleable private int tabAreaAlignment; - @Styleable private int tabAlignment; - @Styleable private int tabWidthMode; + @Styleable(type=String.class) private int tabAreaAlignment; + @Styleable(type=String.class) private int tabAlignment; + @Styleable(type=String.class) private int tabWidthMode; protected Icon closeIcon; @Styleable protected String arrowType; @@ -626,6 +629,21 @@ public class FlatTabbedPaneUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + Map> infos = new LinkedHashMap<>(); + infos.put( "tabInsets", Insets.class ); + infos.put( "tabAreaInsets", Insets.class ); + infos.put( "textIconGap", int.class ); + FlatStyleSupport.collectAnnotatedStyleableInfos( this, infos ); + if( closeIcon instanceof FlatTabbedPaneCloseIcon ) + infos.putAll( ((FlatTabbedPaneCloseIcon)closeIcon).getStyleableInfos() ); + return infos; + } + protected void setRolloverTab( int x, int y ) { setRolloverTab( tabForCoordinate( tabPane, x, y ) ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index 0d5f45ea..43bb1eae 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java @@ -39,6 +39,7 @@ import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.UIScale; /** @@ -71,10 +72,11 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatTableHeaderUI extends BasicTableHeaderUI + implements StyleableUI { @Styleable protected Color bottomSeparatorColor; @Styleable protected int height; - @Styleable protected int sortIconPosition; + @Styleable(type=String.class) protected int sortIconPosition; // for FlatTableHeaderBorder @Styleable protected Insets cellMargins; @@ -150,6 +152,14 @@ public class FlatTableHeaderUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + private static int parseSortIconPosition( String str ) { if( str == null ) str = ""; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index 17a82a1f..1ed05dcd 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -39,6 +39,7 @@ import javax.swing.plaf.basic.BasicTableUI; import javax.swing.table.JTableHeader; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.UIScale; @@ -92,6 +93,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatTableUI extends BasicTableUI + implements StyleableUI { protected boolean showHorizontalLines; protected boolean showVerticalLines; @@ -255,6 +257,14 @@ public class FlatTableUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + /** * Toggle selection colors from focused to inactive and vice versa. * 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 b17f8d14..8600994e 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 @@ -29,6 +29,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTextAreaUI; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -59,6 +60,7 @@ import com.formdev.flatlaf.util.HiDPIUtils; */ public class FlatTextAreaUI extends BasicTextAreaUI + implements StyleableUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; @@ -158,6 +160,14 @@ public class FlatTextAreaUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + private void updateBackground() { FlatTextFieldUI.updateBackground( getComponent(), background, disabledBackground, inactiveBackground, 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 fa4d211b..2c173f08 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 @@ -43,6 +43,7 @@ import javax.swing.text.Caret; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.JavaCompatibility; import com.formdev.flatlaf.util.UIScale; @@ -78,6 +79,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatTextFieldUI extends BasicTextFieldUI + implements StyleableUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; @@ -216,6 +218,14 @@ public class FlatTextFieldUI return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, getComponent(), borderShared ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this, getComponent().getBorder() ); + } + private void updateBackground() { updateBackground( getComponent(), background, disabledBackground, inactiveBackground, 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 25cf45cf..395c07f1 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 @@ -29,6 +29,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTextPaneUI; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -59,6 +60,7 @@ import com.formdev.flatlaf.util.HiDPIUtils; */ public class FlatTextPaneUI extends BasicTextPaneUI + implements StyleableUI { @Styleable protected int minimumWidth; protected boolean isIntelliJTheme; @@ -166,6 +168,14 @@ public class FlatTextPaneUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + private void updateBackground() { FlatTextFieldUI.updateBackground( getComponent(), background, disabledBackground, inactiveBackground, diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java index cc14d423..cd49f1b5 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java @@ -21,12 +21,15 @@ import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.beans.PropertyChangeEvent; +import java.util.Iterator; +import java.util.Map; import javax.swing.AbstractButton; import javax.swing.JComponent; import javax.swing.JToggleButton; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** @@ -143,6 +146,31 @@ public class FlatToggleButtonUI } } + /** + * @since TODO + */ + @Override + protected Object applyStyleProperty( AbstractButton b, String key, Object value ) { + if( key.startsWith( "help." ) ) + throw new UnknownStyleException( key ); + + return super.applyStyleProperty( b, key, value ); + } + + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + Map> infos = super.getStyleableInfos( c ); + Iterator it = infos.keySet().iterator(); + while( it.hasNext() ) { + if( it.next().startsWith( "help." ) ) + it.remove(); + } + return infos; + } + static boolean isTabButton( Component c ) { return c instanceof JToggleButton && clientPropertyEquals( (JToggleButton) c, BUTTON_TYPE, BUTTON_TYPE_TAB ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java index 578879ab..f08b9d99 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java @@ -33,6 +33,7 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicToolBarSeparatorUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JToolBar.Separator}. @@ -46,6 +47,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; */ public class FlatToolBarSeparatorUI extends BasicToolBarSeparatorUI + implements StyleableUI { private static final int LINE_WIDTH = 1; @@ -144,6 +146,14 @@ public class FlatToolBarSeparatorUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override public Dimension getPreferredSize( JComponent c ) { Dimension size = ((JToolBar.Separator)c).getSeparatorSize(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java index ca27d66b..bc7fea16 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java @@ -30,6 +30,7 @@ import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicToolBarUI; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JToolBar}. @@ -59,6 +60,7 @@ import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; */ public class FlatToolBarUI extends BasicToolBarUI + implements StyleableUI { /** @since 1.4 */ @Styleable protected boolean focusableButtons; @@ -153,6 +155,14 @@ public class FlatToolBarUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + /** * @since 1.4 */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java index cfd8b724..0c626f6f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java @@ -41,6 +41,7 @@ import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; import com.formdev.flatlaf.util.UIScale; /** @@ -122,6 +123,7 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatTreeUI extends BasicTreeUI + implements StyleableUI { @Styleable protected Color selectionBackground; @Styleable protected Color selectionForeground; @@ -301,6 +303,14 @@ public class FlatTreeUI return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); } + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + /** * Same as super.paintRow(), but supports wide selection and uses * inactive selection background/foreground if tree is not focused. diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java new file mode 100644 index 00000000..70caf329 --- /dev/null +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java @@ -0,0 +1,1105 @@ +/* + * Copyright 2021 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 + * + * https://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 org.junit.jupiter.api.Assertions.assertTrue; +import static com.formdev.flatlaf.ui.TestUtils.assertMapEquals; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Insets; +import java.util.LinkedHashMap; +import java.util.Map; +import javax.swing.*; +import javax.swing.table.JTableHeader; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import com.formdev.flatlaf.icons.*; + +/** + * @author Karl Tauber + */ +public class TestFlatStyleableInfo +{ + @BeforeAll + static void setup() { + TestUtils.setup( false ); + } + + @AfterAll + static void cleanup() { + TestUtils.cleanup(); + } + + private Map> expectedMap( Object... keyValuePairs ) { + Map> map = new LinkedHashMap<>(); + expectedMap( map, keyValuePairs ); + return map; + } + + private void expectedMap( Map> map, Object... keyValuePairs ) { + for( int i = 0; i < keyValuePairs.length; i += 2 ) + map.put( (String) keyValuePairs[i], (Class) keyValuePairs[i+1] ); + } + + //---- components --------------------------------------------------------- + + @Test + void button() { + JButton b = new JButton(); + FlatButtonUI ui = (FlatButtonUI) b.getUI(); + + Map> expected = new LinkedHashMap<>(); + button( expected ); + + //---- FlatHelpButtonIcon ---- + + expectedMap( expected, + "help.focusWidth", int.class, + "help.focusColor", Color.class, + "help.innerFocusWidth", float.class, + "help.borderWidth", int.class, + + "help.borderColor", Color.class, + "help.disabledBorderColor", Color.class, + "help.focusedBorderColor", Color.class, + "help.hoverBorderColor", Color.class, + "help.background", Color.class, + "help.disabledBackground", Color.class, + "help.focusedBackground", Color.class, + "help.hoverBackground", Color.class, + "help.pressedBackground", Color.class, + "help.questionMarkColor", Color.class, + "help.disabledQuestionMarkColor", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( b ) ); + } + + private void button( Map> expected ) { + expectedMap( expected, + "minimumWidth", int.class, + + "focusedBackground", Color.class, + "hoverBackground", Color.class, + "pressedBackground", Color.class, + "selectedBackground", Color.class, + "selectedForeground", Color.class, + "disabledBackground", Color.class, + "disabledText", Color.class, + "disabledSelectedBackground", Color.class, + + "default.background", Color.class, + "default.foreground", Color.class, + "default.focusedBackground", Color.class, + "default.hoverBackground", Color.class, + "default.pressedBackground", Color.class, + "default.boldText", boolean.class, + + "paintShadow", boolean.class, + "shadowWidth", int.class, + "shadowColor", Color.class, + "default.shadowColor", Color.class, + + "toolbar.spacingInsets", Insets.class, + "toolbar.hoverBackground", Color.class, + "toolbar.pressedBackground", Color.class, + "toolbar.selectedBackground", Color.class + ); + + // border + flatButtonBorder( expected ); + } + + @Test + void checkBox() { + JCheckBox c = new JCheckBox(); + FlatCheckBoxUI ui = (FlatCheckBoxUI) c.getUI(); + + assertTrue( ui.getDefaultIcon() instanceof FlatCheckBoxIcon ); + + // FlatCheckBoxUI extends FlatRadioButtonUI + Map> expected = new LinkedHashMap<>(); + radioButton( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void comboBox() { + JComboBox c = new JComboBox<>(); + FlatComboBoxUI ui = (FlatComboBoxUI) c.getUI(); + + Map> expected = expectedMap( + "padding", Insets.class, + + "minimumWidth", int.class, + "editorColumns", int.class, + "buttonStyle", String.class, + "arrowType", String.class, + "borderColor", Color.class, + "disabledBorderColor", Color.class, + + "editableBackground", Color.class, + "focusedBackground", Color.class, + "disabledBackground", Color.class, + "disabledForeground", Color.class, + + "buttonBackground", Color.class, + "buttonFocusedBackground", Color.class, + "buttonEditableBackground", Color.class, + "buttonArrowColor", Color.class, + "buttonDisabledArrowColor", Color.class, + "buttonHoverArrowColor", Color.class, + "buttonPressedArrowColor", Color.class, + + "popupBackground", Color.class + ); + + // border + flatRoundBorder( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void editorPane() { + JEditorPane c = new JEditorPane(); + FlatEditorPaneUI ui = (FlatEditorPaneUI) c.getUI(); + + Map> expected = expectedMap( + "minimumWidth", int.class, + "disabledBackground", Color.class, + "inactiveBackground", Color.class, + "focusedBackground", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void formattedTextField() { + JFormattedTextField c = new JFormattedTextField(); + FlatFormattedTextFieldUI ui = (FlatFormattedTextFieldUI) c.getUI(); + + // FlatFormattedTextFieldUI extends FlatTextFieldUI + Map> expected = new LinkedHashMap<>(); + textField( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void internalFrame() { + JInternalFrame c = new JInternalFrame(); + FlatInternalFrameUI ui = (FlatInternalFrameUI) c.getUI(); + + Map> expected = expectedMap( + "activeBorderColor", Color.class, + "inactiveBorderColor", Color.class, + "borderLineWidth", int.class, + "dropShadowPainted", boolean.class, + "borderMargins", Insets.class, + + "activeDropShadowColor", Color.class, + "activeDropShadowInsets", Insets.class, + "activeDropShadowOpacity", float.class, + "inactiveDropShadowColor", Color.class, + "inactiveDropShadowInsets", Insets.class, + "inactiveDropShadowOpacity", float.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void label() { + JLabel c = new JLabel(); + FlatLabelUI ui = (FlatLabelUI) c.getUI(); + + Map> expected = expectedMap( + "disabledForeground", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void list() { + JList c = new JList<>(); + FlatListUI ui = (FlatListUI) c.getUI(); + + Map> expected = expectedMap( + "selectionBackground", Color.class, + "selectionForeground", Color.class, + "selectionInactiveBackground", Color.class, + "selectionInactiveForeground", Color.class, + + // FlatListCellBorder + "cellMargins", Insets.class, + "cellFocusColor", Color.class, + "showCellFocusIndicator", boolean.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void menuBar() { + JMenuBar c = new JMenuBar(); + FlatMenuBarUI ui = (FlatMenuBarUI) c.getUI(); + + Map> expected = expectedMap( + // FlatMenuBarBorder + "borderColor", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void menu() { + JMenu c = new JMenu(); + FlatMenuUI ui = (FlatMenuUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + menuItem( expected ); + menuItem_arrowIcon( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void menuItem() { + JMenuItem c = new JMenuItem(); + FlatMenuItemUI ui = (FlatMenuItemUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + menuItem( expected ); + menuItem_arrowIcon( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void checkBoxMenuItem() { + JCheckBoxMenuItem c = new JCheckBoxMenuItem(); + FlatCheckBoxMenuItemUI ui = (FlatCheckBoxMenuItemUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + menuItem( expected ); + menuItem_checkIcon( expected ); + menuItem_arrowIcon( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void radioButtonMenuItem() { + JRadioButtonMenuItem c = new JRadioButtonMenuItem(); + FlatRadioButtonMenuItemUI ui = (FlatRadioButtonMenuItemUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + menuItem( expected ); + menuItem_checkIcon( expected ); + menuItem_arrowIcon( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + private void menuItem( Map> expected ) { + expectedMap( expected, + "selectionBackground", Color.class, + "selectionForeground", Color.class, + "disabledForeground", Color.class, + "acceleratorForeground", Color.class, + "acceleratorSelectionForeground", Color.class + ); + + menuItemRenderer( expected ); + } + + private void menuItemRenderer( Map> expected ) { + expectedMap( expected, + "minimumWidth", int.class, + "minimumIconSize", Dimension.class, + "textAcceleratorGap", int.class, + "textNoAcceleratorGap", int.class, + "acceleratorArrowGap", int.class, + + "checkBackground", Color.class, + "checkMargins", Insets.class, + + "underlineSelectionBackground", Color.class, + "underlineSelectionCheckBackground", Color.class, + "underlineSelectionColor", Color.class, + "underlineSelectionHeight", int.class + ); + } + + private void menuItem_checkIcon( Map> expected ) { + expectedMap( expected, + "icon.checkmarkColor", Color.class, + "icon.disabledCheckmarkColor", Color.class, + "selectionForeground", Color.class + ); + } + + private void menuItem_arrowIcon( Map> expected ) { + expectedMap( expected, + "icon.arrowType", String.class, + "icon.arrowColor", Color.class, + "icon.disabledArrowColor", Color.class, + "selectionForeground", Color.class + ); + } + + @Test + void passwordField() { + JPasswordField c = new JPasswordField(); + FlatPasswordFieldUI ui = (FlatPasswordFieldUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + expectedMap( expected, + "showCapsLock", boolean.class + ); + + // FlatPasswordFieldUI extends FlatTextFieldUI + textField( expected ); + + expectedMap( expected, + // capsLockIcon + "capsLockIconColor", Color.class + ); + + // border + flatTextBorder( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void popupMenuSeparator() { + JPopupMenu.Separator c = new JPopupMenu.Separator(); + FlatPopupMenuSeparatorUI ui = (FlatPopupMenuSeparatorUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + + // FlatPopupMenuSeparatorUI extends FlatSeparatorUI + separator( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void progressBar() { + JProgressBar c = new JProgressBar(); + FlatProgressBarUI ui = (FlatProgressBarUI) c.getUI(); + + Map> expected = expectedMap( + "arc", int.class, + "horizontalSize", Dimension.class, + "verticalSize", Dimension.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void radioButton() { + JRadioButton c = new JRadioButton(); + FlatRadioButtonUI ui = (FlatRadioButtonUI) c.getUI(); + + assertTrue( ui.getDefaultIcon() instanceof FlatRadioButtonIcon ); + + Map> expected = new LinkedHashMap<>(); + radioButton( expected ); + + expectedMap( expected, + "icon.centerDiameter", int.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + private void radioButton( Map> expected ) { + expectedMap( expected, + "disabledText", Color.class, + + //---- icon ---- + + "icon.focusWidth", int.class, + "icon.focusColor", Color.class, + "icon.arc", int.class, + + // enabled + "icon.borderColor", Color.class, + "icon.background", Color.class, + "icon.selectedBorderColor", Color.class, + "icon.selectedBackground", Color.class, + "icon.checkmarkColor", Color.class, + + // disabled + "icon.disabledBorderColor", Color.class, + "icon.disabledBackground", Color.class, + "icon.disabledCheckmarkColor", Color.class, + + // focused + "icon.focusedBorderColor", Color.class, + "icon.focusedBackground", Color.class, + "icon.selectedFocusedBorderColor", Color.class, + "icon.selectedFocusedBackground", Color.class, + "icon.selectedFocusedCheckmarkColor", Color.class, + + // hover + "icon.hoverBorderColor", Color.class, + "icon.hoverBackground", Color.class, + "icon.selectedHoverBackground", Color.class, + + // pressed + "icon.pressedBackground", Color.class, + "icon.selectedPressedBackground", Color.class + ); + } + + @Test + void scrollBar() { + JScrollBar c = new JScrollBar(); + FlatScrollBarUI ui = (FlatScrollBarUI) c.getUI(); + + Map> expected = expectedMap( + "track", Color.class, + "thumb", Color.class, + "width", int.class, + "minimumThumbSize", Dimension.class, + "maximumThumbSize", Dimension.class, + "allowsAbsolutePositioning", boolean.class, + + "trackInsets", Insets.class, + "thumbInsets", Insets.class, + "trackArc", int.class, + "thumbArc", int.class, + "hoverTrackColor", Color.class, + "hoverThumbColor", Color.class, + "hoverThumbWithTrack", boolean.class, + "pressedTrackColor", Color.class, + "pressedThumbColor", Color.class, + "pressedThumbWithTrack", boolean.class, + + "showButtons", boolean.class, + "arrowType", String.class, + "buttonArrowColor", Color.class, + "buttonDisabledArrowColor", Color.class, + "hoverButtonBackground", Color.class, + "pressedButtonBackground", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void scrollPane() { + JScrollPane c = new JScrollPane(); + FlatScrollPaneUI ui = (FlatScrollPaneUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + + // border + flatBorder( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void separator() { + JSeparator c = new JSeparator(); + FlatSeparatorUI ui = (FlatSeparatorUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + separator( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + private void separator( Map> expected ) { + expectedMap( expected, + "height", int.class, + "stripeWidth", int.class, + "stripeIndent", int.class + ); + } + + @Test + void slider() { + JSlider c = new JSlider(); + FlatSliderUI ui = (FlatSliderUI) c.getUI(); + + Map> expected = expectedMap( + "trackWidth", int.class, + "thumbSize", Dimension.class, + "focusWidth", int.class, + + "trackValueColor", Color.class, + "trackColor", Color.class, + "thumbColor", Color.class, + "thumbBorderColor", Color.class, + "focusedColor", Color.class, + "focusedThumbBorderColor", Color.class, + "hoverThumbColor", Color.class, + "pressedThumbColor", Color.class, + "disabledTrackColor", Color.class, + "disabledThumbColor", Color.class, + "disabledThumbBorderColor", Color.class, + "tickColor", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void spinner() { + JSpinner c = new JSpinner(); + FlatSpinnerUI ui = (FlatSpinnerUI) c.getUI(); + + Map> expected = expectedMap( + "minimumWidth", int.class, + "buttonStyle", String.class, + "arrowType", String.class, + "borderColor", Color.class, + "disabledBorderColor", Color.class, + "disabledBackground", Color.class, + "disabledForeground", Color.class, + "focusedBackground", Color.class, + "buttonBackground", Color.class, + "buttonArrowColor", Color.class, + "buttonDisabledArrowColor", Color.class, + "buttonHoverArrowColor", Color.class, + "buttonPressedArrowColor", Color.class, + "padding", Insets.class + ); + + // border + flatRoundBorder( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void splitPane() { + JSplitPane c = new JSplitPane(); + FlatSplitPaneUI ui = (FlatSplitPaneUI) c.getUI(); + + Map> expected = expectedMap( + "arrowType", String.class, + "oneTouchArrowColor", Color.class, + "oneTouchHoverArrowColor", Color.class, + "oneTouchPressedArrowColor", Color.class, + + "style", String.class, + "gripColor", Color.class, + "gripDotCount", int.class, + "gripDotSize", int.class, + "gripGap", int.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void tabbedPane() { + JTabbedPane c = new JTabbedPane(); + FlatTabbedPaneUI ui = (FlatTabbedPaneUI) c.getUI(); + + Map> expected = expectedMap( + "tabInsets", Insets.class, + "tabAreaInsets", Insets.class, + "textIconGap", int.class, + + "disabledForeground", Color.class, + + "selectedBackground", Color.class, + "selectedForeground", Color.class, + "underlineColor", Color.class, + "disabledUnderlineColor", Color.class, + "hoverColor", Color.class, + "focusColor", Color.class, + "tabSeparatorColor", Color.class, + "contentAreaColor", Color.class, + + "minimumTabWidth", int.class, + "maximumTabWidth", int.class, + "tabHeight", int.class, + "tabSelectionHeight", int.class, + "contentSeparatorHeight", int.class, + "showTabSeparators", boolean.class, + "tabSeparatorsFullHeight", boolean.class, + "hasFullBorder", boolean.class, + "tabsOpaque", boolean.class, + + "tabsPopupPolicy", String.class, + "scrollButtonsPolicy", String.class, + "scrollButtonsPlacement", String.class, + + "tabAreaAlignment", String.class, + "tabAlignment", String.class, + "tabWidthMode", String.class, + + "arrowType", String.class, + "buttonInsets", Insets.class, + "buttonArc", int.class, + "buttonHoverBackground", Color.class, + "buttonPressedBackground", Color.class, + + "moreTabsButtonToolTipText", String.class, + + // FlatTabbedPaneCloseIcon + "closeSize", Dimension.class, + "closeArc", int.class, + "closeCrossPlainSize", float.class, + "closeCrossFilledSize", float.class, + "closeCrossLineWidth", float.class, + "closeBackground", Color.class, + "closeForeground", Color.class, + "closeHoverBackground", Color.class, + "closeHoverForeground", Color.class, + "closePressedBackground", Color.class, + "closePressedForeground", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void table() { + JTable c = new JTable(); + FlatTableUI ui = (FlatTableUI) c.getUI(); + + Map> expected = expectedMap( + "selectionBackground", Color.class, + "selectionForeground", Color.class, + "selectionInactiveBackground", Color.class, + "selectionInactiveForeground", Color.class, + + // FlatTableCellBorder + "cellMargins", Insets.class, + "cellFocusColor", Color.class, + "showCellFocusIndicator", boolean.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void tableHeader() { + JTableHeader c = new JTableHeader(); + FlatTableHeaderUI ui = (FlatTableHeaderUI) c.getUI(); + + Map> expected = expectedMap( + "bottomSeparatorColor", Color.class, + "height", int.class, + "sortIconPosition", String.class, + + // FlatTableHeaderBorder + "cellMargins", Insets.class, + "separatorColor", Color.class, + + // FlatAscendingSortIcon and FlatDescendingSortIcon + "arrowType", String.class, + "sortIconColor", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void textArea() { + JTextArea c = new JTextArea(); + FlatTextAreaUI ui = (FlatTextAreaUI) c.getUI(); + + Map> expected = expectedMap( + "minimumWidth", int.class, + "disabledBackground", Color.class, + "inactiveBackground", Color.class, + "focusedBackground", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void textField() { + JTextField c = new JTextField(); + FlatTextFieldUI ui = (FlatTextFieldUI) c.getUI(); + + Map> expected = new LinkedHashMap<>(); + textField( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + private void textField( Map> expected ) { + expectedMap( expected, + "minimumWidth", int.class, + "disabledBackground", Color.class, + "inactiveBackground", Color.class, + "placeholderForeground", Color.class, + "focusedBackground", Color.class + ); + + // border + flatTextBorder( expected ); + } + + @Test + void textPane() { + JTextPane c = new JTextPane(); + FlatTextPaneUI ui = (FlatTextPaneUI) c.getUI(); + + Map> expected = expectedMap( + "minimumWidth", int.class, + "disabledBackground", Color.class, + "inactiveBackground", Color.class, + "focusedBackground", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void toggleButton() { + JToggleButton b = new JToggleButton(); + FlatToggleButtonUI ui = (FlatToggleButtonUI) b.getUI(); + + Map> expected = expectedMap( + "tab.underlineHeight", int.class, + "tab.underlineColor", Color.class, + "tab.disabledUnderlineColor", Color.class, + "tab.selectedBackground", Color.class, + "tab.hoverBackground", Color.class, + "tab.focusBackground", Color.class + ); + + // FlatToggleButtonUI extends FlatButtonUI + button( expected ); + + assertMapEquals( expected, ui.getStyleableInfos( b ) ); + } + + @Test + void toolBar() { + JToolBar c = new JToolBar(); + FlatToolBarUI ui = (FlatToolBarUI) c.getUI(); + + Map> expected = expectedMap( + "focusableButtons", boolean.class, + + "borderMargins", Insets.class, + "gripColor", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void toolBarSeparator() { + JToolBar.Separator c = new JToolBar.Separator(); + FlatToolBarSeparatorUI ui = (FlatToolBarSeparatorUI) c.getUI(); + + Map> expected = expectedMap( + "separatorWidth", int.class, + "separatorColor", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + @Test + void tree() { + JTree c = new JTree(); + FlatTreeUI ui = (FlatTreeUI) c.getUI(); + + Map> expected = expectedMap( + "selectionBackground", Color.class, + "selectionForeground", Color.class, + "selectionInactiveBackground", Color.class, + "selectionInactiveForeground", Color.class, + "selectionBorderColor", Color.class, + "wideSelection", boolean.class, + "showCellFocusIndicator", boolean.class, + + // icons + "icon.arrowType", String.class, + "icon.expandedColor", Color.class, + "icon.collapsedColor", Color.class, + "icon.leafColor", Color.class, + "icon.closedColor", Color.class, + "icon.openColor", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + + //---- component borders -------------------------------------------------- + + private void flatButtonBorder( Map> expected ) { + flatBorder( expected ); + + expectedMap( expected, + "borderColor", Color.class, + "disabledBorderColor", Color.class, + "focusedBorderColor", Color.class, + "hoverBorderColor", Color.class, + + "default.borderColor", Color.class, + "default.focusedBorderColor", Color.class, + "default.focusColor", Color.class, + "default.hoverBorderColor", Color.class, + "toolbar.focusColor", Color.class, + + "borderWidth", int.class, + "default.borderWidth", int.class, + "toolbar.margin", Insets.class, + "toolbar.spacingInsets", Insets.class, + "toolbar.focusWidth", float.class, + "arc", int.class + ); + } + + private void flatRoundBorder( Map> expected ) { + flatBorder( expected ); + + expectedMap( expected, + "arc", int.class + ); + } + + private void flatTextBorder( Map> expected ) { + flatBorder( expected ); + + expectedMap( expected, + "arc", int.class + ); + } + + private void flatBorder( Map> expected ) { + expectedMap( expected, + "focusWidth", int.class, + "innerFocusWidth", float.class, + "innerOutlineWidth", float.class, + "focusColor", Color.class, + "borderColor", Color.class, + "disabledBorderColor", Color.class, + "focusedBorderColor", Color.class, + + "error.borderColor", Color.class, + "error.focusedBorderColor", Color.class, + "warning.borderColor", Color.class, + "warning.focusedBorderColor", Color.class, + "custom.borderColor", Color.class + ); + } + + //---- borders ------------------------------------------------------------ + + @Test + void flatButtonBorder() { + FlatButtonBorder border = new FlatButtonBorder(); + + Map> expected = new LinkedHashMap<>(); + flatButtonBorder( expected ); + + assertMapEquals( expected, border.getStyleableInfos() ); + } + + @Test + void flatRoundBorder() { + FlatRoundBorder border = new FlatRoundBorder(); + + Map> expected = new LinkedHashMap<>(); + flatRoundBorder( expected ); + + assertMapEquals( expected, border.getStyleableInfos() ); + } + + @Test + void flatTextBorder() { + FlatTextBorder border = new FlatTextBorder(); + + Map> expected = new LinkedHashMap<>(); + flatTextBorder( expected ); + + assertMapEquals( expected, border.getStyleableInfos() ); + } + + @Test + void flatBorder() { + FlatBorder border = new FlatBorder(); + + Map> expected = new LinkedHashMap<>(); + flatBorder( expected ); + + assertMapEquals( expected, border.getStyleableInfos() ); + } + + //---- icons -------------------------------------------------------------- + + @Test + void flatCheckBoxIcon() { + FlatCheckBoxIcon icon = new FlatCheckBoxIcon(); + + Map> expected = new LinkedHashMap<>(); + flatCheckBoxIcon( expected ); + + assertMapEquals( expected, icon.getStyleableInfos() ); + } + + @Test + void flatRadioButtonIcon() { + FlatRadioButtonIcon icon = new FlatRadioButtonIcon(); + + // FlatRadioButtonIcon extends FlatCheckBoxIcon + Map> expected = new LinkedHashMap<>(); + flatCheckBoxIcon( expected ); + + expectedMap( expected, + "centerDiameter", int.class + ); + + assertMapEquals( expected, icon.getStyleableInfos() ); + } + + private void flatCheckBoxIcon( Map> expected ) { + expectedMap( expected, + "focusWidth", int.class, + "focusColor", Color.class, + "arc", int.class, + + // enabled + "borderColor", Color.class, + "background", Color.class, + "selectedBorderColor", Color.class, + "selectedBackground", Color.class, + "checkmarkColor", Color.class, + + // disabled + "disabledBorderColor", Color.class, + "disabledBackground", Color.class, + "disabledCheckmarkColor", Color.class, + + // focused + "focusedBorderColor", Color.class, + "focusedBackground", Color.class, + "selectedFocusedBorderColor", Color.class, + "selectedFocusedBackground", Color.class, + "selectedFocusedCheckmarkColor", Color.class, + + // hover + "hoverBorderColor", Color.class, + "hoverBackground", Color.class, + "selectedHoverBackground", Color.class, + + // pressed + "pressedBackground", Color.class, + "selectedPressedBackground", Color.class + ); + } + + @Test + void flatCheckBoxMenuItemIcon() { + FlatCheckBoxMenuItemIcon icon = new FlatCheckBoxMenuItemIcon(); + + Map> expected = new LinkedHashMap<>(); + flatCheckBoxMenuItemIcon( expected ); + + assertMapEquals( expected, icon.getStyleableInfos() ); + } + + @Test + void flatRadioButtonMenuItemIcon() { + FlatRadioButtonMenuItemIcon icon = new FlatRadioButtonMenuItemIcon(); + + // FlatRadioButtonMenuItemIcon extends FlatCheckBoxMenuItemIcon + Map> expected = new LinkedHashMap<>(); + flatCheckBoxMenuItemIcon( expected ); + + assertMapEquals( expected, icon.getStyleableInfos() ); + } + + private void flatCheckBoxMenuItemIcon( Map> expected ) { + expectedMap( expected, + "checkmarkColor", Color.class, + "disabledCheckmarkColor", Color.class, + "selectionForeground", Color.class + ); + } + + @Test + void flatMenuArrowIcon() { + FlatMenuArrowIcon icon = new FlatMenuArrowIcon(); + + Map> expected = new LinkedHashMap<>(); + flatMenuArrowIcon( expected ); + + assertMapEquals( expected, icon.getStyleableInfos() ); + } + + @Test + void flatMenuItemArrowIcon() { + FlatMenuItemArrowIcon icon = new FlatMenuItemArrowIcon(); + + // FlatMenuItemArrowIcon extends FlatMenuArrowIcon + Map> expected = new LinkedHashMap<>(); + flatMenuArrowIcon( expected ); + + assertMapEquals( expected, icon.getStyleableInfos() ); + } + + private void flatMenuArrowIcon( Map> expected ) { + expectedMap( expected, + "arrowType", String.class, + "arrowColor", Color.class, + "disabledArrowColor", Color.class, + "selectionForeground", Color.class + ); + } + + @Test + void flatHelpButtonIcon() { + FlatHelpButtonIcon icon = new FlatHelpButtonIcon(); + + Map> expected = expectedMap( + "focusWidth", int.class, + "focusColor", Color.class, + "innerFocusWidth", float.class, + "borderWidth", int.class, + + "borderColor", Color.class, + "disabledBorderColor", Color.class, + "focusedBorderColor", Color.class, + "hoverBorderColor", Color.class, + "background", Color.class, + "disabledBackground", Color.class, + "focusedBackground", Color.class, + "hoverBackground", Color.class, + "pressedBackground", Color.class, + "questionMarkColor", Color.class, + "disabledQuestionMarkColor", Color.class + ); + + assertMapEquals( expected, icon.getStyleableInfos() ); + } +} diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 47747e1a..75d82e41 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -276,8 +276,8 @@ public class TestFlatStyling Consumer applyStyle = style -> ui.applyStyle( style ); menuItem( applyStyle ); - menuItem_arrowIcon( applyStyle ); menuItem_checkIcon( applyStyle ); + menuItem_arrowIcon( applyStyle ); } @Test @@ -287,8 +287,8 @@ public class TestFlatStyling Consumer applyStyle = style -> ui.applyStyle( style ); menuItem( applyStyle ); - menuItem_arrowIcon( applyStyle ); menuItem_checkIcon( applyStyle ); + menuItem_arrowIcon( applyStyle ); } private void menuItem( Consumer applyStyle ) { @@ -320,7 +320,7 @@ public class TestFlatStyling private void menuItem_checkIcon( Consumer applyStyle ) { applyStyle.accept( "icon.checkmarkColor: #fff" ); applyStyle.accept( "icon.disabledCheckmarkColor: #fff" ); - applyStyle.accept( "icon.selectionForeground: #fff" ); + applyStyle.accept( "selectionForeground: #fff" ); } private void menuItem_arrowIcon( Consumer applyStyle ) { @@ -335,11 +335,9 @@ public class TestFlatStyling JPasswordField c = new JPasswordField(); FlatPasswordFieldUI ui = (FlatPasswordFieldUI) c.getUI(); - ui.applyStyle( "minimumWidth: 100" ); - ui.applyStyle( "disabledBackground: #fff" ); - ui.applyStyle( "inactiveBackground: #fff" ); - ui.applyStyle( "placeholderForeground: #fff" ); - ui.applyStyle( "focusedBackground: #fff" ); + // FlatPasswordFieldUI extends FlatTextFieldUI + textField( ui ); + ui.applyStyle( "showCapsLock: true" ); // capsLockIcon @@ -543,6 +541,7 @@ public class TestFlatStyling ui.applyStyle( "tabInsets: 1,2,3,4" ); ui.applyStyle( "tabAreaInsets: 1,2,3,4" ); + ui.applyStyle( "textIconGap: 4" ); ui.applyStyle( "disabledForeground: #fff" ); @@ -555,7 +554,6 @@ public class TestFlatStyling ui.applyStyle( "tabSeparatorColor: #fff" ); ui.applyStyle( "contentAreaColor: #fff" ); - ui.applyStyle( "textIconGap: 4" ); ui.applyStyle( "minimumTabWidth: 50" ); ui.applyStyle( "maximumTabWidth: 100" ); ui.applyStyle( "tabHeight: 30" ); @@ -809,6 +807,16 @@ public class TestFlatStyling border.applyStyleProperty( "arc", 6 ); } + @Test + void flatRoundBorder() { + FlatRoundBorder border = new FlatRoundBorder(); + + // FlatRoundBorder extends FlatBorder + flatBorder( border ); + + border.applyStyleProperty( "arc", 6 ); + } + @Test void flatTextBorder() { FlatTextBorder border = new FlatTextBorder(); @@ -937,6 +945,7 @@ public class TestFlatStyling icon.applyStyleProperty( "disabledArrowColor", Color.WHITE ); icon.applyStyleProperty( "selectionForeground", Color.WHITE ); } + @Test void flatHelpButtonIcon() { FlatHelpButtonIcon icon = new FlatHelpButtonIcon(); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestUtils.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestUtils.java index e4bead06..d9399383 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestUtils.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestUtils.java @@ -17,7 +17,10 @@ package com.formdev.flatlaf.ui; import java.awt.Font; +import java.util.Map; +import java.util.Objects; import javax.swing.UIManager; +import org.opentest4j.AssertionFailedError; import com.formdev.flatlaf.FlatIntelliJLaf; import com.formdev.flatlaf.FlatLightLaf; import com.formdev.flatlaf.FlatSystemProperties; @@ -50,4 +53,15 @@ public class TestUtils public static void resetFont() { UIManager.put( "defaultFont", null ); } + + public static void assertMapEquals( Map expected, Map actual ) { + if( !Objects.equals( expected, actual ) ) { + String expectedStr = String.valueOf( expected ).replace( ", ", ",\n" ); + String actualStr = String.valueOf( actual ).replace( ", ", ",\n" ); + String msg = String.format( "expected: <%s> but was: <%s>", expectedStr, actualStr ); + + // pass expected/actual strings to exception for nice diff in IDE + throw new AssertionFailedError( msg, expectedStr, actualStr ); + } + } } From 299bd67151b2375db5455770002b4a2532861871 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 23 Jul 2021 08:54:50 +0200 Subject: [PATCH 49/60] Styling: support PopupMenu --- .../flatlaf/ui/FlatPopupMenuBorder.java | 37 +++++++++++ .../formdev/flatlaf/ui/FlatPopupMenuUI.java | 65 +++++++++++++++++++ .../flatlaf/ui/TestFlatStyleableInfo.java | 13 ++++ .../formdev/flatlaf/ui/TestFlatStyling.java | 9 +++ 4 files changed, 124 insertions(+) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java index ce1b314e..593dd2f1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java @@ -16,11 +16,16 @@ package com.formdev.flatlaf.ui; +import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Insets; +import java.util.LinkedHashMap; +import java.util.Map; import javax.swing.JScrollPane; import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; +import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** @@ -33,12 +38,44 @@ import com.formdev.flatlaf.util.UIScale; */ public class FlatPopupMenuBorder extends FlatLineBorder + implements StyleableBorder { + private Color borderColor; + public FlatPopupMenuBorder() { super( UIManager.getInsets( "PopupMenu.borderInsets" ), UIManager.getColor( "PopupMenu.borderColor" ) ); } + /** + * @since TODO + */ + @Override + public Object applyStyleProperty( String key, Object value ) { + Object oldValue; + switch( key ) { + case "borderInsets": return applyStyleProperty( (Insets) value ); + case "borderColor": oldValue = getLineColor(); borderColor = (Color) value; return oldValue; + } + throw new UnknownStyleException( key ); + } + + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos() { + Map> infos = new LinkedHashMap<>(); + infos.put( "borderInsets", Insets.class ); + infos.put( "borderColor", Color.class ); + return infos; + } + + @Override + public Color getLineColor() { + return (borderColor != null) ? borderColor : super.getLineColor(); + } + @Override public Insets getBorderInsets( Component c, Insets insets ) { if( c instanceof Container && diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java index 480b0222..27435846 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java @@ -16,9 +16,14 @@ package com.formdev.flatlaf.ui; +import java.beans.PropertyChangeListener; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicPopupMenuUI; +import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JPopupMenu}. @@ -34,8 +39,68 @@ import javax.swing.plaf.basic.BasicPopupMenuUI; */ public class FlatPopupMenuUI extends BasicPopupMenuUI + implements StyleableUI { + private PropertyChangeListener propertyChangeListener; + private Map oldStyleValues; + private AtomicBoolean borderShared; + public static ComponentUI createUI( JComponent c ) { return new FlatPopupMenuUI(); } + + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( c ) ); + } + + @Override + public void uninstallUI( JComponent c ) { + super.uninstallUI( c ); + + oldStyleValues = null; + borderShared = null; + } + + @Override + protected void installListeners() { + super.installListeners(); + + propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( popupMenu, this::applyStyle, null ); + popupMenu.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + } + + @Override + protected void uninstallListeners() { + super.uninstallListeners(); + + popupMenu.removePropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); + propertyChangeListener = null; + } + + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + if( borderShared == null ) + borderShared = new AtomicBoolean( true ); + return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, popupMenu, borderShared ); + } + + /** + * @since TODO + */ + @Override + public Map> getStyleableInfos( JComponent c ) { + return FlatStyleSupport.getAnnotatedStyleableInfos( this, popupMenu.getBorder() ); + } } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java index 70caf329..46da6a99 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java @@ -392,6 +392,19 @@ public class TestFlatStyleableInfo assertMapEquals( expected, ui.getStyleableInfos( c ) ); } + @Test + void popupMenu() { + JPopupMenu c = new JPopupMenu(); + FlatPopupMenuUI ui = (FlatPopupMenuUI) c.getUI(); + + Map> expected = expectedMap( + "borderInsets", Insets.class, + "borderColor", Color.class + ); + + assertMapEquals( expected, ui.getStyleableInfos( c ) ); + } + @Test void popupMenuSeparator() { JPopupMenu.Separator c = new JPopupMenu.Separator(); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 75d82e41..4333d836 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -347,6 +347,15 @@ public class TestFlatStyling flatTextBorder( style -> ui.applyStyle( style ) ); } + @Test + void popupMenu() { + JPopupMenu c = new JPopupMenu(); + FlatPopupMenuUI ui = (FlatPopupMenuUI) c.getUI(); + + ui.applyStyle( "borderInsets: 1,2,3,4" ); + ui.applyStyle( "borderColor: #fff" ); + } + @Test void popupMenuSeparator() { JPopupMenu.Separator c = new JPopupMenu.Separator(); From b12c818862f8933422bdfc70ba1a6b8524e3dc21 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 31 Aug 2021 16:12:03 +0200 Subject: [PATCH 50/60] Styling: support styling for recently merged changes --- .../formdev/flatlaf/icons/FlatClearIcon.java | 23 +++++++++++++-- .../formdev/flatlaf/icons/FlatSearchIcon.java | 23 +++++++++++++-- .../formdev/flatlaf/ui/TestFlatStyling.java | 29 +++++++++++++++++++ 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java index b756b509..e5790b41 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java @@ -22,10 +22,13 @@ import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.awt.geom.Path2D; +import java.util.Map; import javax.swing.AbstractButton; import javax.swing.ButtonModel; import javax.swing.UIManager; +import com.formdev.flatlaf.ui.FlatStyleSupport; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * "clear" icon for search fields. @@ -40,14 +43,28 @@ import com.formdev.flatlaf.ui.FlatUIUtils; public class FlatClearIcon extends FlatAbstractIcon { - protected Color clearIconColor = UIManager.getColor( "SearchField.clearIconColor" ); - protected Color clearIconHoverColor = UIManager.getColor( "SearchField.clearIconHoverColor" ); - protected Color clearIconPressedColor = UIManager.getColor( "SearchField.clearIconPressedColor" ); + @Styleable protected Color clearIconColor = UIManager.getColor( "SearchField.clearIconColor" ); + @Styleable protected Color clearIconHoverColor = UIManager.getColor( "SearchField.clearIconHoverColor" ); + @Styleable protected Color clearIconPressedColor = UIManager.getColor( "SearchField.clearIconPressedColor" ); public FlatClearIcon() { super( 16, 16, null ); } + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + + /** + * @since TODO + */ + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override protected void paintIcon( Component c, Graphics2D g ) { if( c instanceof AbstractButton ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java index 1bc726a6..f47a7839 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java @@ -21,9 +21,12 @@ import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Area; import java.awt.geom.Ellipse2D; +import java.util.Map; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; +import com.formdev.flatlaf.ui.FlatStyleSupport; import com.formdev.flatlaf.ui.FlatUIUtils; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * "search" icon for search fields. @@ -38,14 +41,28 @@ import com.formdev.flatlaf.ui.FlatUIUtils; public class FlatSearchIcon extends FlatAbstractIcon { - protected Color searchIconColor = UIManager.getColor( "SearchField.searchIconColor" ); - protected Color searchIconHoverColor = UIManager.getColor( "SearchField.searchIconHoverColor" ); - protected Color searchIconPressedColor = UIManager.getColor( "SearchField.searchIconPressedColor" ); + @Styleable protected Color searchIconColor = UIManager.getColor( "SearchField.searchIconColor" ); + @Styleable protected Color searchIconHoverColor = UIManager.getColor( "SearchField.searchIconHoverColor" ); + @Styleable protected Color searchIconPressedColor = UIManager.getColor( "SearchField.searchIconPressedColor" ); public FlatSearchIcon() { super( 16, 16, null ); } + /** + * @since TODO + */ + public Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + + /** + * @since TODO + */ + public Map> getStyleableInfos() { + return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + } + @Override protected void paintIcon( Component c, Graphics2D g ) { /* diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 4333d836..dc01e58a 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -976,4 +976,33 @@ public class TestFlatStyling icon.applyStyleProperty( "questionMarkColor", Color.WHITE ); icon.applyStyleProperty( "disabledQuestionMarkColor", Color.WHITE ); } + + @Test + void flatClearIcon() { + FlatClearIcon icon = new FlatClearIcon(); + + icon.applyStyleProperty( "clearIconColor", Color.WHITE ); + icon.applyStyleProperty( "clearIconHoverColor", Color.WHITE ); + icon.applyStyleProperty( "clearIconPressedColor", Color.WHITE ); + } + + @Test + void flatSearchIcon() { + FlatSearchIcon icon = new FlatSearchIcon(); + + flatSearchIcon( icon ); + } + + @Test + void flatSearchWithHistoryIcon() { + FlatSearchWithHistoryIcon icon = new FlatSearchWithHistoryIcon(); + + flatSearchIcon( icon ); + } + + private void flatSearchIcon( FlatSearchIcon icon ) { + icon.applyStyleProperty( "searchIconColor", Color.WHITE ); + icon.applyStyleProperty( "searchIconHoverColor", Color.WHITE ); + icon.applyStyleProperty( "searchIconPressedColor", Color.WHITE ); + } } From 6f9bbb184a014ccf0f0663ebec46ae7b5785270d Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 31 Aug 2021 23:53:12 +0200 Subject: [PATCH 51/60] Styling: support specifying explicit value type for parsing CSS values (for future use) --- .../java/com/formdev/flatlaf/FlatLaf.java | 9 +- .../com/formdev/flatlaf/IntelliJTheme.java | 2 +- .../com/formdev/flatlaf/UIDefaultsLoader.java | 169 +++++++++++------- .../formdev/flatlaf/ui/FlatStyleSupport.java | 2 +- .../formdev/flatlaf/TestUIDefaultsLoader.java | 74 ++++++++ .../flatlaf/UIDefaultsLoaderAccessor.java | 3 +- 6 files changed, 192 insertions(+), 67 deletions(-) create mode 100644 flatlaf-core/src/test/java/com/formdev/flatlaf/TestUIDefaultsLoader.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 b5801a41..4781957a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -784,14 +784,17 @@ public abstract class FlatLaf *

* See: https://www.formdev.com/flatlaf/properties-files/ * - * @param key the key, which is used to determine the value type + * @param key the key, which is used to determine the value type if parameter {@code valueType} is {@code null} * @param value the value string + * @param valueType the expected value type, or {@code null} * @return the binary value * @throws IllegalArgumentException on syntax errors * @since TODO */ - public static Object parseDefaultsValue( String key, String value ) throws IllegalArgumentException { - return UIDefaultsLoader.parseValue( key, value ); + public static Object parseDefaultsValue( String key, String value, Class valueType ) + throws IllegalArgumentException + { + return UIDefaultsLoader.parseValue( key, value, valueType ); } private static void reSetLookAndFeel() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java index 5a2fa716..554f7d2b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java @@ -338,7 +338,7 @@ public class IntelliJTheme // parse value try { - uiValue = UIDefaultsLoader.parseValue( key, valueStr ); + uiValue = UIDefaultsLoader.parseValue( key, valueStr, null ); } catch( RuntimeException ex ) { UIDefaultsLoader.logParseError( key, valueStr, ex, false ); return; // ignore invalid value diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java index f71cf72c..9a1e9702 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -33,8 +33,10 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.function.Function; +import javax.swing.Icon; import javax.swing.UIDefaults; import javax.swing.UIManager; +import javax.swing.border.Border; import javax.swing.UIDefaults.ActiveValue; import javax.swing.UIDefaults.LazyValue; import javax.swing.plaf.ColorUIResource; @@ -241,7 +243,7 @@ class UIDefaultsLoader String value = resolveValue( (String) e.getValue(), propertiesGetter ); try { - defaults.put( key, parseValue( key, value, null, resolver, addonClassLoaders ) ); + defaults.put( key, parseValue( key, value, null, null, resolver, addonClassLoaders ) ); } catch( RuntimeException ex ) { logParseError( key, value, ex, true ); } @@ -292,12 +294,13 @@ class UIDefaultsLoader SCALEDINTEGER, SCALEDFLOAT, SCALEDINSETS, SCALEDDIMENSION, INSTANCE, CLASS, GRAYFILTER, NULL, LAZY } private static ValueType[] tempResultValueType = new ValueType[1]; + private static Map, ValueType> javaValueTypes; - static Object parseValue( String key, String value ) { - return parseValue( key, value, null, v -> v, Collections.emptyList() ); + static Object parseValue( String key, String value, Class valueType ) { + return parseValue( key, value, valueType, null, v -> v, Collections.emptyList() ); } - static Object parseValue( String key, String value, ValueType[] resultValueType, + static Object parseValue( String key, String value, Class javaValueType, ValueType[] resultValueType, Function resolver, List addonClassLoaders ) { if( resultValueType == null ) @@ -305,71 +308,106 @@ class UIDefaultsLoader value = value.trim(); - // null, false, true - switch( value ) { - case "null": resultValueType[0] = ValueType.NULL; return null; - case "false": resultValueType[0] = ValueType.BOOLEAN; return false; - case "true": resultValueType[0] = ValueType.BOOLEAN; return true; - } - - // check for function "lazy" - // Syntax: lazy(uiKey) - if( value.startsWith( "lazy(" ) && value.endsWith( ")" ) ) { - resultValueType[0] = ValueType.LAZY; - String uiKey = value.substring( 5, value.length() - 1 ).trim(); - return (LazyValue) t -> { - return lazyUIManagerGet( uiKey ); - }; + // null + if( value.equals( "null" ) ) { + resultValueType[0] = ValueType.NULL; + return null; } ValueType valueType = ValueType.UNKNOWN; - // check whether value type is specified in the value - if( value.startsWith( "#" ) ) - valueType = ValueType.COLOR; - else if( value.startsWith( "\"" ) && value.endsWith( "\"" ) ) { - valueType = ValueType.STRING; - value = value.substring( 1, value.length() - 1 ); - } else if( value.startsWith( TYPE_PREFIX ) ) { - int end = value.indexOf( TYPE_PREFIX_END ); - if( end != -1 ) { - try { - String typeStr = value.substring( TYPE_PREFIX.length(), end ); - valueType = ValueType.valueOf( typeStr.toUpperCase( Locale.ENGLISH ) ); + if( javaValueType != null ) { + if( javaValueTypes == null ) { + // create lazy + javaValueTypes = new HashMap<>(); + javaValueTypes.put( String.class, ValueType.STRING ); + javaValueTypes.put( boolean.class, ValueType.BOOLEAN ); + javaValueTypes.put( Boolean.class, ValueType.BOOLEAN ); + javaValueTypes.put( char.class, ValueType.CHARACTER ); + javaValueTypes.put( Character.class, ValueType.CHARACTER ); + javaValueTypes.put( int.class, ValueType.INTEGER ); + javaValueTypes.put( Integer.class, ValueType.INTEGER ); + javaValueTypes.put( float.class, ValueType.FLOAT ); + javaValueTypes.put( Float.class, ValueType.FLOAT ); + javaValueTypes.put( Border.class, ValueType.BORDER ); + javaValueTypes.put( Icon.class, ValueType.ICON ); + javaValueTypes.put( Insets.class, ValueType.INSETS ); + javaValueTypes.put( Dimension.class, ValueType.DIMENSION ); + javaValueTypes.put( Color.class, ValueType.COLOR ); + } - // remove type from value - value = value.substring( end + TYPE_PREFIX_END.length() ); - } catch( IllegalArgumentException ex ) { - // ignore + // map java value type to parser value type + valueType = javaValueTypes.get( javaValueType ); + if( valueType == null ) + throw new IllegalArgumentException( "unsupported value type '" + javaValueType.getName() + "'" ); + + // remove '"' from strings + if( valueType == ValueType.STRING && value.startsWith( "\"" ) && value.endsWith( "\"" ) ) + value = value.substring( 1, value.length() - 1 ); + } else { + // false, true + switch( value ) { + case "false": resultValueType[0] = ValueType.BOOLEAN; return false; + case "true": resultValueType[0] = ValueType.BOOLEAN; return true; + } + + // check for function "lazy" + // Syntax: lazy(uiKey) + if( value.startsWith( "lazy(" ) && value.endsWith( ")" ) ) { + resultValueType[0] = ValueType.LAZY; + String uiKey = value.substring( 5, value.length() - 1 ).trim(); + return (LazyValue) t -> { + return lazyUIManagerGet( uiKey ); + }; + } + + // check whether value type is specified in the value + if( value.startsWith( "#" ) ) + valueType = ValueType.COLOR; + else if( value.startsWith( "\"" ) && value.endsWith( "\"" ) ) { + valueType = ValueType.STRING; + value = value.substring( 1, value.length() - 1 ); + } else if( value.startsWith( TYPE_PREFIX ) ) { + int end = value.indexOf( TYPE_PREFIX_END ); + if( end != -1 ) { + try { + String typeStr = value.substring( TYPE_PREFIX.length(), end ); + valueType = ValueType.valueOf( typeStr.toUpperCase( Locale.ENGLISH ) ); + + // remove type from value + value = value.substring( end + TYPE_PREFIX_END.length() ); + } catch( IllegalArgumentException ex ) { + // ignore + } } } - } - // determine value type from key - if( valueType == ValueType.UNKNOWN ) { - if( key.endsWith( "UI" ) ) - valueType = ValueType.STRING; - else if( key.endsWith( "Color" ) || - (key.endsWith( "ground" ) && - (key.endsWith( ".background" ) || key.endsWith( "Background" ) || key.equals( "background" ) || - key.endsWith( ".foreground" ) || key.endsWith( "Foreground" ) || key.equals( "foreground" ))) ) - valueType = ValueType.COLOR; - else if( key.endsWith( ".border" ) || key.endsWith( "Border" ) ) - valueType = ValueType.BORDER; - else if( key.endsWith( ".icon" ) || key.endsWith( "Icon" ) ) - valueType = ValueType.ICON; - else if( key.endsWith( ".margin" ) || key.equals( "margin" ) || - key.endsWith( ".padding" ) || key.equals( "padding" ) || - key.endsWith( "Margins" ) || key.endsWith( "Insets" ) ) - valueType = ValueType.INSETS; - else if( key.endsWith( "Size" ) ) - valueType = ValueType.DIMENSION; - else if( key.endsWith( "Width" ) || key.endsWith( "Height" ) ) - valueType = ValueType.INTEGER; - else if( key.endsWith( "Char" ) ) - valueType = ValueType.CHARACTER; - else if( key.endsWith( "grayFilter" ) ) - valueType = ValueType.GRAYFILTER; + // determine value type from key + if( valueType == ValueType.UNKNOWN ) { + if( key.endsWith( "UI" ) ) + valueType = ValueType.STRING; + else if( key.endsWith( "Color" ) || + (key.endsWith( "ground" ) && + (key.endsWith( ".background" ) || key.endsWith( "Background" ) || key.equals( "background" ) || + key.endsWith( ".foreground" ) || key.endsWith( "Foreground" ) || key.equals( "foreground" ))) ) + valueType = ValueType.COLOR; + else if( key.endsWith( ".border" ) || key.endsWith( "Border" ) ) + valueType = ValueType.BORDER; + else if( key.endsWith( ".icon" ) || key.endsWith( "Icon" ) ) + valueType = ValueType.ICON; + else if( key.endsWith( ".margin" ) || key.equals( "margin" ) || + key.endsWith( ".padding" ) || key.equals( "padding" ) || + key.endsWith( "Margins" ) || key.endsWith( "Insets" ) ) + valueType = ValueType.INSETS; + else if( key.endsWith( "Size" ) ) + valueType = ValueType.DIMENSION; + else if( key.endsWith( "Width" ) || key.endsWith( "Height" ) ) + valueType = ValueType.INTEGER; + else if( key.endsWith( "Char" ) ) + valueType = ValueType.CHARACTER; + else if( key.endsWith( "grayFilter" ) ) + valueType = ValueType.GRAYFILTER; + } } resultValueType[0] = valueType; @@ -377,6 +415,7 @@ class UIDefaultsLoader // parse value switch( valueType ) { case STRING: return value; + case BOOLEAN: return parseBoolean( value ); case CHARACTER: return parseCharacter( value ); case INTEGER: return parseInteger( value, true ); case FLOAT: return parseFloat( value, true ); @@ -869,6 +908,14 @@ class UIDefaultsLoader return val; } + private static Boolean parseBoolean( String value ) { + switch( value ) { + case "false": return false; + case "true": return true; + } + throw new IllegalArgumentException( "invalid boolean '" + value + "'" ); + } + private static Character parseCharacter( String value ) { if( value.length() != 1 ) throw new IllegalArgumentException( "invalid character '" + value + "'" ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java index 882dd7e6..d1387ca7 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java @@ -198,7 +198,7 @@ public class FlatStyleSupport if( key.startsWith( "[" ) ) key = key.substring( key.indexOf( ']' ) + 1 ); - return FlatLaf.parseDefaultsValue( key, value ); + return FlatLaf.parseDefaultsValue( key, value, null ); } /** diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/TestUIDefaultsLoader.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/TestUIDefaultsLoader.java new file mode 100644 index 00000000..b940debe --- /dev/null +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/TestUIDefaultsLoader.java @@ -0,0 +1,74 @@ +/* + * Copyright 2021 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 + * + * https://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; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Insets; +import org.junit.jupiter.api.Test; + +/** + * @author Karl Tauber + */ +public class TestUIDefaultsLoader +{ + @Test + void parseValue() { + assertEquals( null, UIDefaultsLoader.parseValue( "dummy", "null", null ) ); + assertEquals( false, UIDefaultsLoader.parseValue( "dummy", "false", null ) ); + assertEquals( true, UIDefaultsLoader.parseValue( "dummy", "true", null ) ); + + assertEquals( "hello", UIDefaultsLoader.parseValue( "dummy", "hello", null ) ); + assertEquals( "hello", UIDefaultsLoader.parseValue( "dummy", "\"hello\"", null ) ); + assertEquals( "null", UIDefaultsLoader.parseValue( "dummy", "\"null\"", null ) ); + + assertEquals( 'a', UIDefaultsLoader.parseValue( "dummyChar", "a", null ) ); + assertEquals( 123, UIDefaultsLoader.parseValue( "dummy", "123", null ) ); + assertEquals( 123, UIDefaultsLoader.parseValue( "dummyWidth", "123", null ) ); + assertEquals( 1.23f, UIDefaultsLoader.parseValue( "dummy", "1.23", null ) ); + assertEquals( 1.23f, UIDefaultsLoader.parseValue( "dummyWidth", "{float}1.23", null ) ); + + assertEquals( new Insets( 2,2,2,2 ), UIDefaultsLoader.parseValue( "dummyInsets", "2,2,2,2", null ) ); + assertEquals( new Dimension( 2,2 ), UIDefaultsLoader.parseValue( "dummySize", "2,2", null ) ); + assertEquals( new Color( 0xff0000 ), UIDefaultsLoader.parseValue( "dummy", "#f00", null ) ); + assertEquals( new Color( 0xff0000 ), UIDefaultsLoader.parseValue( "dummyColor", "#f00", null ) ); + } + + @Test + void parseValueWithJavaType() { + assertEquals( null, UIDefaultsLoader.parseValue( "dummy", "null", String.class ) ); + assertEquals( false, UIDefaultsLoader.parseValue( "dummy", "false", boolean.class ) ); + assertEquals( true, UIDefaultsLoader.parseValue( "dummy", "true", Boolean.class ) ); + + assertEquals( "hello", UIDefaultsLoader.parseValue( "dummy", "hello", String.class ) ); + assertEquals( "hello", UIDefaultsLoader.parseValue( "dummy", "\"hello\"", String.class ) ); + assertEquals( "null", UIDefaultsLoader.parseValue( "dummy", "\"null\"", String.class ) ); + assertEquals( null, UIDefaultsLoader.parseValue( "dummy", "null", String.class ) ); + + assertEquals( 'a', UIDefaultsLoader.parseValue( "dummy", "a", char.class ) ); + assertEquals( 'a', UIDefaultsLoader.parseValue( "dummy", "a", Character.class ) ); + assertEquals( 123, UIDefaultsLoader.parseValue( "dummy", "123", int.class ) ); + assertEquals( 123, UIDefaultsLoader.parseValue( "dummy", "123", Integer.class ) ); + assertEquals( 1.23f, UIDefaultsLoader.parseValue( "dummy", "1.23", float.class ) ); + assertEquals( 1.23f, UIDefaultsLoader.parseValue( "dummy", "1.23", Float.class ) ); + + assertEquals( new Insets( 2,2,2,2 ), UIDefaultsLoader.parseValue( "dummy", "2,2,2,2", Insets.class ) ); + assertEquals( new Dimension( 2,2 ), UIDefaultsLoader.parseValue( "dummy", "2,2", Dimension.class ) ); + assertEquals( new Color( 0xff0000 ), UIDefaultsLoader.parseValue( "dummy", "#f00", Color.class ) ); + } +} diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/UIDefaultsLoaderAccessor.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/UIDefaultsLoaderAccessor.java index fb4698d1..d6b35f90 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/UIDefaultsLoaderAccessor.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/UIDefaultsLoaderAccessor.java @@ -56,7 +56,8 @@ public class UIDefaultsLoaderAccessor Function resolver ) { ValueType[] resultValueType2 = new ValueType[1]; - Object result = UIDefaultsLoader.parseValue( key, value, resultValueType2, resolver, Collections.emptyList() ); + Object result = UIDefaultsLoader.parseValue( key, value, null, + resultValueType2, resolver, Collections.emptyList() ); resultValueType[0] = resultValueType2[0]; return result; } From 397c36911451609984690af140cce8886b16eb64 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 1 Sep 2021 00:21:47 +0200 Subject: [PATCH 52/60] Styling: renamed class `FlatStyleSupport` to `FlatStylingSupport` --- .../flatlaf/icons/FlatCapsLockIcon.java | 2 +- .../flatlaf/icons/FlatCheckBoxIcon.java | 8 ++++---- .../icons/FlatCheckBoxMenuItemIcon.java | 8 ++++---- .../formdev/flatlaf/icons/FlatClearIcon.java | 8 ++++---- .../flatlaf/icons/FlatHelpButtonIcon.java | 8 ++++---- .../flatlaf/icons/FlatMenuArrowIcon.java | 8 ++++---- .../flatlaf/icons/FlatRadioButtonIcon.java | 2 +- .../formdev/flatlaf/icons/FlatSearchIcon.java | 8 ++++---- .../icons/FlatTabbedPaneCloseIcon.java | 8 ++++---- .../com/formdev/flatlaf/ui/FlatBorder.java | 8 ++++---- .../formdev/flatlaf/ui/FlatButtonBorder.java | 2 +- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 18 ++++++++--------- .../flatlaf/ui/FlatCheckBoxMenuItemUI.java | 10 +++++----- .../formdev/flatlaf/ui/FlatComboBoxUI.java | 14 ++++++------- .../flatlaf/ui/FlatDropShadowBorder.java | 8 ++++---- .../formdev/flatlaf/ui/FlatEditorPaneUI.java | 12 +++++------ .../flatlaf/ui/FlatInternalFrameUI.java | 20 +++++++++---------- .../com/formdev/flatlaf/ui/FlatLabelUI.java | 12 +++++------ .../com/formdev/flatlaf/ui/FlatListUI.java | 14 ++++++------- .../formdev/flatlaf/ui/FlatMenuBarBorder.java | 8 ++++---- .../com/formdev/flatlaf/ui/FlatMenuBarUI.java | 12 +++++------ .../flatlaf/ui/FlatMenuItemRenderer.java | 16 +++++++-------- .../formdev/flatlaf/ui/FlatMenuItemUI.java | 12 +++++------ .../com/formdev/flatlaf/ui/FlatMenuUI.java | 10 +++++----- .../flatlaf/ui/FlatPasswordFieldUI.java | 4 ++-- .../flatlaf/ui/FlatPopupMenuBorder.java | 4 ++-- .../formdev/flatlaf/ui/FlatPopupMenuUI.java | 12 +++++------ .../formdev/flatlaf/ui/FlatProgressBarUI.java | 12 +++++------ .../flatlaf/ui/FlatRadioButtonMenuItemUI.java | 10 +++++----- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 16 +++++++-------- .../formdev/flatlaf/ui/FlatRoundBorder.java | 2 +- .../formdev/flatlaf/ui/FlatScrollBarUI.java | 12 +++++------ .../formdev/flatlaf/ui/FlatScrollPaneUI.java | 10 +++++----- .../formdev/flatlaf/ui/FlatSeparatorUI.java | 14 ++++++------- .../com/formdev/flatlaf/ui/FlatSliderUI.java | 14 ++++++------- .../com/formdev/flatlaf/ui/FlatSpinnerUI.java | 12 +++++------ .../formdev/flatlaf/ui/FlatSplitPaneUI.java | 20 +++++++++---------- ...leSupport.java => FlatStylingSupport.java} | 2 +- .../formdev/flatlaf/ui/FlatTabbedPaneUI.java | 16 +++++++-------- .../formdev/flatlaf/ui/FlatTableHeaderUI.java | 14 ++++++------- .../com/formdev/flatlaf/ui/FlatTableUI.java | 14 ++++++------- .../formdev/flatlaf/ui/FlatTextAreaUI.java | 12 +++++------ .../formdev/flatlaf/ui/FlatTextBorder.java | 2 +- .../formdev/flatlaf/ui/FlatTextFieldUI.java | 12 +++++------ .../formdev/flatlaf/ui/FlatTextPaneUI.java | 12 +++++------ .../flatlaf/ui/FlatToggleButtonUI.java | 4 ++-- .../flatlaf/ui/FlatToolBarSeparatorUI.java | 14 ++++++------- .../com/formdev/flatlaf/ui/FlatToolBarUI.java | 14 ++++++------- .../com/formdev/flatlaf/ui/FlatTreeUI.java | 12 +++++------ .../com/formdev/flatlaf/ui/FlatUIUtils.java | 2 +- .../formdev/flatlaf/ui/TestFlatStyling.java | 16 +++++++-------- 51 files changed, 262 insertions(+), 262 deletions(-) rename flatlaf-core/src/main/java/com/formdev/flatlaf/ui/{FlatStyleSupport.java => FlatStylingSupport.java} (99%) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java index fb5a0022..c849d107 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java @@ -23,7 +23,7 @@ import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; import com.formdev.flatlaf.ui.FlatUIUtils; /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java index 0d73b165..fff75272 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java @@ -28,8 +28,8 @@ import javax.swing.AbstractButton; import javax.swing.JComponent; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; -import com.formdev.flatlaf.ui.FlatStyleSupport; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -136,14 +136,14 @@ public class FlatCheckBoxIcon * @since TODO */ public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java index 99eab2b2..837c7300 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java @@ -25,8 +25,8 @@ import java.util.Map; import javax.swing.AbstractButton; import javax.swing.JMenuItem; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatStyleSupport; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; /** * Icon for {@link javax.swing.JCheckBoxMenuItem}. @@ -53,14 +53,14 @@ public class FlatCheckBoxMenuItemIcon * @since TODO */ public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java index e5790b41..63e01983 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java @@ -26,9 +26,9 @@ import java.util.Map; import javax.swing.AbstractButton; import javax.swing.ButtonModel; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatStyleSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.ui.FlatUIUtils; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * "clear" icon for search fields. @@ -55,14 +55,14 @@ public class FlatClearIcon * @since TODO */ public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java index 756858b0..742c9d0b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java @@ -25,9 +25,9 @@ import java.awt.geom.Path2D; import java.util.Map; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; -import com.formdev.flatlaf.ui.FlatStyleSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.ui.FlatUIUtils; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * Help button icon for {@link javax.swing.JButton}. @@ -78,14 +78,14 @@ public class FlatHelpButtonIcon * @since TODO */ public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java index 13260c76..7581fa21 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java @@ -24,9 +24,9 @@ import java.awt.geom.Path2D; import java.util.Map; import javax.swing.JMenu; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatStyleSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport; import com.formdev.flatlaf.ui.FlatUIUtils; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; /** * "arrow" icon for {@link javax.swing.JMenu}. @@ -55,14 +55,14 @@ public class FlatMenuArrowIcon * @since TODO */ public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatRadioButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatRadioButtonIcon.java index c26b1de6..381d2910 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatRadioButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatRadioButtonIcon.java @@ -19,7 +19,7 @@ package com.formdev.flatlaf.icons; import java.awt.Component; import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; /** * Icon for {@link javax.swing.JRadioButton}. diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java index f47a7839..9719adb7 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java @@ -24,9 +24,9 @@ import java.awt.geom.Ellipse2D; import java.util.Map; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; -import com.formdev.flatlaf.ui.FlatStyleSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.ui.FlatUIUtils; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; /** * "search" icon for search fields. @@ -53,14 +53,14 @@ public class FlatSearchIcon * @since TODO */ public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java index b5cf5cd8..eac04c4b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java @@ -26,8 +26,8 @@ import java.awt.geom.Path2D; import java.util.Map; import javax.swing.UIManager; import com.formdev.flatlaf.ui.FlatButtonUI; -import com.formdev.flatlaf.ui.FlatStyleSupport; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -70,14 +70,14 @@ public class FlatTabbedPaneCloseIcon * @since TODO */ public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override 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 index ac12fe9d..998e7429 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java @@ -32,8 +32,8 @@ import javax.swing.JViewport; import javax.swing.UIManager; import javax.swing.plaf.basic.BasicBorders; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableBorder; import com.formdev.flatlaf.util.DerivedColor; /** @@ -84,7 +84,7 @@ public class FlatBorder */ @Override public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -92,7 +92,7 @@ public class FlatBorder */ @Override public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java index b29dece6..d9ac552a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonBorder.java @@ -26,7 +26,7 @@ import java.awt.Paint; import javax.swing.AbstractButton; import javax.swing.UIManager; import javax.swing.plaf.UIResource; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.util.UIScale; /** 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 ea4a30d1..41f59437 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 @@ -48,9 +48,9 @@ import javax.swing.plaf.basic.BasicButtonListener; import javax.swing.plaf.basic.BasicButtonUI; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.icons.FlatHelpButtonIcon; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** @@ -160,7 +160,7 @@ public class FlatButtonUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( (AbstractButton) c, FlatStyleSupport.getStyle( c ) ); + applyStyle( (AbstractButton) c, FlatStylingSupport.getStyle( c ) ); } @Override @@ -275,7 +275,7 @@ public class FlatButtonUI * @since TODO */ protected void applyStyle( AbstractButton b, Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, (key, value) -> applyStyleProperty( b, key, value ) ); } @@ -288,7 +288,7 @@ public class FlatButtonUI return new UnknownStyleException( key ); if( helpButtonIconShared ) { - helpButtonIcon = FlatStyleSupport.cloneIcon( helpButtonIcon ); + helpButtonIcon = FlatStylingSupport.cloneIcon( helpButtonIcon ); helpButtonIconShared = false; } @@ -298,7 +298,7 @@ public class FlatButtonUI if( borderShared == null ) borderShared = new AtomicBoolean( true ); - return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, b, borderShared ); + return FlatStylingSupport.applyToAnnotatedObjectOrBorder( this, key, value, b, borderShared ); } /** @@ -306,9 +306,9 @@ public class FlatButtonUI */ @Override public Map> getStyleableInfos( JComponent c ) { - Map> infos = FlatStyleSupport.getAnnotatedStyleableInfos( this, c.getBorder() ); + Map> infos = FlatStylingSupport.getAnnotatedStyleableInfos( this, c.getBorder() ); if( helpButtonIcon instanceof FlatHelpButtonIcon ) - FlatStyleSupport.putAllPrefixKey( infos, "help.", ((FlatHelpButtonIcon)helpButtonIcon).getStyleableInfos() ); + FlatStylingSupport.putAllPrefixKey( infos, "help.", ((FlatHelpButtonIcon)helpButtonIcon).getStyleableInfos() ); return infos; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java index 27f422a0..683204d0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java @@ -25,8 +25,8 @@ import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicCheckBoxMenuItemUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JCheckBoxMenuItem}. @@ -71,7 +71,7 @@ public class FlatCheckBoxMenuItemUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( menuItem ) ); + applyStyle( FlatStylingSupport.getStyle( menuItem ) ); } @Override @@ -97,14 +97,14 @@ public class FlatCheckBoxMenuItemUI @Override protected PropertyChangeListener createPropertyChangeListener( JComponent c ) { - return FlatStyleSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); + return FlatStylingSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); } /** * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java index 6a35558e..1c84e96b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java @@ -71,8 +71,8 @@ import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.plaf.basic.ComboPopup; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.SystemInfo; /** @@ -156,7 +156,7 @@ public class FlatComboBoxUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( comboBox ) ); + applyStyle( FlatStylingSupport.getStyle( comboBox ) ); } @Override @@ -454,7 +454,7 @@ public class FlatComboBoxUI Insets oldPadding = padding; int oldEditorColumns = editorColumns; - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); if( !padding.equals( oldPadding ) ) { paddingBorder.padding = padding; @@ -481,7 +481,7 @@ public class FlatComboBoxUI if( borderShared == null ) borderShared = new AtomicBoolean( true ); - return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, comboBox, borderShared ); + return FlatStylingSupport.applyToAnnotatedObjectOrBorder( this, key, value, comboBox, borderShared ); } /** @@ -491,8 +491,8 @@ public class FlatComboBoxUI public Map> getStyleableInfos( JComponent c ) { Map> infos = new LinkedHashMap<>(); infos.put( "padding", Insets.class ); - FlatStyleSupport.collectAnnotatedStyleableInfos( this, infos ); - FlatStyleSupport.collectStyleableInfos( comboBox.getBorder(), infos ); + FlatStylingSupport.collectAnnotatedStyleableInfos( this, infos ); + FlatStylingSupport.collectStyleableInfos( comboBox.getBorder(), infos ); return infos; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java index ede1bc4f..0e149fd2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java @@ -25,8 +25,8 @@ import java.awt.Insets; import java.awt.RadialGradientPaint; import java.awt.image.BufferedImage; import java.util.Map; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableBorder; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -95,7 +95,7 @@ public class FlatDropShadowBorder */ @Override public Object applyStyleProperty( String key, Object value ) { - Object oldValue = FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + Object oldValue = FlatStylingSupport.applyToAnnotatedObject( this, key, value ); if( key.equals( "shadowInsets" ) ) { applyStyleProperty( nonNegativeInsets( shadowInsets ) ); shadowSize = maxInset( shadowInsets ); @@ -108,7 +108,7 @@ public class FlatDropShadowBorder */ @Override public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override 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 1936f63a..57198896 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 @@ -33,8 +33,8 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicEditorPaneUI; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -91,7 +91,7 @@ public class FlatEditorPaneUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -179,7 +179,7 @@ public class FlatEditorPaneUI oldDisabledBackground = disabledBackground; oldInactiveBackground = inactiveBackground; - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); updateBackground(); } @@ -188,7 +188,7 @@ public class FlatEditorPaneUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -196,7 +196,7 @@ public class FlatEditorPaneUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } private void updateBackground() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java index d4077457..f95e33ec 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java @@ -35,9 +35,9 @@ import javax.swing.UIManager; import javax.swing.event.MouseInputAdapter; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicInternalFrameUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableBorder; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JInternalFrame}. @@ -116,7 +116,7 @@ public class FlatInternalFrameUI windowResizer = createWindowResizer(); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -148,7 +148,7 @@ public class FlatInternalFrameUI @Override protected PropertyChangeListener createPropertyChangeListener() { - return FlatStyleSupport.createPropertyChangeListener( frame, this::applyStyle, + return FlatStylingSupport.createPropertyChangeListener( frame, this::applyStyle, super.createPropertyChangeListener() ); } @@ -156,7 +156,7 @@ public class FlatInternalFrameUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** @@ -165,7 +165,7 @@ public class FlatInternalFrameUI protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) borderShared = new AtomicBoolean( true ); - return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, frame, borderShared ); + return FlatStylingSupport.applyToAnnotatedObjectOrBorder( this, key, value, frame, borderShared ); } /** @@ -173,7 +173,7 @@ public class FlatInternalFrameUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this, frame.getBorder() ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this, frame.getBorder() ); } //---- class FlatInternalFrameBorder -------------------------------------- @@ -213,13 +213,13 @@ public class FlatInternalFrameUI case "inactiveDropShadowOpacity": return inactiveDropShadowBorder.applyStyleProperty( "shadowOpacity", value ); } - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } @Override public Map> getStyleableInfos() { Map> infos = new LinkedHashMap<>(); - FlatStyleSupport.collectAnnotatedStyleableInfos( this, infos ); + FlatStylingSupport.collectAnnotatedStyleableInfos( this, infos ); infos.put( "borderMargins", Insets.class ); infos.put( "activeDropShadowColor", Color.class ); infos.put( "activeDropShadowInsets", Insets.class ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index f7f25afc..ea787e10 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -36,8 +36,8 @@ import javax.swing.plaf.basic.BasicHTML; import javax.swing.plaf.basic.BasicLabelUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -83,7 +83,7 @@ public class FlatLabelUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -141,14 +141,14 @@ public class FlatLabelUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -156,7 +156,7 @@ public class FlatLabelUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java index 5dfce689..6f7727a0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java @@ -27,8 +27,8 @@ import javax.swing.JComponent; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicListUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JList}. @@ -90,7 +90,7 @@ public class FlatListUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -140,7 +140,7 @@ public class FlatListUI @Override protected PropertyChangeListener createPropertyChangeListener() { - return FlatStyleSupport.createPropertyChangeListener( list, this::applyStyle, + return FlatStylingSupport.createPropertyChangeListener( list, this::applyStyle, super.createPropertyChangeListener() ); } @@ -153,7 +153,7 @@ public class FlatListUI Color oldSelectionInactiveBackground = selectionInactiveBackground; Color oldSelectionInactiveForeground = selectionInactiveForeground; - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); // update selection background if( selectionBackground != oldSelectionBackground ) { @@ -178,7 +178,7 @@ public class FlatListUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -186,7 +186,7 @@ public class FlatListUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java index dadf531f..dcd8b73a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java @@ -24,8 +24,8 @@ import java.awt.Insets; import java.util.Map; import javax.swing.JMenuBar; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableBorder; /** * Border for {@link javax.swing.JMenuBar}. @@ -45,12 +45,12 @@ public class FlatMenuBarBorder */ @Override public Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } @Override public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java index 135dbd72..a8918ab0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java @@ -40,7 +40,7 @@ import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicMenuBarUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.SystemInfo; /** @@ -80,7 +80,7 @@ public class FlatMenuBarUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -102,7 +102,7 @@ public class FlatMenuBarUI protected void installListeners() { super.installListeners(); - propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( + propertyChangeListener = FlatStylingSupport.createPropertyChangeListener( menuBar, this::applyStyle, null ); menuBar.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @@ -131,7 +131,7 @@ public class FlatMenuBarUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** @@ -140,7 +140,7 @@ public class FlatMenuBarUI protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) borderShared = new AtomicBoolean( true ); - return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, menuBar, borderShared ); + return FlatStylingSupport.applyToAnnotatedObjectOrBorder( this, key, value, menuBar, borderShared ); } /** @@ -148,7 +148,7 @@ public class FlatMenuBarUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this, menuBar.getBorder() ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this, menuBar.getBorder() ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java index a3f2c5d9..e74d3d7d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java @@ -42,8 +42,8 @@ import javax.swing.text.View; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon; import com.formdev.flatlaf.icons.FlatMenuArrowIcon; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; import com.formdev.flatlaf.util.DerivedColor; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; @@ -110,9 +110,9 @@ public class FlatMenuItemRenderer if( key.startsWith( "icon." ) || key.equals( "selectionForeground" ) ) { if( iconsShared ) { if( checkIcon instanceof FlatCheckBoxMenuItemIcon ) - checkIcon = FlatStyleSupport.cloneIcon( checkIcon ); + checkIcon = FlatStylingSupport.cloneIcon( checkIcon ); if( arrowIcon instanceof FlatMenuArrowIcon ) - arrowIcon = FlatStyleSupport.cloneIcon( arrowIcon ); + arrowIcon = FlatStylingSupport.cloneIcon( arrowIcon ); iconsShared = false; } @@ -147,18 +147,18 @@ public class FlatMenuItemRenderer } } - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - Map> infos = FlatStyleSupport.getAnnotatedStyleableInfos( this ); + Map> infos = FlatStylingSupport.getAnnotatedStyleableInfos( this ); if( checkIcon instanceof FlatCheckBoxMenuItemIcon ) - FlatStyleSupport.putAllPrefixKey( infos, "icon.", ((FlatCheckBoxMenuItemIcon)checkIcon).getStyleableInfos() ); + FlatStylingSupport.putAllPrefixKey( infos, "icon.", ((FlatCheckBoxMenuItemIcon)checkIcon).getStyleableInfos() ); if( arrowIcon instanceof FlatMenuArrowIcon ) - FlatStyleSupport.putAllPrefixKey( infos, "icon.", ((FlatMenuArrowIcon)arrowIcon).getStyleableInfos() ); + FlatStylingSupport.putAllPrefixKey( infos, "icon.", ((FlatMenuArrowIcon)arrowIcon).getStyleableInfos() ); infos.remove( "icon.selectionForeground" ); return infos; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java index 946b91e4..65431984 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java @@ -27,8 +27,8 @@ import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicMenuItemUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JMenuItem}. @@ -73,7 +73,7 @@ public class FlatMenuItemUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( menuItem ) ); + applyStyle( FlatStylingSupport.getStyle( menuItem ) ); } @Override @@ -99,14 +99,14 @@ public class FlatMenuItemUI @Override protected PropertyChangeListener createPropertyChangeListener( JComponent c ) { - return FlatStyleSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); + return FlatStylingSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); } /** * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** @@ -130,7 +130,7 @@ public class FlatMenuItemUI case "disabledForeground": case "acceleratorForeground": case "acceleratorSelectionForeground": - return FlatStyleSupport.applyToField( ui, key, key, value ); + return FlatStylingSupport.applyToField( ui, key, key, value ); default: throw new UnknownStyleException( key ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index 1b976879..795e52e9 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -33,8 +33,8 @@ import javax.swing.UIManager; import javax.swing.event.MouseInputListener; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicMenuUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JMenu}. @@ -90,7 +90,7 @@ public class FlatMenuUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( menuItem ) ); + applyStyle( FlatStylingSupport.getStyle( menuItem ) ); } @Override @@ -145,14 +145,14 @@ public class FlatMenuUI @Override protected PropertyChangeListener createPropertyChangeListener( JComponent c ) { - return FlatStyleSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); + return FlatStylingSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); } /** * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** 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 adfbd0d6..0680fde1 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 @@ -39,7 +39,7 @@ import javax.swing.text.JTextComponent; import javax.swing.text.PasswordView; import javax.swing.text.View; import com.formdev.flatlaf.icons.FlatCapsLockIcon; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JPasswordField}. @@ -168,7 +168,7 @@ public class FlatPasswordFieldUI protected Object applyStyleProperty( String key, Object value ) { if( key.equals( "capsLockIconColor" ) && capsLockIcon instanceof FlatCapsLockIcon ) { if( capsLockIconShared ) { - capsLockIcon = FlatStyleSupport.cloneIcon( capsLockIcon ); + capsLockIcon = FlatStylingSupport.cloneIcon( capsLockIcon ); capsLockIconShared = false; } return ((FlatCapsLockIcon)capsLockIcon).applyStyleProperty( key, value ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java index 593dd2f1..3c424f09 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java @@ -24,8 +24,8 @@ import java.util.LinkedHashMap; import java.util.Map; import javax.swing.JScrollPane; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableBorder; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableBorder; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java index 27435846..a5d56cbf 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java @@ -23,7 +23,7 @@ import javax.swing.JComponent; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicPopupMenuUI; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JPopupMenu}. @@ -53,7 +53,7 @@ public class FlatPopupMenuUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -68,7 +68,7 @@ public class FlatPopupMenuUI protected void installListeners() { super.installListeners(); - propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( popupMenu, this::applyStyle, null ); + propertyChangeListener = FlatStylingSupport.createPropertyChangeListener( popupMenu, this::applyStyle, null ); popupMenu.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @@ -84,7 +84,7 @@ public class FlatPopupMenuUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** @@ -93,7 +93,7 @@ public class FlatPopupMenuUI protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) borderShared = new AtomicBoolean( true ); - return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, popupMenu, borderShared ); + return FlatStylingSupport.applyToAnnotatedObjectOrBorder( this, key, value, popupMenu, borderShared ); } /** @@ -101,6 +101,6 @@ public class FlatPopupMenuUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this, popupMenu.getBorder() ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this, popupMenu.getBorder() ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java index 072abd36..a4260e1e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java @@ -32,8 +32,8 @@ import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicProgressBarUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -78,7 +78,7 @@ public class FlatProgressBarUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( progressBar ) ); + applyStyle( FlatStylingSupport.getStyle( progressBar ) ); } @Override @@ -133,14 +133,14 @@ public class FlatProgressBarUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -148,7 +148,7 @@ public class FlatProgressBarUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java index cfa7dcb3..30d03d90 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java @@ -25,8 +25,8 @@ import javax.swing.JComponent; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicRadioButtonMenuItemUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JRadioButtonMenuItem}. @@ -71,7 +71,7 @@ public class FlatRadioButtonMenuItemUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( menuItem ) ); + applyStyle( FlatStylingSupport.getStyle( menuItem ) ); } @Override @@ -97,14 +97,14 @@ public class FlatRadioButtonMenuItemUI @Override protected PropertyChangeListener createPropertyChangeListener( JComponent c ) { - return FlatStyleSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); + return FlatStylingSupport.createPropertyChangeListener( c, this::applyStyle, super.createPropertyChangeListener( c ) ); } /** * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index d26de632..b9a75fb3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -36,9 +36,9 @@ import javax.swing.plaf.basic.BasicButtonListener; import javax.swing.plaf.basic.BasicRadioButtonUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.icons.FlatCheckBoxIcon; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** @@ -92,7 +92,7 @@ public class FlatRadioButtonUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -159,7 +159,7 @@ public class FlatRadioButtonUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** @@ -172,7 +172,7 @@ public class FlatRadioButtonUI return new UnknownStyleException( key ); if( iconShared ) { - icon = FlatStyleSupport.cloneIcon( icon ); + icon = FlatStylingSupport.cloneIcon( icon ); iconShared = false; } @@ -180,7 +180,7 @@ public class FlatRadioButtonUI return ((FlatCheckBoxIcon)icon).applyStyleProperty( key, value ); } - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -188,7 +188,7 @@ public class FlatRadioButtonUI */ @Override public Map> getStyleableInfos( JComponent c ) { - Map> infos = FlatStyleSupport.getAnnotatedStyleableInfos( this ); + Map> infos = FlatStylingSupport.getAnnotatedStyleableInfos( this ); if( icon instanceof FlatCheckBoxIcon ) { for( Map.Entry> e : ((FlatCheckBoxIcon)icon).getStyleableInfos().entrySet() ) infos.put( "icon.".concat( e.getKey() ), e.getValue() ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRoundBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRoundBorder.java index 975c71e0..f9cce14d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRoundBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRoundBorder.java @@ -18,7 +18,7 @@ package com.formdev.flatlaf.ui; import java.awt.Component; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; /** * Border for various components (e.g. {@link javax.swing.JComboBox}). diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index 937ed1d1..1f4749c5 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -37,8 +37,8 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicScrollBarUI; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.UIScale; /** @@ -115,7 +115,7 @@ public class FlatScrollBarUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -224,7 +224,7 @@ public class FlatScrollBarUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); if( incrButton instanceof FlatScrollBarButton ) ((FlatScrollBarButton)incrButton).updateStyle(); @@ -246,7 +246,7 @@ public class FlatScrollBarUI case "maximumThumbSize": oldValue = maximumThumbSize; maximumThumbSize = (Dimension) value; return oldValue; } - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -260,7 +260,7 @@ public class FlatScrollBarUI infos.put( "width", int.class ); infos.put( "minimumThumbSize", Dimension.class ); infos.put( "maximumThumbSize", Dimension.class ); - FlatStyleSupport.collectAnnotatedStyleableInfos( this, infos ); + FlatStylingSupport.collectAnnotatedStyleableInfos( this, infos ); return infos; } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java index 6532d5aa..5ccff5a9 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java @@ -48,7 +48,7 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicScrollPaneUI; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JScrollPane}. @@ -87,7 +87,7 @@ public class FlatScrollPaneUI int focusWidth = UIManager.getInt( "Component.focusWidth" ); LookAndFeel.installProperty( c, "opaque", focusWidth == 0 ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); MigLayoutVisualPadding.install( scrollpane ); } @@ -305,7 +305,7 @@ public class FlatScrollPaneUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** @@ -319,7 +319,7 @@ public class FlatScrollPaneUI if( borderShared == null ) borderShared = new AtomicBoolean( true ); - return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, scrollpane, borderShared ); + return FlatStylingSupport.applyToAnnotatedObjectOrBorder( this, key, value, scrollpane, borderShared ); } /** @@ -327,7 +327,7 @@ public class FlatScrollPaneUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this, scrollpane.getBorder() ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this, scrollpane.getBorder() ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index b6cb9aae..cc64050b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -29,8 +29,8 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSeparatorUI; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JSeparator}. @@ -82,7 +82,7 @@ public class FlatSeparatorUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -111,7 +111,7 @@ public class FlatSeparatorUI protected void installListeners( JSeparator s ) { super.installListeners( s ); - propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( + propertyChangeListener = FlatStylingSupport.createPropertyChangeListener( s, style -> applyStyle( s, this, style ), null ); s.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @@ -140,14 +140,14 @@ public class FlatSeparatorUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -155,7 +155,7 @@ public class FlatSeparatorUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index 4db7abd3..b84931d6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -36,8 +36,8 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSliderUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.UIScale; @@ -119,7 +119,7 @@ public class FlatSliderUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( slider ) ); + applyStyle( FlatStylingSupport.getStyle( slider ) ); } @Override @@ -186,7 +186,7 @@ public class FlatSliderUI @Override protected PropertyChangeListener createPropertyChangeListener( JSlider slider ) { - return FlatStyleSupport.createPropertyChangeListener( slider, this::applyStyle, + return FlatStylingSupport.createPropertyChangeListener( slider, this::applyStyle, super.createPropertyChangeListener( slider ) ); } @@ -194,14 +194,14 @@ public class FlatSliderUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -209,7 +209,7 @@ public class FlatSliderUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index b35beafe..4706c540 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -45,8 +45,8 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicSpinnerUI; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JSpinner}. @@ -114,7 +114,7 @@ public class FlatSpinnerUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( spinner ) ); + applyStyle( FlatStylingSupport.getStyle( spinner ) ); } @Override @@ -194,7 +194,7 @@ public class FlatSpinnerUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); updateEditorPadding(); updateArrowButtonsStyle(); } @@ -205,7 +205,7 @@ public class FlatSpinnerUI protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) borderShared = new AtomicBoolean( true ); - return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, spinner, borderShared ); + return FlatStylingSupport.applyToAnnotatedObjectOrBorder( this, key, value, spinner, borderShared ); } /** @@ -213,7 +213,7 @@ public class FlatSpinnerUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this, spinner.getBorder() ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this, spinner.getBorder() ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index c238a01c..87ea7341 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -35,9 +35,9 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** @@ -90,7 +90,7 @@ public class FlatSplitPaneUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( splitPane ) ); + applyStyle( FlatStylingSupport.getStyle( splitPane ) ); } @Override @@ -121,7 +121,7 @@ public class FlatSplitPaneUI protected void installListeners() { super.installListeners(); - propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( splitPane, this::applyStyle, null ); + propertyChangeListener = FlatStylingSupport.createPropertyChangeListener( splitPane, this::applyStyle, null ); splitPane.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @@ -142,7 +142,7 @@ public class FlatSplitPaneUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); if( divider instanceof FlatSplitPaneDivider ) ((FlatSplitPaneDivider)divider).updateStyle(); @@ -158,7 +158,7 @@ public class FlatSplitPaneUI } catch( UnknownStyleException ex ) { // ignore } - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -166,7 +166,7 @@ public class FlatSplitPaneUI */ @Override public Map> getStyleableInfos( JComponent c ) { - Map> infos = FlatStyleSupport.getAnnotatedStyleableInfos( this ); + Map> infos = FlatStylingSupport.getAnnotatedStyleableInfos( this ); if( divider instanceof FlatSplitPaneDivider ) infos.putAll( ((FlatSplitPaneDivider)divider).getStyleableInfos() ); return infos; @@ -193,14 +193,14 @@ public class FlatSplitPaneUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** * @since TODO */ public Map> getStyleableInfos() { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } void updateStyle() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java similarity index 99% rename from flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java rename to flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java index d1387ca7..c166b068 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStyleSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java @@ -45,7 +45,7 @@ import com.formdev.flatlaf.util.SystemInfo; * @author Karl Tauber * @since TODO */ -public class FlatStyleSupport +public class FlatStylingSupport { /** * Indicates that a field is intended to be used by FlatLaf styling support. diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index baccb168..89b74a51 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -87,9 +87,9 @@ import javax.swing.text.JTextComponent; import javax.swing.text.View; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.icons.FlatTabbedPaneCloseIcon; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; import com.formdev.flatlaf.util.Animator; import com.formdev.flatlaf.util.CubicBezierEasing; import com.formdev.flatlaf.util.JavaCompatibility; @@ -269,7 +269,7 @@ public class FlatTabbedPaneUI super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -576,7 +576,7 @@ public class FlatTabbedPaneUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); // update buttons for( Component c : tabPane.getComponents() ) { @@ -595,7 +595,7 @@ public class FlatTabbedPaneUI return new UnknownStyleException( key ); if( closeIconShared ) { - closeIcon = FlatStyleSupport.cloneIcon( closeIcon ); + closeIcon = FlatStylingSupport.cloneIcon( closeIcon ); closeIconShared = false; } @@ -626,7 +626,7 @@ public class FlatTabbedPaneUI } } - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -638,7 +638,7 @@ public class FlatTabbedPaneUI infos.put( "tabInsets", Insets.class ); infos.put( "tabAreaInsets", Insets.class ); infos.put( "textIconGap", int.class ); - FlatStyleSupport.collectAnnotatedStyleableInfos( this, infos ); + FlatStylingSupport.collectAnnotatedStyleableInfos( this, infos ); if( closeIcon instanceof FlatTabbedPaneCloseIcon ) infos.putAll( ((FlatTabbedPaneCloseIcon)closeIcon).getStyleableInfos() ); return infos; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index 5cb0ab82..c291ad85 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java @@ -38,8 +38,8 @@ import javax.swing.plaf.basic.BasicTableHeaderUI; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.UIScale; /** @@ -98,7 +98,7 @@ public class FlatTableHeaderUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -123,7 +123,7 @@ public class FlatTableHeaderUI protected void installListeners() { super.installListeners(); - propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( header, this::applyStyle, null ); + propertyChangeListener = FlatStylingSupport.createPropertyChangeListener( header, this::applyStyle, null ); header.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @@ -139,7 +139,7 @@ public class FlatTableHeaderUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** @@ -149,7 +149,7 @@ public class FlatTableHeaderUI if( key.equals( "sortIconPosition" ) && value instanceof String ) value = parseSortIconPosition( (String) value ); - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -157,7 +157,7 @@ public class FlatTableHeaderUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } private static int parseSortIconPosition( String str ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index 1ed05dcd..79092b07 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -38,8 +38,8 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTableUI; import javax.swing.table.JTableHeader; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.UIScale; @@ -124,7 +124,7 @@ public class FlatTableUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -187,7 +187,7 @@ public class FlatTableUI protected void installListeners() { super.installListeners(); - propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( table, this::applyStyle, null ); + propertyChangeListener = FlatStylingSupport.createPropertyChangeListener( table, this::applyStyle, null ); table.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @@ -229,7 +229,7 @@ public class FlatTableUI Color oldSelectionInactiveBackground = selectionInactiveBackground; Color oldSelectionInactiveForeground = selectionInactiveForeground; - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); // update selection background if( selectionBackground != oldSelectionBackground ) { @@ -254,7 +254,7 @@ public class FlatTableUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -262,7 +262,7 @@ public class FlatTableUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } /** 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 ae694d2c..70351905 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 @@ -29,8 +29,8 @@ import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTextAreaUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -86,7 +86,7 @@ public class FlatTextAreaUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -153,7 +153,7 @@ public class FlatTextAreaUI oldDisabledBackground = disabledBackground; oldInactiveBackground = inactiveBackground; - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); updateBackground(); } @@ -162,7 +162,7 @@ public class FlatTextAreaUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -170,7 +170,7 @@ public class FlatTextAreaUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } private void updateBackground() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextBorder.java index 9ad7a5b4..e446e670 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTextBorder.java @@ -18,7 +18,7 @@ package com.formdev.flatlaf.ui; import java.awt.Component; import javax.swing.UIManager; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; /** * Border for various text components (e.g. {@link javax.swing.JTextField}). 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 70abb546..d739ee5a 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 @@ -43,8 +43,8 @@ import javax.swing.plaf.basic.BasicTextFieldUI; import javax.swing.text.Caret; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.JavaCompatibility; import com.formdev.flatlaf.util.UIScale; @@ -107,7 +107,7 @@ public class FlatTextFieldUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -209,7 +209,7 @@ public class FlatTextFieldUI oldDisabledBackground = disabledBackground; oldInactiveBackground = inactiveBackground; - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); updateBackground(); } @@ -220,7 +220,7 @@ public class FlatTextFieldUI protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) borderShared = new AtomicBoolean( true ); - return FlatStyleSupport.applyToAnnotatedObjectOrBorder( this, key, value, getComponent(), borderShared ); + return FlatStylingSupport.applyToAnnotatedObjectOrBorder( this, key, value, getComponent(), borderShared ); } /** @@ -228,7 +228,7 @@ public class FlatTextFieldUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this, getComponent().getBorder() ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this, getComponent().getBorder() ); } private void updateBackground() { 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 3ebf2d20..13a6302b 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 @@ -29,8 +29,8 @@ import javax.swing.JEditorPane; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTextPaneUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.HiDPIUtils; /** @@ -87,7 +87,7 @@ public class FlatTextPaneUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -161,7 +161,7 @@ public class FlatTextPaneUI oldDisabledBackground = disabledBackground; oldInactiveBackground = inactiveBackground; - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); updateBackground(); } @@ -170,7 +170,7 @@ public class FlatTextPaneUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -178,7 +178,7 @@ public class FlatTextPaneUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } private void updateBackground() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java index cd49f1b5..7b102775 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java @@ -28,8 +28,8 @@ import javax.swing.JComponent; import javax.swing.JToggleButton; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.UnknownStyleException; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; import com.formdev.flatlaf.util.UIScale; /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java index f08b9d99..61a5f42a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java @@ -32,8 +32,8 @@ import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicToolBarSeparatorUI; import com.formdev.flatlaf.FlatClientProperties; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JToolBar.Separator}. @@ -76,7 +76,7 @@ public class FlatToolBarSeparatorUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -107,7 +107,7 @@ public class FlatToolBarSeparatorUI protected void installListeners( JSeparator s ) { super.installListeners( s ); - propertyChangeListener = FlatStyleSupport.createPropertyChangeListener( + propertyChangeListener = FlatStylingSupport.createPropertyChangeListener( s, style -> applyStyle( s, this, style ), null ); s.addPropertyChangeListener( FlatClientProperties.STYLE, propertyChangeListener ); } @@ -136,14 +136,14 @@ public class FlatToolBarSeparatorUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -151,7 +151,7 @@ public class FlatToolBarSeparatorUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java index bc7fea16..42e933b8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java @@ -29,8 +29,8 @@ import javax.swing.UIManager; import javax.swing.border.Border; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicToolBarUI; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; /** * Provides the Flat LaF UI delegate for {@link javax.swing.JToolBar}. @@ -83,7 +83,7 @@ public class FlatToolBarUI if( !focusableButtons ) setButtonsFocusable( false ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -133,7 +133,7 @@ public class FlatToolBarUI @Override protected PropertyChangeListener createPropertyListener() { - return FlatStyleSupport.createPropertyChangeListener( toolBar, this::applyStyle, super.createPropertyListener() ); + return FlatStylingSupport.createPropertyChangeListener( toolBar, this::applyStyle, super.createPropertyListener() ); } /** @@ -142,7 +142,7 @@ public class FlatToolBarUI protected void applyStyle( Object style ) { boolean oldFocusableButtons = focusableButtons; - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); if( focusableButtons != oldFocusableButtons ) setButtonsFocusable( focusableButtons ); @@ -152,7 +152,7 @@ public class FlatToolBarUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -160,7 +160,7 @@ public class FlatToolBarUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java index 3f3962d8..65931a91 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java @@ -40,8 +40,8 @@ import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicTreeUI; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreePath; -import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; -import com.formdev.flatlaf.ui.FlatStyleSupport.StyleableUI; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; +import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.UIScale; /** @@ -156,7 +156,7 @@ public class FlatTreeUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStyleSupport.getStyle( c ) ); + applyStyle( FlatStylingSupport.getStyle( c ) ); } @Override @@ -313,14 +313,14 @@ public class FlatTreeUI * @since TODO */ protected void applyStyle( Object style ) { - oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** @@ -328,7 +328,7 @@ public class FlatTreeUI */ @Override public Map> getStyleableInfos( JComponent c ) { - return FlatStyleSupport.getAnnotatedStyleableInfos( this ); + return FlatStylingSupport.getAnnotatedStyleableInfos( this ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java index 2ee0fc55..c0dae004 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java @@ -868,7 +868,7 @@ debug*/ * with other components. This is only possible if it does not have styles. */ public static boolean canUseSharedUI( JComponent c ) { - return FlatStyleSupport.getStyle( c ) == null; + return FlatStylingSupport.getStyle( c ) == null; } //---- class RepaintFocusListener ----------------------------------------- diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index dc01e58a..16110540 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -47,21 +47,21 @@ public class TestFlatStyling @Test void parse() { - assertEquals( null, FlatStyleSupport.parse( null ) ); - assertEquals( null, FlatStyleSupport.parse( "" ) ); - assertEquals( null, FlatStyleSupport.parse( " " ) ); - assertEquals( null, FlatStyleSupport.parse( ";" ) ); - assertEquals( null, FlatStyleSupport.parse( " ; ; " ) ); + assertEquals( null, FlatStylingSupport.parse( null ) ); + assertEquals( null, FlatStylingSupport.parse( "" ) ); + assertEquals( null, FlatStylingSupport.parse( " " ) ); + assertEquals( null, FlatStylingSupport.parse( ";" ) ); + assertEquals( null, FlatStylingSupport.parse( " ; ; " ) ); assertEquals( expectedMap( "background", Color.WHITE ), - FlatStyleSupport.parse( "background: #fff" ) ); + FlatStylingSupport.parse( "background: #fff" ) ); assertEquals( expectedMap( "background", Color.WHITE, "foreground", Color.BLACK ), - FlatStyleSupport.parse( "background: #fff; foreground: #000" ) ); + FlatStylingSupport.parse( "background: #fff; foreground: #000" ) ); assertEquals( expectedMap( "background", Color.WHITE, "foreground", Color.BLACK, "someWidth", 20 ), - FlatStyleSupport.parse( "background: #fff; foreground: #000; someWidth: 20" ) ); + FlatStylingSupport.parse( "background: #fff; foreground: #000; someWidth: 20" ) ); } private Map expectedMap( Object... keyValuePairs ) { From cdbdccf1adedc518c2cdcb2b6f5b5a665acf4cd7 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 1 Sep 2021 13:32:31 +0200 Subject: [PATCH 53/60] Styling: support styling any component property that has public getter and setter methods --- .../java/com/formdev/flatlaf/FlatLaf.java | 12 +- .../com/formdev/flatlaf/UIDefaultsLoader.java | 4 +- .../flatlaf/ui/FlatCheckBoxMenuItemUI.java | 2 +- .../formdev/flatlaf/ui/FlatEditorPaneUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatLabelUI.java | 13 +- .../com/formdev/flatlaf/ui/FlatListUI.java | 2 +- .../formdev/flatlaf/ui/FlatMenuItemUI.java | 8 +- .../com/formdev/flatlaf/ui/FlatMenuUI.java | 2 +- .../formdev/flatlaf/ui/FlatProgressBarUI.java | 2 +- .../flatlaf/ui/FlatRadioButtonMenuItemUI.java | 2 +- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 13 +- .../formdev/flatlaf/ui/FlatScrollBarUI.java | 2 +- .../formdev/flatlaf/ui/FlatSeparatorUI.java | 13 +- .../com/formdev/flatlaf/ui/FlatSliderUI.java | 2 +- .../formdev/flatlaf/ui/FlatSplitPaneUI.java | 2 +- .../flatlaf/ui/FlatStylingSupport.java | 92 ++++++- .../formdev/flatlaf/ui/FlatTabbedPaneUI.java | 2 +- .../formdev/flatlaf/ui/FlatTableHeaderUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatTableUI.java | 2 +- .../formdev/flatlaf/ui/FlatTextAreaUI.java | 2 +- .../formdev/flatlaf/ui/FlatTextPaneUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatToolBarUI.java | 2 +- .../com/formdev/flatlaf/ui/FlatTreeUI.java | 2 +- .../formdev/flatlaf/ui/TestFlatStyling.java | 259 +++++++++++++++--- 24 files changed, 370 insertions(+), 76 deletions(-) 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 4781957a..f6fb8d95 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -55,6 +55,7 @@ import javax.swing.RootPaneContainer; import javax.swing.SwingUtilities; import javax.swing.UIDefaults; import javax.swing.UIDefaults.ActiveValue; +import javax.swing.UIDefaults.LazyValue; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.plaf.ColorUIResource; @@ -794,7 +795,16 @@ public abstract class FlatLaf public static Object parseDefaultsValue( String key, String value, Class valueType ) throws IllegalArgumentException { - return UIDefaultsLoader.parseValue( key, value, valueType ); + // parse value + Object val = UIDefaultsLoader.parseValue( key, value, valueType ); + + // create actual value if lazy or active + if( val instanceof LazyValue ) + val = ((LazyValue)val).createValue( null ); + else if( val instanceof ActiveValue ) + val = ((ActiveValue)val).createValue( null ); + + return val; } private static void reSetLookAndFeel() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java index 9a1e9702..7f157776 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -391,9 +391,9 @@ class UIDefaultsLoader (key.endsWith( ".background" ) || key.endsWith( "Background" ) || key.equals( "background" ) || key.endsWith( ".foreground" ) || key.endsWith( "Foreground" ) || key.equals( "foreground" ))) ) valueType = ValueType.COLOR; - else if( key.endsWith( ".border" ) || key.endsWith( "Border" ) ) + else if( key.endsWith( ".border" ) || key.endsWith( "Border" ) || key.equals( "border" ) ) valueType = ValueType.BORDER; - else if( key.endsWith( ".icon" ) || key.endsWith( "Icon" ) ) + else if( key.endsWith( ".icon" ) || key.endsWith( "Icon" ) || key.equals( "icon" ) ) valueType = ValueType.ICON; else if( key.endsWith( ".margin" ) || key.equals( "margin" ) || key.endsWith( ".padding" ) || key.equals( "padding" ) || diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java index 683204d0..ffd79d5c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java @@ -117,7 +117,7 @@ public class FlatCheckBoxMenuItemUI // ignore } - return FlatMenuItemUI.applyStyleProperty( this, key, value ); + return FlatMenuItemUI.applyStyleProperty( this, menuItem, key, value ); } /** 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 57198896..da79771e 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 @@ -188,7 +188,7 @@ public class FlatEditorPaneUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, getComponent(), key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index ea787e10..2fd98876 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -83,7 +83,7 @@ public class FlatLabelUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStylingSupport.getStyle( c ) ); + applyStyle( (JLabel) c, FlatStylingSupport.getStyle( c ) ); } @Override @@ -132,7 +132,7 @@ public class FlatLabelUI ui = (FlatLabelUI) c.getUI(); } - ui.applyStyle( style ); + ui.applyStyle( c, style ); c.revalidate(); c.repaint(); } @@ -140,15 +140,16 @@ public class FlatLabelUI /** * @since TODO */ - protected void applyStyle( Object style ) { - oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + protected void applyStyle( JLabel c, Object style ) { + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, + (key, value) -> applyStyleProperty( c, key, value ) ); } /** * @since TODO */ - protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + protected Object applyStyleProperty( JLabel c, String key, Object value ) { + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, c, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java index 6f7727a0..2135ef28 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java @@ -178,7 +178,7 @@ public class FlatListUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, list, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java index 65431984..ba120a37 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java @@ -24,6 +24,7 @@ import java.util.LinkedHashMap; import java.util.Map; import javax.swing.Icon; import javax.swing.JComponent; +import javax.swing.JMenuItem; import javax.swing.LookAndFeel; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicMenuItemUI; @@ -119,10 +120,10 @@ public class FlatMenuItemUI // ignore } - return applyStyleProperty( this, key, value ); + return applyStyleProperty( this, menuItem, key, value ); } - static Object applyStyleProperty( BasicMenuItemUI ui, String key, Object value ) { + static Object applyStyleProperty( BasicMenuItemUI ui, JMenuItem menuItem, String key, Object value ) { switch( key ) { // BasicMenuItemUI case "selectionBackground": @@ -132,7 +133,8 @@ public class FlatMenuItemUI case "acceleratorSelectionForeground": return FlatStylingSupport.applyToField( ui, key, key, value ); - default: throw new UnknownStyleException( key ); + default: + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( ui, menuItem, key, value ); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index 795e52e9..ce76c31c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -165,7 +165,7 @@ public class FlatMenuUI // ignore } - return FlatMenuItemUI.applyStyleProperty( this, key, value ); + return FlatMenuItemUI.applyStyleProperty( this, menuItem, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java index a4260e1e..357e9b14 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java @@ -140,7 +140,7 @@ public class FlatProgressBarUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, progressBar, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java index 30d03d90..bbcc8ecf 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java @@ -117,7 +117,7 @@ public class FlatRadioButtonMenuItemUI // ignore } - return FlatMenuItemUI.applyStyleProperty( this, key, value ); + return FlatMenuItemUI.applyStyleProperty( this, menuItem, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index b9a75fb3..04032808 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -92,7 +92,7 @@ public class FlatRadioButtonUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStylingSupport.getStyle( c ) ); + applyStyle( (AbstractButton) c, FlatStylingSupport.getStyle( c ) ); } @Override @@ -150,7 +150,7 @@ public class FlatRadioButtonUI ui = (FlatRadioButtonUI) b.getUI(); } - ui.applyStyle( style ); + ui.applyStyle( b, style ); b.revalidate(); b.repaint(); } @@ -158,14 +158,15 @@ public class FlatRadioButtonUI /** * @since TODO */ - protected void applyStyle( Object style ) { - oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + protected void applyStyle( AbstractButton b, Object style ) { + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, + (key, value) -> applyStyleProperty( b, key, value ) ); } /** * @since TODO */ - protected Object applyStyleProperty( String key, Object value ) { + protected Object applyStyleProperty( AbstractButton b, String key, Object value ) { // style icon if( key.startsWith( "icon." ) ) { if( !(icon instanceof FlatCheckBoxIcon) ) @@ -180,7 +181,7 @@ public class FlatRadioButtonUI return ((FlatCheckBoxIcon)icon).applyStyleProperty( key, value ); } - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, b, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index 1f4749c5..ec04d4bd 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -246,7 +246,7 @@ public class FlatScrollBarUI case "maximumThumbSize": oldValue = maximumThumbSize; maximumThumbSize = (Dimension) value; return oldValue; } - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, scrollbar, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index cc64050b..97820f84 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -82,7 +82,7 @@ public class FlatSeparatorUI public void installUI( JComponent c ) { super.installUI( c ); - applyStyle( FlatStylingSupport.getStyle( c ) ); + applyStyle( (JSeparator) c, FlatStylingSupport.getStyle( c ) ); } @Override @@ -131,7 +131,7 @@ public class FlatSeparatorUI ui = (FlatSeparatorUI) s.getUI(); } - ui.applyStyle( style ); + ui.applyStyle( s, style ); s.revalidate(); s.repaint(); } @@ -139,15 +139,16 @@ public class FlatSeparatorUI /** * @since TODO */ - protected void applyStyle( Object style ) { - oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + protected void applyStyle( JSeparator s, Object style ) { + oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, + (key, value) -> applyStyleProperty( s, key, value ) ); } /** * @since TODO */ - protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + protected Object applyStyleProperty( JSeparator s, String key, Object value ) { + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, s, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index b84931d6..30f71e99 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -201,7 +201,7 @@ public class FlatSliderUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, slider, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 87ea7341..7761f00b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -158,7 +158,7 @@ public class FlatSplitPaneUI } catch( UnknownStyleException ex ) { // ignore } - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, splitPane, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java index c166b068..65c86903 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java @@ -22,6 +22,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.LinkedHashMap; @@ -81,7 +82,7 @@ public class FlatStylingSupport * @return map of old values modified by the given style, or {@code null} * @throws UnknownStyleException on unknown style keys * @throws IllegalArgumentException on syntax errors - * @throws ClassCastException if value type does not fit to expected type  + * @throws ClassCastException if value type does not fit to expected type */ public static Map parseAndApply( Map oldStyleValues, Object style, BiFunction applyProperty ) @@ -210,7 +211,7 @@ public class FlatStylingSupport * @param value the new value * @return the old value of the field * @throws UnknownStyleException if object does not have a annotated field with given name - * @throws IllegalArgumentException if value type does not fit to expected type  + * @throws IllegalArgumentException if value type does not fit to expected type */ public static Object applyToAnnotatedObject( Object obj, String key, Object value ) throws UnknownStyleException, IllegalArgumentException @@ -239,7 +240,7 @@ public class FlatStylingSupport * @param value the new value * @return the old value of the field * @throws UnknownStyleException if object does not have a field with given name - * @throws IllegalArgumentException if value type does not fit to expected type  + * @throws IllegalArgumentException if value type does not fit to expected type */ static Object applyToField( Object obj, String fieldName, String key, Object value ) throws UnknownStyleException, IllegalArgumentException @@ -292,12 +293,90 @@ public class FlatStylingSupport return (modifiers & (Modifier.FINAL|Modifier.STATIC)) == 0 && !f.isSynthetic(); } + /** + * Applies the given value to a property of the given object. + * Works only for properties that have public getter and setter methods. + * First the property getter is invoked to get the old value, + * then the property setter is invoked to set the new value. + * + * @param obj the object + * @param name the name of the property + * @param value the new value + * @return the old value of the property + * @throws UnknownStyleException if object does not have a property with given name + * @throws IllegalArgumentException if value type does not fit to expected type + */ + private static Object applyToProperty( Object obj, String name, Object value ) + throws UnknownStyleException, IllegalArgumentException + { + Class cls = obj.getClass(); + String getterName = buildMethodName( "get", name ); + String setterName = buildMethodName( "set", name ); + + try { + Method getter; + try { + getter = cls.getMethod( getterName ); + } catch( NoSuchMethodException ex ) { + getter = cls.getMethod( buildMethodName( "is", name ) ); + } + Method setter = cls.getMethod( setterName, getter.getReturnType() ); + Object oldValue = getter.invoke( obj ); + setter.invoke( obj, value ); + return oldValue; + } catch( NoSuchMethodException ex ) { + throw new UnknownStyleException( name ); + } catch( Exception ex ) { + throw new IllegalArgumentException( "failed to invoke property methods '" + cls.getName() + "." + + getterName + "()' or '" + setterName + "(...)'", ex ); + } + } + + private static String buildMethodName( String prefix, String name ) { + int prefixLength = prefix.length(); + int nameLength = name.length(); + char[] chars = new char[prefixLength + nameLength]; + prefix.getChars( 0, prefixLength, chars, 0 ); + name.getChars( 0, nameLength, chars, prefixLength ); + chars[prefixLength] = Character.toUpperCase( chars[prefixLength] ); + return new String( chars ); + } + + /** + * Applies the given value to an annotated field of the given object + * or to a property of the given component. + * The field must be annotated with {@link Styleable}. + * The component property must have public getter and setter methods. + * + * @param obj the object + * @param comp the component, or {@code null} + * @param key the name of the field + * @param value the new value + * @return the old value of the field + * @throws UnknownStyleException if object does not have a annotated field with given name + * @throws IllegalArgumentException if value type does not fit to expected type + */ + public static Object applyToAnnotatedObjectOrComponent( Object obj, Object comp, String key, Object value ) { + try { + return applyToAnnotatedObject( obj, key, value ); + } catch( UnknownStyleException ex ) { + try { + if( comp != null ) + return applyToProperty( comp, key, value ); + } catch( UnknownStyleException ex2 ) { + // ignore + } + throw ex; + } + } + static Object applyToAnnotatedObjectOrBorder( Object obj, String key, Object value, JComponent c, AtomicBoolean borderShared ) { try { return applyToAnnotatedObject( obj, key, value ); } catch( UnknownStyleException ex ) { + // apply to border Border border = c.getBorder(); if( border instanceof StyleableBorder ) { if( borderShared.get() ) { @@ -312,6 +391,13 @@ public class FlatStylingSupport // ignore } } + + // apply to component property + try { + return applyToProperty( c, key, value ); + } catch( UnknownStyleException ex2 ) { + // ignore + } throw ex; } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index 89b74a51..8ae42c6a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -626,7 +626,7 @@ public class FlatTabbedPaneUI } } - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, tabPane, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index c291ad85..770323f5 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java @@ -149,7 +149,7 @@ public class FlatTableHeaderUI if( key.equals( "sortIconPosition" ) && value instanceof String ) value = parseSortIconPosition( (String) value ); - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, header, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index 79092b07..d8577b89 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -254,7 +254,7 @@ public class FlatTableUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, table, key, value ); } /** 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 70351905..39a70398 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 @@ -162,7 +162,7 @@ public class FlatTextAreaUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, getComponent(), key, value ); } /** 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 13a6302b..9e948f21 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 @@ -170,7 +170,7 @@ public class FlatTextPaneUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, getComponent(), key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java index 42e933b8..bb4e7547 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java @@ -152,7 +152,7 @@ public class FlatToolBarUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, toolBar, key, value ); } /** diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java index 65931a91..2f379add 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java @@ -320,7 +320,7 @@ public class FlatTreeUI * @since TODO */ protected Object applyStyleProperty( String key, Object value ) { - return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); + return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, tree, key, value ); } /** diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 16110540..8d36fdfc 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -131,6 +131,14 @@ public class TestFlatStyling // border flatButtonBorder( style -> ui.applyStyle( b, style ) ); + + // JComponent properties + ui.applyStyle( b, "background: #fff" ); + ui.applyStyle( b, "foreground: #fff" ); + ui.applyStyle( b, "border: 2,2,2,2,#f00" ); + + // AbstractButton properties + ui.applyStyle( b, "margin: 2,2,2,2" ); } @Test @@ -141,7 +149,7 @@ public class TestFlatStyling assertTrue( ui.getDefaultIcon() instanceof FlatCheckBoxIcon ); // FlatCheckBoxUI extends FlatRadioButtonUI - radioButton( ui ); + radioButton( ui, c ); } @Test @@ -175,6 +183,11 @@ public class TestFlatStyling // border flatRoundBorder( style -> ui.applyStyle( style ) ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -186,6 +199,17 @@ public class TestFlatStyling ui.applyStyle( "disabledBackground: #fff" ); ui.applyStyle( "inactiveBackground: #fff" ); ui.applyStyle( "focusedBackground: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JTextComponent properties + ui.applyStyle( "caretColor: #fff" ); + ui.applyStyle( "selectionColor: #fff" ); + ui.applyStyle( "selectedTextColor: #fff" ); + ui.applyStyle( "disabledTextColor: #fff" ); } @Test @@ -214,6 +238,11 @@ public class TestFlatStyling ui.applyStyle( "inactiveDropShadowColor: #fff" ); ui.applyStyle( "inactiveDropShadowInsets: 1,2,3,4" ); ui.applyStyle( "inactiveDropShadowOpacity: 0.5" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -221,7 +250,15 @@ public class TestFlatStyling JLabel c = new JLabel(); FlatLabelUI ui = (FlatLabelUI) c.getUI(); - ui.applyStyle( "disabledForeground: #fff" ); + ui.applyStyle( c, "disabledForeground: #fff" ); + + // JComponent properties + ui.applyStyle( c, "background: #fff" ); + ui.applyStyle( c, "foreground: #fff" ); + ui.applyStyle( c, "border: 2,2,2,2,#f00" ); + + // JLabel properties + ui.applyStyle( c, "icon: com.formdev.flatlaf.icons.FlatTreeExpandedIcon" ); } @Test @@ -238,6 +275,14 @@ public class TestFlatStyling ui.applyStyle( "cellMargins: 1,2,3,4" ); ui.applyStyle( "cellFocusColor: #fff" ); ui.applyStyle( "showCellFocusIndicator: true" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JList properties + ui.applyStyle( "visibleRowCount: 20" ); } @Test @@ -247,6 +292,11 @@ public class TestFlatStyling // FlatMenuBarBorder ui.applyStyle( "borderColor: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -299,6 +349,14 @@ public class TestFlatStyling applyStyle.accept( "acceleratorSelectionForeground: #fff" ); menuItemRenderer( applyStyle ); + + // JComponent properties + applyStyle.accept( "background: #fff" ); + applyStyle.accept( "foreground: #fff" ); + applyStyle.accept( "border: 2,2,2,2,#f00" ); + + // AbstractButton properties + applyStyle.accept( "margin: 2,2,2,2" ); } private void menuItemRenderer( Consumer applyStyle ) { @@ -354,6 +412,11 @@ public class TestFlatStyling ui.applyStyle( "borderInsets: 1,2,3,4" ); ui.applyStyle( "borderColor: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -362,7 +425,7 @@ public class TestFlatStyling FlatPopupMenuSeparatorUI ui = (FlatPopupMenuSeparatorUI) c.getUI(); // FlatPopupMenuSeparatorUI extends FlatSeparatorUI - separator( ui ); + separator( ui, c ); } @Test @@ -373,6 +436,11 @@ public class TestFlatStyling ui.applyStyle( "arc: 5" ); ui.applyStyle( "horizontalSize: 100,12" ); ui.applyStyle( "verticalSize: 12,100" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -382,47 +450,55 @@ public class TestFlatStyling assertTrue( ui.getDefaultIcon() instanceof FlatRadioButtonIcon ); - radioButton( ui ); + radioButton( ui, c ); - ui.applyStyle( "icon.centerDiameter: 8" ); + ui.applyStyle( c, "icon.centerDiameter: 8" ); } - private void radioButton( FlatRadioButtonUI ui ) { - ui.applyStyle( "disabledText: #fff" ); + private void radioButton( FlatRadioButtonUI ui, AbstractButton b ) { + ui.applyStyle( b, "disabledText: #fff" ); + + // JComponent properties + ui.applyStyle( b, "background: #fff" ); + ui.applyStyle( b, "foreground: #fff" ); + ui.applyStyle( b, "border: 2,2,2,2,#f00" ); + + // AbstractButton properties + ui.applyStyle( b, "margin: 2,2,2,2" ); //---- icon ---- - ui.applyStyle( "icon.focusWidth: 2" ); - ui.applyStyle( "icon.focusColor: #fff" ); - ui.applyStyle( "icon.arc: 5" ); + ui.applyStyle( b, "icon.focusWidth: 2" ); + ui.applyStyle( b, "icon.focusColor: #fff" ); + ui.applyStyle( b, "icon.arc: 5" ); // enabled - ui.applyStyle( "icon.borderColor: #fff" ); - ui.applyStyle( "icon.background: #fff" ); - ui.applyStyle( "icon.selectedBorderColor: #fff" ); - ui.applyStyle( "icon.selectedBackground: #fff" ); - ui.applyStyle( "icon.checkmarkColor: #fff" ); + ui.applyStyle( b, "icon.borderColor: #fff" ); + ui.applyStyle( b, "icon.background: #fff" ); + ui.applyStyle( b, "icon.selectedBorderColor: #fff" ); + ui.applyStyle( b, "icon.selectedBackground: #fff" ); + ui.applyStyle( b, "icon.checkmarkColor: #fff" ); // disabled - ui.applyStyle( "icon.disabledBorderColor: #fff" ); - ui.applyStyle( "icon.disabledBackground: #fff" ); - ui.applyStyle( "icon.disabledCheckmarkColor: #fff" ); + ui.applyStyle( b, "icon.disabledBorderColor: #fff" ); + ui.applyStyle( b, "icon.disabledBackground: #fff" ); + ui.applyStyle( b, "icon.disabledCheckmarkColor: #fff" ); // focused - ui.applyStyle( "icon.focusedBorderColor: #fff" ); - ui.applyStyle( "icon.focusedBackground: #fff" ); - ui.applyStyle( "icon.selectedFocusedBorderColor: #fff" ); - ui.applyStyle( "icon.selectedFocusedBackground: #fff" ); - ui.applyStyle( "icon.selectedFocusedCheckmarkColor: #fff" ); + ui.applyStyle( b, "icon.focusedBorderColor: #fff" ); + ui.applyStyle( b, "icon.focusedBackground: #fff" ); + ui.applyStyle( b, "icon.selectedFocusedBorderColor: #fff" ); + ui.applyStyle( b, "icon.selectedFocusedBackground: #fff" ); + ui.applyStyle( b, "icon.selectedFocusedCheckmarkColor: #fff" ); // hover - ui.applyStyle( "icon.hoverBorderColor: #fff" ); - ui.applyStyle( "icon.hoverBackground: #fff" ); - ui.applyStyle( "icon.selectedHoverBackground: #fff" ); + ui.applyStyle( b, "icon.hoverBorderColor: #fff" ); + ui.applyStyle( b, "icon.hoverBackground: #fff" ); + ui.applyStyle( b, "icon.selectedHoverBackground: #fff" ); // pressed - ui.applyStyle( "icon.pressedBackground: #fff" ); - ui.applyStyle( "icon.selectedPressedBackground: #fff" ); + ui.applyStyle( b, "icon.pressedBackground: #fff" ); + ui.applyStyle( b, "icon.selectedPressedBackground: #fff" ); } @Test @@ -454,6 +530,11 @@ public class TestFlatStyling ui.applyStyle( "buttonDisabledArrowColor: #fff" ); ui.applyStyle( "hoverButtonBackground: #fff" ); ui.applyStyle( "pressedButtonBackground: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -463,6 +544,11 @@ public class TestFlatStyling // border flatBorder( style -> ui.applyStyle( style ) ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -470,13 +556,18 @@ public class TestFlatStyling JSeparator c = new JSeparator(); FlatSeparatorUI ui = (FlatSeparatorUI) c.getUI(); - separator( ui ); + separator( ui, c ); } - private void separator( FlatSeparatorUI ui ) { - ui.applyStyle( "height: 6" ); - ui.applyStyle( "stripeWidth: 2" ); - ui.applyStyle( "stripeIndent: 10" ); + private void separator( FlatSeparatorUI ui, JSeparator c ) { + ui.applyStyle( c, "height: 6" ); + ui.applyStyle( c, "stripeWidth: 2" ); + ui.applyStyle( c, "stripeIndent: 10" ); + + // JComponent properties + ui.applyStyle( c, "background: #fff" ); + ui.applyStyle( c, "foreground: #fff" ); + ui.applyStyle( c, "border: 2,2,2,2,#f00" ); } @Test @@ -500,6 +591,17 @@ public class TestFlatStyling ui.applyStyle( "disabledThumbColor: #fff" ); ui.applyStyle( "disabledThumbBorderColor: #fff" ); ui.applyStyle( "tickColor: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JSlider properties + ui.applyStyle( "paintLabels: true" ); + ui.applyStyle( "paintTicks: true" ); + ui.applyStyle( "paintTrack: true" ); + ui.applyStyle( "snapToTicks: true" ); } @Test @@ -524,6 +626,11 @@ public class TestFlatStyling // border flatRoundBorder( style -> ui.applyStyle( style ) ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -541,6 +648,14 @@ public class TestFlatStyling ui.applyStyle( "gripDotCount: 3" ); ui.applyStyle( "gripDotSize: {integer}3" ); ui.applyStyle( "gripGap: 2" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JSplitPane properties + ui.applyStyle( "dividerSize: {integer}20" ); } @Test @@ -601,6 +716,11 @@ public class TestFlatStyling ui.applyStyle( "closeHoverForeground: #fff" ); ui.applyStyle( "closePressedBackground: #fff" ); ui.applyStyle( "closePressedForeground: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -617,6 +737,18 @@ public class TestFlatStyling ui.applyStyle( "cellMargins: 1,2,3,4" ); ui.applyStyle( "cellFocusColor: #fff" ); ui.applyStyle( "showCellFocusIndicator: true" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JTable properties + ui.applyStyle( "fillsViewportHeight: true" ); + ui.applyStyle( "rowHeight: 30" ); + ui.applyStyle( "showHorizontalLines: true" ); + ui.applyStyle( "showVerticalLines: true" ); + ui.applyStyle( "intercellSpacing: {dimension}1,1" ); } @Test @@ -635,6 +767,11 @@ public class TestFlatStyling // FlatAscendingSortIcon and FlatDescendingSortIcon ui.applyStyle( "arrowType: chevron" ); ui.applyStyle( "sortIconColor: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); } @Test @@ -646,6 +783,17 @@ public class TestFlatStyling ui.applyStyle( "disabledBackground: #fff" ); ui.applyStyle( "inactiveBackground: #fff" ); ui.applyStyle( "focusedBackground: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JTextComponent properties + ui.applyStyle( "caretColor: #fff" ); + ui.applyStyle( "selectionColor: #fff" ); + ui.applyStyle( "selectedTextColor: #fff" ); + ui.applyStyle( "disabledTextColor: #fff" ); } @Test @@ -665,6 +813,17 @@ public class TestFlatStyling // border flatTextBorder( style -> ui.applyStyle( style ) ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JTextComponent properties + ui.applyStyle( "caretColor: #fff" ); + ui.applyStyle( "selectionColor: #fff" ); + ui.applyStyle( "selectedTextColor: #fff" ); + ui.applyStyle( "disabledTextColor: #fff" ); } @Test @@ -676,6 +835,17 @@ public class TestFlatStyling ui.applyStyle( "disabledBackground: #fff" ); ui.applyStyle( "inactiveBackground: #fff" ); ui.applyStyle( "focusedBackground: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JTextComponent properties + ui.applyStyle( "caretColor: #fff" ); + ui.applyStyle( "selectionColor: #fff" ); + ui.applyStyle( "selectedTextColor: #fff" ); + ui.applyStyle( "disabledTextColor: #fff" ); } @Test @@ -703,6 +873,17 @@ public class TestFlatStyling ui.applyStyle( "borderMargins: 1,2,3,4" ); ui.applyStyle( "gripColor: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JToolBar properties + ui.applyStyle( "borderPainted: true" ); + ui.applyStyle( "floatable: true" ); + ui.applyStyle( "margin: 2,2,2,2" ); + ui.applyStyle( "rollover: true" ); } @Test @@ -734,6 +915,18 @@ public class TestFlatStyling ui.applyStyle( "icon.leafColor: #fff" ); ui.applyStyle( "icon.closedColor: #fff" ); ui.applyStyle( "icon.openColor: #fff" ); + + // JComponent properties + ui.applyStyle( "background: #fff" ); + ui.applyStyle( "foreground: #fff" ); + ui.applyStyle( "border: 2,2,2,2,#f00" ); + + // JTree properties + ui.applyStyle( "rootVisible: true" ); + ui.applyStyle( "rowHeight: 30" ); + ui.applyStyle( "scrollsOnExpand: true" ); + ui.applyStyle( "showsRootHandles: true" ); + ui.applyStyle( "visibleRowCount: 20" ); } //---- component borders -------------------------------------------------- From 4a65bc88d587e425b71b7e36307fccc74d378ccd Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 5 Sep 2021 23:25:16 +0200 Subject: [PATCH 54/60] Theme Editor: highlight selected editor tab --- .../com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java index 03c35552..02da2a64 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java @@ -52,6 +52,7 @@ import java.util.prefs.Preferences; import javax.lang.model.SourceVersion; import javax.swing.*; import net.miginfocom.swing.*; +import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatDarculaLaf; import com.formdev.flatlaf.FlatDarkLaf; import com.formdev.flatlaf.FlatIntelliJLaf; @@ -130,6 +131,10 @@ class FlatThemeFileEditor if( UIManager.getLookAndFeel() instanceof FlatDarkLaf ) darkLafMenuItem.setSelected( true ); + // highlight selected tab + tabbedPane.putClientProperty( FlatClientProperties.STYLE, + "[light]selectedBackground: #fff; [dark]selectedBackground: #303234" ); + // add "+" button to tabbed pane newButton = new JButton( new FlatSVGIcon( "com/formdev/flatlaf/themeeditor/icons/add.svg" ) ); newButton.setToolTipText( "New Properties File" ); From 674efae184217bc31516b8f90b5c2504c45e6413 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 6 Sep 2021 15:23:15 +0200 Subject: [PATCH 55/60] Styling: Extras: add style getters and setters to component classes --- .../formdev/flatlaf/FlatClientProperties.java | 13 ++- .../flatlaf/extras/components/FlatButton.java | 2 +- .../extras/components/FlatCheckBox.java | 31 +++++++ .../components/FlatCheckBoxMenuItem.java | 31 +++++++ .../extras/components/FlatComboBox.java | 2 +- .../extras/components/FlatEditorPane.java | 2 +- .../components/FlatFormattedTextField.java | 2 +- .../extras/components/FlatInternalFrame.java | 31 +++++++ .../flatlaf/extras/components/FlatLabel.java | 31 +++++++ .../flatlaf/extras/components/FlatList.java | 31 +++++++ .../flatlaf/extras/components/FlatMenu.java | 31 +++++++ .../extras/components/FlatMenuBar.java | 31 +++++++ .../extras/components/FlatMenuItem.java | 31 +++++++ .../extras/components/FlatPasswordField.java | 2 +- .../extras/components/FlatPopupMenu.java | 31 +++++++ .../components/FlatPopupMenuSeparator.java | 31 +++++++ .../extras/components/FlatProgressBar.java | 2 +- .../extras/components/FlatRadioButton.java | 31 +++++++ .../components/FlatRadioButtonMenuItem.java | 31 +++++++ .../extras/components/FlatScrollBar.java | 2 +- .../extras/components/FlatScrollPane.java | 2 +- .../extras/components/FlatSeparator.java | 31 +++++++ .../flatlaf/extras/components/FlatSlider.java | 31 +++++++ .../extras/components/FlatSpinner.java | 2 +- .../extras/components/FlatSplitPane.java | 31 +++++++ .../components/FlatStyleableComponent.java | 88 +++++++++++++++++++ .../extras/components/FlatTabbedPane.java | 2 +- .../flatlaf/extras/components/FlatTable.java | 31 +++++++ .../extras/components/FlatTableHeader.java | 31 +++++++ .../extras/components/FlatTextArea.java | 2 +- .../extras/components/FlatTextField.java | 2 +- .../extras/components/FlatTextPane.java | 2 +- .../extras/components/FlatToggleButton.java | 2 +- .../extras/components/FlatToolBar.java | 31 +++++++ .../components/FlatToolBarSeparator.java | 31 +++++++ .../flatlaf/extras/components/FlatTree.java | 3 +- .../themeeditor/FlatThemeFileEditor.java | 4 +- 37 files changed, 705 insertions(+), 20 deletions(-) create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatCheckBox.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatCheckBoxMenuItem.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatInternalFrame.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatLabel.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatList.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenu.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenuBar.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenuItem.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPopupMenu.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPopupMenuSeparator.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatRadioButton.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatRadioButtonMenuItem.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSeparator.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSlider.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSplitPane.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatStyleableComponent.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTable.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTableHeader.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToolBar.java create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToolBarSeparator.java diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index 8f107a42..0d83eb42 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -127,12 +127,21 @@ public interface FlatClientProperties //---- JComponent --------------------------------------------------------- /** - * Specifies the style of a component in CSS syntax ("key1: value1; key2: value2; ..."). + * Specifies the style of a component as String in CSS syntax ("key1: value1; key2: value2; ...") + * or as {@link java.util.Map}<String, Object> with binary values. + *

+ * The keys are the same as used in UI defaults, but without component type prefix. + * E.g. for UI default {@code Slider.thumbSize} use key {@code thumbSize}. + *

+ * The syntax of the CSS values is the same as used in FlatLaf properties files + * (https://www.formdev.com/flatlaf/properties-files/), + * but some features are not supported (e.g. variables). + * When using a map, the values are not parsed from a string. They must be binary. *

* Components {@link javax.swing.JComponent}
* Value type {@link java.lang.String} or {@link java.util.Map}<String, Object>
* - * @since TODO + * @since 2 */ String STYLE = "FlatLaf.style"; diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatButton.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatButton.java index 38434c28..4b290775 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatButton.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatButton.java @@ -27,7 +27,7 @@ import javax.swing.JButton; */ public class FlatButton extends JButton - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { // NOTE: enum names must be equal to allowed strings public enum ButtonType { none, square, roundRect, tab, help, toolBarButton, borderless } diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatCheckBox.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatCheckBox.java new file mode 100644 index 00000000..bfdc60b5 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatCheckBox.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JCheckBox; + +/** + * Subclass of {@link JCheckBox} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatCheckBox + extends JCheckBox + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatCheckBoxMenuItem.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatCheckBoxMenuItem.java new file mode 100644 index 00000000..711d91e0 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatCheckBoxMenuItem.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JCheckBoxMenuItem; + +/** + * Subclass of {@link JCheckBoxMenuItem} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatCheckBoxMenuItem + extends JCheckBoxMenuItem + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatComboBox.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatComboBox.java index 6b9581c7..79e44158 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatComboBox.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatComboBox.java @@ -27,7 +27,7 @@ import javax.swing.JComboBox; */ public class FlatComboBox extends JComboBox - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns the placeholder text that is only painted if the editable combo box is empty. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatEditorPane.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatEditorPane.java index 403ccb43..02be8eff 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatEditorPane.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatEditorPane.java @@ -26,7 +26,7 @@ import javax.swing.JEditorPane; */ public class FlatEditorPane extends JEditorPane - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns minimum width of a component. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatFormattedTextField.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatFormattedTextField.java index 4ebc554d..fe030a95 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatFormattedTextField.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatFormattedTextField.java @@ -29,7 +29,7 @@ import com.formdev.flatlaf.extras.components.FlatTextField.SelectAllOnFocusPolic */ public class FlatFormattedTextField extends JFormattedTextField - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns the placeholder text that is only painted if the text field is empty. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatInternalFrame.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatInternalFrame.java new file mode 100644 index 00000000..cdc09538 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatInternalFrame.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JInternalFrame; + +/** + * Subclass of {@link JInternalFrame} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatInternalFrame + extends JInternalFrame + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatLabel.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatLabel.java new file mode 100644 index 00000000..2577b9a4 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatLabel.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JLabel; + +/** + * Subclass of {@link JLabel} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatLabel + extends JLabel + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatList.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatList.java new file mode 100644 index 00000000..b667e907 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatList.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JList; + +/** + * Subclass of {@link JList} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatList + extends JList + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenu.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenu.java new file mode 100644 index 00000000..407ad500 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenu.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JMenu; + +/** + * Subclass of {@link JMenu} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatMenu + extends JMenu + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenuBar.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenuBar.java new file mode 100644 index 00000000..b7e2520b --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenuBar.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JMenuBar; + +/** + * Subclass of {@link JMenuBar} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatMenuBar + extends JMenuBar + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenuItem.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenuItem.java new file mode 100644 index 00000000..5895a9aa --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatMenuItem.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JMenuItem; + +/** + * Subclass of {@link JMenuItem} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatMenuItem + extends JMenuItem + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPasswordField.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPasswordField.java index 86495da2..3a9b027a 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPasswordField.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPasswordField.java @@ -29,7 +29,7 @@ import com.formdev.flatlaf.extras.components.FlatTextField.SelectAllOnFocusPolic */ public class FlatPasswordField extends JPasswordField - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns the placeholder text that is only painted if the text field is empty. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPopupMenu.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPopupMenu.java new file mode 100644 index 00000000..e16757e5 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPopupMenu.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JPopupMenu; + +/** + * Subclass of {@link JPopupMenu} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatPopupMenu + extends JPopupMenu + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPopupMenuSeparator.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPopupMenuSeparator.java new file mode 100644 index 00000000..37f0abb2 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatPopupMenuSeparator.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JPopupMenu; + +/** + * Subclass of {@link JPopupMenu.Separator} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatPopupMenuSeparator + extends JPopupMenu.Separator + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatProgressBar.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatProgressBar.java index c4698374..d0ede426 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatProgressBar.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatProgressBar.java @@ -26,7 +26,7 @@ import javax.swing.JProgressBar; */ public class FlatProgressBar extends JProgressBar - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns whether the progress bar has always the larger height even if no string is painted. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatRadioButton.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatRadioButton.java new file mode 100644 index 00000000..f19b0a04 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatRadioButton.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JRadioButton; + +/** + * Subclass of {@link JRadioButton} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatRadioButton + extends JRadioButton + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatRadioButtonMenuItem.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatRadioButtonMenuItem.java new file mode 100644 index 00000000..6185ba61 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatRadioButtonMenuItem.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JRadioButtonMenuItem; + +/** + * Subclass of {@link JRadioButtonMenuItem} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatRadioButtonMenuItem + extends JRadioButtonMenuItem + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatScrollBar.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatScrollBar.java index eba79afe..7d0a2fd1 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatScrollBar.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatScrollBar.java @@ -26,7 +26,7 @@ import javax.swing.JScrollBar; */ public class FlatScrollBar extends JScrollBar - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns whether the decrease/increase arrow buttons of a scrollbar are shown. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatScrollPane.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatScrollPane.java index 159b477d..f99f0d3b 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatScrollPane.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatScrollPane.java @@ -27,7 +27,7 @@ import javax.swing.JScrollPane; */ public class FlatScrollPane extends JScrollPane - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns whether the decrease/increase arrow buttons of a scrollbar are shown. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSeparator.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSeparator.java new file mode 100644 index 00000000..aa8b9a56 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSeparator.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JSeparator; + +/** + * Subclass of {@link JSeparator} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatSeparator + extends JSeparator + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSlider.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSlider.java new file mode 100644 index 00000000..aa9aa6e5 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSlider.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JSlider; + +/** + * Subclass of {@link JSlider} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatSlider + extends JSlider + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSpinner.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSpinner.java index f4e162f0..d9567bad 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSpinner.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSpinner.java @@ -27,7 +27,7 @@ import javax.swing.JSpinner; */ public class FlatSpinner extends JSpinner - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns minimum width of a component. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSplitPane.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSplitPane.java new file mode 100644 index 00000000..846ad68e --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatSplitPane.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JSplitPane; + +/** + * Subclass of {@link JSplitPane} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatSplitPane + extends JSplitPane + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatStyleableComponent.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatStyleableComponent.java new file mode 100644 index 00000000..d2b3c70c --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatStyleableComponent.java @@ -0,0 +1,88 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import java.util.Map; +import javax.swing.JComponent; +import com.formdev.flatlaf.FlatClientProperties; + +/** + * Interface for all styleable FlatLaf components. + *

+ * If you already have custom subclasses of Swing components, you can add this interface + * to your components to add styling getter and setter methods to them. + * + * @author Karl Tauber + * @since 2 + */ +public interface FlatStyleableComponent +{ + /** + * Returns the style of a component as String in CSS syntax ("key1: value1; key2: value2; ...") + * or {@code null} if no style has been assigned. + */ + default String getStyle() { + return (String) getClientProperty( FlatClientProperties.STYLE ); + } + + /** + * Specifies the style of a component as String in CSS syntax ("key1: value1; key2: value2; ..."). + *

+ * The keys are the same as used in UI defaults, but without component type prefix. + * E.g. for UI default {@code Slider.thumbSize} use key {@code thumbSize}. + *

+ * The syntax of the CSS values is the same as used in FlatLaf properties files + * (https://www.formdev.com/flatlaf/properties-files/), + * but some features are not supported (e.g. variables). + */ + default void setStyle( String style ) { + putClientProperty( FlatClientProperties.STYLE, style ); + } + + + /** + * Returns the style of a component as {@link java.util.Map}<String, Object> + * or {@code null} if no style has been assigned. + */ + @SuppressWarnings( "unchecked" ) + default Map getStyleMap() { + return (Map) getClientProperty( FlatClientProperties.STYLE ); + } + + /** + * Specifies the style of a component as {@link java.util.Map}<String, Object> with binary values. + *

+ * The keys are the same as used in UI defaults, but without component type prefix. + * E.g. for UI default {@code Slider.thumbSize} use key {@code thumbSize}. + *

+ * The values are not parsed from a string. They must be binary. + */ + default void setStyleMap( Map styleMap ) { + putClientProperty( FlatClientProperties.STYLE, styleMap ); + } + + + /** + * Overrides {@link JComponent#getClientProperty(Object)}. + */ + Object getClientProperty( Object key ); + + /** + * Overrides {@link JComponent#putClientProperty(Object, Object)}. + */ + void putClientProperty( Object key, Object value ); +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTabbedPane.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTabbedPane.java index bd04f9b4..22181f90 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTabbedPane.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTabbedPane.java @@ -31,7 +31,7 @@ import javax.swing.SwingConstants; */ public class FlatTabbedPane extends JTabbedPane - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns whether separators are shown between tabs. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTable.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTable.java new file mode 100644 index 00000000..627517d0 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTable.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JTable; + +/** + * Subclass of {@link JTable} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatTable + extends JTable + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTableHeader.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTableHeader.java new file mode 100644 index 00000000..37e0e209 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTableHeader.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.table.JTableHeader; + +/** + * Subclass of {@link JTableHeader} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatTableHeader + extends JTableHeader + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextArea.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextArea.java index a0568d97..5ba1f7ac 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextArea.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextArea.java @@ -26,7 +26,7 @@ import javax.swing.JTextArea; */ public class FlatTextArea extends JTextArea - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns minimum width of a component. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextField.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextField.java index bfa22dd2..8c8cc56e 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextField.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextField.java @@ -28,7 +28,7 @@ import javax.swing.JTextField; */ public class FlatTextField extends JTextField - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns the placeholder text that is only painted if the text field is empty. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextPane.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextPane.java index 4660068a..84897ee6 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextPane.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTextPane.java @@ -26,7 +26,7 @@ import javax.swing.JTextPane; */ public class FlatTextPane extends JTextPane - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns minimum width of a component. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToggleButton.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToggleButton.java index a342f890..226acb12 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToggleButton.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToggleButton.java @@ -28,7 +28,7 @@ import com.formdev.flatlaf.extras.components.FlatButton.ButtonType; */ public class FlatToggleButton extends JToggleButton - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns type of a button. diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToolBar.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToolBar.java new file mode 100644 index 00000000..3caff752 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToolBar.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JToolBar; + +/** + * Subclass of {@link JToolBar} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatToolBar + extends JToolBar + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToolBarSeparator.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToolBarSeparator.java new file mode 100644 index 00000000..37300b5d --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatToolBarSeparator.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 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 + * + * https://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.extras.components; + +import javax.swing.JToolBar; + +/** + * Subclass of {@link JToolBar.Separator} that provides easy access to FlatLaf specific client properties. + * + * @author Karl Tauber + * @since 2 + */ +public class FlatToolBarSeparator + extends JToolBar.Separator + implements FlatStyleableComponent +{ +} diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java index 730b91be..83c0075c 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java @@ -22,10 +22,11 @@ import javax.swing.JTree; /** * Subclass of {@link JTree} that provides easy access to FlatLaf specific client properties. * + * @author Karl Tauber */ public class FlatTree extends JTree - implements FlatComponentExtension + implements FlatComponentExtension, FlatStyleableComponent { /** * Returns if the tree shows a wide selection diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java index 02da2a64..14a3d253 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java @@ -52,7 +52,6 @@ import java.util.prefs.Preferences; import javax.lang.model.SourceVersion; import javax.swing.*; import net.miginfocom.swing.*; -import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatDarculaLaf; import com.formdev.flatlaf.FlatDarkLaf; import com.formdev.flatlaf.FlatIntelliJLaf; @@ -132,8 +131,7 @@ class FlatThemeFileEditor darkLafMenuItem.setSelected( true ); // highlight selected tab - tabbedPane.putClientProperty( FlatClientProperties.STYLE, - "[light]selectedBackground: #fff; [dark]selectedBackground: #303234" ); + tabbedPane.setStyle( "[light]selectedBackground: #fff; [dark]selectedBackground: #303234" ); // add "+" button to tabbed pane newButton = new JButton( new FlatSVGIcon( "com/formdev/flatlaf/themeeditor/icons/add.svg" ) ); From fe15758e5946371656949581ce606e6fda26fabb Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 6 Sep 2021 15:39:19 +0200 Subject: [PATCH 56/60] Styling: updated "since" javadoc tags --- .../src/main/java/com/formdev/flatlaf/FlatLaf.java | 2 +- .../com/formdev/flatlaf/icons/FlatCapsLockIcon.java | 2 +- .../com/formdev/flatlaf/icons/FlatCheckBoxIcon.java | 4 ++-- .../flatlaf/icons/FlatCheckBoxMenuItemIcon.java | 4 ++-- .../com/formdev/flatlaf/icons/FlatClearIcon.java | 4 ++-- .../formdev/flatlaf/icons/FlatHelpButtonIcon.java | 4 ++-- .../com/formdev/flatlaf/icons/FlatMenuArrowIcon.java | 4 ++-- .../com/formdev/flatlaf/icons/FlatSearchIcon.java | 4 ++-- .../flatlaf/icons/FlatTabbedPaneCloseIcon.java | 4 ++-- .../java/com/formdev/flatlaf/ui/FlatArrowButton.java | 2 +- .../main/java/com/formdev/flatlaf/ui/FlatBorder.java | 4 ++-- .../java/com/formdev/flatlaf/ui/FlatButtonUI.java | 6 +++--- .../formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java | 2 +- .../java/com/formdev/flatlaf/ui/FlatComboBoxUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatDropShadowBorder.java | 4 ++-- .../com/formdev/flatlaf/ui/FlatEditorPaneUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatInternalFrameUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatLabelUI.java | 8 ++++---- .../main/java/com/formdev/flatlaf/ui/FlatListUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatMenuBarBorder.java | 2 +- .../java/com/formdev/flatlaf/ui/FlatMenuBarUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatMenuItemRenderer.java | 4 ++-- .../java/com/formdev/flatlaf/ui/FlatMenuItemUI.java | 6 +++--- .../main/java/com/formdev/flatlaf/ui/FlatMenuUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatPasswordFieldUI.java | 4 ++-- .../com/formdev/flatlaf/ui/FlatPopupMenuBorder.java | 4 ++-- .../formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java | 2 +- .../java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatProgressBarUI.java | 6 +++--- .../flatlaf/ui/FlatRadioButtonMenuItemUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatRadioButtonUI.java | 12 ++++++------ .../java/com/formdev/flatlaf/ui/FlatScrollBarUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatScrollPaneUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatSeparatorUI.java | 8 ++++---- .../java/com/formdev/flatlaf/ui/FlatSliderUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatSpinnerUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java | 10 +++++----- .../com/formdev/flatlaf/ui/FlatStylingSupport.java | 2 +- .../com/formdev/flatlaf/ui/FlatTabbedPaneUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatTableHeaderUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatTableUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatTextAreaUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatTextFieldUI.java | 6 +++--- .../java/com/formdev/flatlaf/ui/FlatTextPaneUI.java | 6 +++--- .../com/formdev/flatlaf/ui/FlatToggleButtonUI.java | 4 ++-- .../formdev/flatlaf/ui/FlatToolBarSeparatorUI.java | 8 ++++---- .../java/com/formdev/flatlaf/ui/FlatToolBarUI.java | 6 +++--- .../main/java/com/formdev/flatlaf/ui/FlatTreeUI.java | 6 +++--- 49 files changed, 128 insertions(+), 128 deletions(-) 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 f6fb8d95..1d0caa2f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -790,7 +790,7 @@ public abstract class FlatLaf * @param valueType the expected value type, or {@code null} * @return the binary value * @throws IllegalArgumentException on syntax errors - * @since TODO + * @since 2 */ public static Object parseDefaultsValue( String key, String value, Class valueType ) throws IllegalArgumentException diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java index c849d107..5db34209 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCapsLockIcon.java @@ -41,7 +41,7 @@ public class FlatCapsLockIcon } /** - * @since TODO + * @since 2 */ public Object applyStyleProperty( String key, Object value ) { Object oldValue; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java index fff75272..7249c884 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java @@ -133,14 +133,14 @@ public class FlatCheckBoxIcon } /** - * @since TODO + * @since 2 */ public Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { return FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java index 837c7300..7e6e0279 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxMenuItemIcon.java @@ -50,14 +50,14 @@ public class FlatCheckBoxMenuItemIcon } /** - * @since TODO + * @since 2 */ public Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { return FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java index 63e01983..f0e7590c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatClearIcon.java @@ -52,14 +52,14 @@ public class FlatClearIcon } /** - * @since TODO + * @since 2 */ public Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { return FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java index 742c9d0b..f4f62d1c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java @@ -75,14 +75,14 @@ public class FlatHelpButtonIcon } /** - * @since TODO + * @since 2 */ public Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { return FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java index 7581fa21..b346820e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java @@ -52,14 +52,14 @@ public class FlatMenuArrowIcon } /** - * @since TODO + * @since 2 */ public Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { return FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java index 9719adb7..0549b813 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatSearchIcon.java @@ -50,14 +50,14 @@ public class FlatSearchIcon } /** - * @since TODO + * @since 2 */ public Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { return FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java index eac04c4b..f93d71d3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java @@ -67,14 +67,14 @@ public class FlatTabbedPaneCloseIcon } /** - * @since TODO + * @since 2 */ public Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { return FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java index 9f59f30d..6fc774fd 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatArrowButton.java @@ -96,7 +96,7 @@ public class FlatArrowButton } /** - * @since TODO + * @since 2 */ public void updateStyle( String type, Color foreground, Color disabledForeground, Color hoverForeground, Color hoverBackground, Color pressedForeground, Color pressedBackground ) 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 index 31e6e66a..dccdffb5 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java @@ -81,7 +81,7 @@ public class FlatBorder @Styleable(dot=true) protected Color customBorderColor = UIManager.getColor( "Component.custom.borderColor" ); /** - * @since TODO + * @since 2 */ @Override public Object applyStyleProperty( String key, Object value ) { @@ -89,7 +89,7 @@ public class FlatBorder } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos() { 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 41f59437..cc2990d8 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 @@ -272,7 +272,7 @@ public class FlatButtonUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( AbstractButton b, Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, @@ -280,7 +280,7 @@ public class FlatButtonUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( AbstractButton b, String key, Object value ) { if( key.startsWith( "help." ) ) { @@ -302,7 +302,7 @@ public class FlatButtonUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java index ffd79d5c..b899d7b3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxMenuItemUI.java @@ -101,14 +101,14 @@ public class FlatCheckBoxMenuItemUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { try { @@ -121,7 +121,7 @@ public class FlatCheckBoxMenuItemUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java index 4153d5ff..5d6f5526 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatCheckBoxUI.java @@ -49,7 +49,7 @@ public class FlatCheckBoxUI } /** - * @since TODO + * @since 2 */ protected FlatCheckBoxUI( boolean shared ) { super( shared ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java index 1c84e96b..b4b975d4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java @@ -448,7 +448,7 @@ public class FlatComboBoxUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { Insets oldPadding = padding; @@ -469,7 +469,7 @@ public class FlatComboBoxUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { // BasicComboBoxUI @@ -485,7 +485,7 @@ public class FlatComboBoxUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java index 0e149fd2..2f8df4dc 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDropShadowBorder.java @@ -91,7 +91,7 @@ public class FlatDropShadowBorder } /** - * @since TODO + * @since 2 */ @Override public Object applyStyleProperty( String key, Object value ) { @@ -104,7 +104,7 @@ public class FlatDropShadowBorder } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos() { 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 da79771e..33a1a381 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 @@ -173,7 +173,7 @@ public class FlatEditorPaneUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldDisabledBackground = disabledBackground; @@ -185,14 +185,14 @@ public class FlatEditorPaneUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, getComponent(), key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java index f95e33ec..0faca855 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java @@ -153,14 +153,14 @@ public class FlatInternalFrameUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) @@ -169,7 +169,7 @@ public class FlatInternalFrameUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index 2fd98876..8877a7dd 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -73,7 +73,7 @@ public class FlatLabelUI } /** - * @since TODO + * @since 2 */ protected FlatLabelUI( boolean shared ) { this.shared = shared; @@ -138,7 +138,7 @@ public class FlatLabelUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( JLabel c, Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, @@ -146,14 +146,14 @@ public class FlatLabelUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( JLabel c, String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, c, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java index de0c02d0..1d9821b8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java @@ -160,7 +160,7 @@ public class FlatListUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { Color oldSelectionBackground = selectionBackground; @@ -190,14 +190,14 @@ public class FlatListUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, list, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java index dcd8b73a..6331e035 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarBorder.java @@ -41,7 +41,7 @@ public class FlatMenuBarBorder @Styleable protected Color borderColor = UIManager.getColor( "MenuBar.borderColor" ); /** - * @since TODO + * @since 2 */ @Override public Object applyStyleProperty( String key, Object value ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java index a8918ab0..eb04751f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java @@ -128,14 +128,14 @@ public class FlatMenuBarUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) @@ -144,7 +144,7 @@ public class FlatMenuBarUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java index e74d3d7d..1886d08d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemRenderer.java @@ -103,7 +103,7 @@ public class FlatMenuItemRenderer } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { // style icon @@ -151,7 +151,7 @@ public class FlatMenuItemRenderer } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { Map> infos = FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java index ba120a37..4d85b14b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemUI.java @@ -104,14 +104,14 @@ public class FlatMenuItemUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { try { @@ -139,7 +139,7 @@ public class FlatMenuItemUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index ce76c31c..0767e7d8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -149,14 +149,14 @@ public class FlatMenuUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { try { @@ -169,7 +169,7 @@ public class FlatMenuUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { 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 0680fde1..9e90ecde 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 @@ -162,7 +162,7 @@ public class FlatPasswordFieldUI } /** - * @since TODO + * @since 2 */ @Override protected Object applyStyleProperty( String key, Object value ) { @@ -178,7 +178,7 @@ public class FlatPasswordFieldUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java index 3c424f09..8367a97f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuBorder.java @@ -48,7 +48,7 @@ public class FlatPopupMenuBorder } /** - * @since TODO + * @since 2 */ @Override public Object applyStyleProperty( String key, Object value ) { @@ -61,7 +61,7 @@ public class FlatPopupMenuBorder } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java index 150566e8..87bf88ef 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuSeparatorUI.java @@ -45,7 +45,7 @@ public class FlatPopupMenuSeparatorUI } /** - * @since TODO + * @since 2 */ protected FlatPopupMenuSeparatorUI( boolean shared ) { super( shared ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java index a5d56cbf..7bcea2fa 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupMenuUI.java @@ -81,14 +81,14 @@ public class FlatPopupMenuUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) @@ -97,7 +97,7 @@ public class FlatPopupMenuUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java index 357e9b14..04178b39 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatProgressBarUI.java @@ -130,21 +130,21 @@ public class FlatProgressBarUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, progressBar, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java index bbcc8ecf..0510ba3b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonMenuItemUI.java @@ -101,14 +101,14 @@ public class FlatRadioButtonMenuItemUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { try { @@ -121,7 +121,7 @@ public class FlatRadioButtonMenuItemUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 04032808..73ea534e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -82,7 +82,7 @@ public class FlatRadioButtonUI } /** - * @since TODO + * @since 2 */ protected FlatRadioButtonUI( boolean shared ) { this.shared = shared; @@ -133,7 +133,7 @@ public class FlatRadioButtonUI } /** - * @since TODO + * @since 2 */ protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) { switch( e.getPropertyName() ) { @@ -156,7 +156,7 @@ public class FlatRadioButtonUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( AbstractButton b, Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, @@ -164,7 +164,7 @@ public class FlatRadioButtonUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( AbstractButton b, String key, Object value ) { // style icon @@ -185,7 +185,7 @@ public class FlatRadioButtonUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { @@ -286,7 +286,7 @@ public class FlatRadioButtonUI //---- class FlatRadioButtonListener -------------------------------------- /** - * @since TODO + * @since 2 */ protected class FlatRadioButtonListener extends BasicButtonListener diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java index ec04d4bd..3c83968c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollBarUI.java @@ -221,7 +221,7 @@ public class FlatScrollBarUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); @@ -233,7 +233,7 @@ public class FlatScrollBarUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { Object oldValue; @@ -250,7 +250,7 @@ public class FlatScrollBarUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java index 5ccff5a9..1b46ef38 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java @@ -302,14 +302,14 @@ public class FlatScrollPaneUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { if( key.equals( "focusWidth" ) ) { @@ -323,7 +323,7 @@ public class FlatScrollPaneUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index 97820f84..4712d058 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -68,7 +68,7 @@ public class FlatSeparatorUI } /** - * @since TODO + * @since 2 */ protected FlatSeparatorUI( boolean shared ) { this.shared = shared; @@ -137,7 +137,7 @@ public class FlatSeparatorUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( JSeparator s, Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, @@ -145,14 +145,14 @@ public class FlatSeparatorUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( JSeparator s, String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, s, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index 30f71e99..bd4c266b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -191,21 +191,21 @@ public class FlatSliderUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, slider, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index 4706c540..1431ba24 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -191,7 +191,7 @@ public class FlatSpinnerUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); @@ -200,7 +200,7 @@ public class FlatSpinnerUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) @@ -209,7 +209,7 @@ public class FlatSpinnerUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 7761f00b..1eb62027 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -139,7 +139,7 @@ public class FlatSplitPaneUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); @@ -149,7 +149,7 @@ public class FlatSplitPaneUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { try { @@ -162,7 +162,7 @@ public class FlatSplitPaneUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { @@ -190,14 +190,14 @@ public class FlatSplitPaneUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ public Map> getStyleableInfos() { return FlatStylingSupport.getAnnotatedStyleableInfos( this ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java index 65c86903..c3adab67 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java @@ -44,7 +44,7 @@ import com.formdev.flatlaf.util.SystemInfo; * Support for styling components in CSS syntax. * * @author Karl Tauber - * @since TODO + * @since 2 */ public class FlatStylingSupport { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index 8ae42c6a..a63bd555 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -573,7 +573,7 @@ public class FlatTabbedPaneUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); @@ -586,7 +586,7 @@ public class FlatTabbedPaneUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { // close icon @@ -630,7 +630,7 @@ public class FlatTabbedPaneUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index ff60f80e..2ef37e0b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java @@ -141,14 +141,14 @@ public class FlatTableHeaderUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { if( key.equals( "sortIconPosition" ) && value instanceof String ) @@ -158,7 +158,7 @@ public class FlatTableHeaderUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index b36e159b..4d2f43ab 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -236,7 +236,7 @@ public class FlatTableUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { Color oldSelectionBackground = selectionBackground; @@ -266,14 +266,14 @@ public class FlatTableUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, table, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { 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 39a70398..14b3f04b 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 @@ -147,7 +147,7 @@ public class FlatTextAreaUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldDisabledBackground = disabledBackground; @@ -159,14 +159,14 @@ public class FlatTextAreaUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, getComponent(), key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { 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 197c1810..f3fc6a58 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 @@ -203,7 +203,7 @@ public class FlatTextFieldUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldDisabledBackground = disabledBackground; @@ -215,7 +215,7 @@ public class FlatTextFieldUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { if( borderShared == null ) @@ -224,7 +224,7 @@ public class FlatTextFieldUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { 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 9e948f21..eadc6eda 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 @@ -155,7 +155,7 @@ public class FlatTextPaneUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldDisabledBackground = disabledBackground; @@ -167,14 +167,14 @@ public class FlatTextPaneUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, getComponent(), key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java index 7b102775..ef87d6bd 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToggleButtonUI.java @@ -147,7 +147,7 @@ public class FlatToggleButtonUI } /** - * @since TODO + * @since 2 */ @Override protected Object applyStyleProperty( AbstractButton b, String key, Object value ) { @@ -158,7 +158,7 @@ public class FlatToggleButtonUI } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java index 61a5f42a..daaf999a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java @@ -66,7 +66,7 @@ public class FlatToolBarSeparatorUI } /** - * @since TODO + * @since 2 */ protected FlatToolBarSeparatorUI( boolean shared ) { this.shared = shared; @@ -133,21 +133,21 @@ public class FlatToolBarSeparatorUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObject( this, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java index bb4e7547..da64ed28 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarUI.java @@ -137,7 +137,7 @@ public class FlatToolBarUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { boolean oldFocusableButtons = focusableButtons; @@ -149,14 +149,14 @@ public class FlatToolBarUI } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, toolBar, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java index 2f379add..503087e9 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java @@ -310,21 +310,21 @@ public class FlatTreeUI } /** - * @since TODO + * @since 2 */ protected void applyStyle( Object style ) { oldStyleValues = FlatStylingSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); } /** - * @since TODO + * @since 2 */ protected Object applyStyleProperty( String key, Object value ) { return FlatStylingSupport.applyToAnnotatedObjectOrComponent( this, tree, key, value ); } /** - * @since TODO + * @since 2 */ @Override public Map> getStyleableInfos( JComponent c ) { From 08ca2aa26664258a1b2af4d1be674f78e5f3d75d Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 6 Sep 2021 22:48:39 +0200 Subject: [PATCH 57/60] Styling: - support references in color functions - added test for using color functions in styling --- .../java/com/formdev/flatlaf/FlatLaf.java | 4 +- .../com/formdev/flatlaf/UIDefaultsLoader.java | 19 +++++ .../flatlaf/ui/FlatStylingSupport.java | 2 + .../formdev/flatlaf/ui/TestFlatStyling.java | 72 +++++++++++++++++++ .../themeeditor/FlatThemeFileEditor.java | 4 +- .../themeeditor/FlatDarkLaf.properties | 5 -- .../themeeditor/FlatLightLaf.properties | 5 -- 7 files changed, 99 insertions(+), 12 deletions(-) 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 1d0caa2f..d9589d19 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -32,6 +32,7 @@ import java.beans.PropertyChangeListener; import java.io.File; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; @@ -796,7 +797,8 @@ public abstract class FlatLaf throws IllegalArgumentException { // parse value - Object val = UIDefaultsLoader.parseValue( key, value, valueType ); + Object val = UIDefaultsLoader.parseValue( key, value, valueType, null, + v -> UIDefaultsLoader.resolveValueFromUIManager( v ), Collections.emptyList() ); // create actual value if lazy or active if( val instanceof LazyValue ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java index 7f157776..0edf48e4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -290,6 +290,25 @@ class UIDefaultsLoader return resolveValue( newValue, propertiesGetter ); } + static String resolveValueFromUIManager( String value ) { + if( !value.startsWith( PROPERTY_PREFIX ) ) + return value; + + String key = value.substring( PROPERTY_PREFIX.length() ); + Object newValue = UIManager.get( key ); + if( newValue == null ) + throw new IllegalArgumentException( "property '" + key + "' not found" ); + + // convert binary color to string + if( newValue instanceof Color ) { + Color color = (Color) newValue; + int alpha = color.getAlpha(); + return String.format( (alpha != 255) ? "#%06x%02x" : "#%06x", color.getRGB() & 0xffffff, alpha ); + } + + throw new IllegalArgumentException( "property value type '" + newValue.getClass().getName() + "' not supported in references" ); + } + enum ValueType { UNKNOWN, STRING, BOOLEAN, CHARACTER, INTEGER, FLOAT, BORDER, ICON, INSETS, DIMENSION, COLOR, SCALEDINTEGER, SCALEDFLOAT, SCALEDINSETS, SCALEDDIMENSION, INSTANCE, CLASS, GRAYFILTER, NULL, LAZY } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java index c3adab67..d66657e3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java @@ -191,6 +191,7 @@ public class FlatStylingSupport } private static Object parseValue( String key, String value ) { + // simple reference if( value.startsWith( "$" ) ) return UIManager.get( value.substring( 1 ) ); @@ -199,6 +200,7 @@ public class FlatStylingSupport if( key.startsWith( "[" ) ) key = key.substring( key.indexOf( ']' ) + 1 ); + // parse string return FlatLaf.parseDefaultsValue( key, value, null ); } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 8d36fdfc..5f3b99cd 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -19,6 +19,7 @@ package com.formdev.flatlaf.ui; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import java.awt.Color; +import java.awt.Dimension; import java.awt.Insets; import java.util.HashMap; import java.util.Map; @@ -64,6 +65,77 @@ public class TestFlatStyling FlatStylingSupport.parse( "background: #fff; foreground: #000; someWidth: 20" ) ); } + @Test + void parseColorFunctions() { + testColorStyle( 0x0c2238, "rgb(12,34,56)" ); + testColorStyle( 0x4e0c2238, "rgba(12,34,56,78)" ); + testColorStyle( 0xb57869, "hsl(12,34%,56%)" ); + testColorStyle( 0xc7b57869, "hsla(12,34%,56%,78%)" ); + + testColorStyle( 0xff6666, "lighten(#f00,20%)" ); + testColorStyle( 0x990000, "darken(#f00,20%)" ); + + testColorStyle( 0x9c3030, "saturate(#844,20%)" ); + testColorStyle( 0x745858, "desaturate(#844,20%)" ); + + testColorStyle( 0x4dff0000, "fadein(#ff000000,30%)" ); + testColorStyle( 0x99ff0000, "fadeout(#ff0000,40%)" ); + testColorStyle( 0x80ff0000, "fade(#ff0000,50%)" ); + + testColorStyle( 0xffaa00, "spin(#f00,40)" ); + testColorStyle( 0xff00aa, "spin(#f00,-40)" ); + + testColorStyle( 0x00ffff, "changeHue(#f00,180)" ); + testColorStyle( 0xbf4040, "changeSaturation(#f00,50%)" ); + testColorStyle( 0xff9999, "changeLightness(#f00,80%)" ); + testColorStyle( 0x80ff0000, "changeAlpha(#f00,50%)" ); + + testColorStyle( 0x1ae600, "mix(#f00,#0f0,10%)" ); + testColorStyle( 0x40bf00, "mix(#f00,#0f0,25%)" ); + testColorStyle( 0x808000, "mix(#f00,#0f0)" ); + testColorStyle( 0xbf4000, "mix(#f00,#0f0,75%)" ); + testColorStyle( 0xe61a00, "mix(#f00,#0f0,90%)" ); + + testColorStyle( 0xff40ff, "tint(#f0f,25%)" ); + testColorStyle( 0xff80ff, "tint(#f0f)" ); + testColorStyle( 0xffbfff, "tint(#f0f,75%)" ); + + testColorStyle( 0xbf00bf, "shade(#f0f,25%)" ); + testColorStyle( 0x800080, "shade(#f0f)" ); + testColorStyle( 0x400040, "shade(#f0f,75%)" ); + + // nested + testColorStyle( 0xd1c7c7, "saturate(darken(#fff,20%),10%)" ); + testColorStyle( 0xcf00cf, "shade(shade(#f0f,10%),10%)" ); + testColorStyle( 0xba00ba, "shade(shade(shade(#f0f,10%),10%),10%)" ); + } + + @Test + void parseReferences() { + assertEquals( Color.white, UIManager.getColor( "TextField.background" ) ); + + testColorStyle( 0xffffff, "$TextField.background" ); + testColorStyle( 0xcccccc, "darken($TextField.background,20%)" ); + testColorStyle( 0xd1c7c7, "saturate(darken($TextField.background,20%),10%)" ); + + testStyle( "hideMnemonics", true, "$Component.hideMnemonics" ); + testStyle( "arc", 6, "$Button.arc" ); + testStyle( "dropShadowOpacity", 0.15f, "$Popup.dropShadowOpacity" ); + testStyle( "margin", new Insets( 2, 14, 2, 14 ) , "$Button.margin" ); + testStyle( "iconSize", new Dimension( 64, 64 ), "$DesktopIcon.iconSize" ); + testStyle( "arrowType", "chevron", "$Component.arrowType" ); + } + + private void testColorStyle( int expectedRGB, String style ) { + testStyle( "background", new Color( expectedRGB, (expectedRGB & 0xff000000) != 0 ), style ); + } + + private void testStyle( String key, Object expected, String style ) { + assertEquals( + expectedMap( key, expected ), + FlatStylingSupport.parse( key + ": " + style ) ); + } + private Map expectedMap( Object... keyValuePairs ) { Map map = new HashMap<>(); for( int i = 0; i < keyValuePairs.length; i += 2 ) diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java index 14a3d253..b86fa60e 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java @@ -131,7 +131,9 @@ class FlatThemeFileEditor darkLafMenuItem.setSelected( true ); // highlight selected tab - tabbedPane.setStyle( "[light]selectedBackground: #fff; [dark]selectedBackground: #303234" ); + tabbedPane.setStyle( + "[light]selectedBackground: lighten($TabbedPane.background,5%);" + + " [dark]selectedBackground: darken($TabbedPane.background,5%)" ); // add "+" button to tabbed pane newButton = new JButton( new FlatSVGIcon( "com/formdev/flatlaf/themeeditor/icons/add.svg" ) ); diff --git a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatDarkLaf.properties b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatDarkLaf.properties index 04e68e5d..d274c2e0 100644 --- a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatDarkLaf.properties +++ b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatDarkLaf.properties @@ -14,11 +14,6 @@ # limitations under the License. # -#---- TabbedPane ---- - -#TabbedPane.selectedBackground = darken($TabbedPane.background,5%) - - #---- FlatThemeEditorPane ---- FlatThemeEditorPane.background = #2b2b2b diff --git a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLightLaf.properties b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLightLaf.properties index d84c0966..0678c339 100644 --- a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLightLaf.properties +++ b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLightLaf.properties @@ -14,11 +14,6 @@ # limitations under the License. # -#---- TabbedPane ---- - -#TabbedPane.selectedBackground = lighten($TabbedPane.background,5%) - - #---- FlatThemeEditorPane ---- FlatThemeEditorPane.background = #fff From e0dddfceba0273dbc1f694a53ae6e522c7eb86f4 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 8 Sep 2021 14:55:41 +0200 Subject: [PATCH 58/60] Styling: Menu: support top-level underline selection --- .../com/formdev/flatlaf/ui/FlatMenuBarUI.java | 11 ++++ .../flatlaf/ui/FlatMenuItemBorder.java | 19 +++++-- .../com/formdev/flatlaf/ui/FlatMenuUI.java | 51 ++++++++++++------- .../flatlaf/ui/TestFlatStyleableInfo.java | 6 +++ .../formdev/flatlaf/ui/TestFlatStyling.java | 6 +++ 5 files changed, 69 insertions(+), 24 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java index eb04751f..39fb218b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuBarUI.java @@ -18,6 +18,7 @@ package com.formdev.flatlaf.ui; import java.awt.Color; import java.awt.Graphics; +import java.awt.Insets; import java.awt.Window; import java.awt.event.ActionEvent; import java.beans.PropertyChangeListener; @@ -40,6 +41,7 @@ import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicMenuBarUI; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable; import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.util.SystemInfo; @@ -63,6 +65,15 @@ public class FlatMenuBarUI extends BasicMenuBarUI implements StyleableUI { + // used in FlatMenuItemBorder + /** @since 2 */ @Styleable protected Insets itemMargins; + + // used in FlatMenuUI + /** @since 2 */ @Styleable protected Color hoverBackground; + /** @since 2 */ @Styleable protected Color underlineSelectionBackground; + /** @since 2 */ @Styleable protected Color underlineSelectionColor; + /** @since 2 */ @Styleable protected int underlineSelectionHeight = -1; + private PropertyChangeListener propertyChangeListener; private Map oldStyleValues; private AtomicBoolean borderShared; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemBorder.java index aa8079a6..108371ec 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuItemBorder.java @@ -18,9 +18,11 @@ package com.formdev.flatlaf.ui; import static com.formdev.flatlaf.util.UIScale.scale; import java.awt.Component; +import java.awt.Container; import java.awt.Insets; import javax.swing.JMenuBar; import javax.swing.UIManager; +import javax.swing.plaf.MenuBarUI; /** * Border for {@link javax.swing.JMenu}, {@link javax.swing.JMenuItem}, @@ -33,15 +35,22 @@ import javax.swing.UIManager; public class FlatMenuItemBorder extends FlatMarginBorder { + // only used if parent menubar is not a instance of FlatMenuBarUI private final Insets menuBarItemMargins = UIManager.getInsets( "MenuBar.itemMargins" ); @Override public Insets getBorderInsets( Component c, Insets insets ) { - if( c.getParent() instanceof JMenuBar ) { - insets.top = scale( menuBarItemMargins.top ); - insets.left = scale( menuBarItemMargins.left ); - insets.bottom = scale( menuBarItemMargins.bottom ); - insets.right = scale( menuBarItemMargins.right ); + Container parent = c.getParent(); + if( parent instanceof JMenuBar ) { + // get margins from FlatMenuBarUI to allow styling + MenuBarUI ui = ((JMenuBar)parent).getUI(); + Insets margins = (ui instanceof FlatMenuBarUI && ((FlatMenuBarUI)ui).itemMargins != null) + ? ((FlatMenuBarUI)ui).itemMargins + : this.menuBarItemMargins; + insets.top = scale( margins.top ); + insets.left = scale( margins.left ); + insets.bottom = scale( margins.bottom ); + insets.right = scale( margins.right ); return insets; } else return super.getBorderInsets( c, insets ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java index 0767e7d8..edf94112 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatMenuUI.java @@ -23,15 +23,18 @@ import java.awt.Graphics; import java.awt.event.MouseEvent; import java.beans.PropertyChangeListener; import java.util.Map; +import java.util.function.Function; import javax.swing.ButtonModel; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JMenu; +import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.LookAndFeel; import javax.swing.UIManager; import javax.swing.event.MouseInputListener; import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.MenuBarUI; import javax.swing.plaf.basic.BasicMenuUI; import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; @@ -64,10 +67,10 @@ import com.formdev.flatlaf.ui.FlatStylingSupport.UnknownStyleException; * * * @uiDefault MenuItem.iconTextGap int - * @uiDefault MenuBar.hoverBackground Color * * * + * @uiDefault MenuBar.hoverBackground Color * @uiDefault MenuBar.underlineSelectionBackground Color * @uiDefault MenuBar.underlineSelectionColor Color * @uiDefault MenuBar.underlineSelectionHeight int @@ -78,7 +81,6 @@ public class FlatMenuUI extends BasicMenuUI implements StyleableUI { - private Color hoverBackground; private FlatMenuItemRenderer renderer; private Map oldStyleValues; @@ -101,7 +103,6 @@ public class FlatMenuUI menuItem.setRolloverEnabled( true ); - hoverBackground = UIManager.getColor( "MenuBar.hoverBackground" ); renderer = createRenderer(); } @@ -109,7 +110,6 @@ public class FlatMenuUI protected void uninstallDefaults() { super.uninstallDefaults(); - hoverBackground = null; renderer = null; oldStyleValues = null; } @@ -200,9 +200,10 @@ public class FlatMenuUI protected class FlatMenuRenderer extends FlatMenuItemRenderer { - protected final Color menuBarUnderlineSelectionBackground = FlatUIUtils.getUIColor( "MenuBar.underlineSelectionBackground", underlineSelectionBackground ); - protected final Color menuBarUnderlineSelectionColor = FlatUIUtils.getUIColor( "MenuBar.underlineSelectionColor", underlineSelectionColor ); - protected final int menuBarUnderlineSelectionHeight = FlatUIUtils.getUIInt( "MenuBar.underlineSelectionHeight", underlineSelectionHeight ); + protected Color hoverBackground = UIManager.getColor( "MenuBar.hoverBackground" ); + protected Color menuBarUnderlineSelectionBackground = FlatUIUtils.getUIColor( "MenuBar.underlineSelectionBackground", underlineSelectionBackground ); + protected Color menuBarUnderlineSelectionColor = FlatUIUtils.getUIColor( "MenuBar.underlineSelectionColor", underlineSelectionColor ); + protected int menuBarUnderlineSelectionHeight = FlatUIUtils.getUIInt( "MenuBar.underlineSelectionHeight", underlineSelectionHeight ); protected FlatMenuRenderer( JMenuItem menuItem, Icon checkIcon, Icon arrowIcon, Font acceleratorFont, String acceleratorDelimiter ) @@ -212,27 +213,39 @@ public class FlatMenuUI @Override protected void paintBackground( Graphics g, Color selectionBackground ) { - if( isUnderlineSelection() && ((JMenu)menuItem).isTopLevelMenu() ) - selectionBackground = menuBarUnderlineSelectionBackground; + if( ((JMenu)menuItem).isTopLevelMenu() ) { + if( isUnderlineSelection() ) + selectionBackground = getStyleFromMenuBarUI( ui -> ui.underlineSelectionBackground, menuBarUnderlineSelectionBackground ); - ButtonModel model = menuItem.getModel(); - if( model.isRollover() && !model.isArmed() && !model.isSelected() && - model.isEnabled() && ((JMenu)menuItem).isTopLevelMenu() ) - { - g.setColor( deriveBackground( hoverBackground ) ); - g.fillRect( 0, 0, menuItem.getWidth(), menuItem.getHeight() ); - } else - super.paintBackground( g, selectionBackground ); + ButtonModel model = menuItem.getModel(); + if( model.isRollover() && !model.isArmed() && !model.isSelected() && model.isEnabled() ) { + g.setColor( deriveBackground( getStyleFromMenuBarUI( ui -> ui.hoverBackground, hoverBackground ) ) ); + g.fillRect( 0, 0, menuItem.getWidth(), menuItem.getHeight() ); + return; + } + } + + super.paintBackground( g, selectionBackground ); } @Override protected void paintUnderlineSelection( Graphics g, Color underlineSelectionColor, int underlineSelectionHeight ) { if( ((JMenu)menuItem).isTopLevelMenu() ) { - underlineSelectionColor = menuBarUnderlineSelectionColor; - underlineSelectionHeight = menuBarUnderlineSelectionHeight; + underlineSelectionColor = getStyleFromMenuBarUI( ui -> ui.underlineSelectionColor, menuBarUnderlineSelectionColor ); + underlineSelectionHeight = getStyleFromMenuBarUI( ui -> (ui.underlineSelectionHeight != -1) + ? ui.underlineSelectionHeight : null, menuBarUnderlineSelectionHeight ); } super.paintUnderlineSelection( g, underlineSelectionColor, underlineSelectionHeight ); } + + private T getStyleFromMenuBarUI( Function f, T defaultValue ) { + MenuBarUI ui = ((JMenuBar)menuItem.getParent()).getUI(); + if( !(ui instanceof FlatMenuBarUI) ) + return defaultValue; + + T value = f.apply( (FlatMenuBarUI) ui ); + return (value != null) ? value : defaultValue; + } } } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java index 46da6a99..55ec6d4d 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java @@ -264,6 +264,12 @@ public class TestFlatStyleableInfo FlatMenuBarUI ui = (FlatMenuBarUI) c.getUI(); Map> expected = expectedMap( + "itemMargins", Insets.class, + "hoverBackground", Color.class, + "underlineSelectionBackground", Color.class, + "underlineSelectionColor", Color.class, + "underlineSelectionHeight", int.class, + // FlatMenuBarBorder "borderColor", Color.class ); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 5f3b99cd..6b819dec 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -362,6 +362,12 @@ public class TestFlatStyling JMenuBar c = new JMenuBar(); FlatMenuBarUI ui = (FlatMenuBarUI) c.getUI(); + ui.applyStyle( "itemMargins: 1,2,3,4" ); + ui.applyStyle( "hoverBackground: #fff" ); + ui.applyStyle( "underlineSelectionBackground: #fff" ); + ui.applyStyle( "underlineSelectionColor: #fff" ); + ui.applyStyle( "underlineSelectionHeight: 3" ); + // FlatMenuBarBorder ui.applyStyle( "borderColor: #fff" ); From ccd0597b35cc6234fb4fc672f1243498a6b5608d Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 14 Sep 2021 22:43:44 +0200 Subject: [PATCH 59/60] Styling: support styling for recently merged changes --- .../java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java | 6 ++++++ .../main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java | 1 + .../src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java | 2 +- .../java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java | 2 ++ .../test/java/com/formdev/flatlaf/ui/TestFlatStyling.java | 2 ++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java index 7e554dce..30f7a06b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderBorder.java @@ -139,6 +139,12 @@ public class FlatTableHeaderBorder } protected boolean hideTrailingVerticalLine( JTableHeader header ) { + if( header.getUI() instanceof FlatTableHeaderUI ) { + FlatTableHeaderUI ui = (FlatTableHeaderUI) header.getUI(); + if( ui.showTrailingVerticalLine ) + return false; + } + if( showTrailingVerticalLine ) return false; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java index 663e2fca..d0b15bcf 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableHeaderUI.java @@ -86,6 +86,7 @@ public class FlatTableHeaderUI // for FlatTableHeaderBorder @Styleable protected Insets cellMargins; @Styleable protected Color separatorColor; + /** @since 2 */ @Styleable protected boolean showTrailingVerticalLine; // for FlatAscendingSortIcon and FlatDescendingSortIcon // (needs to be public because icon classes are in another package) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index 16ade184..c45507d0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -98,7 +98,7 @@ public class FlatTableUI { protected boolean showHorizontalLines; protected boolean showVerticalLines; - /** @since 1.6 */ protected boolean showTrailingVerticalLine; + /** @since 1.6 */ @Styleable protected boolean showTrailingVerticalLine; protected Dimension intercellSpacing; @Styleable protected Color selectionBackground; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java index 55ec6d4d..24a0545a 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java @@ -708,6 +708,7 @@ public class TestFlatStyleableInfo FlatTableUI ui = (FlatTableUI) c.getUI(); Map> expected = expectedMap( + "showTrailingVerticalLine", boolean.class, "selectionBackground", Color.class, "selectionForeground", Color.class, "selectionInactiveBackground", Color.class, @@ -735,6 +736,7 @@ public class TestFlatStyleableInfo // FlatTableHeaderBorder "cellMargins", Insets.class, "separatorColor", Color.class, + "showTrailingVerticalLine", boolean.class, // FlatAscendingSortIcon and FlatDescendingSortIcon "arrowType", String.class, diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 6b819dec..8f458c99 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -806,6 +806,7 @@ public class TestFlatStyling JTable c = new JTable(); FlatTableUI ui = (FlatTableUI) c.getUI(); + ui.applyStyle( "showTrailingVerticalLine: true" ); ui.applyStyle( "selectionBackground: #fff" ); ui.applyStyle( "selectionForeground: #fff" ); ui.applyStyle( "selectionInactiveBackground: #fff" ); @@ -841,6 +842,7 @@ public class TestFlatStyling // FlatTableHeaderBorder ui.applyStyle( "cellMargins: 1,2,3,4" ); ui.applyStyle( "separatorColor: #fff" ); + ui.applyStyle( "showTrailingVerticalLine: true" ); // FlatAscendingSortIcon and FlatDescendingSortIcon ui.applyStyle( "arrowType: chevron" ); From 560ec437b9f8f6f393ee3211f416afda6706fde2 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 15 Sep 2021 10:57:52 +0200 Subject: [PATCH 60/60] Styling: avoid duplicate applying styles to buttons, labels and separators (which use shared UI delegates) --- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 22 +++++++-------- .../com/formdev/flatlaf/ui/FlatLabelUI.java | 27 +++++++++---------- .../formdev/flatlaf/ui/FlatRadioButtonUI.java | 22 +++++++-------- .../formdev/flatlaf/ui/FlatSeparatorUI.java | 9 +++---- .../flatlaf/ui/FlatToolBarSeparatorUI.java | 9 +++---- 5 files changed, 38 insertions(+), 51 deletions(-) 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 cc2990d8..a171cfe2 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 @@ -254,23 +254,19 @@ public class FlatButtonUI break; case STYLE: - applyStyle( b, this, e.getNewValue() ); + Object style = e.getNewValue(); + if( style != null && shared ) { + // unshare component UI if necessary + // updateUI() invokes applyStyle() from installUI() + b.updateUI(); + } else + applyStyle( b, style ); + b.revalidate(); + b.repaint(); break; } } - private static void applyStyle( AbstractButton b, FlatButtonUI ui, Object style ) { - // unshare component UI if necessary - if( style != null && ui.shared ) { - b.updateUI(); - ui = (FlatButtonUI) b.getUI(); - } - - ui.applyStyle( b, style ); - b.revalidate(); - b.repaint(); - } - /** * @since 2 */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index 8877a7dd..6334cd6e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -119,24 +119,21 @@ public class FlatLabelUI if( name == "text" || name == "font" || name == "foreground" ) { JLabel label = (JLabel) e.getSource(); updateHTMLRenderer( label, label.getText(), true ); - } else if( name.equals( FlatClientProperties.STYLE ) ) - applyStyle( (JLabel) e.getSource(), this, e.getNewValue() ); - else + } else if( name.equals( FlatClientProperties.STYLE ) ) { + JLabel label = (JLabel) e.getSource(); + Object style = e.getNewValue(); + if( style != null && shared ) { + // unshare component UI if necessary + // updateUI() invokes applyStyle() from installUI() + label.updateUI(); + } else + applyStyle( label, style ); + label.revalidate(); + label.repaint(); + } else super.propertyChange( e ); } - private static void applyStyle( JLabel c, FlatLabelUI ui, Object style ) { - // unshare component UI if necessary - if( style != null && ui.shared ) { - c.updateUI(); - ui = (FlatLabelUI) c.getUI(); - } - - ui.applyStyle( c, style ); - c.revalidate(); - c.repaint(); - } - /** * @since 2 */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java index 73ea534e..642e09a0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatRadioButtonUI.java @@ -138,23 +138,19 @@ public class FlatRadioButtonUI protected void propertyChange( AbstractButton b, PropertyChangeEvent e ) { switch( e.getPropertyName() ) { case FlatClientProperties.STYLE: - applyStyle( b, this, e.getNewValue() ); + Object style = e.getNewValue(); + if( style != null && shared ) { + // unshare component UI if necessary + // updateUI() invokes applyStyle() from installUI() + b.updateUI(); + } else + applyStyle( b, style ); + b.revalidate(); + b.repaint(); break; } } - private static void applyStyle( AbstractButton b, FlatRadioButtonUI ui, Object style ) { - // unshare component UI if necessary - if( style != null && ui.shared ) { - b.updateUI(); - ui = (FlatRadioButtonUI) b.getUI(); - } - - ui.applyStyle( b, style ); - b.revalidate(); - b.repaint(); - } - /** * @since 2 */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java index 4712d058..8310e59e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSeparatorUI.java @@ -125,13 +125,12 @@ public class FlatSeparatorUI } private static void applyStyle( JSeparator s, FlatSeparatorUI ui, Object style ) { - // unshare component UI if necessary if( style != null && ui.shared ) { + // unshare component UI if necessary + // updateUI() invokes applyStyle() from installUI() s.updateUI(); - ui = (FlatSeparatorUI) s.getUI(); - } - - ui.applyStyle( s, style ); + } else + ui.applyStyle( s, style ); s.revalidate(); s.repaint(); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java index daaf999a..31881e2b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatToolBarSeparatorUI.java @@ -121,13 +121,12 @@ public class FlatToolBarSeparatorUI } private static void applyStyle( JSeparator s, FlatToolBarSeparatorUI ui, Object style ) { - // unshare component UI if necessary if( style != null && ui.shared ) { + // unshare component UI if necessary + // updateUI() invokes applyStyle() from installUI() s.updateUI(); - ui = (FlatToolBarSeparatorUI) s.getUI(); - } - - ui.applyStyle( style ); + } else + ui.applyStyle( style ); s.revalidate(); s.repaint(); }