Revert "IDEA-311412 Adopt new API for custom title bar"

This reverts commit 53e82ce2e55509cfb0398882011b16bb4fdb8505.

GitOrigin-RevId: d2076ff84beac78f361c631dcee528af5d96c90e
This commit is contained in:
Mikhail Sokolov
2023-05-19 15:04:02 +02:00
committed by intellij-monorepo-bot
parent 830dc346e3
commit 9d6857f81b
12 changed files with 176 additions and 82 deletions

View File

@@ -25,7 +25,6 @@ import com.intellij.openapi.wm.ex.WindowManagerEx
import com.intellij.openapi.wm.impl.*
import com.intellij.openapi.wm.impl.LinuxIdeMenuBar.Companion.doBindAppMenuOfParent
import com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomFrameDialogContent
import com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomHeader
import com.intellij.ui.*
import com.intellij.ui.mac.touchbar.TouchbarSupport
import com.intellij.util.ui.ImageUtil
@@ -303,7 +302,9 @@ open class FrameWrapper @JvmOverloads constructor(private var project: Project?,
override fun toggleFullScreen(state: Boolean): Job = CompletableDeferred(value = Unit)
override fun addNotify() {
CustomHeader.enableCustomHeader(this)
if (IdeFrameDecorator.isCustomDecorationActive()) {
JBR.getCustomWindowDecoration().setCustomDecorationEnabled(this, true)
}
super.addNotify()
}

View File

@@ -36,7 +36,6 @@ import com.intellij.openapi.wm.impl.IdeFrameImpl;
import com.intellij.openapi.wm.impl.IdeGlassPaneImpl;
import com.intellij.openapi.wm.impl.ProjectFrameHelper;
import com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomFrameDialogContent;
import com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomHeader;
import com.intellij.reference.SoftReference;
import com.intellij.ui.*;
import com.intellij.ui.components.JBLayeredPane;
@@ -660,7 +659,7 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer {
@Override
public void addNotify() {
if (IdeFrameDecorator.isCustomDecorationActive()) {
CustomHeader.enableCustomHeader(this);
JBR.getCustomWindowDecoration().setCustomDecorationEnabled(this, true);
}
super.addNotify();
if (SystemInfo.isMacOSVentura && Registry.is("ide.mac.stage.manager.support", false)) {

View File

@@ -216,7 +216,7 @@ public abstract class IdeFrameDecorator {
}
public static boolean isCustomDecorationAvailable() {
return (SystemInfoRt.isMac || SystemInfoRt.isWindows) && JBR.isWindowDecorationsSupported();
return (SystemInfoRt.isMac || SystemInfoRt.isWindows) && JBR.isCustomWindowDecorationSupported();
}
private static final AtomicReference<Boolean> isCustomDecorationActiveCache = new AtomicReference<>();

View File

@@ -26,7 +26,6 @@ import com.intellij.openapi.wm.StatusBar
import com.intellij.openapi.wm.StatusBarCentralWidgetProvider
import com.intellij.openapi.wm.WINDOW_INFO_DEFAULT_TOOL_WINDOW_PANE_ID
import com.intellij.openapi.wm.impl.FrameInfoHelper.Companion.isFloatingMenuBarSupported
import com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomHeader
import com.intellij.openapi.wm.impl.customFrameDecorations.header.MacToolbarFrameHeader
import com.intellij.openapi.wm.impl.customFrameDecorations.header.MainFrameCustomHeader
import com.intellij.openapi.wm.impl.customFrameDecorations.header.MenuFrameHeader
@@ -135,7 +134,7 @@ open class IdeRootPane internal constructor(frame: JFrame,
}
else {
if (isDecoratedMenu) {
CustomHeader.enableCustomHeader(frame)
JBR.getCustomWindowDecoration().setCustomDecorationEnabled(frame, true)
val selectedEditorFilePath: SelectedEditorFilePath?
val customFrameTitlePane = if (ExperimentalUI.isNewUI()) {
@@ -230,7 +229,7 @@ open class IdeRootPane internal constructor(frame: JFrame,
// some rootPane is required
val rootPane = JRootPane()
if (isDecoratedMenu && !isFloatingMenuBarSupported) {
CustomHeader.enableCustomHeader(frame)
JBR.getCustomWindowDecoration().setCustomDecorationEnabled(frame, true)
}
frame.doSetRootPane(rootPane)
if (SystemInfoRt.isMac) {

View File

@@ -12,7 +12,12 @@ import com.intellij.openapi.ui.JBPopupMenu
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.NlsActions
import com.intellij.openapi.util.SystemInfo
import com.intellij.ui.*
import com.intellij.openapi.wm.impl.customFrameDecorations.CustomFrameTitleButtons
import com.intellij.ui.AppUIUtil
import com.intellij.ui.Gray
import com.intellij.ui.JBColor
import com.intellij.ui.UIBundle
import com.intellij.ui.awt.RelativeRectangle
import com.intellij.ui.paint.LinePainter2D
import com.intellij.ui.scale.JBUIScale
import com.intellij.ui.scale.ScaleContext
@@ -22,10 +27,10 @@ import com.intellij.util.ui.JBFont
import com.intellij.util.ui.JBUI
import com.intellij.util.ui.UIUtil
import com.jetbrains.JBR
import com.jetbrains.WindowDecorations
import java.awt.*
import java.awt.event.*
import java.beans.PropertyChangeListener
import java.util.*
import javax.accessibility.AccessibleContext
import javax.accessibility.AccessibleRole
import javax.swing.*
@@ -50,16 +55,6 @@ internal abstract class CustomHeader(private val window: Window) : JPanel(), Dis
val scale = GraphicsEnvironment.getLocalGraphicsEnvironment().defaultScreenDevice.defaultConfiguration.defaultTransform.scaleY
floor(scale).toInt()
}
@JvmStatic
fun enableCustomHeader(w: Window) {
JBR.getWindowDecorations()?.let {
val bar = it.createCustomTitleBar()
bar.height = 1f
if (w is Dialog) it.setCustomTitleBar(w, bar)
else if (w is Frame) it.setCustomTitleBar(w, bar)
}
}
}
private var windowListener: WindowAdapter
@@ -69,7 +64,6 @@ internal abstract class CustomHeader(private val window: Window) : JPanel(), Dis
protected var myActive = false
private var customFrameTopBorder: CustomFrameTopBorder? = null
protected val customTitleBar: WindowDecorations.CustomTitleBar?
private val icon: Icon
get() = getFrameIcon()
@@ -89,6 +83,10 @@ internal abstract class CustomHeader(private val window: Window) : JPanel(), Dis
createProductIcon()
}
protected val buttonPanes: CustomFrameTitleButtons by lazy {
createButtonsPane()
}
init {
isOpaque = true
background = getHeaderBackground()
@@ -118,13 +116,11 @@ internal abstract class CustomHeader(private val window: Window) : JPanel(), Dis
componentListener = object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent?) {
SwingUtilities.invokeLater { updateCustomTitleBar() }
SwingUtilities.invokeLater { updateCustomDecorationHitTestSpots() }
}
}
setCustomFrameTopBorder()
customTitleBar = JBR.getWindowDecorations()?.createCustomTitleBar()
}
protected open fun getHeaderBackground(active: Boolean = true) = JBUI.CurrentTheme.CustomFrameDecorations.titlePaneBackground(active)
@@ -134,8 +130,10 @@ internal abstract class CustomHeader(private val window: Window) : JPanel(), Dis
border = customFrameTopBorder
}
abstract fun createButtonsPane(): CustomFrameTitleButtons
open fun windowStateChanged() {
updateCustomTitleBar()
updateCustomDecorationHitTestSpots()
}
protected var added = false
@@ -144,7 +142,7 @@ internal abstract class CustomHeader(private val window: Window) : JPanel(), Dis
super.addNotify()
added = true
installListeners()
updateCustomTitleBar()
updateCustomDecorationHitTestSpots()
customFrameTopBorder!!.addNotify()
}
@@ -169,42 +167,41 @@ internal abstract class CustomHeader(private val window: Window) : JPanel(), Dis
window.removeComponentListener(componentListener)
}
protected open fun updateCustomTitleBar() {
if (!added || customTitleBar == null) {
protected fun updateCustomDecorationHitTestSpots() {
if (!added || !JBR.isCustomWindowDecorationSupported()) {
return
}
val decor = JBR.getCustomWindowDecoration()
if ((window is JDialog && window.isUndecorated) ||
(window is JFrame && window.isUndecorated)) {
setCustomToolbar(null)
decor.setCustomDecorationHitTestSpots(window, Collections.emptyList())
decor.setCustomDecorationTitleBarHeight(window, 0)
}
else {
if (height == 0) return
customTitleBar.height = (height - insets.bottom).toFloat()
setCustomToolbar(customTitleBar)
}
border = JBUI.Borders.empty(0, customTitleBar.leftInset.toInt(), 0, customTitleBar.rightInset.toInt())
}
private fun setCustomToolbar(toolbar: WindowDecorations.CustomTitleBar?) {
JBR.getWindowDecorations()?.let {
if (window is Dialog) it.setCustomTitleBar(window, toolbar)
else if (window is Frame) it.setCustomTitleBar(window, toolbar)
val toList = getHitTestSpots().map { java.util.Map.entry(it.first.getRectangleOn(window), it.second) }.toList()
decor.setCustomDecorationHitTestSpots(window, toList)
decor.setCustomDecorationTitleBarHeight(window, height + window.insets.top - insets.bottom)
}
}
/**
* Pairs of rectangles and integer constants from {@link com.jetbrains.CustomWindowDecoration} describing type of the spot
*/
abstract fun getHitTestSpots(): Sequence<Pair<RelativeRectangle, Int>>
private fun setActive(value: Boolean) {
myActive = value
updateActive()
updateCustomTitleBar()
updateCustomDecorationHitTestSpots()
}
protected open fun updateActive() {
buttonPanes.isSelected = myActive
buttonPanes.updateVisibility()
customFrameTopBorder?.repaintBorder()
background = getHeaderBackground(myActive)
customTitleBar?.putProperty("controls.dark", ColorUtil.isDark(background))
}
protected val myCloseAction: Action = CustomFrameAction(CommonBundle.getCloseButtonText(), AllIcons.Windows.CloseSmall) { close() }

View File

@@ -1,8 +1,11 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.openapi.wm.impl.customFrameDecorations.header
import com.intellij.openapi.wm.impl.customFrameDecorations.ResizableCustomFrameTitleButtons
import com.intellij.openapi.wm.impl.customFrameDecorations.header.titleLabel.CustomDecorationTitle
import com.intellij.ui.awt.RelativeRectangle
import com.intellij.util.ui.JBUI
import com.jetbrains.CustomWindowDecoration.*
import net.miginfocom.swing.MigLayout
import java.awt.Frame
import javax.swing.JFrame
@@ -13,13 +16,14 @@ internal class DefaultFrameHeader(frame: JFrame, isForDockContainerProvider: Boo
init {
layout = MigLayout("novisualpadding, ins 0, fillx, gap 0", "[min!][][pref!]")
updateCustomTitleBar()
updateCustomDecorationHitTestSpots()
productIcon.border = JBUI.Borders.empty(V, H, V, H)
customDecorationTitle.view.border = JBUI.Borders.empty(V, 0, V, H)
add(productIcon)
add(customDecorationTitle.view, "wmin 0, left, growx, center")
add(buttonPanes.getView(), "top, wmin pref")
setCustomFrameTopBorder(isTopNeeded = { myState != Frame.MAXIMIZED_VERT && myState != Frame.MAXIMIZED_BOTH })
}
@@ -28,4 +32,16 @@ internal class DefaultFrameHeader(frame: JFrame, isForDockContainerProvider: Boo
customDecorationTitle.setActive(myActive)
super.updateActive()
}
override fun getHitTestSpots(): Sequence<Pair<RelativeRectangle, Int>> {
val buttons = buttonPanes as ResizableCustomFrameTitleButtons
val hitTestSpots = ArrayList<Pair<RelativeRectangle, Int>>()
hitTestSpots.add(Pair(RelativeRectangle(productIcon), OTHER_HIT_SPOT))
hitTestSpots.add(Pair(RelativeRectangle(buttons.minimizeButton), MINIMIZE_BUTTON))
hitTestSpots.add(Pair(RelativeRectangle(buttons.maximizeButton), MAXIMIZE_BUTTON))
hitTestSpots.add(Pair(RelativeRectangle(buttons.restoreButton), MAXIMIZE_BUTTON))
hitTestSpots.add(Pair(RelativeRectangle(buttons.closeButton), CLOSE_BUTTON))
hitTestSpots.addAll(customDecorationTitle.getBoundList().map { Pair(it, OTHER_HIT_SPOT) })
return hitTestSpots.asSequence()
}
}

View File

@@ -2,14 +2,14 @@
package com.intellij.openapi.wm.impl.customFrameDecorations.header
import com.intellij.openapi.util.NlsContexts
import com.intellij.util.ui.GridBag
import com.intellij.openapi.wm.impl.customFrameDecorations.CustomFrameTitleButtons
import com.intellij.ui.awt.RelativeRectangle
import com.intellij.util.ui.JBUI
import com.jetbrains.CustomWindowDecoration.CLOSE_BUTTON
import com.jetbrains.CustomWindowDecoration.OTHER_HIT_SPOT
import net.miginfocom.swing.MigLayout
import java.awt.Dialog
import java.awt.GridBagConstraints
import java.awt.GridBagLayout
import java.awt.Window
import java.awt.event.MouseAdapter
import java.awt.event.MouseEvent
import java.beans.PropertyChangeListener
import javax.swing.JLabel
import javax.swing.UIManager
@@ -23,38 +23,28 @@ internal class DialogHeader(val window: Window) : CustomHeader(window) {
}
init {
layout = GridBagLayout()
layout = MigLayout("novisualpadding, ins 0, fillx, gap 0", "[min!][][pref!]")
titleLabel.text = getTitle()
productIcon.border = JBUI.Borders.empty(0, H, 0, H)
val gb = GridBag().setDefaultFill(GridBagConstraints.VERTICAL).setDefaultAnchor(GridBagConstraints.WEST)
add(productIcon, gb.next())
add(titleLabel, gb.next().fillCell().weightx(1.0))
preferredSize = preferredSize.apply { height = 40 }
}
private val dragListener = object : MouseAdapter() { //passing events to OS handler to make it draggable
override fun mouseDragged(e: MouseEvent?) { customTitleBar?.forceHitTest(false) }
override fun mouseClicked(e: MouseEvent?) { customTitleBar?.forceHitTest(false) }
override fun mouseMoved(e: MouseEvent?) { customTitleBar?.forceHitTest(false) }
add(productIcon)
add(titleLabel, "wmin 0, left")
add(buttonPanes.getView(), "top, wmin pref")
}
override fun installListeners() {
super.installListeners()
window.addPropertyChangeListener("title", titleChangeListener)
addMouseListener(dragListener)
addMouseMotionListener(dragListener)
}
override fun uninstallListeners() {
super.uninstallListeners()
window.removePropertyChangeListener(titleChangeListener)
removeMouseListener(dragListener)
removeMouseMotionListener(dragListener)
}
override fun createButtonsPane(): CustomFrameTitleButtons = CustomFrameTitleButtons.create(myCloseAction)
override fun updateActive() {
titleLabel.foreground = if (myActive) UIManager.getColor("Panel.foreground") else UIManager.getColor("Label.disabledForeground")
super.updateActive()
@@ -77,4 +67,11 @@ internal class DialogHeader(val window: Window) : CustomHeader(window) {
else -> return ""
}
}
override fun getHitTestSpots(): Sequence<Pair<RelativeRectangle, Int>> {
return sequenceOf(
Pair(RelativeRectangle(productIcon), OTHER_HIT_SPOT),
Pair(RelativeRectangle(buttonPanes.closeButton), CLOSE_BUTTON)
)
}
}

View File

@@ -5,7 +5,11 @@ import com.intellij.CommonBundle
import com.intellij.icons.AllIcons
import com.intellij.ide.IdeBundle
import com.intellij.idea.ActionsBundle
import com.intellij.openapi.wm.impl.customFrameDecorations.CustomFrameTitleButtons
import com.intellij.openapi.wm.impl.customFrameDecorations.ResizableCustomFrameTitleButtons
import com.intellij.ui.awt.RelativeRectangle
import com.intellij.util.ui.JBFont
import com.jetbrains.CustomWindowDecoration.*
import java.awt.Font
import java.awt.Frame
import java.awt.Toolkit
@@ -35,6 +39,13 @@ internal open class FrameHeader(protected val frame: JFrame) : CustomHeader(fram
}
}
override fun createButtonsPane(): CustomFrameTitleButtons {
return ResizableCustomFrameTitleButtons.create(myCloseAction,
restoreAction, iconifyAction,
maximizeAction)
}
override fun windowStateChanged() {
super.windowStateChanged()
updateActions()
@@ -81,7 +92,8 @@ internal open class FrameHeader(protected val frame: JFrame) : CustomHeader(fram
iconifyAction.isEnabled = true
myCloseAction.isEnabled = true
updateCustomTitleBar()
buttonPanes.updateVisibility()
updateCustomDecorationHitTestSpots()
}
override fun addMenuItems(menu: JPopupMenu) {
@@ -96,4 +108,15 @@ internal open class FrameHeader(protected val frame: JFrame) : CustomHeader(fram
val closeMenuItem = menu.add(myCloseAction)
closeMenuItem.font = JBFont.label().deriveFont(Font.BOLD)
}
override fun getHitTestSpots(): Sequence<Pair<RelativeRectangle, Int>> {
val buttons = buttonPanes as ResizableCustomFrameTitleButtons
return sequenceOf(
Pair(RelativeRectangle(productIcon), OTHER_HIT_SPOT),
Pair(RelativeRectangle(buttons.minimizeButton), MINIMIZE_BUTTON),
Pair(RelativeRectangle(buttons.maximizeButton), MAXIMIZE_BUTTON),
Pair(RelativeRectangle(buttons.restoreButton), MAXIMIZE_BUTTON),
Pair(RelativeRectangle(buttons.closeButton), CLOSE_BUTTON)
)
}
}

View File

@@ -11,12 +11,14 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.wm.impl.IdeMenuBar
import com.intellij.openapi.wm.impl.IdeRootPane
import com.intellij.openapi.wm.impl.ToolbarHolder
import com.intellij.openapi.wm.impl.customFrameDecorations.CustomFrameTitleButtons
import com.intellij.openapi.wm.impl.customFrameDecorations.header.titleLabel.SimpleCustomDecorationPath
import com.intellij.openapi.wm.impl.headertoolbar.MainToolbar
import com.intellij.ui.awt.RelativeRectangle
import com.intellij.ui.mac.MacFullScreenControlsManager
import com.intellij.ui.mac.MacMainFrameDecorator
import com.intellij.util.ui.JBUI
import com.jetbrains.CustomWindowDecoration
import com.jetbrains.JBR
import java.awt.CardLayout
import java.awt.Component
@@ -73,11 +75,11 @@ internal class MacToolbarFrameHeader(private val frame: JFrame,
private fun createToolBar(): MainToolbar {
val toolbar = MainToolbar()
toolbar.layoutCallBack = { updateCustomTitleBar() }
toolbar.layoutCallBack = { updateCustomDecorationHitTestSpots() }
toolbar.isOpaque = false
toolbar.addComponentListener(object: ComponentAdapter() {
override fun componentResized(e: ComponentEvent?) {
updateCustomTitleBar()
updateCustomDecorationHitTestSpots()
super.componentResized(e)
}
})
@@ -119,7 +121,7 @@ internal class MacToolbarFrameHeader(private val frame: JFrame,
toolbar.init(actionGroups)
revalidate()
updateCustomTitleBar()
updateCustomDecorationHitTestSpots()
updateToolbarHasNoActions(actionGroups)
}
@@ -146,11 +148,18 @@ internal class MacToolbarFrameHeader(private val frame: JFrame,
super.addNotify()
updateBorders()
JBR.getWindowDecorations()?.let {
val bar = it.createCustomTitleBar()
bar.height= DEFAULT_HEADER_HEIGHT.toFloat()
it.setCustomTitleBar(frame, bar)
}
val decor = JBR.getCustomWindowDecoration()
decor.setCustomDecorationTitleBarHeight(frame, DEFAULT_HEADER_HEIGHT)
}
override fun createButtonsPane(): CustomFrameTitleButtons = CustomFrameTitleButtons.create(myCloseAction)
override fun getHitTestSpots(): Sequence<Pair<RelativeRectangle, Int>> {
return (toolbar ?: return emptySequence())
.components
.asSequence()
.filter { it.isVisible }
.map { Pair(getElementRect(it), CustomWindowDecoration.MENU_BAR) }
}
override fun updateMenuActions(forceRebuild: Boolean) = ideMenu.updateMenuActions(forceRebuild)

View File

@@ -8,14 +8,19 @@ import com.intellij.openapi.util.CheckedDisposable
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.wm.impl.IdeMenuBar
import com.intellij.openapi.wm.impl.customFrameDecorations.header.title.CustomHeaderTitle
import com.intellij.ui.awt.RelativeRectangle
import com.intellij.util.ui.JBUI
import com.jetbrains.CustomWindowDecoration.MENU_BAR
import com.jetbrains.CustomWindowDecoration.OTHER_HIT_SPOT
import net.miginfocom.swing.MigLayout
import java.awt.Frame
import java.awt.Rectangle
import javax.swing.JComponent
import javax.swing.JFrame
import javax.swing.JPanel
import javax.swing.SwingUtilities
import javax.swing.event.ChangeListener
import kotlin.math.roundToInt
internal class MenuFrameHeader(frame: JFrame,
private val headerTitle: CustomHeaderTitle,
@@ -35,7 +40,7 @@ internal class MenuFrameHeader(frame: JFrame,
add(productIcon)
changeListener = ChangeListener {
updateCustomTitleBar()
updateCustomDecorationHitTestSpots()
}
headerTitle.onBoundsChanged = { windowStateChanged() }
@@ -50,12 +55,13 @@ internal class MenuFrameHeader(frame: JFrame,
view.border = empty
add(view, "left, growx, gapbottom 1")
add(buttonPanes.getView(), "top, wmin pref")
setCustomFrameTopBorder({ myState != Frame.MAXIMIZED_VERT && myState != Frame.MAXIMIZED_BOTH }, {true})
mainMenuUpdater = UISettingsListener {
menuHolder.isVisible = UISettings.getInstance().showMainMenu
SwingUtilities.invokeLater { updateCustomTitleBar() }
SwingUtilities.invokeLater { updateCustomDecorationHitTestSpots() }
}
menuHolder.isVisible = UISettings.getInstance().showMainMenu
@@ -95,4 +101,20 @@ internal class MenuFrameHeader(frame: JFrame,
super.uninstallListeners()
}
override fun getHitTestSpots(): Sequence<Pair<RelativeRectangle, Int>> {
var hitTestSpots = super.getHitTestSpots()
if (menuHolder.isVisible) {
val menuRect = Rectangle(menuHolder.size)
val state = frame.extendedState
if (state != Frame.MAXIMIZED_VERT && state != Frame.MAXIMIZED_BOTH) {
val topGap = (menuRect.height / 3).toFloat().roundToInt()
menuRect.y += topGap
menuRect.height -= topGap
}
hitTestSpots += Pair(RelativeRectangle(menuHolder, menuRect), MENU_BAR)
}
return hitTestSpots + headerTitle.getBoundList().asSequence().map { Pair(it, OTHER_HIT_SPOT) }
}
}

View File

@@ -27,15 +27,16 @@ import com.intellij.util.concurrency.annotations.RequiresEdt
import com.intellij.util.ui.GridBag
import com.intellij.util.ui.JBUI
import com.intellij.util.ui.JBUI.CurrentTheme.CustomFrameDecorations
import com.jetbrains.CustomWindowDecoration.MENU_BAR
import java.awt.*
import java.awt.GridBagConstraints.CENTER
import java.awt.GridBagConstraints.WEST
import java.awt.GridBagConstraints.*
import java.awt.event.ComponentAdapter
import java.awt.event.ComponentEvent
import javax.swing.JComponent
import javax.swing.JFrame
import javax.swing.JLabel
import javax.swing.JPanel
import kotlin.math.roundToInt
private enum class ShowMode {
MENU, TOOLBAR
@@ -83,7 +84,7 @@ internal class ToolbarFrameHeader(frame: JFrame, private val root: IdeRootPane)
private val contentResizeListener = object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent?) {
updateCustomTitleBar()
updateCustomDecorationHitTestSpots()
}
}
@@ -102,6 +103,8 @@ internal class ToolbarFrameHeader(frame: JFrame, private val root: IdeRootPane)
productIcon.border = JBUI.Borders.empty(V, 0, V, 0)
add(productIcon, gb.nextLine().next().anchor(WEST).insetLeft(H))
add(myHeaderContent, gb.next().fillCell().anchor(CENTER).weightx(1.0).weighty(1.0))
val buttonsView = wrap(buttonPanes.getView())
add(buttonsView, gb.next().anchor(EAST))
setCustomFrameTopBorder({ false }, {true})
@@ -143,7 +146,7 @@ internal class ToolbarFrameHeader(frame: JFrame, private val root: IdeRootPane)
removeToolbar()
val toolbar = MainToolbar()
toolbar.layoutCallBack = { updateCustomTitleBar() }
toolbar.layoutCallBack = { updateCustomDecorationHitTestSpots() }
toolbar.init(toolbarActionGroups)
toolbar.isOpaque = false
toolbar.addComponentListener(contentResizeListener)
@@ -174,6 +177,10 @@ internal class ToolbarFrameHeader(frame: JFrame, private val root: IdeRootPane)
menuBarHeaderTitle.isVisible = (isCompact && mode == ShowMode.MENU)
}
private fun updateTitleButtonsMode() {
buttonPanes.isCompactMode = isCompact
}
override fun installListeners() {
super.installListeners()
mainMenuButton.rootPane = frame.rootPane
@@ -215,10 +222,32 @@ internal class ToolbarFrameHeader(frame: JFrame, private val root: IdeRootPane)
}
private fun updateToolbarAppearanceFromMode() {
updateTitleButtonsMode()
updateMenuButtonMinimumSize()
if (mode == ShowMode.MENU) updateMenuBarAppearance()
}
override fun getHitTestSpots(): Sequence<Pair<RelativeRectangle, Int>> {
return when (mode) {
ShowMode.MENU -> {
super.getHitTestSpots() + Pair(getElementRect(myMenuBar) { rect ->
val state = frame.extendedState
if (state != Frame.MAXIMIZED_VERT && state != Frame.MAXIMIZED_BOTH) {
val topGap = (rect.height / 3).toFloat().roundToInt()
rect.y += topGap
rect.height -= topGap
}
}, MENU_BAR)
}
ShowMode.TOOLBAR -> {
super.getHitTestSpots() +
Pair(getElementRect(mainMenuButton.button), MENU_BAR) +
if (isCompact) emptySequence()
else (toolbar?.components?.asSequence()?.filter { it.isVisible }?.map { Pair(getElementRect(it), MENU_BAR) } ?: emptySequence())
}
}
}
override fun getHeaderBackground(active: Boolean) = CustomFrameDecorations.mainToolbarBackground(active)
override fun updateActive() {

View File

@@ -31,7 +31,6 @@ import com.intellij.openapi.wm.impl.IdeFrameDecorator
import com.intellij.openapi.wm.impl.IdeGlassPaneImpl
import com.intellij.openapi.wm.impl.IdeMenuBar
import com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomFrameDialogContent.Companion.getCustomContentHolder
import com.intellij.openapi.wm.impl.customFrameDecorations.header.CustomHeader
import com.intellij.openapi.wm.impl.customFrameDecorations.header.DefaultFrameHeader
import com.intellij.openapi.wm.impl.welcomeScreen.WelcomeScreenComponentFactory.JActionLinkPanel
import com.intellij.ui.*
@@ -51,6 +50,7 @@ import com.intellij.util.ui.StartupUiUtil
import com.intellij.util.ui.UIUtil
import com.intellij.util.ui.accessibility.AccessibleContextAccessor
import com.intellij.util.ui.update.UiNotifyConnector
import com.jetbrains.JBR
import kotlinx.coroutines.launch
import net.miginfocom.swing.MigLayout
import java.awt.*
@@ -214,7 +214,9 @@ open class FlatWelcomeFrame @JvmOverloads constructor(
}
override fun addNotify() {
CustomHeader.enableCustomHeader(this)
if (IdeFrameDecorator.isCustomDecorationActive()) {
JBR.getCustomWindowDecoration().setCustomDecorationEnabled(this, true)
}
super.addNotify()
}