mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-13 15:27:16 -06:00
added API to register packages or folders where FlatLaf searches for application specific properties files with custom UI defaults
This commit is contained in:
@@ -5,6 +5,9 @@ FlatLaf Change Log
|
|||||||
|
|
||||||
#### New features
|
#### New features
|
||||||
|
|
||||||
|
- Added API to register packages or folders where FlatLaf searches for
|
||||||
|
application specific properties files with custom UI defaults (see
|
||||||
|
`FlatLaf.registerCustomDefaultsSource(...)` methods).
|
||||||
- Extras: `FlatSVGIcon` now allows specifying `ClassLoader` that is used to load
|
- Extras: `FlatSVGIcon` now allows specifying `ClassLoader` that is used to load
|
||||||
SVG file. (issue #163)
|
SVG file. (issue #163)
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import java.awt.image.ImageFilter;
|
|||||||
import java.awt.image.ImageProducer;
|
import java.awt.image.ImageProducer;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
|
import java.io.File;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -76,6 +77,8 @@ public abstract class FlatLaf
|
|||||||
static final Logger LOG = Logger.getLogger( FlatLaf.class.getName() );
|
static final Logger LOG = Logger.getLogger( FlatLaf.class.getName() );
|
||||||
private static final String DESKTOPFONTHINTS = "awt.font.desktophints";
|
private static final String DESKTOPFONTHINTS = "awt.font.desktophints";
|
||||||
|
|
||||||
|
private static List<Object> customDefaultsSources;
|
||||||
|
|
||||||
private String desktopPropertyName;
|
private String desktopPropertyName;
|
||||||
private String desktopPropertyName2;
|
private String desktopPropertyName2;
|
||||||
private PropertyChangeListener desktopPropertyListener;
|
private PropertyChangeListener desktopPropertyListener;
|
||||||
@@ -552,6 +555,87 @@ public abstract class FlatLaf
|
|||||||
defaults.put( key, value );
|
defaults.put( key, value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static List<Object> getCustomDefaultsSources() {
|
||||||
|
return customDefaultsSources;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a package where FlatLaf searches for properties files with custom UI defaults.
|
||||||
|
* <p>
|
||||||
|
* This can be used to specify application specific UI defaults that override UI values
|
||||||
|
* of existing themes or to define own UI values used in custom controls.
|
||||||
|
* <p>
|
||||||
|
* There may be multiple properties files in that package for multiple themes.
|
||||||
|
* The properties file name must match the used theme class names.
|
||||||
|
* E.g. {@code FlatLightLaf.properties} for class {@link FlatLightLaf}
|
||||||
|
* or {@code FlatDarkLaf.properties} for class {@link FlatDarkLaf}.
|
||||||
|
* {@code FlatLaf.properties} is loaded first for all themes.
|
||||||
|
* <p>
|
||||||
|
* These properties files are loaded after theme and addon properties files
|
||||||
|
* and can therefore override all UI defaults.
|
||||||
|
* <p>
|
||||||
|
* Invoke this method before setting the look and feel.
|
||||||
|
*
|
||||||
|
* @param packageName a package name (e.g. "com.myapp.resources")
|
||||||
|
*/
|
||||||
|
public static void registerCustomDefaultsSource( String packageName ) {
|
||||||
|
registerCustomDefaultsSource( packageName, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unregisterCustomDefaultsSource( String packageName ) {
|
||||||
|
unregisterCustomDefaultsSource( packageName, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a package where FlatLaf searches for properties files with custom UI defaults.
|
||||||
|
* <p>
|
||||||
|
* See {@link #registerCustomDefaultsSource(String)} for details.
|
||||||
|
*
|
||||||
|
* @param packageName a package name (e.g. "com.myapp.resources")
|
||||||
|
* @param classLoader a class loader used to find resources, or {@code null}
|
||||||
|
*/
|
||||||
|
public static void registerCustomDefaultsSource( String packageName, ClassLoader classLoader ) {
|
||||||
|
if( customDefaultsSources == null )
|
||||||
|
customDefaultsSources = new ArrayList<>();
|
||||||
|
customDefaultsSources.add( packageName );
|
||||||
|
customDefaultsSources.add( classLoader );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unregisterCustomDefaultsSource( String packageName, ClassLoader classLoader ) {
|
||||||
|
if( customDefaultsSources == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
int size = customDefaultsSources.size();
|
||||||
|
for( int i = 0; i < size - 1; i++ ) {
|
||||||
|
Object source = customDefaultsSources.get( i );
|
||||||
|
if( packageName.equals( source ) && customDefaultsSources.get( i + 1 ) == classLoader ) {
|
||||||
|
customDefaultsSources.remove( i + 1 );
|
||||||
|
customDefaultsSources.remove( i );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a folder where FlatLaf searches for properties files with custom UI defaults.
|
||||||
|
* <p>
|
||||||
|
* See {@link #registerCustomDefaultsSource(String)} for details.
|
||||||
|
*
|
||||||
|
* @param folder a folder
|
||||||
|
*/
|
||||||
|
public static void registerCustomDefaultsSource( File folder ) {
|
||||||
|
if( customDefaultsSources == null )
|
||||||
|
customDefaultsSources = new ArrayList<>();
|
||||||
|
customDefaultsSources.add( folder );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void unregisterCustomDefaultsSource( File folder ) {
|
||||||
|
if( customDefaultsSources == null )
|
||||||
|
return;
|
||||||
|
|
||||||
|
customDefaultsSources.remove( folder );
|
||||||
|
}
|
||||||
|
|
||||||
private static void reSetLookAndFeel() {
|
private static void reSetLookAndFeel() {
|
||||||
EventQueue.invokeLater( () -> {
|
EventQueue.invokeLater( () -> {
|
||||||
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ package com.formdev.flatlaf;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -107,6 +109,42 @@ class UIDefaultsLoader
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// load custom properties files (usually provides by applications)
|
||||||
|
List<Object> customDefaultsSources = FlatLaf.getCustomDefaultsSources();
|
||||||
|
int size = (customDefaultsSources != null) ? customDefaultsSources.size() : 0;
|
||||||
|
for( int i = 0; i < size; i++ ) {
|
||||||
|
Object source = customDefaultsSources.get( i );
|
||||||
|
if( source instanceof String && i + 1 < size ) {
|
||||||
|
// load from package in classloader
|
||||||
|
String packageName = (String) source;
|
||||||
|
ClassLoader classLoader = (ClassLoader) customDefaultsSources.get( ++i );
|
||||||
|
|
||||||
|
packageName = packageName.replace( '.', '/' );
|
||||||
|
if( classLoader == null )
|
||||||
|
classLoader = FlatLaf.class.getClassLoader();
|
||||||
|
|
||||||
|
for( Class<?> lafClass : lafClasses ) {
|
||||||
|
String propertiesName = packageName + '/' + lafClass.getSimpleName() + ".properties";
|
||||||
|
try( InputStream in = classLoader.getResourceAsStream( propertiesName ) ) {
|
||||||
|
if( in != null )
|
||||||
|
properties.load( in );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if( source instanceof File ) {
|
||||||
|
// load from folder
|
||||||
|
File folder = (File) source;
|
||||||
|
for( Class<?> lafClass : lafClasses ) {
|
||||||
|
File propertiesFile = new File( folder, lafClass.getSimpleName() + ".properties" );
|
||||||
|
if( !propertiesFile.isFile() )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
try( InputStream in = new FileInputStream( propertiesFile ) ) {
|
||||||
|
properties.load( in );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// collect addon class loaders
|
// collect addon class loaders
|
||||||
List<ClassLoader> addonClassLoaders = new ArrayList<>();
|
List<ClassLoader> addonClassLoaders = new ArrayList<>();
|
||||||
for( FlatDefaultsAddon addon : addons ) {
|
for( FlatDefaultsAddon addon : addons ) {
|
||||||
|
|||||||
@@ -77,6 +77,9 @@ public class FlatTestFrame
|
|||||||
// disable animated Laf change
|
// disable animated Laf change
|
||||||
System.setProperty( "flatlaf.animatedLafChange", "false" );
|
System.setProperty( "flatlaf.animatedLafChange", "false" );
|
||||||
|
|
||||||
|
// test loading custom defaults from package
|
||||||
|
FlatLaf.registerCustomDefaultsSource( "com.formdev.flatlaf.testing.customdefaults" );
|
||||||
|
|
||||||
// set look and feel
|
// set look and feel
|
||||||
DemoPrefs.initLaf( args );
|
DemoPrefs.initLaf( args );
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
# @background=#000
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Component.arc=9999
|
||||||
|
# TextComponent.arc=9999
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# @background=#fff
|
||||||
Reference in New Issue
Block a user