mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 22:51:17 +07:00
Revert "IDEA-311412 Adopt new API for custom title bar"
This reverts commit 53e82ce2e55509cfb0398882011b16bb4fdb8505. GitOrigin-RevId: d2076ff84beac78f361c631dcee528af5d96c90e
This commit is contained in:
committed by
intellij-monorepo-bot
parent
830dc346e3
commit
9d6857f81b
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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() }
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user