From f011468819b3386be0494a61d20167d8862ce764 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Tue, 12 Nov 2019 10:11:26 +0100 Subject: [PATCH] IntelliJ Themes: use single Laf class for light and dark IntelliJ themes and added IntelliJTheme$ThemeLaf.properties to allow (re-)setting UI defaults before .theme.json is applied --- .../java/com/formdev/flatlaf/FlatLaf.java | 12 ++++- .../com/formdev/flatlaf/IntelliJTheme.java | 51 +++++++------------ .../com/formdev/flatlaf/UIDefaultsLoader.java | 4 ++ .../flatlaf/IntelliJTheme$ThemeLaf.properties | 15 ++++++ 4 files changed, 47 insertions(+), 35 deletions(-) create mode 100644 flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties 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 3924cb17..4304dc94 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -186,7 +186,13 @@ public abstract class FlatLaf Object aquaMenuBarUI = useScreenMenuBar ? defaults.get( "MenuBarUI" ) : null; initFonts( defaults ); - UIDefaultsLoader.loadDefaultsFromProperties( getClass(), defaults ); + + // load defaults from properties + List> lafClassesForDefaultsLoading = getLafClassesForDefaultsLoading(); + if( lafClassesForDefaultsLoading != null ) + UIDefaultsLoader.loadDefaultsFromProperties( lafClassesForDefaultsLoading, defaults ); + else + UIDefaultsLoader.loadDefaultsFromProperties( getClass(), defaults ); // use Aqua MenuBarUI if Mac screen menubar is enabled if( useScreenMenuBar ) @@ -195,6 +201,10 @@ public abstract class FlatLaf return defaults; } + List> getLafClassesForDefaultsLoading() { + return null; + } + private void initFonts( UIDefaults defaults ) { FontUIResource uiFont = null; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java index b4f8e008..068fa268 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/IntelliJTheme.java @@ -66,10 +66,7 @@ public class IntelliJTheme } public static FlatLaf createLaf( IntelliJTheme theme ) { - FlatLaf laf = theme.dark - ? new DarkLaf( theme ) - : new LightLaf( theme ); - return laf; + return new ThemeLaf( theme ); } @SuppressWarnings( "unchecked" ) @@ -233,14 +230,14 @@ public class IntelliJTheme checkboxKeyMapping.put( "Checkbox.Focus.Thin.Selected", "CheckBox.icon.selectedFocusedBorderColor" ); } - //---- class LightLaf ----------------------------------------------------- + //---- class ThemeLaf ----------------------------------------------------- - public static class LightLaf - extends FlatIntelliJLaf + public static class ThemeLaf + extends FlatLaf { private final IntelliJTheme theme; - public LightLaf( IntelliJTheme theme ) { + public ThemeLaf( IntelliJTheme theme ) { this.theme = theme; } @@ -255,32 +252,8 @@ public class IntelliJTheme } @Override - public UIDefaults getDefaults() { - UIDefaults defaults = super.getDefaults(); - theme.applyProperties( defaults ); - return defaults; - } - } - - //---- class DarkLaf ------------------------------------------------------ - - public static class DarkLaf - extends FlatDarculaLaf - { - private final IntelliJTheme theme; - - public DarkLaf( IntelliJTheme theme ) { - this.theme = theme; - } - - @Override - public String getName() { - return theme.name; - } - - @Override - public String getDescription() { - return theme.name; + public boolean isDark() { + return theme.dark; } @Override @@ -289,5 +262,15 @@ public class IntelliJTheme theme.applyProperties( defaults ); return defaults; } + + @Override + ArrayList> getLafClassesForDefaultsLoading() { + ArrayList> lafClasses = new ArrayList<>(); + lafClasses.add( FlatLaf.class ); + lafClasses.add( theme.dark ? FlatDarkLaf.class : FlatLightLaf.class ); + lafClasses.add( theme.dark ? FlatDarculaLaf.class : FlatIntelliJLaf.class ); + lafClasses.add( ThemeLaf.class ); + return lafClasses; + } } } 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 3777581b..53254d96 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -70,6 +70,10 @@ class UIDefaultsLoader lafClasses.add( 0, lafClass ); } + loadDefaultsFromProperties( lafClasses, defaults ); + } + + static void loadDefaultsFromProperties( List> lafClasses, UIDefaults defaults ) { try { // load properties files Properties properties = new Properties(); diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties new file mode 100644 index 00000000..5363acb4 --- /dev/null +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/IntelliJTheme$ThemeLaf.properties @@ -0,0 +1,15 @@ +# +# Copyright 2019 FormDev Software GmbH +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#