From d27a16610c4328b2b38e0705217ce40f3e2a6652 Mon Sep 17 00:00:00 2001 From: "ekaterina.itsenko" Date: Thu, 6 Mar 2025 20:56:12 +0100 Subject: [PATCH] [pycharm] PY-79603 Debugger: fix dialog UI (cherry picked from commit 8c60898596b927d7cf0eeeda62a8542e35b07971) GitOrigin-RevId: 456b119570cd2bd9816ab82714a0aaffa0d604b9 --- .../messages/ImagesBundle.properties | 2 +- .../scientific/action/ConfigureActions.kt | 66 +++++++++++++------ 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/images/resources/messages/ImagesBundle.properties b/images/resources/messages/ImagesBundle.properties index 44d20e28d399..f2641e7dc7c6 100644 --- a/images/resources/messages/ImagesBundle.properties +++ b/images/resources/messages/ImagesBundle.properties @@ -95,5 +95,5 @@ image.color.mode.grayscale.image=Grayscale image.color.mode.binarize.image=Binarized image.binarize.dialog.title=Set Binarization Threshold image.binarize.dialog.message=Please enter a valid integer between 0 and 255. -image.binarize.dialog.invalid=Invalid Input +image.binarize.dialog.invalid=Invalid input image.color.mode.configure.actions=Configure... \ No newline at end of file diff --git a/images/src/org/intellij/images/scientific/action/ConfigureActions.kt b/images/src/org/intellij/images/scientific/action/ConfigureActions.kt index 7babaf678d47..0abd3f6e47ae 100644 --- a/images/src/org/intellij/images/scientific/action/ConfigureActions.kt +++ b/images/src/org/intellij/images/scientific/action/ConfigureActions.kt @@ -5,9 +5,14 @@ import com.intellij.icons.AllIcons import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.DialogWrapper import org.intellij.images.ImagesBundle import org.intellij.images.scientific.BinarizationThresholdConfig -import javax.swing.JOptionPane +import java.awt.BorderLayout +import java.awt.Dimension +import javax.swing.JComponent +import javax.swing.JPanel import javax.swing.JTextField class ConfigureActions : AnAction( @@ -16,35 +21,58 @@ class ConfigureActions : AnAction( AllIcons.General.Settings ) { override fun actionPerformed(e: AnActionEvent) { - openConfigurationDialog() + openConfigurationDialog(e.project) } - private fun openConfigurationDialog() { + private fun openConfigurationDialog(project: Project?) { val thresholdConfig = ApplicationManager.getApplication().getService(BinarizationThresholdConfig::class.java) ?: return val currentThreshold = thresholdConfig.threshold - val newThreshold = showThresholdDialog(currentThreshold) - if (newThreshold != null) { - thresholdConfig.threshold = newThreshold + val dialog = ThresholdDialogWrapper(project, currentThreshold) + if (dialog.showAndGet()) { + val newThreshold = dialog.thresholdValue + if (newThreshold != null) { + thresholdConfig.threshold = newThreshold + } } } - private fun showThresholdDialog(initialValue: Int): Int? { - val inputField = JTextField(initialValue.toString()) - val optionPane = JOptionPane(inputField, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION) - val dialog = optionPane.createDialog(null, ImagesBundle.message("image.binarize.dialog.title")) - dialog.isAlwaysOnTop = true - dialog.isVisible = true + private class ThresholdDialogWrapper(project: Project?, initialValue: Int) : DialogWrapper(project) { + private val inputField = JTextField(initialValue.toString()).apply { + preferredSize = Dimension(150, 10) + maximumSize = Dimension(150, 10) + minimumSize = Dimension(150, 10) + } - if (optionPane.value == JOptionPane.OK_OPTION) { - val threshold = inputField.text.toIntOrNull() - if (threshold != null && threshold in 0..255) { - return threshold + var thresholdValue: Int? = null + + init { + title = ImagesBundle.message("image.binarize.dialog.title") + init() + } + + override fun createCenterPanel(): JComponent { + val panel = JPanel(BorderLayout()) + panel.add(inputField, BorderLayout.CENTER) + return panel + } + + override fun getPreferredFocusedComponent(): JComponent { + return inputField + } + + override fun doOKAction() { + val value = inputField.text.toIntOrNull() + if (value != null && value in 0..255) { + thresholdValue = value + super.doOKAction() } else { - JOptionPane.showMessageDialog(null, ImagesBundle.message("image.binarize.dialog.message"), ImagesBundle.message("image.binarize.dialog.invalid"), JOptionPane.ERROR_MESSAGE) - return showThresholdDialog(initialValue) + setErrorText(ImagesBundle.message("image.binarize.dialog.invalid")) } } - return null + + override fun getInitialSize(): Dimension { + return Dimension(300, 120) + } } } \ No newline at end of file