From 09d8d09aad0fb3b821328c1261b9383c9f205e57 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 10 Dec 2021 23:14:19 +0100 Subject: [PATCH] Theme Editor: Preview: support usage of variables in styles --- .../com/formdev/flatlaf/UIDefaultsLoader.java | 2 +- .../flatlaf/UIDefaultsLoaderAccessor.java | 2 + .../flatlaf/themeeditor/FlatThemePreview.java | 44 +++++++++++++++++++ .../FlatThemePropertiesSupport.java | 2 +- .../theme-editor-test.properties | 5 +++ 5 files changed, 53 insertions(+), 2 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 c9a3c480..8e641c95 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -80,7 +80,7 @@ class UIDefaultsLoader private static final String OPTIONAL_PREFIX = "?"; private static final String WILDCARD_PREFIX = "*."; - private static final String KEY_VARIABLES = "FlatLaf.internal.variables"; + static final String KEY_VARIABLES = "FlatLaf.internal.variables"; private static int parseColorDepth; 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 d6b35f90..af0ce531 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 @@ -27,6 +27,8 @@ import com.formdev.flatlaf.UIDefaultsLoader.ValueType; */ public class UIDefaultsLoaderAccessor { + public static final String KEY_VARIABLES = UIDefaultsLoader.KEY_VARIABLES; + public static Object UNKNOWN = ValueType.UNKNOWN; public static Object STRING = ValueType.STRING; public static Object BOOLEAN = ValueType.BOOLEAN; diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemePreview.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemePreview.java index 0c2f0026..ca004201 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemePreview.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemePreview.java @@ -19,6 +19,7 @@ package com.formdev.flatlaf.themeeditor; import java.awt.*; import java.awt.event.HierarchyEvent; +import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; import java.util.prefs.Preferences; @@ -28,6 +29,7 @@ import javax.swing.UIDefaults.LazyValue; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.UIDefaultsLoaderAccessor; import com.formdev.flatlaf.extras.components.*; /** @@ -51,6 +53,7 @@ class FlatThemePreview private final Map lazyValueCache = new WeakHashMap<>(); private int runWithUIDefaultsGetterLevel; private boolean inGetDefaultFont; + private boolean inGetVariables; FlatThemePreview( FlatSyntaxTextArea textArea ) { this.textArea = textArea; @@ -162,6 +165,7 @@ class FlatThemePreview } } + @SuppressWarnings( "unchecked" ) Object getUIDefaultProperty( Object key ) { // avoid StackOverflowError because "defaultFont" value is an active value // that itself uses UIManager.getFont( "defaultFont" ) to get base font @@ -176,6 +180,19 @@ class FlatThemePreview if( ((String)key).endsWith( "UI" ) ) return null; + // handle access to variables map, which is used in styles + if( UIDefaultsLoaderAccessor.KEY_VARIABLES.equals( key ) ) { + if( inGetVariables ) + return null; + + inGetVariables = true; + try { + return new VariablesDelegateMap( (Map) UIManager.get( UIDefaultsLoaderAccessor.KEY_VARIABLES ) ); + } finally { + inGetVariables = false; + } + } + Object value = textArea.propertiesSupport.getParsedProperty( (String) key ); boolean isDefaultFont = "defaultFont".equals( key ); @@ -341,4 +358,31 @@ class FlatThemePreview } } } + + //---- class VariablesDelegateMap ----------------------------------------- + + private class VariablesDelegateMap + extends HashMap + { + private final Map variables; + + public VariablesDelegateMap( Map variables ) { + this.variables = variables; + } + + @Override + public String get( Object key ) { + String value = textArea.propertiesSupport.getProperty( (String) key ); + if( value != null ) + return value; + + if( variables != null ) { + value = variables.get( key ); + if( value != null ) + return value; + } + + return super.get( key ); + } + } } diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemePropertiesSupport.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemePropertiesSupport.java index 636a049d..eb42fff7 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemePropertiesSupport.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemePropertiesSupport.java @@ -179,7 +179,7 @@ class FlatThemePropertiesSupport return getProperty( wildcardKey ); } - private String getProperty( String key ) { + String getProperty( String key ) { // look in current text area String value = getProperties().getProperty( key ); if( value != null ) diff --git a/flatlaf-theme-editor/theme-editor-test.properties b/flatlaf-theme-editor/theme-editor-test.properties index 7d75455b..52973641 100644 --- a/flatlaf-theme-editor/theme-editor-test.properties +++ b/flatlaf-theme-editor/theme-editor-test.properties @@ -117,3 +117,8 @@ Prop.6.selectionForeground = contrast($Prop.6.selectionBackground,#000,#fff) Prop.7.selectionBackground = #FF9500 Prop.7.selectionForeground = contrast($Prop.7.selectionBackground,#000,#fff) + + + +@varStyle1 = #f0f +[style].style1 = background: @varStyle1