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