diff --git a/CHANGELOG.md b/CHANGELOG.md index fc076af3..9d16d8ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ FlatLaf Change Log ## Unreleased +- Changed `.properties` file loading order: Now all core `.properties` files are + loaded before loading addon `.properties` files. This makes it easier to + overwrite core values in addons. Also, addon loading order can be specified. - TableHeader: Paint column borders if renderer has changed, but delegates to the system default renderer (e.g. done in NetBeans). 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 50a62554..4e469d8f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatDefaultsAddon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatDefaultsAddon.java @@ -45,8 +45,18 @@ public abstract class FlatDefaultsAddon */ public InputStream getDefaults( Class lafClass ) { Class addonClass = this.getClass(); - String propertiesName = "/" + addonClass.getPackage().getName().replace( '.', '/' ) + String propertiesName = '/' + addonClass.getPackage().getName().replace( '.', '/' ) + '/' + lafClass.getSimpleName() + ".properties"; return addonClass.getResourceAsStream( propertiesName ); } + + /** + * Returns the priority used to sort addon loading. + * The order is only important if you want overwrite UI defaults of other addons. + * Lower numbers mean higher priority. + * Returns 10000 by default. + */ + public int getPriority() { + return 10000; + } } 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 fc79c8cf..b82ae296 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -84,32 +84,41 @@ class UIDefaultsLoader static void loadDefaultsFromProperties( List> lafClasses, UIDefaults defaults ) { try { - List addonClassLoaders = new ArrayList<>(); - - // load properties files + // load core properties files Properties properties = new Properties(); - ServiceLoader addonLoader = ServiceLoader.load( FlatDefaultsAddon.class ); for( Class lafClass : lafClasses ) { - // load core properties - String propertiesName = "/" + lafClass.getName().replace( '.', '/' ) + ".properties"; + String propertiesName = '/' + lafClass.getName().replace( '.', '/' ) + ".properties"; try( InputStream in = lafClass.getResourceAsStream( propertiesName ) ) { if( in != null ) properties.load( in ); } + } - // load properties from addons - for( FlatDefaultsAddon addon : addonLoader ) { + // 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( Class lafClass : lafClasses ) { try( InputStream in = addon.getDefaults( lafClass ) ) { if( in != null ) properties.load( in ); } - - ClassLoader addonClassLoader = addon.getClass().getClassLoader(); - if( !addonClassLoaders.contains( addonClassLoader ) ) - addonClassLoaders.add( addonClassLoader ); } } + // collect addon class loaders + List addonClassLoaders = new ArrayList<>(); + for( FlatDefaultsAddon addon : addonList ) { + ClassLoader addonClassLoader = addon.getClass().getClassLoader(); + if( !addonClassLoaders.contains( addonClassLoader ) ) + addonClassLoaders.add( addonClassLoader ); + } + // collect all platform specific keys (but do not modify properties) ArrayList platformSpecificKeys = new ArrayList<>(); for( Object key : properties.keySet() ) { diff --git a/flatlaf-jide-oss/src/main/java/com/formdev/flatlaf/jideoss/FlatJideOssDefaultsAddon.java b/flatlaf-jide-oss/src/main/java/com/formdev/flatlaf/jideoss/FlatJideOssDefaultsAddon.java index bcbf8169..cb0494d5 100644 --- a/flatlaf-jide-oss/src/main/java/com/formdev/flatlaf/jideoss/FlatJideOssDefaultsAddon.java +++ b/flatlaf-jide-oss/src/main/java/com/formdev/flatlaf/jideoss/FlatJideOssDefaultsAddon.java @@ -46,6 +46,11 @@ public class FlatJideOssDefaultsAddon return super.getDefaults( lafClass ); } + @Override + public int getPriority() { + return 11; + } + //---- class FlatJideUIDefaultsCustomizer --------------------------------- /** diff --git a/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/FlatSwingXDefaultsAddon.java b/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/FlatSwingXDefaultsAddon.java index b26894bb..c708c034 100644 --- a/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/FlatSwingXDefaultsAddon.java +++ b/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/FlatSwingXDefaultsAddon.java @@ -29,4 +29,8 @@ import com.formdev.flatlaf.FlatDefaultsAddon; public class FlatSwingXDefaultsAddon extends FlatDefaultsAddon { + @Override + public int getPriority() { + return 10; + } }