From 93b82c0e97172f17fb3b53e6bb691bc7cf4bd92f Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 27 Mar 2020 23:21:55 +0100 Subject: [PATCH] FlatDefaultsAddon: added afterDefaultsLoading() method to allow modification of UI defaults by Addons --- .../formdev/flatlaf/FlatDefaultsAddon.java | 9 ++++++++ .../java/com/formdev/flatlaf/FlatLaf.java | 17 ++++++++++++-- .../com/formdev/flatlaf/UIDefaultsLoader.java | 22 ++++++++----------- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatDefaultsAddon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatDefaultsAddon.java index 4e469d8f..1737d8e3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatDefaultsAddon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatDefaultsAddon.java @@ -17,6 +17,8 @@ package com.formdev.flatlaf; import java.io.InputStream; +import javax.swing.LookAndFeel; +import javax.swing.UIDefaults; /** * Addon for FlatLaf UI defaults. @@ -50,6 +52,13 @@ public abstract class FlatDefaultsAddon return addonClass.getResourceAsStream( propertiesName ); } + /** + * Allows modifying UI defaults after loading UI defaults. + * The default implementation does nothing. + */ + public void afterDefaultsLoading( LookAndFeel laf, UIDefaults defaults ) { + } + /** * Returns the priority used to sort addon loading. * The order is only important if you want overwrite UI defaults of other addons. 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 55a8f087..1f11462b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -31,8 +31,10 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.ServiceLoader; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; @@ -266,12 +268,19 @@ public abstract class FlatLaf initIconColors( defaults, isDark() ); FlatInputMaps.initInputMaps( defaults ); + // get addons and sort them by priority + ServiceLoader addonLoader = ServiceLoader.load( FlatDefaultsAddon.class ); + List addons = new ArrayList<>(); + for( FlatDefaultsAddon addon : addonLoader ) + addons.add( addon ); + addons.sort( (addon1, addon2) -> addon1.getPriority() - addon2.getPriority() ); + // load defaults from properties List> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading(); if( lafClassesForDefaultsLoading != null ) - UIDefaultsLoader.loadDefaultsFromProperties( lafClassesForDefaultsLoading, defaults ); + UIDefaultsLoader.loadDefaultsFromProperties( lafClassesForDefaultsLoading, addons, defaults ); else - UIDefaultsLoader.loadDefaultsFromProperties( getClass(), defaults ); + UIDefaultsLoader.loadDefaultsFromProperties( getClass(), addons, defaults ); // use Aqua MenuBarUI if Mac screen menubar is enabled if( SystemInfo.IS_MAC && Boolean.getBoolean( "apple.laf.useScreenMenuBar" ) ) @@ -283,6 +292,10 @@ public abstract class FlatLaf // apply additional defaults (e.g. from IntelliJ themes) applyAdditionalDefaults( defaults ); + // allow addons modifying UI defaults + for( FlatDefaultsAddon addon : addons ) + addon.afterDefaultsLoading( this, defaults ); + if( postInitialization != null ) { postInitialization.accept( defaults ); postInitialization = null; 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 d19e0966..cc508fe2 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -28,7 +28,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Properties; -import java.util.ServiceLoader; import java.util.function.Function; import java.util.logging.Level; import javax.swing.UIDefaults; @@ -69,7 +68,9 @@ class UIDefaultsLoader private static final String OPTIONAL_PREFIX = "?"; private static final String GLOBAL_PREFIX = "*."; - static void loadDefaultsFromProperties( Class lookAndFeelClass, UIDefaults defaults ) { + static void loadDefaultsFromProperties( Class lookAndFeelClass, List addons, + UIDefaults defaults ) + { // determine classes in class hierarchy in reverse order ArrayList> lafClasses = new ArrayList<>(); for( Class lafClass = lookAndFeelClass; @@ -79,10 +80,12 @@ class UIDefaultsLoader lafClasses.add( 0, lafClass ); } - loadDefaultsFromProperties( lafClasses, defaults ); + loadDefaultsFromProperties( lafClasses, addons, defaults ); } - static void loadDefaultsFromProperties( List> lafClasses, UIDefaults defaults ) { + static void loadDefaultsFromProperties( List> lafClasses, List addons, + UIDefaults defaults ) + { try { // load core properties files Properties properties = new Properties(); @@ -94,15 +97,8 @@ class UIDefaultsLoader } } - // get addons and sort them by priority - ServiceLoader addonLoader = ServiceLoader.load( FlatDefaultsAddon.class ); - List addonList = new ArrayList<>(); - for( FlatDefaultsAddon addon : addonLoader ) - addonList.add( addon ); - addonList.sort( (addon1, addon2) -> addon1.getPriority() - addon2.getPriority() ); - // load properties from addons - for( FlatDefaultsAddon addon : addonList ) { + for( FlatDefaultsAddon addon : addons ) { for( Class lafClass : lafClasses ) { try( InputStream in = addon.getDefaults( lafClass ) ) { if( in != null ) @@ -113,7 +109,7 @@ class UIDefaultsLoader // collect addon class loaders List addonClassLoaders = new ArrayList<>(); - for( FlatDefaultsAddon addon : addonList ) { + for( FlatDefaultsAddon addon : addons ) { ClassLoader addonClassLoader = addon.getClass().getClassLoader(); if( !addonClassLoaders.contains( addonClassLoader ) ) addonClassLoaders.add( addonClassLoader );