From ff8130b4fc0522b0662700c924542efc55ffb79e Mon Sep 17 00:00:00 2001 From: Louis Vignier Date: Thu, 21 Mar 2024 10:59:08 +0100 Subject: [PATCH] [compiler] Use UI DSL in JavaCompilersTab #IDEA-334671 #IDEA-344704 Fixed GitOrigin-RevId: 5bc5529c7ae023f4039341d06dc65bbf8913b22a --- .../compiler/options/JavaCompilersTab.form | 70 ----------------- .../compiler/options/JavaCompilersTab.java | 70 ++++++----------- .../compiler/options/JavaCompilersTabUi.kt | 76 +++++++++++++++++++ 3 files changed, 98 insertions(+), 118 deletions(-) delete mode 100644 java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTab.form create mode 100644 java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTabUi.kt diff --git a/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTab.form b/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTab.form deleted file mode 100644 index 84d51af5df7e..000000000000 --- a/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTab.form +++ /dev/null @@ -1,70 +0,0 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTab.java b/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTab.java index 309d062b78ab..6700db7bc712 100644 --- a/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTab.java +++ b/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTab.java @@ -13,12 +13,9 @@ import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.psi.PsiManager; -import com.intellij.ui.SimpleListCellRenderer; -import com.intellij.ui.components.JBCheckBox; import org.jetbrains.annotations.NotNull; import javax.swing.*; -import java.awt.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -27,18 +24,12 @@ import java.util.Objects; /** * @author Eugene Zhuravlev */ -public class JavaCompilersTab extends CompositeConfigurable implements SearchableConfigurable, Configurable.NoScroll { - private JPanel myPanel; - private JPanel myContentPanel; - private JComboBox myCompiler; - private JPanel myTargetOptionsPanel; - private JBCheckBox myCbUseReleaseOption; - private final CardLayout myCardLayout; +public class JavaCompilersTab extends CompositeConfigurable implements SearchableConfigurable { + private final JavaCompilersTabUi myUi; private final Project myProject; private final CompilerConfigurationImpl myCompilerConfiguration; private final BackendCompiler myDefaultCompiler; - private final TargetOptionsComponent myTargetLevelComponent; private final List myConfigurables; private BackendCompiler mySelectedCompiler; @@ -46,31 +37,16 @@ public class JavaCompilersTab extends CompositeConfigurable implem myProject = project; myCompilerConfiguration = (CompilerConfigurationImpl)CompilerConfiguration.getInstance(project); myDefaultCompiler = myCompilerConfiguration.getDefaultCompiler(); - myTargetLevelComponent = new TargetOptionsComponent(project); - - myCardLayout = new CardLayout(); - myContentPanel.setLayout(myCardLayout); - myTargetOptionsPanel.setLayout(new BorderLayout()); - myTargetOptionsPanel.add(myTargetLevelComponent, BorderLayout.CENTER); Collection compilers = myCompilerConfiguration.getRegisteredJavaCompilers(); myConfigurables = new ArrayList<>(compilers.size()); - for (BackendCompiler compiler : compilers) { - Configurable configurable = compiler.createConfigurable(); - myConfigurables.add(configurable); - JComponent component = configurable.createComponent(); - assert component != null : configurable.getClass(); - myContentPanel.add(component, compiler.getId()); - } - myCompiler.setModel(new DefaultComboBoxModel<>(compilers.toArray(new BackendCompiler[0]))); - myCompiler.setRenderer(SimpleListCellRenderer.create("", BackendCompiler::getPresentableName)); - myCompiler.addActionListener(e -> { - BackendCompiler compiler = (BackendCompiler)myCompiler.getSelectedItem(); - if (compiler != null) { - selectCompiler(compiler); - } - }); + myUi = new JavaCompilersTabUi( + project, + compilers, + configurable -> myConfigurables.add(configurable), + compiler -> selectCompiler(compiler) + ); } @Override @@ -93,15 +69,15 @@ public class JavaCompilersTab extends CompositeConfigurable implem @Override public JComponent createComponent() { - return myPanel; + return myUi.getPanel(); } @Override public boolean isModified() { return !Comparing.equal(mySelectedCompiler, myCompilerConfiguration.getDefaultCompiler()) || - myCbUseReleaseOption.isSelected() != myCompilerConfiguration.useReleaseOption() || - !Objects.equals(myTargetLevelComponent.getProjectBytecodeTarget(), myCompilerConfiguration.getProjectBytecodeTarget()) || - !Comparing.equal(myTargetLevelComponent.getModulesBytecodeTargetMap(), myCompilerConfiguration.getModulesBytecodeTargetMap()) || + myUi.useReleaseOptionCb.isSelected() != myCompilerConfiguration.useReleaseOption() || + !Objects.equals(myUi.targetOptionsComponent.getProjectBytecodeTarget(), myCompilerConfiguration.getProjectBytecodeTarget()) || + !Comparing.equal(myUi.targetOptionsComponent.getModulesBytecodeTargetMap(), myCompilerConfiguration.getModulesBytecodeTargetMap()) || super.isModified(); } @@ -109,14 +85,14 @@ public class JavaCompilersTab extends CompositeConfigurable implem public void apply() throws ConfigurationException { try { myCompilerConfiguration.setDefaultCompiler(mySelectedCompiler); - myCompilerConfiguration.setUseReleaseOption(myCbUseReleaseOption.isSelected()); - myCompilerConfiguration.setProjectBytecodeTarget(myTargetLevelComponent.getProjectBytecodeTarget()); - myCompilerConfiguration.setModulesBytecodeTargetMap(myTargetLevelComponent.getModulesBytecodeTargetMap()); + myCompilerConfiguration.setUseReleaseOption(myUi.useReleaseOptionCb.isSelected()); + myCompilerConfiguration.setProjectBytecodeTarget(myUi.targetOptionsComponent.getProjectBytecodeTarget()); + myCompilerConfiguration.setModulesBytecodeTargetMap(myUi.targetOptionsComponent.getModulesBytecodeTargetMap()); super.apply(); - myTargetLevelComponent.setProjectBytecodeTargetLevel(myCompilerConfiguration.getProjectBytecodeTarget()); - myTargetLevelComponent.setModuleTargetLevels(myCompilerConfiguration.getModulesBytecodeTargetMap()); + myUi.targetOptionsComponent.setProjectBytecodeTargetLevel(myCompilerConfiguration.getProjectBytecodeTarget()); + myUi.targetOptionsComponent.setModuleTargetLevels(myCompilerConfiguration.getModulesBytecodeTargetMap()); } finally { if (!myProject.isDefault()) { @@ -130,20 +106,18 @@ public class JavaCompilersTab extends CompositeConfigurable implem public void reset() { super.reset(); selectCompiler(myCompilerConfiguration.getDefaultCompiler()); - myCbUseReleaseOption.setSelected(myCompilerConfiguration.useReleaseOption()); - myTargetLevelComponent.setProjectBytecodeTargetLevel(myCompilerConfiguration.getProjectBytecodeTarget()); - myTargetLevelComponent.setModuleTargetLevels(myCompilerConfiguration.getModulesBytecodeTargetMap()); + myUi.useReleaseOptionCb.setSelected(myCompilerConfiguration.useReleaseOption()); + myUi.targetOptionsComponent.setProjectBytecodeTargetLevel(myCompilerConfiguration.getProjectBytecodeTarget()); + myUi.targetOptionsComponent.setModuleTargetLevels(myCompilerConfiguration.getModulesBytecodeTargetMap()); } private void selectCompiler(BackendCompiler compiler) { if (compiler == null) { compiler = myDefaultCompiler; } - myCompiler.setSelectedItem(compiler); + myUi.compilerComboBox.setSelectedItem(compiler); mySelectedCompiler = compiler; - myCardLayout.show(myContentPanel, compiler.getId()); - myContentPanel.revalidate(); - myContentPanel.repaint(); + myUi.show(compiler.getId()); } @NotNull diff --git a/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTabUi.kt b/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTabUi.kt new file mode 100644 index 000000000000..9b236c2b4715 --- /dev/null +++ b/java/compiler/impl/src/com/intellij/compiler/options/JavaCompilersTabUi.kt @@ -0,0 +1,76 @@ +// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.compiler.options + +import com.intellij.compiler.impl.javaCompiler.BackendCompiler +import com.intellij.openapi.compiler.JavaCompilerBundle +import com.intellij.openapi.options.Configurable +import com.intellij.openapi.project.Project +import com.intellij.openapi.ui.ComboBox +import com.intellij.ui.dsl.builder.* +import com.intellij.ui.dsl.listCellRenderer.textListCellRenderer +import java.util.function.Consumer +import javax.swing.JCheckBox + +class JavaCompilersTabUi( + project: Project, + val compilers: Collection, + configurableConsumer: Consumer, + val compilerSelected: Consumer, + ) { + + lateinit var compilerComboBox: ComboBox + lateinit var useReleaseOptionCb: JCheckBox + lateinit var targetOptionsComponent: TargetOptionsComponent + + val compilersMap = hashMapOf() + + val panel = panel { + row(JavaCompilerBundle.message("option.use.compiler.text")) { + compilerComboBox = comboBox(compilers, textListCellRenderer { it?.presentableName ?: "" }) + .applyToComponent { + addActionListener { + val compiler = compilerComboBox.getSelectedItem() + if (compiler is BackendCompiler) compilerSelected.accept(compiler) + } + } + .component + } + + row { + useReleaseOptionCb = checkBox(JavaCompilerBundle.message("settings.use.release.option.for.cross.compilation")) + .component + } + + row { + targetOptionsComponent = cell(TargetOptionsComponent(project)) + .resizableColumn() + .align(AlignX.FILL) + .component + } + .bottomGap(BottomGap.MEDIUM) + + compilers.forEach { compiler -> + val configurable = compiler.createConfigurable() + configurableConsumer.accept(configurable) + + val component = configurable.createComponent() + assert(component != null) + val p = panel { + row { + cell(component!!) + .resizableColumn() + .align(AlignX.FILL) + } + .resizableRow() + } + + compilersMap.put(compiler.id, p) + } + } + + fun show(id: String) { + compilersMap.forEach { (compilerId, panel) -> + panel.visible(id == compilerId) + } + } +} \ No newline at end of file