Theme Editor: support loading/resolving base properties from core themes

This commit is contained in:
Karl Tauber
2021-08-11 22:38:35 +02:00
parent 896e9bca8e
commit d08a6d7dd3
2 changed files with 89 additions and 7 deletions

View File

@@ -48,7 +48,6 @@ import org.fife.ui.rsyntaxtextarea.TokenTypes;
import org.fife.ui.rtextarea.Gutter; import org.fife.ui.rtextarea.Gutter;
import org.fife.ui.rtextarea.RTextArea; import org.fife.ui.rtextarea.RTextArea;
import org.fife.ui.rtextarea.RTextScrollPane; import org.fife.ui.rtextarea.RTextScrollPane;
import com.formdev.flatlaf.util.StringUtils;
import com.formdev.flatlaf.util.UIScale; import com.formdev.flatlaf.util.UIScale;
/** /**
@@ -169,8 +168,7 @@ class FlatThemeEditorPane
} }
void initBasePropertyProvider( FlatThemePropertiesBaseManager propertiesBaseManager ) { void initBasePropertyProvider( FlatThemePropertiesBaseManager propertiesBaseManager ) {
String name = StringUtils.removeTrailing( file.getName(), ".properties" ); textArea.propertiesSupport.setBasePropertyProvider( propertiesBaseManager.create( file, textArea.propertiesSupport ) );
textArea.propertiesSupport.setBasePropertyProvider( propertiesBaseManager.create( name, textArea.propertiesSupport ) );
} }
File getFile() { File getFile() {

View File

@@ -16,22 +16,43 @@
package com.formdev.flatlaf.themeeditor; package com.formdev.flatlaf.themeeditor;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Properties;
import java.util.Set; import java.util.Set;
import com.formdev.flatlaf.FlatDarculaLaf;
import com.formdev.flatlaf.FlatDarkLaf;
import com.formdev.flatlaf.FlatIntelliJLaf;
import com.formdev.flatlaf.FlatLaf;
import com.formdev.flatlaf.FlatLightLaf;
import com.formdev.flatlaf.util.StringUtils;
/** /**
* @author Karl Tauber * @author Karl Tauber
*/ */
class FlatThemePropertiesBaseManager class FlatThemePropertiesBaseManager
{ {
private final Map<String, MyBasePropertyProvider> providers = new HashMap<>(); private static Class<?>[] CORE_THEMES = {
FlatLaf.class,
FlatLightLaf.class,
FlatDarkLaf.class,
FlatIntelliJLaf.class,
FlatDarculaLaf.class,
};
FlatThemePropertiesSupport.BasePropertyProvider create( String name, FlatThemePropertiesSupport propertiesSupport ) { private final Map<String, MyBasePropertyProvider> providers = new HashMap<>();
MyBasePropertyProvider provider = new MyBasePropertyProvider( name, propertiesSupport ); private Map<String, Properties> coreThemes;
FlatThemePropertiesSupport.BasePropertyProvider create( File file, FlatThemePropertiesSupport propertiesSupport ) {
String name = StringUtils.removeTrailing( file.getName(), ".properties" );
boolean isCoreTheme = file.getParent().replace( '\\', '/' ).endsWith( "/com/formdev/flatlaf" );
MyBasePropertyProvider provider = new MyBasePropertyProvider( name, propertiesSupport, isCoreTheme );
providers.put( name, provider ); providers.put( name, provider );
return provider; return provider;
} }
@@ -40,6 +61,25 @@ class FlatThemePropertiesBaseManager
providers.clear(); providers.clear();
} }
private void loadCoreThemes() {
if( coreThemes != null )
return;
coreThemes = new HashMap<>();
for( Class<?> lafClass : CORE_THEMES ) {
String propertiesName = '/' + lafClass.getName().replace( '.', '/' ) + ".properties";
try( InputStream in = lafClass.getResourceAsStream( propertiesName ) ) {
Properties properties = new Properties();
if( in != null )
properties.load( in );
coreThemes.put( lafClass.getSimpleName(), properties );
} catch( IOException ex ) {
ex.printStackTrace();
}
}
}
private static List<String> baseFiles( String name, String baseTheme ) { private static List<String> baseFiles( String name, String baseTheme ) {
ArrayList<String> result = new ArrayList<>(); ArrayList<String> result = new ArrayList<>();
@@ -106,25 +146,43 @@ class FlatThemePropertiesBaseManager
{ {
private final String name; private final String name;
private final FlatThemePropertiesSupport propertiesSupport; private final FlatThemePropertiesSupport propertiesSupport;
private final boolean isCoreTheme;
private List<String> baseFiles; private List<String> baseFiles;
private String lastBaseTheme; private String lastBaseTheme;
MyBasePropertyProvider( String name, FlatThemePropertiesSupport propertiesSupport ) { MyBasePropertyProvider( String name, FlatThemePropertiesSupport propertiesSupport, boolean isCoreTheme ) {
this.name = name; this.name = name;
this.propertiesSupport = propertiesSupport; this.propertiesSupport = propertiesSupport;
this.isCoreTheme = isCoreTheme;
} }
@Override @Override
public String getProperty( String key, String baseTheme ) { public String getProperty( String key, String baseTheme ) {
updateBaseFiles( baseTheme ); updateBaseFiles( baseTheme );
// search in opened editors
for( String baseFile : baseFiles ) { for( String baseFile : baseFiles ) {
String value = getPropertyFromBase( baseFile, key ); String value = getPropertyFromBase( baseFile, key );
if( value != null ) if( value != null )
return value; return value;
} }
// search in core themes
if( !isCoreTheme ) {
loadCoreThemes();
String value = getPropertyFromCore( name, key );
if( value != null )
return value;
for( String baseFile : baseFiles ) {
value = getPropertyFromCore( baseFile, key );
if( value != null )
return value;
}
}
return null; return null;
} }
@@ -135,6 +193,13 @@ class FlatThemePropertiesBaseManager
: null; : null;
} }
private String getPropertyFromCore( String baseFile, String key ) {
Properties properties = coreThemes.get( baseFile );
return (properties != null)
? properties.getProperty( key )
: null;
}
private void updateBaseFiles( String baseTheme ) { private void updateBaseFiles( String baseTheme ) {
if( baseFiles != null && Objects.equals( baseTheme, lastBaseTheme ) ) if( baseFiles != null && Objects.equals( baseTheme, lastBaseTheme ) )
return; return;
@@ -147,6 +212,7 @@ class FlatThemePropertiesBaseManager
public void addAllKeys( Set<String> allKeys, String baseTheme ) { public void addAllKeys( Set<String> allKeys, String baseTheme ) {
updateBaseFiles( baseTheme ); updateBaseFiles( baseTheme );
// search in opened editors
for( String baseFile : baseFiles ) { for( String baseFile : baseFiles ) {
MyBasePropertyProvider provider = providers.get( baseFile ); MyBasePropertyProvider provider = providers.get( baseFile );
if( provider == null ) if( provider == null )
@@ -155,6 +221,24 @@ class FlatThemePropertiesBaseManager
for( Object key : provider.propertiesSupport.getProperties().keySet() ) for( Object key : provider.propertiesSupport.getProperties().keySet() )
allKeys.add( (String) key ); allKeys.add( (String) key );
} }
// search in core themes
if( !isCoreTheme ) {
loadCoreThemes();
copyKeys( coreThemes.get( name ), allKeys );
for( String baseFile : baseFiles )
copyKeys( coreThemes.get( baseFile ), allKeys );
}
}
private void copyKeys( Properties properties, Set<String> allKeys ) {
if( properties == null )
return;
for( Object key : properties.keySet() )
allKeys.add( (String) key );
} }
} }
} }