From 79561628d0ae53cd60d6e7be6a3b8da785757c8c Mon Sep 17 00:00:00 2001 From: Pavel Porvatov Date: Thu, 26 Jun 2025 17:14:47 +0200 Subject: [PATCH] [Kotlin UI DSL] Port GuiDesignerConfigurable to Kotlin UI DSL GitOrigin-RevId: 0e0f046aaf80a9e6d7eac2cfdae9c8d9453a6ab1 --- .../uiDesigner/GeneralConfigurable.form | 138 ------------------ .../uiDesigner/GuiDesignerConfigurable.java | 92 +----------- .../com/intellij/uiDesigner/GuiDesignerUI.kt | 89 +++++++++++ 3 files changed, 97 insertions(+), 222 deletions(-) delete mode 100644 plugins/ui-designer/src/com/intellij/uiDesigner/GeneralConfigurable.form create mode 100644 plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerUI.kt diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/GeneralConfigurable.form b/plugins/ui-designer/src/com/intellij/uiDesigner/GeneralConfigurable.form deleted file mode 100644 index 7bed6d9ec33d..000000000000 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/GeneralConfigurable.form +++ /dev/null @@ -1,138 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerConfigurable.java b/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerConfigurable.java index e29631f9a8f0..0f48816b168e 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerConfigurable.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerConfigurable.java @@ -10,7 +10,6 @@ import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.util.DispatchThreadProgressWindow; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiDocumentManager; @@ -18,10 +17,8 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiMethod; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.PsiShortNamesCache; -import com.intellij.ui.SimpleListCellRenderer; import com.intellij.uiDesigner.compiler.AsmCodeGenerator; import com.intellij.uiDesigner.make.FormSourceCodeGenerator; -import com.intellij.uiDesigner.radComponents.LayoutManagerRegistry; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -30,7 +27,7 @@ import javax.swing.*; public final class GuiDesignerConfigurable implements SearchableConfigurable, Configurable.NoScroll { private static final Logger LOG = Logger.getInstance(GuiDesignerConfigurable.class); private final Project myProject; - private MyGeneralUI myGeneralUI; + private GuiDesignerUI myGuiDesignerUI; /** * Invoked by reflection @@ -51,62 +48,22 @@ public final class GuiDesignerConfigurable implements SearchableConfigurable, Co @Override public JComponent createComponent() { - if (myGeneralUI == null) { - myGeneralUI = new MyGeneralUI(); + if (myGuiDesignerUI == null) { + myGuiDesignerUI = new GuiDesignerUI(myProject); } - return myGeneralUI.myPanel; + return myGuiDesignerUI.content; } @Override public boolean isModified() { - final GuiDesignerConfiguration configuration = GuiDesignerConfiguration.getInstance(myProject); - - if (myGeneralUI == null) { - return false; - } - - if (myGeneralUI.myChkCopyFormsRuntime.isSelected() != configuration.COPY_FORMS_RUNTIME_TO_OUTPUT) { - return true; - } - - if (myGeneralUI.myChkUseDynamicBundles.isSelected() != configuration.USE_DYNAMIC_BUNDLES) { - return true; - } - - if (!Comparing.equal(configuration.DEFAULT_LAYOUT_MANAGER, myGeneralUI.myLayoutManagerCombo.getSelectedItem())) { - return true; - } - - if (!Comparing.equal(configuration.DEFAULT_FIELD_ACCESSIBILITY, myGeneralUI.myDefaultFieldAccessibilityCombo.getSelectedItem())) { - return true; - } - - if (configuration.INSTRUMENT_CLASSES != myGeneralUI.myRbInstrumentClasses.isSelected()) { - return true; - } - - if (configuration.GENERATE_SOURCES_ON_SAVE != myGeneralUI.myRbInstrumentSourcesOnSave.isSelected()) { - return true; - } - - if (configuration.RESIZE_HEADERS != myGeneralUI.myResizeHeaders.isSelected()) { - return true; - } - - return false; + return myGuiDesignerUI != null && myGuiDesignerUI.content.isModified(); } @Override public void apply() { + myGuiDesignerUI.content.apply(); final GuiDesignerConfiguration configuration = GuiDesignerConfiguration.getInstance(myProject); - configuration.COPY_FORMS_RUNTIME_TO_OUTPUT = myGeneralUI.myChkCopyFormsRuntime.isSelected(); - configuration.DEFAULT_LAYOUT_MANAGER = (String)myGeneralUI.myLayoutManagerCombo.getSelectedItem(); - configuration.INSTRUMENT_CLASSES = myGeneralUI.myRbInstrumentClasses.isSelected(); - configuration.DEFAULT_FIELD_ACCESSIBILITY = (String)myGeneralUI .myDefaultFieldAccessibilityCombo.getSelectedItem(); - configuration.RESIZE_HEADERS = myGeneralUI.myResizeHeaders.isSelected(); - configuration.USE_DYNAMIC_BUNDLES = myGeneralUI.myChkUseDynamicBundles.isSelected(); - configuration.GENERATE_SOURCES_ON_SAVE = myGeneralUI.myRbInstrumentSourcesOnSave.isSelected(); if (configuration.INSTRUMENT_CLASSES && !myProject.isDefault()) { final DispatchThreadProgressWindow progressWindow = new DispatchThreadProgressWindow(false, myProject); @@ -118,47 +75,14 @@ public final class GuiDesignerConfigurable implements SearchableConfigurable, Co @Override public void reset() { - final GuiDesignerConfiguration configuration = GuiDesignerConfiguration.getInstance(myProject); - - /*general*/ - if (configuration.INSTRUMENT_CLASSES) { - myGeneralUI.myRbInstrumentClasses.setSelected(true); - } - else if (configuration.GENERATE_SOURCES_ON_SAVE) { - myGeneralUI.myRbInstrumentSourcesOnSave.setSelected(true); - } - else { - myGeneralUI.myRbInstrumentSourcesOnCompilation.setSelected(true); - } - myGeneralUI.myChkCopyFormsRuntime.setSelected(configuration.COPY_FORMS_RUNTIME_TO_OUTPUT); - myGeneralUI.myChkUseDynamicBundles.setSelected(configuration.USE_DYNAMIC_BUNDLES); - - myGeneralUI.myLayoutManagerCombo.setModel(new DefaultComboBoxModel<>(LayoutManagerRegistry.getNonDeprecatedLayoutManagerNames())); - myGeneralUI.myLayoutManagerCombo.setRenderer(SimpleListCellRenderer.create("", LayoutManagerRegistry::getLayoutManagerDisplayName)); - myGeneralUI.myLayoutManagerCombo.setSelectedItem(configuration.DEFAULT_LAYOUT_MANAGER); - - myGeneralUI.myDefaultFieldAccessibilityCombo.setSelectedItem(configuration.DEFAULT_FIELD_ACCESSIBILITY); - - myGeneralUI.myResizeHeaders.setSelected(configuration.RESIZE_HEADERS); + myGuiDesignerUI.content.reset(); } @Override public void disposeUIResources() { - myGeneralUI = null; + myGuiDesignerUI = null; } /*UI for "General" tab*/ - private static final class MyGeneralUI { - public JPanel myPanel; - public JRadioButton myRbInstrumentClasses; - public JRadioButton myRbInstrumentSourcesOnCompilation; - public JRadioButton myRbInstrumentSourcesOnSave; - public JCheckBox myChkCopyFormsRuntime; - public JCheckBox myChkUseDynamicBundles; - private JComboBox myLayoutManagerCombo; - private JComboBox myDefaultFieldAccessibilityCombo; - private JCheckBox myResizeHeaders; - } - private final class MyApplyRunnable implements Runnable { private final DispatchThreadProgressWindow myProgressWindow; diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerUI.kt b/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerUI.kt new file mode 100644 index 000000000000..d49140d918ac --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/GuiDesignerUI.kt @@ -0,0 +1,89 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.uiDesigner + +import com.intellij.openapi.project.Project +import com.intellij.ui.components.JBRadioButton +import com.intellij.ui.dsl.builder.AlignY +import com.intellij.ui.dsl.builder.bindItem +import com.intellij.ui.dsl.builder.bindSelected +import com.intellij.ui.dsl.builder.panel +import com.intellij.ui.dsl.listCellRenderer.textListCellRenderer +import com.intellij.uiDesigner.radComponents.LayoutManagerRegistry +import org.jetbrains.annotations.ApiStatus + +@ApiStatus.Internal +internal class GuiDesignerUI(project: Project) { + + @JvmField + val content = panel { + val configuration = GuiDesignerConfiguration.getInstance(project) + + row { + label(UIDesignerBundle.message("label.generate.gui.into")) + .align(AlignY.TOP) + + lateinit var rbInstrumentClasses: JBRadioButton + lateinit var rbInstrumentSourcesOnCompilation: JBRadioButton + lateinit var rbInstrumentSourcesOnSave: JBRadioButton + panel { + buttonsGroup { + row { + rbInstrumentClasses = radioButton(UIDesignerBundle.message("radio.generate.into.class")) + .component + } + row { + rbInstrumentSourcesOnCompilation = radioButton(UIDesignerBundle.message("radio.generate.into.java.on.compilation")) + .component + } + row { + rbInstrumentSourcesOnSave = radioButton(UIDesignerBundle.message("radio.generate.into.java.on.save")) + .component + } + } + }.onApply { + configuration.INSTRUMENT_CLASSES = rbInstrumentClasses.isSelected + configuration.GENERATE_SOURCES_ON_SAVE = rbInstrumentSourcesOnSave.isSelected + + }.onIsModified { + configuration.INSTRUMENT_CLASSES != rbInstrumentClasses.isSelected || + configuration.GENERATE_SOURCES_ON_SAVE != rbInstrumentSourcesOnSave.isSelected + }.onReset { + if (configuration.INSTRUMENT_CLASSES) { + rbInstrumentClasses.setSelected(true) + } + else if (configuration.GENERATE_SOURCES_ON_SAVE) { + rbInstrumentSourcesOnSave.setSelected(true) + } + else { + rbInstrumentSourcesOnCompilation.setSelected(true) + } + } + } + + row { + checkBox(UIDesignerBundle.message("chk.copy.form.runtime")) + .bindSelected(configuration::COPY_FORMS_RUNTIME_TO_OUTPUT) + } + + row(UIDesignerBundle.message("default.layout.manager")) { + comboBox(LayoutManagerRegistry.getNonDeprecatedLayoutManagerNames().toList(), + textListCellRenderer("", LayoutManagerRegistry::getLayoutManagerDisplayName)) + .bindItem(configuration::DEFAULT_LAYOUT_MANAGER) + } + + row(UIDesignerBundle.message("default.field.accessibility")) { + comboBox(listOf("private", "package-private", "protected", "public")) + .bindItem(configuration::DEFAULT_FIELD_ACCESSIBILITY) + } + + row { + checkBox(UIDesignerBundle.message("ui.designer.general.settings.resize.column.and.row.headers")) + .bindSelected(configuration::RESIZE_HEADERS) + } + + row { + checkBox(UIDesignerBundle.message("ui.designer.general.settings.use.dynamic.bundles")) + .bindSelected(configuration::USE_DYNAMIC_BUNDLES) + } + } +} \ No newline at end of file