From eb1af3fc47766ccc7ba82dae15c996cfe1eda9df Mon Sep 17 00:00:00 2001 From: Andre Dietisheim Date: Mon, 15 Apr 2024 14:38:23 +0200 Subject: [PATCH] fix: dont set dialog size, make dialog undecorated (#637) Signed-off-by: Andre Dietisheim --- .../intellij/kubernetes/SwingUtils.kt | 52 +++++++++++++++++++ .../kubernetes/dialogs/ResourceNameDialog.kt | 51 +++++++++++------- 2 files changed, 85 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/SwingUtils.kt b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/SwingUtils.kt index d1bbb6430..9766b096e 100644 --- a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/SwingUtils.kt +++ b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/SwingUtils.kt @@ -10,9 +10,24 @@ ******************************************************************************/ package com.redhat.devtools.intellij.kubernetes +import com.intellij.openapi.Disposable +import com.intellij.openapi.actionSystem.ActionManager +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.CommonShortcuts +import com.intellij.openapi.project.DumbAwareAction +import com.intellij.openapi.wm.impl.IdeGlassPaneEx +import com.intellij.ui.PopupBorder +import com.intellij.ui.WindowMoveListener +import com.intellij.ui.WindowResizeListener import com.intellij.ui.components.JBLabel +import com.intellij.util.ui.JBFont import com.intellij.util.ui.JBUI import com.intellij.util.ui.UIUtil +import java.awt.Font +import java.util.stream.Stream +import javax.swing.JComponent +import javax.swing.JLabel +import javax.swing.JRootPane import javax.swing.text.JTextComponent fun createExplanationLabel(text: String): JBLabel { @@ -28,3 +43,40 @@ fun insertNewLineAtCaret(textComponent: JTextComponent) { textComponent.text = newText textComponent.caretPosition = caretPosition + 1 } + +fun setGlassPaneResizable(rootPane: JRootPane, disposable: Disposable?) { + val resizeListener = WindowResizeListener(rootPane, JBUI.insets(10), null) + val glassPane = rootPane.glassPane as IdeGlassPaneEx + glassPane.addMousePreprocessor(resizeListener, disposable!!) + glassPane.addMouseMotionPreprocessor(resizeListener, disposable) +} + +fun setMovable(rootPane: JRootPane, vararg movableComponents: JComponent) { + val windowMoveListener = WindowMoveListener(rootPane) + Stream.of(*movableComponents).forEach { component: JComponent -> + component.addMouseListener( + windowMoveListener + ) + } +} + +fun setBold(label: JLabel) { + label.font = JBFont.create(label.font.deriveFont(Font.BOLD)) +} + +fun registerEscapeShortcut(rootPane: JRootPane, closeFunction: () -> Unit, disposable: Disposable) { + val escape = ActionManager.getInstance().getAction("EditorEscape") + DumbAwareAction.create { e: AnActionEvent? -> closeFunction.invoke() } + .registerCustomShortcutSet( + escape?.shortcutSet ?: CommonShortcuts.ESCAPE, + rootPane, + disposable + ) +} + +fun setRootPaneBorders(rootPane: JRootPane) { + rootPane.border = PopupBorder.Factory.create(true, true) + rootPane.windowDecorationStyle = JRootPane.NONE +} + + diff --git a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/dialogs/ResourceNameDialog.kt b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/dialogs/ResourceNameDialog.kt index 205f48c3a..f5914798c 100644 --- a/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/dialogs/ResourceNameDialog.kt +++ b/src/main/kotlin/com/redhat/devtools/intellij/kubernetes/dialogs/ResourceNameDialog.kt @@ -16,14 +16,17 @@ import com.intellij.openapi.ui.ValidationInfo import com.intellij.ui.TextFieldWithAutoCompletion import com.intellij.ui.TextFieldWithAutoCompletionListProvider import com.intellij.ui.components.JBLabel -import com.intellij.util.ui.JBUI +import com.redhat.devtools.intellij.kubernetes.registerEscapeShortcut +import com.redhat.devtools.intellij.kubernetes.setBold +import com.redhat.devtools.intellij.kubernetes.setRootPaneBorders +import com.redhat.devtools.intellij.kubernetes.setGlassPaneResizable +import com.redhat.devtools.intellij.kubernetes.setMovable import io.fabric8.kubernetes.api.model.HasMetadata -import java.awt.BorderLayout +import net.miginfocom.swing.MigLayout import java.awt.Point -import javax.swing.Box -import javax.swing.BoxLayout import javax.swing.JComponent import javax.swing.JPanel +import javax.swing.RootPaneContainer import javax.swing.SwingConstants class ResourceNameDialog( @@ -34,9 +37,8 @@ class ResourceNameDialog( private val location: Point? ) : DialogWrapper(project, false) { - companion object { - private const val HEIGHT = 40 - private const val WIDTH = 300 + private val title = JBLabel("Set current $kind").apply { + setBold(this) } private val nameTextField = TextFieldWithAutoCompletion( @@ -55,24 +57,31 @@ class ResourceNameDialog( } override fun createCenterPanel(): JComponent { - return JPanel(BorderLayout()).apply { + return JPanel( + MigLayout("ins 4, gap 4, fillx, filly, hidemode 3") + ).apply { + add(title, "gapbottom 10, span 2, wrap") val label = JBLabel("Current $kind:", SwingConstants.LEFT) - label.border = JBUI.Borders.empty(0, 2, 2, 0) - add(label, BorderLayout.PAGE_START) - add(nameTextField, BorderLayout.CENTER) + add(label) + add(nameTextField, "growx, pushx, w min:200, wrap") } } override fun init() { - title = "Set Current $kind" - setResizable(false) - setOKButtonText("Set") + super.init() + setUndecorated(true) + val dialogWindow = peer.window + val rootPane = (dialogWindow as RootPaneContainer).rootPane + registerEscapeShortcut(rootPane, ::closeImmediately, myDisposable) + setRootPaneBorders(rootPane) + setGlassPaneResizable(peer.rootPane, disposable) + setMovable(getRootPane(), title) + isResizable = false isModal = false - setSize(WIDTH, HEIGHT) if (location != null) { setLocation(location.x, location.y) } - super.init() + setOKButtonText("Set") } override fun getPreferredFocusedComponent(): JComponent { @@ -86,7 +95,7 @@ class ResourceNameDialog( override fun doValidate(): ValidationInfo? { return if (nameTextField.text.isEmpty()) { - ValidationInfo("Name musn't be empty", nameTextField) + ValidationInfo("Name mustn't be empty", nameTextField) } else { null } @@ -96,4 +105,10 @@ class ResourceNameDialog( super.doOKAction() onOk.invoke(nameTextField.text) } - } \ No newline at end of file + + private fun closeImmediately() { + if (isVisible) { + doCancelAction() + } + } +} \ No newline at end of file