IDEA-200171 High Contrast Theme: Editor color scheme remains "High Contrast" after changing theme to "Darcula"

This commit is contained in:
Konstantin Bulenkov
2018-10-10 17:19:52 +02:00
parent ab3eea657d
commit 7f04b40ef1
2 changed files with 42 additions and 40 deletions
@@ -5,16 +5,18 @@ import com.intellij.CommonBundle;
import com.intellij.icons.AllIcons;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.WelcomeWizardUtil;
import com.intellij.ide.ui.LafManager;
import com.intellij.ide.ui.LafManagerListener;
import com.intellij.ide.ui.UISettings;
import com.intellij.ide.ui.UIThemeProvider;
import com.intellij.ide.ui.*;
import com.intellij.ide.ui.laf.darcula.DarculaInstaller;
import com.intellij.ide.ui.laf.darcula.DarculaLaf;
import com.intellij.ide.ui.laf.darcula.DarculaLookAndFeelInfo;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.*;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.popup.util.PopupUtil;
@@ -23,6 +25,7 @@ import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.openapi.util.registry.Registry;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.JBColor;
import com.intellij.ui.ScreenUtil;
import com.intellij.ui.components.BasicOptionButtonUI;
@@ -68,6 +71,9 @@ public final class LafManagerImpl extends LafManager implements PersistentStateC
@NonNls private static final String ATTRIBUTE_THEME_NAME = "themeId";
@NonNls private static final String GNOME_THEME_PROPERTY_NAME = "gnome.Net/ThemeName";
private static final String DARCULA_EDITOR_THEME_KEY = "Darcula.SavedEditorTheme";
private static final String DEFAULT_EDITOR_THEME_KEY = "Default.SavedEditorTheme";
@NonNls private static final String[] ourPatchableFontResources = {"Button.font", "ToggleButton.font", "RadioButton.font",
"CheckBox.font", "ColorChooser.font", "ComboBox.font", "Label.font", "List.font", "MenuBar.font", "MenuItem.font",
"MenuItem.acceleratorFont", "RadioButtonMenuItem.font", "CheckBoxMenuItem.font", "Menu.font", "PopupMenu.font", "OptionPane.font",
@@ -400,7 +406,39 @@ public final class LafManagerImpl extends LafManager implements PersistentStateC
((UIThemeBasedLookAndFeelInfo)myCurrentLaf).dispose();
}
final UIManager.LookAndFeelInfo oldLaf = myCurrentLaf;
myCurrentLaf = ObjectUtils.chooseNotNull(lookAndFeelInfo, findLaf(lookAndFeelInfo.getClassName()));
ApplicationManager.getApplication().invokeLater(() -> updateEditorScheme(oldLaf));
}
private static void updateEditorScheme(UIManager.LookAndFeelInfo oldLaf) {
boolean dark = UIUtil.isUnderDarcula();
EditorColorsManager colorsManager = EditorColorsManager.getInstance();
EditorColorsScheme current = colorsManager.getGlobalScheme();
boolean wasUITheme = oldLaf instanceof UIThemeBasedLookAndFeelInfo;
if (dark != ColorUtil.isDark(current.getDefaultBackground()) || wasUITheme) {
String targetScheme = dark ? DarculaLaf.NAME : EditorColorsScheme.DEFAULT_SCHEME_NAME;
PropertiesComponent properties = PropertiesComponent.getInstance();
String savedEditorThemeKey = dark ? DARCULA_EDITOR_THEME_KEY : DEFAULT_EDITOR_THEME_KEY;
String toSavedEditorThemeKey = dark ? DEFAULT_EDITOR_THEME_KEY : DARCULA_EDITOR_THEME_KEY;
String themeName = wasUITheme ? dark ? DarculaLaf.NAME : EditorColorsScheme.DEFAULT_SCHEME_NAME
: properties.getValue(savedEditorThemeKey);
if (themeName != null && colorsManager.getScheme(themeName) != null) {
targetScheme = themeName;
}
if (!wasUITheme) {
properties.setValue(toSavedEditorThemeKey, current.getName(), dark ? EditorColorsScheme.DEFAULT_SCHEME_NAME : DarculaLaf.NAME);
}
EditorColorsScheme scheme = colorsManager.getScheme(targetScheme);
if (scheme != null) {
colorsManager.setGlobalScheme(scheme);
}
}
UISettings.getShadowInstance().fireUISettingsChanged();
ActionToolbarImpl.updateAllToolbarsImmediately();
}
public static void updateForDarcula(boolean isDarcula) {
@@ -15,23 +15,13 @@
*/
package com.intellij.ide.ui.laf.darcula;
import com.intellij.ide.ui.UISettings;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.util.IconLoader;
import com.intellij.ui.ColorUtil;
import com.intellij.ui.JBColor;
/**
* @author Konstantin Bulenkov
*/
public class DarculaInstaller {
private static final String DARCULA_EDITOR_THEME_KEY = "Darcula.savedEditorTheme";
private static final String DEFAULT_EDITOR_THEME_KEY = "Default.savedEditorTheme";
public static void uninstall() {
performImpl(false);
}
@@ -43,31 +33,5 @@ public class DarculaInstaller {
private static void performImpl(final boolean dark) {
JBColor.setDark(dark);
IconLoader.setUseDarkIcons(dark);
ApplicationManager.getApplication().invokeLater(() -> {
EditorColorsManager colorsManager = EditorColorsManager.getInstance();
EditorColorsScheme current = colorsManager.getGlobalScheme();
if (dark != ColorUtil.isDark(current.getDefaultBackground())) {
String targetScheme = dark ? DarculaLaf.NAME : EditorColorsScheme.DEFAULT_SCHEME_NAME;
PropertiesComponent properties = PropertiesComponent.getInstance();
String savedEditorThemeKey = dark ? DARCULA_EDITOR_THEME_KEY : DEFAULT_EDITOR_THEME_KEY;
String toSavedEditorThemeKey = dark ? DEFAULT_EDITOR_THEME_KEY : DARCULA_EDITOR_THEME_KEY;
String themeName = properties.getValue(savedEditorThemeKey);
if (themeName != null && colorsManager.getScheme(themeName) != null) {
targetScheme = themeName;
}
properties.setValue(toSavedEditorThemeKey, current.getName(), dark ? EditorColorsScheme.DEFAULT_SCHEME_NAME : DarculaLaf.NAME);
EditorColorsScheme scheme = colorsManager.getScheme(targetScheme);
if (scheme != null) {
colorsManager.setGlobalScheme(scheme);
}
}
update();
});
}
protected static void update() {
UISettings.getShadowInstance().fireUISettingsChanged();
ActionToolbarImpl.updateAllToolbarsImmediately();
}
}