diff --git a/platform/platform-api/src/com/intellij/ide/actions/QuickSwitchSchemeAction.java b/platform/platform-api/src/com/intellij/ide/actions/QuickSwitchSchemeAction.java index c594152d6139..6d27dc46fde8 100644 --- a/platform/platform-api/src/com/intellij/ide/actions/QuickSwitchSchemeAction.java +++ b/platform/platform-api/src/com/intellij/ide/actions/QuickSwitchSchemeAction.java @@ -31,9 +31,10 @@ import javax.swing.*; * @author max */ public abstract class QuickSwitchSchemeAction extends AnAction implements DumbAware { + protected static final Icon ourCurrentAction = AllIcons.Diff.CurrentLine; - protected static final Icon ourNotCurrentAction = new EmptyIcon(ourCurrentAction.getIconWidth(), ourCurrentAction.getIconHeight()); - @NotNull + protected static final Icon ourNotCurrentAction = EmptyIcon.create(ourCurrentAction.getIconWidth(), ourCurrentAction.getIconHeight()); + protected String myActionPlace = ActionPlaces.UNKNOWN; private final boolean myShowPopupWithNoActions; @@ -58,11 +59,12 @@ public abstract class QuickSwitchSchemeAction extends AnAction implements DumbAw private void showPopup(AnActionEvent e, DefaultActionGroup group) { if (!myShowPopupWithNoActions && group.getChildrenCount() == 0) return; - final ListPopup popup = JBPopupFactory.getInstance() - .createActionGroupPopup(getPopupTitle(e), - group, - e.getDataContext(), getAidMethod(), - true, myActionPlace); + JBPopupFactory.ActionSelectionAid aid = getAidMethod(); + + ListPopup popup = JBPopupFactory.getInstance().createActionGroupPopup( + getPopupTitle(e), group, e.getDataContext(), + aid == JBPopupFactory.ActionSelectionAid.NUMBERING || aid == JBPopupFactory.ActionSelectionAid.ALPHA_NUMBERING, + true, aid == JBPopupFactory.ActionSelectionAid.MNEMONICS, null, -1, (a) -> a.getTemplatePresentation().getIcon() != ourCurrentAction); showPopup(e, popup); } diff --git a/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java b/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java index 7d9a75c19ea5..2717259333cb 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java @@ -16,6 +16,7 @@ package com.intellij.ide.actions; import com.intellij.ide.ui.LafManager; +import com.intellij.ide.ui.LafManagerListener; import com.intellij.ide.ui.laf.darcula.DarculaInstaller; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataContext; @@ -26,27 +27,41 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.util.concurrent.atomic.AtomicBoolean; /** * @author max */ public class QuickChangeLookAndFeel extends QuickSwitchSchemeAction { + protected void fillActions(Project project, @NotNull DefaultActionGroup group, @NotNull DataContext dataContext) { - final LafManager manager = LafManager.getInstance(); - final UIManager.LookAndFeelInfo[] lfs = manager.getInstalledLookAndFeels(); - final UIManager.LookAndFeelInfo current = manager.getCurrentLookAndFeel(); + final LafManager lafMan = LafManager.getInstance(); + final UIManager.LookAndFeelInfo[] lfs = lafMan.getInstalledLookAndFeels(); + final UIManager.LookAndFeelInfo current = lafMan.getCurrentLookAndFeel(); for (final UIManager.LookAndFeelInfo lf : lfs) { group.add(new DumbAwareAction(lf.getName(), "", lf == current ? ourCurrentAction : ourNotCurrentAction) { public void actionPerformed(AnActionEvent e) { - final UIManager.LookAndFeelInfo cur = manager.getCurrentLookAndFeel(); + UIManager.LookAndFeelInfo cur = lafMan.getCurrentLookAndFeel(); if (cur == lf) return; - boolean needUninstall = UIUtil.isUnderDarcula(); - manager.setCurrentLookAndFeel(lf); - manager.updateUI(); - if (UIUtil.isUnderDarcula()) { - DarculaInstaller.install(); - } else if (needUninstall) { - DarculaInstaller.uninstall(); + boolean wasDarcula = UIUtil.isUnderDarcula(); + lafMan.setCurrentLookAndFeel(lf); + // hack not to updateUI twice: here and in DarculaInstaller + final AtomicBoolean updated = new AtomicBoolean(false); + LafManagerListener listener = (s) -> updated.set(true); + lafMan.addLafManagerListener(listener); + try { + if (UIUtil.isUnderDarcula()) { + DarculaInstaller.install(); + } + else if (wasDarcula) { + DarculaInstaller.uninstall(); + } + } + finally { + lafMan.removeLafManagerListener(listener); + if (!updated.get()) { + lafMan.updateUI(); + } } } }); diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/LafManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/LafManagerImpl.java index 8c2aefdf8e37..91fb3cff2250 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/LafManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/LafManagerImpl.java @@ -760,13 +760,10 @@ public final class LafManagerImpl extends LafManager implements ApplicationCompo } private static void updateUI(Window window) { - if (!window.isDisplayable()) { - return; - } IJSwingUtilities.updateComponentTreeUI(window); Window[] children = window.getOwnedWindows(); - for (Window aChildren : children) { - updateUI(aChildren); + for (Window w : children) { + IJSwingUtilities.updateComponentTreeUI(w); } } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaInstaller.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaInstaller.java index f864a7420f52..be5582fd9489 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaInstaller.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaInstaller.java @@ -20,6 +20,7 @@ import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl; 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; /** @@ -28,24 +29,23 @@ import com.intellij.ui.JBColor; public class DarculaInstaller { public static void uninstall() { - JBColor.setDark(false); - IconLoader.setUseDarkIcons(false); - if (DarculaLaf.NAME.equals(EditorColorsManager.getInstance().getGlobalScheme().getName())) { - final EditorColorsScheme scheme = EditorColorsManager.getInstance().getScheme(EditorColorsScheme.DEFAULT_SCHEME_NAME); - if (scheme != null) { - EditorColorsManager.getInstance().setGlobalScheme(scheme); - } - } - update(); + performImpl(false); } public static void install() { - JBColor.setDark(true); - IconLoader.setUseDarkIcons(true); - if (!DarculaLaf.NAME.equals(EditorColorsManager.getInstance().getGlobalScheme().getName())) { - final EditorColorsScheme scheme = EditorColorsManager.getInstance().getScheme(DarculaLaf.NAME); + performImpl(true); + } + + private static void performImpl(boolean b) { + JBColor.setDark(b); + IconLoader.setUseDarkIcons(b); + EditorColorsManager colorsManager = EditorColorsManager.getInstance(); + EditorColorsScheme current = colorsManager.getGlobalScheme(); + if (b != ColorUtil.isDark(current.getDefaultBackground())) { + String targetScheme = b ? DarculaLaf.NAME : EditorColorsScheme.DEFAULT_SCHEME_NAME; + EditorColorsScheme scheme = colorsManager.getScheme(targetScheme); if (scheme != null) { - EditorColorsManager.getInstance().setGlobalScheme(scheme); + colorsManager.setGlobalScheme(scheme); } } update();