diff --git a/platform/platform-api/src/com/intellij/ui/components/JBScrollBar.java b/platform/platform-api/src/com/intellij/ui/components/JBScrollBar.java index a3392e0540fc..3a23209a42e7 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBScrollBar.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBScrollBar.java @@ -8,6 +8,7 @@ import com.intellij.openapi.wm.IdeGlassPane.TopComponent; import com.intellij.ui.ClientProperty; import com.intellij.ui.scale.JBUIScale; import com.intellij.ui.scroll.TouchScrollUtil; +import com.intellij.ui.tabs.impl.IslandsPainterProvider; import com.intellij.util.ui.RegionPainter; import org.intellij.lang.annotations.JdkConstants; import org.jetbrains.annotations.NotNull; @@ -111,7 +112,8 @@ public class JBScrollBar extends JScrollBar implements TopComponent, Interpolabl */ @SuppressWarnings("UnusedParameters") public static @NotNull ScrollBarUI createUI(JComponent c, boolean isThin) { - if (SystemInfo.isMac) { + IslandsPainterProvider provider = IslandsPainterProvider.getInstance(); + if (SystemInfo.isMac || (provider != null && provider.useMacScrollBar())) { return isThin ? new ThinMacScrollBarUI() : new MacScrollBarUI(); } else { diff --git a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java index 3546df3684ad..9c0f131ade74 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBScrollPane.java @@ -12,6 +12,7 @@ import com.intellij.ui.scroll.LatchingScroll; import com.intellij.ui.scroll.MouseWheelSmoothScroll; import com.intellij.ui.scroll.TouchScroll; import com.intellij.ui.scroll.TouchScrollUtil; +import com.intellij.ui.tabs.impl.IslandsPainterProvider; import com.intellij.util.ArrayUtil; import com.intellij.util.ReflectionUtil; import com.intellij.util.ui.JBInsets; @@ -1039,6 +1040,7 @@ public class JBScrollPane extends JScrollPane { @ApiStatus.Internal public static RegionPainter getThumbPainter(@NotNull Supplier supplier, @NotNull CoroutineScope coroutineScope) { - return new ScrollBarPainter.Thumb(supplier, SystemInfoRt.isMac, coroutineScope); + IslandsPainterProvider provider = IslandsPainterProvider.getInstance(); + return new ScrollBarPainter.Thumb(supplier, SystemInfoRt.isMac || (provider != null && provider.useMacScrollBar()), coroutineScope); } } \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/ui/components/MacScrollBarUI.kt b/platform/platform-api/src/com/intellij/ui/components/MacScrollBarUI.kt index fc1a96a1d631..42429c9ecdbf 100644 --- a/platform/platform-api/src/com/intellij/ui/components/MacScrollBarUI.kt +++ b/platform/platform-api/src/com/intellij/ui/components/MacScrollBarUI.kt @@ -36,8 +36,12 @@ internal open class MacScrollBarUI : DefaultScrollBarUI { companion object { private val CURRENT_STYLE = object : MacScrollbarNative() { override fun run() { + if (!SystemInfoRt.isMac) { + return + } + val oldStyle = invoke() - if (SystemInfoRt.isMac && !Registry.`is`("ide.mac.disableMacScrollbars", false)) { + if (!Registry.`is`("ide.mac.disableMacScrollbars", false)) { super.run() } @@ -61,6 +65,9 @@ internal open class MacScrollBarUI : DefaultScrollBarUI { override fun toString(): String = "scroll bar style" override fun initialize(): ID { + if (!SystemInfoRt.isMac) { + return ID.NIL + } return Foundation.invoke(Foundation.invoke("NSNotificationCenter", "defaultCenter"), "addObserver:selector:name:object:", createDelegate("JBScrollBarStyleObserver", Foundation.createSelector("handleScrollerStyleChanged:"), @@ -143,7 +150,12 @@ internal open class MacScrollBarUI : DefaultScrollBarUI { override fun installUI(c: JComponent) { super.installUI(c) - updateStyle(CURRENT_STYLE()) + if (SystemInfoRt.isMac) { + updateStyle(CURRENT_STYLE()) + } + else { + updateStyle(MacScrollbarStyle.Overlay) + } processReferences(toAdd = this, toRemove = null, list = null) val listener = MOVEMENT_LISTENER.getAndSet(null) if (listener != null) { diff --git a/platform/platform-api/src/com/intellij/ui/components/ScrollBarPainter.java b/platform/platform-api/src/com/intellij/ui/components/ScrollBarPainter.java index 75fad90b379b..0df67e17bbf1 100644 --- a/platform/platform-api/src/com/intellij/ui/components/ScrollBarPainter.java +++ b/platform/platform-api/src/com/intellij/ui/components/ScrollBarPainter.java @@ -11,6 +11,7 @@ import com.intellij.ui.ColorUtil; import com.intellij.ui.JBColor; import com.intellij.ui.MixedColorProducer; import com.intellij.ui.paint.RectanglePainter; +import com.intellij.ui.tabs.impl.IslandsPainterProvider; import com.intellij.util.ui.RegionPainter; import kotlinx.coroutines.CoroutineScope; import org.jetbrains.annotations.ApiStatus; @@ -128,9 +129,6 @@ public abstract class ScrollBarPainter implements RegionPainter { THUMB_HOVERED_BACKGROUND ); - private static final int LIGHT_ALPHA = SystemInfoRt.isMac ? 120 : 160; - private static final int DARK_ALPHA = SystemInfoRt.isMac ? 255 : 180; - ScrollBarPainter(@NotNull Supplier supplier, @NotNull CoroutineScope coroutineScope) { animator = new TwoWayAnimator(getClass().getName(), 11, 150, 125, 300, 125, coroutineScope) { @Override @@ -168,6 +166,11 @@ public abstract class ScrollBarPainter implements RegionPainter { alpha = Integer.min(alpha, 255); } else { + IslandsPainterProvider provider = IslandsPainterProvider.getInstance(); + boolean isMac = SystemInfoRt.isMac || (provider != null && provider.useMacScrollBar()); + int LIGHT_ALPHA = isMac ? 120 : 160; + int DARK_ALPHA = isMac ? 255 : 180; + alpha = JBColor.isBright() ? LIGHT_ALPHA : DARK_ALPHA; } @@ -242,7 +245,8 @@ public abstract class ScrollBarPainter implements RegionPainter { if (ignoreBorder() || fill.getRGB() == draw.getRGB()) draw = null; // without border int arc = 0; - if (SystemInfoRt.isMac) { + IslandsPainterProvider provider = IslandsPainterProvider.getInstance(); + if (SystemInfoRt.isMac || (provider != null && provider.useMacScrollBar())) { int margin = macMargin(draw != null); x += margin; y += margin; diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/TabsPainterProvider.kt b/platform/platform-api/src/com/intellij/ui/tabs/impl/IslandsPainterProvider.kt similarity index 71% rename from platform/platform-api/src/com/intellij/ui/tabs/impl/TabsPainterProvider.kt rename to platform/platform-api/src/com/intellij/ui/tabs/impl/IslandsPainterProvider.kt index 48e2345edf50..b0b830efb787 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/TabsPainterProvider.kt +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/IslandsPainterProvider.kt @@ -7,11 +7,13 @@ import org.jetbrains.annotations.ApiStatus @ApiStatus.Experimental @ApiStatus.Internal -open class TabsPainterProvider { +open class IslandsPainterProvider { companion object { @JvmStatic - fun getInstance(): TabsPainterProvider? = ApplicationManager.getApplication()?.serviceOrNull() + fun getInstance(): IslandsPainterProvider? = ApplicationManager.getApplication()?.serviceOrNull() } open fun createCommonTabPainter(): TabPainterAdapter? = null + + open fun useMacScrollBar(): Boolean = false } \ No newline at end of file diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.kt b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.kt index 52c0aad974b7..8f74a1f88193 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.kt +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.kt @@ -348,7 +348,7 @@ open class JBTabsImpl internal constructor( protected open fun createTabBorder(): JBTabsBorder = JBDefaultTabsBorder(this) - protected open fun createTabPainterAdapter(): TabPainterAdapter = TabsPainterProvider.getInstance()?.createCommonTabPainter() ?: DefaultTabPainterAdapter(DEFAULT) + protected open fun createTabPainterAdapter(): TabPainterAdapter = IslandsPainterProvider.getInstance()?.createCommonTabPainter() ?: DefaultTabPainterAdapter(DEFAULT) private var tabLabelAtMouse: TabLabel? = null private val scrollBar: JBScrollBar diff --git a/platform/platform-api/src/com/intellij/util/ui/NSScrollerHelper.java b/platform/platform-api/src/com/intellij/util/ui/NSScrollerHelper.java index b6b2cc4ea5fe..2266578a4ba6 100644 --- a/platform/platform-api/src/com/intellij/util/ui/NSScrollerHelper.java +++ b/platform/platform-api/src/com/intellij/util/ui/NSScrollerHelper.java @@ -116,8 +116,8 @@ public final class NSScrollerHelper { } @ApiStatus.Internal - public static @Nullable Style getScrollerStyle() { - if (!isOverlayScrollbarSupported()) return null; + public static @NotNull Style getScrollerStyle() { + if (!isOverlayScrollbarSupported()) return Style.Overlay; Foundation.NSAutoreleasePool pool = new Foundation.NSAutoreleasePool(); try { diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt index c776f3a45805..53cb566ccf11 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/InternalUICustomization.kt @@ -113,6 +113,8 @@ open class InternalUICustomization { open val isCustomPaintersAllowed: Boolean = false + open val isMacScrollBar: Boolean = false + open fun attachIdeFrameBackgroundPainter(frame: IdeFrame, glassPane: IdeGlassPane): Unit = Unit open fun paintFrameBackground(frame: Window, component: Component, g: Graphics2D) {} diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsTabsPainterProvider.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInternalPainterProvider.kt similarity index 63% rename from platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsTabsPainterProvider.kt rename to platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInternalPainterProvider.kt index 8254e3b76598..a56a2bf43425 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsTabsPainterProvider.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsInternalPainterProvider.kt @@ -2,11 +2,15 @@ package com.intellij.openapi.application.impl.islands import com.intellij.openapi.application.impl.InternalUICustomization +import com.intellij.ui.tabs.impl.IslandsPainterProvider import com.intellij.ui.tabs.impl.TabPainterAdapter -import com.intellij.ui.tabs.impl.TabsPainterProvider -internal class IslandsTabsPainterProvider : TabsPainterProvider() { +internal class IslandsInternalPainterProvider : IslandsPainterProvider() { override fun createCommonTabPainter(): TabPainterAdapter? { return InternalUICustomization.getInstance()?.commonTabPainterAdapter } + + override fun useMacScrollBar(): Boolean { + return InternalUICustomization.getInstance()?.isMacScrollBar == true + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt index 43d98813124a..4c45bcdb895a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/islands/IslandsUICustomization.kt @@ -5,6 +5,7 @@ import com.intellij.ide.ProjectWindowCustomizerService import com.intellij.ide.impl.ProjectUtil import com.intellij.ide.ui.LafManagerListener import com.intellij.ide.ui.UISettings +import com.intellij.ide.ui.laf.darcula.DarculaUIUtil.doPaint import com.intellij.openapi.actionSystem.ex.ActionButtonLook import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.impl.InternalUICustomization @@ -16,6 +17,7 @@ import com.intellij.openapi.ui.Divider import com.intellij.openapi.ui.OnePixelDivider import com.intellij.openapi.ui.Splittable import com.intellij.openapi.util.SystemInfo +import com.intellij.openapi.util.SystemInfoRt import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.wm.* import com.intellij.openapi.wm.ex.ToolWindowManagerEx @@ -613,6 +615,11 @@ internal class IslandsUICustomization : InternalUICustomization() { return graphics } + override val isMacScrollBar: Boolean + get() { + return !SystemInfoRt.isMac && isManyIslandEnabled + } + private fun updateToolStripesVisibility(toolWindowManager: ToolWindowManager) { if (toolWindowManager is ToolWindowManagerImpl) { for (pane in toolWindowManager.getToolWindowPanes()) { diff --git a/platform/platform-impl/src/com/intellij/util/ui/ButtonlessScrollBarUI.java b/platform/platform-impl/src/com/intellij/util/ui/ButtonlessScrollBarUI.java index c823b9974c4f..4ff513e4f277 100644 --- a/platform/platform-impl/src/com/intellij/util/ui/ButtonlessScrollBarUI.java +++ b/platform/platform-impl/src/com/intellij/util/ui/ButtonlessScrollBarUI.java @@ -4,6 +4,7 @@ package com.intellij.util.ui; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.CoroutineSupport.UiDispatcherKind; +import com.intellij.openapi.application.impl.InternalUICustomization; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.registry.Registry; @@ -232,7 +233,8 @@ public class ButtonlessScrollBarUI extends BasicScrollBarUI { } public static boolean isMacOverlayScrollbarSupported() { - return SystemInfo.isMac && !Registry.is("ide.mac.disableMacScrollbars"); + InternalUICustomization customization = InternalUICustomization.getInstance(); + return (SystemInfo.isMac && !Registry.is("ide.mac.disableMacScrollbars")) || (customization != null && customization.isMacScrollBar()); } private void updateMacScrollbarStyle() { diff --git a/platform/platform-resources/src/META-INF/PlatformLangComponents.xml b/platform/platform-resources/src/META-INF/PlatformLangComponents.xml index afdc907cb222..86f821dacd3a 100644 --- a/platform/platform-resources/src/META-INF/PlatformLangComponents.xml +++ b/platform/platform-resources/src/META-INF/PlatformLangComponents.xml @@ -191,8 +191,8 @@ - + diff --git a/platform/platform-resources/src/themes/islands/ManyIslandsDark.theme.json b/platform/platform-resources/src/themes/islands/ManyIslandsDark.theme.json index a73a17309bee..2decb43ea9ab 100644 --- a/platform/platform-resources/src/themes/islands/ManyIslandsDark.theme.json +++ b/platform/platform-resources/src/themes/islands/ManyIslandsDark.theme.json @@ -331,6 +331,23 @@ } }, + "ScrollBar": { + "hoverThumbBorderColor": "#2626268C", + "hoverThumbColor": "#8080808C", + "hoverTrackColor": "#80808000", + "thumbBorderColor": "#26262659", + "thumbColor": "#80808059", + "trackColor": "#80808000", + "Transparent": { + "hoverThumbBorderColor": "#2626268C", + "hoverThumbColor": "#8080808C", + "hoverTrackColor": "#8080801A", + "thumbBorderColor": "#26262600", + "thumbColor": "#80808000", + "trackColor": "#80808000" + } + }, + "VersionControl.MarkerPopup.borderColor": "Gray4" } } diff --git a/platform/platform-resources/src/themes/islands/ManyIslandsLight.theme.json b/platform/platform-resources/src/themes/islands/ManyIslandsLight.theme.json index 7cd72e8952fe..411d75fac583 100644 --- a/platform/platform-resources/src/themes/islands/ManyIslandsLight.theme.json +++ b/platform/platform-resources/src/themes/islands/ManyIslandsLight.theme.json @@ -140,6 +140,23 @@ "borderColor": "Blue6" }, + "ScrollBar": { + "hoverThumbBorderColor": "#00000080", + "hoverThumbColor": "#00000080", + "hoverTrackColor": "#80808000", + "thumbBorderColor": "#00000033", + "thumbColor": "#00000033", + "trackColor": "#80808000", + "Transparent": { + "hoverThumbBorderColor": "#00000080", + "hoverThumbColor": "#00000080", + "hoverTrackColor": "#8080801A", + "thumbBorderColor": "#00000000", + "thumbColor": "#00000000", + "trackColor": "#80808000" + } + }, + "HelpBrowser.UserMessage.background": "#DFE1E5CC", "RecentProject.Color1.MainToolbarGradientStart": "#f7d7cb",