From c354f484e697cf5d8bdf51b162fa5f553dc0a324 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Sat, 2 Sep 2023 18:46:04 +0300 Subject: [PATCH] IDEA-330211 cleanup GitOrigin-RevId: 10b15fbde8537f9dbef450c7b43d7aa6b9298f17 --- .../com/intellij/ide/ui/ThemesListProvider.kt | 6 +- .../ide/actions/QuickChangeLookAndFeel.java | 2 +- .../com/intellij/ide/ui/laf/LafManagerImpl.kt | 177 +++++++++--------- .../com/intellij/ide/ui/laf/MenuArrowIcon.kt | 6 +- 4 files changed, 92 insertions(+), 99 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ide/ui/ThemesListProvider.kt b/platform/platform-api/src/com/intellij/ide/ui/ThemesListProvider.kt index b66c2bab7a62..42cb24a95d62 100644 --- a/platform/platform-api/src/com/intellij/ide/ui/ThemesListProvider.kt +++ b/platform/platform-api/src/com/intellij/ide/ui/ThemesListProvider.kt @@ -3,6 +3,7 @@ package com.intellij.ide.ui import com.intellij.ide.ui.laf.UIThemeLookAndFeelInfo import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.components.service import org.jetbrains.annotations.ApiStatus /** @@ -10,10 +11,8 @@ import org.jetbrains.annotations.ApiStatus */ @ApiStatus.Internal interface ThemesListProvider { - companion object { - @JvmStatic - fun getInstance(): ThemesListProvider = ApplicationManager.getApplication().getService(ThemesListProvider::class.java) + fun getInstance(): ThemesListProvider = ApplicationManager.getApplication().service() } /** @@ -21,5 +20,4 @@ interface ThemesListProvider { * Themes are divided to groups, groups should be split by separators in all UIs */ fun getShownThemes(): List> - } \ No newline at end of file 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 b21305a889b1..99d2da75c338 100644 --- a/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java +++ b/platform/platform-impl/src/com/intellij/ide/actions/QuickChangeLookAndFeel.java @@ -37,7 +37,7 @@ public final class QuickChangeLookAndFeel extends QuickSwitchSchemeAction implem protected void fillActions(Project project, @NotNull DefaultActionGroup group, @NotNull DataContext dataContext) { UIThemeLookAndFeelInfo initialLaf = LafManager.getInstance().getCurrentUIThemeLookAndFeel(); - for (List list : ThemesListProvider.getInstance().getShownThemes()) { + for (List list : ThemesListProvider.Companion.getInstance().getShownThemes()) { if (group.getChildrenCount() > 0) group.addSeparator(); for (UIManager.LookAndFeelInfo lf : list) group.add(new LafChangeAction(lf, initialLaf == lf)); } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/LafManagerImpl.kt b/platform/platform-impl/src/com/intellij/ide/ui/laf/LafManagerImpl.kt index b24c360267d5..3b9f694af0f8 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/LafManagerImpl.kt +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/LafManagerImpl.kt @@ -114,7 +114,7 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), UiThemeProviderListManager.getInstance().getLaFsWithUITypes() } } - private val lafList + private val lafList: Set get() = lafMap.value.keys private val defaultDarkTheme = SynchronizedClearableLazy { @@ -266,7 +266,7 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), val theme = currentTheme!! if (theme is UIThemeLookAndFeelInfoImpl) { if (!theme.isInitialised) { - doSetLaF(theme, false) + doSetLaF(lookAndFeelInfo = theme, installEditorScheme = false) } } selectComboboxModel() @@ -332,13 +332,13 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), if (systemIsDark) { expectedTheme = preferredDarkTheme if (expectedTheme == null) { - expectedTheme = getDefaultDarkLaf() + expectedTheme = defaultDarkLaf } } else { expectedTheme = preferredLightTheme if (expectedTheme == null) { - expectedTheme = getDefaultLightLaf() + expectedTheme = defaultLightLaf } } if (currentIsDark != systemIsDark || currentTheme !== expectedTheme) { @@ -349,7 +349,7 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), override fun loadState(element: Element) { val oldTheme = currentTheme val newTheme = loadThemeState(element, ELEMENT_LAF) ?: - // We try to read 'class-name' attribute for backward compatibilities IDE's before 2023.3. + // We try to read `class-name` attribute for backward compatibilities IDE's before 2023.3. // Only for Darcula theme. We could drop it in future when we will stop bundle Darcula. if (element.getChild("laf")?.getAttribute("class-name")?.value == "com.intellij.ide.ui.laf.darcula.DarculaLaf") { findLafByName("Darcula") ?: loadDefaultTheme() @@ -403,10 +403,10 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), if (currentTheme?.theme?.id != defaultThemeId) { getThemeState(element, ELEMENT_LAF, currentUIThemeLookAndFeel) } - if (preferredLightTheme != null && preferredLightTheme !== getDefaultLightLaf()) { + if (preferredLightTheme != null && preferredLightTheme !== defaultLightLaf) { getThemeState(element, ELEMENT_PREFERRED_LIGHT_LAF, preferredLightTheme) } - if (preferredDarkTheme != null && preferredDarkTheme !== getDefaultDarkLaf()) { + if (preferredDarkTheme != null && preferredDarkTheme !== defaultDarkLaf) { getThemeState(element, ELEMENT_PREFERRED_DARK_LAF, preferredDarkTheme) } @@ -457,11 +457,13 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), } } - override fun findLaf(reference: LafReference): UIThemeLookAndFeelInfo = lafList.singleOrNull { it.theme.id == reference.themeId } - ?: error("Theme not found for themeId: ${reference.themeId}") + override fun findLaf(reference: LafReference): UIThemeLookAndFeelInfo { + return lafList.singleOrNull { it.theme.id == reference.themeId } ?: error("Theme not found for themeId: ${reference.themeId}") + } @Suppress("removal") override fun getCurrentLookAndFeel(): UIManager.LookAndFeelInfo? = currentTheme + override fun getCurrentUIThemeLookAndFeel(): UIThemeLookAndFeelInfo? = currentTheme override fun getLookAndFeelReference(): LafReference = createLafReference(currentUIThemeLookAndFeel) @@ -479,7 +481,7 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), } } } - return getDefaultDarkLaf() + return defaultDarkLaf } private fun findLafByName(name: String): UIThemeLookAndFeelInfo? = installedLookAndFeels.firstOrNull { name == it.name } @@ -488,7 +490,9 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), * Sets current LAF. The method doesn't update component hierarchy. */ override fun setCurrentLookAndFeel(lookAndFeelInfo: UIManager.LookAndFeelInfo, lockEditorScheme: Boolean) { - setLookAndFeelImpl(lookAndFeelInfo = lookAndFeelInfo as UIThemeLookAndFeelInfo, installEditorScheme = !lockEditorScheme, processChangeSynchronously = true) + setLookAndFeelImpl(lookAndFeelInfo = lookAndFeelInfo as UIThemeLookAndFeelInfo, + installEditorScheme = !lockEditorScheme, + processChangeSynchronously = true) } /** @@ -582,10 +586,8 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), if (oldLaf is TempUIThemeLookAndFeelInfo || currentTheme is TempUIThemeLookAndFeelInfo) { return } - if (currentTheme is UIThemeLookAndFeelInfo) { - if ((currentTheme as UIThemeLookAndFeelInfo).theme.editorSchemeName != null) { - return - } + if (currentTheme is UIThemeLookAndFeelInfo && (currentTheme as UIThemeLookAndFeelInfo).theme.editorSchemeName != null) { + return } val editorColorManager = EditorColorsManager.getInstance() @@ -600,7 +602,7 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), val dark = StartupUiUtil.isDarkTheme val wasUITheme = oldLaf is UIThemeLookAndFeelInfo - if (dark != ColorUtil.isDark(current.defaultBackground) || wasUITheme) { + if (wasUITheme || dark != ColorUtil.isDark(current.defaultBackground)) { var targetScheme = defaultNonLaFSchemeName(dark) val properties = PropertiesComponent.getInstance() val savedEditorThemeKey = if (dark) DARCULA_EDITOR_THEME_KEY else DEFAULT_EDITOR_THEME_KEY @@ -619,8 +621,6 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), } } - private fun defaultNonLaFSchemeName(dark: Boolean) = if (dark) DarculaLaf.NAME else EditorColorsScheme.DEFAULT_SCHEME_NAME - /** * Updates LAF of all windows. The method also updates font of components as it's configured in `UISettings`. */ @@ -856,7 +856,7 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), oldTheme.setProviderClassLoader(null) val isDark = oldTheme.isDark val defaultLaF = if (oldLaF === currentUIThemeLookAndFeel) { - if (isDark) getDefaultDarkLaf() else getDefaultLightLaf() + if (isDark) defaultDarkLaf else defaultLightLaf } else { null @@ -914,10 +914,9 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), private val lafGroups: ActionGroup get() { - val allLaFs = ThemesListProvider.getInstance().getShownThemes().flatten() val lightLaFs = ArrayList() val darkLaFs = ArrayList() - for (lafInfo in allLaFs) { + for (lafInfo in ThemesListProvider.getInstance().getShownThemes().flatten()) { if (lafInfo.theme.isDark) { darkLaFs.add(lafInfo) } @@ -941,7 +940,7 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), val result = ArrayList() result.add(Separator.create(separatorText)) - lafs.mapTo(result) { LafToggleAction(it.name, it, isDark) } + lafs.mapTo(result) { LafToggleAction(name = it.name, lafInfo = it, isDark = isDark) } return result } } @@ -951,41 +950,29 @@ class LafManagerImpl(private val coroutineScope: CoroutineScope) : LafManager(), private val isDark: Boolean) : ToggleAction(name) { override fun isSelected(e: AnActionEvent): Boolean { return if (isDark) { - (preferredDarkTheme?.name ?: getDefaultDarkLaf().name) == lafInfo.name + (preferredDarkTheme?.name ?: defaultDarkLaf.name) == lafInfo.name } else { - (preferredLightTheme?.name ?: getDefaultLightLaf().name) == lafInfo.name + (preferredLightTheme?.name ?: defaultLightLaf.name) == lafInfo.name } } override fun setSelected(e: AnActionEvent, state: Boolean) { if (isDark) { if (preferredDarkTheme?.name != lafInfo.name) { - if (lafInfo.name == getDefaultDarkLaf().name) { - preferredDarkTheme = null - } - else { - preferredDarkTheme = lafInfo - } + preferredDarkTheme = if (lafInfo.name == defaultDarkLaf.name) null else lafInfo detectAndSyncLaf() } } - else { - if (preferredLightTheme?.name != lafInfo.name) { - if (lafInfo.name == getDefaultLightLaf().name) { - preferredLightTheme = null - } - else { - preferredLightTheme = lafInfo - } - detectAndSyncLaf() - } + else if (preferredLightTheme?.name != lafInfo.name) { + preferredLightTheme = if (lafInfo.name == defaultLightLaf.name) null else lafInfo + detectAndSyncLaf() } } - override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT + override fun getActionUpdateThread() = ActionUpdateThread.BGT - override fun isDumbAware(): Boolean = true + override fun isDumbAware() = true } } @@ -1009,7 +996,11 @@ private class LafCellRenderer : SimpleListCellRenderer( return if (value === SEPARATOR) separator else super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus) } - override fun customize(list: JList, value: LafManager.LafReference, index: Int, selected: Boolean, hasFocus: Boolean) { + override fun customize(list: JList, + value: LafManager.LafReference, + index: Int, + selected: Boolean, + hasFocus: Boolean) { text = value.toString() } } @@ -1020,9 +1011,10 @@ open class IJColor internal constructor(color: Color?, private val name: String) override fun toString(): String = "${super.toString()} Name: $name" } -class IJColorUIResource internal constructor(color: Color?, name: String) : IJColor(color, name), UIResource +private class IJColorUIResource(color: Color?, name: String) : IJColor(color, name), UIResource private val SEPARATOR = LafManager.LafReference("", null) + private val fileChooserTextKeys = arrayOf( "FileChooser.viewMenuLabelText", "FileChooser.newFolderActionLabelText", "FileChooser.listViewActionLabelText", "FileChooser.detailsViewActionLabelText", "FileChooser.refreshActionLabelText" @@ -1043,9 +1035,10 @@ private fun fixMenuIssues(uiDefaults: UIDefaults) { private class OurPopupFactory(private val delegate: PopupFactory) : PopupFactory() { companion object { - const val WEIGHT_LIGHT = 0 - const val WEIGHT_MEDIUM = 1 - const val WEIGHT_HEAVY = 2 + const val WEIGHT_LIGHT: Int = 0 + const val WEIGHT_MEDIUM: Int = 1 + const val WEIGHT_HEAVY: Int = 2 + private fun fixPopupLocation(contents: Component, x: Int, y: Int): Point { @Suppress("NAME_SHADOWING") var y = y if (contents !is JToolTip) { @@ -1065,6 +1058,7 @@ private class OurPopupFactory(private val delegate: PopupFactory) : PopupFactory } return Point(x, y) } + val info = try { MouseInfo.getPointerInfo() } @@ -1073,6 +1067,7 @@ private class OurPopupFactory(private val delegate: PopupFactory) : PopupFactory // may happen under Mac OSX 10.5 return Point(x, y) } + var deltaY = 0 if (info != null) { val mouse = info.location @@ -1096,64 +1091,56 @@ private class OurPopupFactory(private val delegate: PopupFactory) : PopupFactory } var popup = delegate.getPopup(owner, contents, point.x, point.y) val window = ComponentUtil.getWindow(contents) - val isHeavyWeightPopup = window is RootPaneContainer && window !== ComponentUtil.getWindow(owner) - if (isHeavyWeightPopup) { - popup = HeavyWeightPopup(popup, window!!) // disable popup caching by runtime - val rootPane = (window as RootPaneContainer?)!!.rootPane - rootPane.glassPane = IdeGlassPaneImpl(rootPane, false) - rootPane.putClientProperty(WINDOW_ALPHA, 1.0f) - window.addWindowListener(object : WindowAdapter() { - override fun windowOpened(e: WindowEvent) { - // cleanup will be handled by AbstractPopup wrapper - if (PopupUtil.getPopupContainerFor(rootPane) != null) { - window.removeWindowListener(this) - } - } + if (window !is RootPaneContainer || window === ComponentUtil.getWindow(owner)) { + return popup + } - override fun windowClosed(e: WindowEvent) { + // disable popup caching by runtime + popup = HeavyWeightPopup(popup, window) + val rootPane = (window as RootPaneContainer?)!!.rootPane + rootPane.glassPane = IdeGlassPaneImpl(rootPane, false) + rootPane.putClientProperty(WINDOW_ALPHA, 1.0f) + window.addWindowListener(object : WindowAdapter() { + override fun windowOpened(e: WindowEvent) { + // cleanup will be handled by AbstractPopup wrapper + if (PopupUtil.getPopupContainerFor(rootPane) != null) { window.removeWindowListener(this) - DialogWrapper.cleanupRootPane(rootPane) - DialogWrapper.cleanupWindowListeners(window) - } - }) - if ((IdeaPopupMenuUI.isUnderPopup(contents) || (SystemInfoRt.isWindows || IdeaPopupMenuUI.isUnderMainMenu(contents))) - && WindowRoundedCornersManager.isAvailable()) { - if ((SystemInfoRt.isMac && StartupUiUtil.isDarkTheme) || SystemInfoRt.isWindows) { - WindowRoundedCornersManager.setRoundedCorners(window, JBUI.CurrentTheme.Popup.borderColor(true)) - } - else { - WindowRoundedCornersManager.setRoundedCorners(window) - } - if (SystemInfoRt.isMac) { - val contentPane = (window as RootPaneContainer?)!!.contentPane as JComponent - contentPane.isOpaque = true - contentPane.background = contents.background } } + + override fun windowClosed(e: WindowEvent) { + window.removeWindowListener(this) + DialogWrapper.cleanupRootPane(rootPane) + DialogWrapper.cleanupWindowListeners(window) + } + }) + if ((IdeaPopupMenuUI.isUnderPopup(contents) || (SystemInfoRt.isWindows || IdeaPopupMenuUI.isUnderMainMenu(contents))) + && WindowRoundedCornersManager.isAvailable()) { + if ((SystemInfoRt.isMac && StartupUiUtil.isDarkTheme) || SystemInfoRt.isWindows) { + WindowRoundedCornersManager.setRoundedCorners(window, JBUI.CurrentTheme.Popup.borderColor(true)) + } + else { + WindowRoundedCornersManager.setRoundedCorners(window) + } + if (SystemInfoRt.isMac) { + val contentPane = (window as RootPaneContainer?)!!.contentPane as JComponent + contentPane.isOpaque = true + contentPane.background = contents.background + } } return popup } } private fun getThemeState(element: Element, attributeName: @NonNls String?, suggestedLaf: UIThemeLookAndFeelInfo?) { - var laf = suggestedLaf - if (laf is TempUIThemeLookAndFeelInfo) { - laf = laf.previousLaf as UIThemeLookAndFeelInfo - } - if (laf == null) { - return - } - + val laf = (if (suggestedLaf is TempUIThemeLookAndFeelInfo) suggestedLaf.previousLaf else null) ?: return val child = Element(attributeName) child.setAttribute(ATTRIBUTE_THEME_NAME, laf.theme.id) element.addContent(child) } private fun createLafReference(laf: UIThemeLookAndFeelInfo?): LafManager.LafReference { - var themeId: String? = null - if (laf is UIThemeLookAndFeelInfo) { - themeId = laf.theme.id - } + val themeId = if (laf is UIThemeLookAndFeelInfo) laf.theme.id else null return LafManager.LafReference(laf!!.name, themeId) } @@ -1341,8 +1328,7 @@ private fun repaintUI(window: Window) { return } window.repaint() - val children = window.ownedWindows - for (aChildren in children) { + for (aChildren in window.ownedWindows) { repaintUI(aChildren) } } @@ -1352,8 +1338,10 @@ private fun applyDensity(defaults: UIDefaults) { val oldDensityName = defaults.get(densityKey) as? String val newDensity = UISettings.getInstance().uiDensity if (oldDensityName == newDensity.name) { - return // re-applying the same density would break HiDPI-scalable values like Tree.rowHeight + // re-applying the same density would break HiDPI-scalable values like Tree.rowHeight + return } + defaults.put(densityKey, newDensity.name) if (newDensity == UIDensity.DEFAULT) { // Special case: we need to set this one to its default value even in non-compact mode, UNLESS it was already set by the theme. @@ -1364,6 +1352,7 @@ private fun applyDensity(defaults: UIDefaults) { defaults.put(JBUI.CurrentTheme.VersionControl.Log.rowHeightKey(), JBUI.CurrentTheme.VersionControl.Log.defaultRowHeight()) } } + if (newDensity == UIDensity.COMPACT) { // toolbars defaults.put(JBUI.CurrentTheme.Toolbar.horizontalInsetsKey(), cmInsets(2, 4)) @@ -1448,4 +1437,6 @@ private fun cmInsets(topAndBottom: Int, leftAndRight: Int): Insets = Insets(topA @Suppress("UseDPIAwareInsets") private fun cmInsets(top: Int, left: Int, bottom: Int, right: Int): Insets = Insets(top, left, bottom, right) -private fun JBInsets.withTopAndBottom(topAndBottom: Int) = JBInsets(topAndBottom, unscaled.left, topAndBottom, unscaled.right) \ No newline at end of file +private fun JBInsets.withTopAndBottom(topAndBottom: Int) = JBInsets(topAndBottom, unscaled.left, topAndBottom, unscaled.right) + +private fun defaultNonLaFSchemeName(dark: Boolean) = if (dark) DarculaLaf.NAME else EditorColorsScheme.DEFAULT_SCHEME_NAME \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/MenuArrowIcon.kt b/platform/platform-impl/src/com/intellij/ide/ui/laf/MenuArrowIcon.kt index ea315d61ec98..b431440b78ab 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/MenuArrowIcon.kt +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/MenuArrowIcon.kt @@ -1,6 +1,7 @@ // Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.ui.laf +import org.jetbrains.annotations.ApiStatus.Internal import java.awt.Component import java.awt.Graphics import javax.swing.Icon @@ -8,7 +9,10 @@ import javax.swing.JMenu import javax.swing.JMenuItem import javax.swing.plaf.UIResource -open class MenuArrowIcon(val icon: () -> Icon, val selectedIcon: () -> Icon, val disabledIcon: () -> Icon) : Icon, UIResource { +@Internal +open class MenuArrowIcon(@JvmField val icon: () -> Icon, + @JvmField val selectedIcon: () -> Icon, + @JvmField val disabledIcon: () -> Icon) : Icon, UIResource { override fun paintIcon(c: Component, g: Graphics, x: Int, y: Int) { if (c is JMenuItem) { if (!c.model.isEnabled) {