IDEA-53476 Gradle integration (Maven's level - dependencies, modules, repositories)

1. Using balloons instead of labels at the 'adjust project settings before importing' wizard step;
2. Exposed all project data at the 'adjust project settings before importing' wizard step;
3. Corrected 'deduced gradle home' notification processing;
4. Added ability to setup configured jdk for the imported project;
5. Added 'description' property to the JavaSdkVersion;
This commit is contained in:
Denis.Zhdanov
2011-09-08 12:38:02 +04:00
parent 346d19db41
commit b54c0aa67b
10 changed files with 323 additions and 71 deletions
@@ -18,22 +18,26 @@ package com.intellij.openapi.projectRoots;
import com.intellij.pom.java.LanguageLevel;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
/**
* Represents version of Java SDK. Use {@link JavaSdk#getVersion(Sdk)} method to obtain version of an {@link Sdk}
*
* @author nik
*/
public enum JavaSdkVersion {
JDK_1_0(LanguageLevel.JDK_1_3), JDK_1_1(LanguageLevel.JDK_1_3), JDK_1_2(LanguageLevel.JDK_1_3), JDK_1_3(LanguageLevel.JDK_1_3),
JDK_1_4(LanguageLevel.JDK_1_4),
JDK_1_5(LanguageLevel.JDK_1_5),
JDK_1_6(LanguageLevel.JDK_1_6),
JDK_1_7(LanguageLevel.JDK_1_7),
JDK_1_8(LanguageLevel.JDK_1_8);
JDK_1_0(LanguageLevel.JDK_1_3, "1.0"), JDK_1_1(LanguageLevel.JDK_1_3, "1.1"), JDK_1_2(LanguageLevel.JDK_1_3, "1.2"), JDK_1_3(LanguageLevel.JDK_1_3, "1.3"),
JDK_1_4(LanguageLevel.JDK_1_4, "1.4"),
JDK_1_5(LanguageLevel.JDK_1_5, "1.5"),
JDK_1_6(LanguageLevel.JDK_1_6, "1.6"),
JDK_1_7(LanguageLevel.JDK_1_7, "1.7"),
JDK_1_8(LanguageLevel.JDK_1_8, "1.8");
private final LanguageLevel myMaxLanguageLevel;
private final String myDescription;
JavaSdkVersion(@NotNull LanguageLevel maxLanguageLevel) {
JavaSdkVersion(@NotNull LanguageLevel maxLanguageLevel, @NotNull String description) {
myMaxLanguageLevel = maxLanguageLevel;
myDescription = description;
}
@NotNull
@@ -41,7 +45,29 @@ public enum JavaSdkVersion {
return myMaxLanguageLevel;
}
@NotNull
public String getDescription() {
return myDescription;
}
public boolean isAtLeast(@NotNull JavaSdkVersion version) {
return compareTo(version) >= 0;
}
@Override
public String toString() {
return super.toString() + ", description: " + myDescription;
}
@NotNull
public static JavaSdkVersion byDescription(@NotNull String description) throws IllegalArgumentException {
for (JavaSdkVersion version : values()) {
if (version.getDescription().equals(description)) {
return version;
}
}
throw new IllegalArgumentException(
String.format("Can't map Java SDK by description (%s). Available values: %s", description, Arrays.toString(values()))
);
}
}
@@ -11,6 +11,13 @@ gradle.import.structure.tree.node.libraries=libraries
gradle.import.structure.tree.node.dependencies=dependencies
gradle.import.structure.settings.label.name=Name:
gradle.import.structure.settings.label.language.level=Language level:
gradle.import.structure.settings.label.sdk=Sdk:
gradle.import.structure.settings.label.sdk.all=all
gradle.import.structure.settings.label.sdk.configured=configured at the IDE
gradle.import.structure.settings.label.project.config.location=Project config location:
gradle.import.structure.settings.title.project.config.location=Project config location
gradle.import.structure.settings.label.project.compile.output.location=Project compile output location:
gradle.import.structure.settings.title.project.compile.output.location=Project compile output
gradle.import.title.error.resolve.generic=Resolve error
gradle.import.text.error.resolve.generic.without.reason=Can''t resolve target gradle project at ''{0}''
@@ -20,6 +27,10 @@ gradle.import.text.error.directory.instead.file=Given path points to directory i
gradle.import.text.error.invalid.path=Can''t resolve gradle project. Reason: given path ({0}) doesn''t point to a file
gradle.import.text.error.cannot.parse.project=Can not parse gradle project
gradle.import.text.error.undefined.name=Name is undefined
gradle.import.text.error.undefined.config.location=Project config location is undefined
gradle.import.text.error.file.config.location=Project config location points to file instead of directory
gradle.import.text.error.undefined.project.compile.output.location=Project compile output location is undefined
gradle.import.text.error.file.project.compile.output.location=Project compile output location points to file instead of directory
gradle.import.text.error.too.old.gradle=Gradle version is too old
gradle.library.resolve.progress.text=Resolving gradle libraries
@@ -31,9 +31,9 @@ import org.jetbrains.plugins.gradle.util.GradleLibraryManager;
import org.jetbrains.plugins.gradle.util.GradleUtil;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.concurrent.TimeUnit;
@@ -99,12 +99,20 @@ public class GradleConfigurable implements SearchableConfigurable {
false,
false
);
myGradleHomeComponent.getPathComponent().addKeyListener(new KeyAdapter() {
myGradleHomeComponent.getPathComponent().getDocument().addDocumentListener(new DocumentListener() {
@Override
public void keyTyped(KeyEvent e) {
public void insertUpdate(DocumentEvent e) {
useNormalColorForPath();
myPathManuallyModified = true;
}
@Override
public void removeUpdate(DocumentEvent e) {
useNormalColorForPath();
myPathManuallyModified = true;
}
@Override
public void changedUpdate(DocumentEvent e) {
}
});
myGradleHomeComponent.setNameComponentVisible(false);
myComponent.add(myGradleHomeComponent, constraints);
@@ -134,6 +142,7 @@ public class GradleConfigurable implements SearchableConfigurable {
@Override
public void reset() {
useNormalColorForPath();
myPathManuallyModified = false;
String valueToUse = GradleSettings.getInstance(myProject).GRADLE_HOME;
if (!StringUtil.isEmpty(valueToUse)) {
myGradleHomeSettingType = myLibraryManager.isGradleSdkHome(new File(valueToUse)) ?
@@ -1,6 +1,7 @@
package org.jetbrains.plugins.gradle.importing.model;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.pom.java.LanguageLevel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -31,7 +32,8 @@ public class GradleProject extends AbstractNamedGradleEntity {
private JavaSdkVersion myJdkVersion = DEFAULT_JDK_VERSION;
private LanguageLevel myLanguageLevel = DEFAULT_LANGUAGE_LEVEL;
private Sdk mySdk;
private String myProjectFileDirectoryPath;
private String myCompileOutputPath;
@@ -111,6 +113,15 @@ public class GradleProject extends AbstractNamedGradleEntity {
assert false : version + ", max value: " + JavaSdkVersion.values().length;
return false;
}
@Nullable
public Sdk getSdk() {
return mySdk;
}
public void setSdk(@NotNull Sdk sdk) {
mySdk = sdk;
}
@NotNull
public LanguageLevel getLanguageLevel() {
@@ -216,6 +216,7 @@ public class GradleProjectImportBuilder extends ProjectImportBuilder<GradleProje
context.setProjectName(myGradleProject.getName());
context.setProjectFileDirectory(myGradleProject.getProjectFileDirectoryPath());
context.setCompilerOutputDirectory(myGradleProject.getCompileOutputPath());
context.setProjectJdk(myGradleProject.getSdk());
}
/**
@@ -1,9 +1,11 @@
package org.jetbrains.plugins.gradle.importing.wizard.adjust;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.util.text.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.gradle.importing.model.Named;
import org.jetbrains.plugins.gradle.util.GradleBundle;
import org.jetbrains.plugins.gradle.util.GradleUtil;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
@@ -23,13 +25,14 @@ public class GradleAdjustImportSettingsUtil {
*
* @param builder target settings builder
* @param component component which name management should be exposed
* @return label that should be used for reporting errors within the given component's name
* @return UI control that holds target component's name
*/
public static JLabel configureNameControl(@NotNull GradleProjectSettingsBuilder builder, @NotNull final Named component) {
final JTextField nameField = new JTextField();
nameField.setText(component.getName());
final JLabel result = builder.add("gradle.import.structure.settings.label.name", nameField);
nameField.getDocument().addDocumentListener(new DocumentListener() {
@NotNull
public static JComponent configureNameControl(@NotNull GradleProjectSettingsBuilder builder, @NotNull final Named component) {
final JTextField result = new JTextField();
result.setText(component.getName());
builder.add("gradle.import.structure.settings.label.name", result);
result.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
applyNewName();
@@ -42,14 +45,11 @@ public class GradleAdjustImportSettingsUtil {
public void changedUpdate(DocumentEvent e) {
}
private void applyNewName() {
String text = nameField.getText();
String text = result.getText();
if (text == null) {
return;
}
component.setName(text.trim());
if (result.isVisible()) {
result.setVisible(false);
}
}
});
return result;
@@ -59,15 +59,14 @@ public class GradleAdjustImportSettingsUtil {
* Performs generic check of the name of the given component.
*
* @param namedComponent target component
* @param errorLabel storage for the validation error message
* @param componentNameUI UI control that allow to manage target component's name
* @return <code>true</code> if validation is successful; <code>false</code> otherwise
*/
public static boolean validate(@NotNull Named namedComponent, @NotNull JLabel errorLabel) {
public static boolean validate(@NotNull Named namedComponent, @NotNull JComponent componentNameUI) {
if (!StringUtil.isEmptyOrSpaces(namedComponent.getName())) {
return true;
}
errorLabel.setText(GradleBundle.message("gradle.import.text.error.undefined.name"));
errorLabel.setVisible(true);
GradleUtil.showBalloon(componentNameUI, MessageType.ERROR, GradleBundle.message("gradle.import.text.error.undefined.name"));
return false;
}
}
@@ -13,19 +13,19 @@ public class GradleLibrarySettings implements GradleProjectStructureNodeSettings
private final GradleLibrary myLibrary;
private final JComponent myComponent;
private final JLabel myNameErrorLabel;
private final JComponent myNameControl;
public GradleLibrarySettings(@NotNull GradleLibrary library) {
myLibrary = library;
GradleProjectSettingsBuilder builder = new GradleProjectSettingsBuilder();
myNameErrorLabel = GradleAdjustImportSettingsUtil.configureNameControl(builder, library);
myNameControl = GradleAdjustImportSettingsUtil.configureNameControl(builder, library);
myComponent = builder.build();
}
@Override
public boolean validate() {
return GradleAdjustImportSettingsUtil.validate(myLibrary, myNameErrorLabel);
return GradleAdjustImportSettingsUtil.validate(myLibrary, myNameControl);
}
@NotNull
@@ -15,18 +15,18 @@ public class GradleModuleSettings implements GradleProjectStructureNodeSettings
private final JComponent myComponent;
private final GradleModule myModule;
private final JLabel myNameErrorLabel;
private final JComponent myNameControl;
public GradleModuleSettings(@NotNull GradleModule module) {
myModule = module;
GradleProjectSettingsBuilder builder = new GradleProjectSettingsBuilder();
myNameErrorLabel = GradleAdjustImportSettingsUtil.configureNameControl(builder, myModule);
myNameControl = GradleAdjustImportSettingsUtil.configureNameControl(builder, myModule);
myComponent = builder.build();
}
@Override
public boolean validate() {
return GradleAdjustImportSettingsUtil.validate(myModule, myNameErrorLabel);
return GradleAdjustImportSettingsUtil.validate(myModule, myNameControl);
}
@NotNull
@@ -1,13 +1,27 @@
package org.jetbrains.plugins.gradle.importing.wizard.adjust;
import com.intellij.ide.util.BrowseFilesListener;
import com.intellij.openapi.projectRoots.JavaSdk;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Pair;
import com.intellij.pom.java.LanguageLevel;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.PropertyKey;
import org.jetbrains.plugins.gradle.importing.model.GradleProject;
import org.jetbrains.plugins.gradle.util.GradleBundle;
import org.jetbrains.plugins.gradle.util.GradleUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@@ -18,37 +32,208 @@ import java.util.Map;
*/
public class GradleProjectSettings implements GradleProjectStructureNodeSettings {
private final JComponent myComponent;
private final GradleProject myProject;
private final JLabel myNameErrorLabel;
private final JComponent myComponent;
private final GradleProject myProject;
private final JComponent myNameControl;
private final DefaultComboBoxModel mySdkModel;
private final JRadioButton myRegisteredSdksButton;
private final JRadioButton myAllSdksButton;
private final TextFieldWithBrowseButton myProjectConfigLocationField;
private final TextFieldWithBrowseButton myProjectCompileOutputLocationField;
private boolean myUseOnlyRegisteredSdks;
public GradleProjectSettings(@NotNull GradleProject project) {
myProject = project;
GradleProjectSettingsBuilder builder = new GradleProjectSettingsBuilder();
myNameErrorLabel = GradleAdjustImportSettingsUtil.configureNameControl(builder, project);
myNameControl = GradleAdjustImportSettingsUtil.configureNameControl(builder, project);
setupLanguageLevelControls(builder);
Pair<JRadioButton, JRadioButton> sdkPair = setupSdkControls(mySdkModel = new DefaultComboBoxModel(), builder);
myRegisteredSdksButton = sdkPair.first;
myAllSdksButton = sdkPair.second;
myProjectConfigLocationField = setupProjectConfigLocation(builder);
myProjectCompileOutputLocationField = setupProjectCompileOutputLocation(builder);
filterSdksByLanguageLevel();
myComponent = builder.build();
}
private void setupLanguageLevelControls(@NotNull GradleProjectSettingsBuilder builder) {
JComboBox languageLevelComboBox = new JComboBox();
builder.add("gradle.import.structure.settings.label.language.level", languageLevelComboBox);
final Map<Object, LanguageLevel> levels = new HashMap<Object, LanguageLevel>();
for (LanguageLevel level : LanguageLevel.values()) {
levels.put(level.getPresentableText(), level);
languageLevelComboBox.addItem(level.getPresentableText());
}
languageLevelComboBox.setSelectedItem(project.getLanguageLevel().getPresentableText());
languageLevelComboBox.setSelectedItem(myProject.getLanguageLevel().getPresentableText());
languageLevelComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
myProject.setLanguageLevel(levels.get(e.getItem()));
filterSdksByLanguageLevel();
}
});
myComponent = builder.build();
builder.add("gradle.import.structure.settings.label.language.level", languageLevelComboBox);
}
private void filterSdksByLanguageLevel() {
Object selectedItem = mySdkModel.getSelectedItem();
myRegisteredSdksButton.setEnabled(true);
mySdkModel.removeAllElements();
LanguageLevel languageLevel = myProject.getLanguageLevel();
boolean restoreSelection = false;
if (myUseOnlyRegisteredSdks) {
JavaSdk javaSdk = JavaSdk.getInstance();
List<Sdk> javaSdks = ProjectJdkTable.getInstance().getSdksOfType(javaSdk);
for (Sdk sdk : javaSdks) {
JavaSdkVersion version = javaSdk.getVersion(sdk);
if (version == null || !version.getMaxLanguageLevel().isAtLeast(languageLevel)) {
continue;
}
mySdkModel.addElement(sdk.getName());
if (sdk.getName().equals(selectedItem)) {
restoreSelection = true;
}
}
if (mySdkModel.getSize() <= 0) {
// Change to 'all' radio button if none of the registered sdks matches target language level.
myAllSdksButton.setSelected(true);
myRegisteredSdksButton.setEnabled(false);
return;
}
}
else {
for (JavaSdkVersion version : JavaSdkVersion.values()) {
if (!version.getMaxLanguageLevel().isAtLeast(languageLevel)) {
continue;
}
mySdkModel.addElement(version.getDescription());
if (version.getDescription().equals(selectedItem)) {
restoreSelection = true;
}
}
}
if (restoreSelection) {
mySdkModel.setSelectedItem(selectedItem);
}
}
@NotNull
private Pair<JRadioButton, JRadioButton> setupSdkControls(@NotNull ComboBoxModel model, @NotNull GradleProjectSettingsBuilder builder) {
// Configure SDK combo box with all jdk versions.
final JComboBox sdkComboBox = new JComboBox(model);
sdkComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
Object selectedItem = sdkComboBox.getSelectedItem();
if (selectedItem == null) {
return;
}
if (myUseOnlyRegisteredSdks) {
Sdk sdk = ProjectJdkTable.getInstance().findJdk(selectedItem.toString());
if (sdk != null) {
myProject.setSdk(sdk);
}
}
else {
myProject.setJdkVersion(JavaSdkVersion.byDescription(selectedItem.toString()));
}
}
});
JRadioButton registeredSdksButton = new JRadioButton(GradleBundle.message("gradle.import.structure.settings.label.sdk.configured"));
JRadioButton allSdksButton = new JRadioButton(GradleBundle.message("gradle.import.structure.settings.label.sdk.all"));
List<Sdk> javaSdks = ProjectJdkTable.getInstance().getSdksOfType(JavaSdk.getInstance());
if (javaSdks.isEmpty()) {
// No jdk instances are configured, just use a simple label then
builder.add("gradle.import.structure.settings.label.sdk", sdkComboBox);
}
else {
JPanel jdkKeyPanel = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.anchor = GridBagConstraints.WEST;
jdkKeyPanel.add(new JLabel(GradleBundle.message("gradle.import.structure.settings.label.sdk")), constraints);
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(allSdksButton);
buttonGroup.add(registeredSdksButton);
jdkKeyPanel.add(allSdksButton, constraints);
constraints.weightx = 1;
jdkKeyPanel.add(registeredSdksButton, constraints);
registeredSdksButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
myUseOnlyRegisteredSdks = e.getStateChange() == ItemEvent.SELECTED;
filterSdksByLanguageLevel();
}
});
allSdksButton.setSelected(true);
builder.add(jdkKeyPanel, sdkComboBox);
}
return new Pair<JRadioButton, JRadioButton>(registeredSdksButton, allSdksButton);
}
@NotNull
private TextFieldWithBrowseButton setupProjectConfigLocation(@NotNull GradleProjectSettingsBuilder builder) {
TextFieldWithBrowseButton result = new TextFieldWithBrowseButton();
String title = GradleBundle.message("gradle.import.structure.settings.title.project.config.location");
result.addBrowseFolderListener(title, "", null, BrowseFilesListener.SINGLE_DIRECTORY_DESCRIPTOR);
result.setText(myProject.getProjectFileDirectoryPath());
builder.add("gradle.import.structure.settings.label.project.config.location", result);
return result;
}
@NotNull
private TextFieldWithBrowseButton setupProjectCompileOutputLocation(@NotNull GradleProjectSettingsBuilder builder) {
TextFieldWithBrowseButton result = new TextFieldWithBrowseButton();
String title = GradleBundle.message("gradle.import.structure.settings.title.project.compile.output.location");
result.addBrowseFolderListener(title, "", null, BrowseFilesListener.SINGLE_DIRECTORY_DESCRIPTOR);
result.setText(myProject.getCompileOutputPath());
builder.add("gradle.import.structure.settings.label.project.compile.output.location", result);
return result;
}
@Override
public boolean validate() {
return GradleAdjustImportSettingsUtil.validate(myProject, myNameErrorLabel);
boolean nameIsValid = GradleAdjustImportSettingsUtil.validate(myProject, myNameControl);
if (!nameIsValid) {
return false;
}
if (!validateDirLocation(myProjectConfigLocationField, "gradle.import.text.error.undefined.config.location",
"gradle.import.text.error.file.config.location"))
{
return false;
}
myProject.setProjectFileDirectoryPath(myProjectCompileOutputLocationField.getText());
if (!validateDirLocation(myProjectCompileOutputLocationField, "gradle.import.text.error.undefined.project.compile.output.location",
"gradle.import.text.error.file.project.compile.output.location"))
{
return false;
}
myProject.setCompileOutputPath(myProjectCompileOutputLocationField.getText());
return true;
}
private static boolean validateDirLocation(
@NotNull TextFieldWithBrowseButton dataHolder,
@NotNull @PropertyKey(resourceBundle = GradleBundle.PATH_TO_BUNDLE)String undefinedPathMessageKey,
@NotNull @PropertyKey(resourceBundle = GradleBundle.PATH_TO_BUNDLE) String filePathMessageKey)
{
String path = dataHolder.getText();
if (path == null || path.trim().isEmpty()) {
GradleUtil.showBalloon(dataHolder, MessageType.ERROR, GradleBundle.message(undefinedPathMessageKey));
return false;
}
else if (new File(path).isFile()) {
GradleUtil.showBalloon(dataHolder, MessageType.ERROR, GradleBundle.message(filePathMessageKey));
return false;
}
return true;
}
@NotNull
@@ -19,52 +19,62 @@ import java.awt.*;
* @since 8/12/11 3:03 PM
*/
public class GradleProjectSettingsBuilder {
private static final int TOP_INSET = 15;
private static final int BOTTOM_INSET = 3;
private final JPanel myResult = new JPanel(new GridBagLayout());
private final GridBagConstraints myLabelConstraint = new GridBagConstraints();
private final GridBagConstraints myControlConstraint = new GridBagConstraints();
private final GridBagConstraints myErrorLabelConstraint = new GridBagConstraints();
private final GridBagConstraints myConstraint = new GridBagConstraints();
public GradleProjectSettingsBuilder() {
myLabelConstraint.anchor = myControlConstraint.anchor = GridBagConstraints.WEST;
myControlConstraint.gridwidth = GridBagConstraints.REMAINDER;
myControlConstraint.weightx = 1;
myControlConstraint.fill = GridBagConstraints.HORIZONTAL;
myErrorLabelConstraint.gridwidth = GridBagConstraints.REMAINDER;
myErrorLabelConstraint.insets.top = 3;
myConstraint.anchor = GridBagConstraints.WEST;
myConstraint.gridwidth = GridBagConstraints.REMAINDER;
myConstraint.weightx = 1;
myConstraint.fill = GridBagConstraints.HORIZONTAL;
}
/**
* Instructs current builder to use given component for the target property management.
*
* @param component component to use
*/
public void add(@NotNull JComponent component) {
myConstraint.insets.top = TOP_INSET;
myResult.add(component, myConstraint);
}
/**
* Instructs current builder to use given property key for the setting label name retrieval and given control for
* the settings value processing
*
* @param labelKey bundle key to use for retrieving setting's label name
* @param control GUI control for managing target setting's value
* @return holder to use for the validation error messages for the target control
*/
public JLabel add(@NotNull @PropertyKey(resourceBundle = GradleBundle.PATH_TO_BUNDLE) String labelKey, @NotNull JComponent control) {
public void add(@NotNull @PropertyKey(resourceBundle = GradleBundle.PATH_TO_BUNDLE) String labelKey, @NotNull JComponent control) {
myConstraint.insets.top = TOP_INSET;
JLabel label = new JLabel(GradleBundle.message(labelKey));
myResult.add(label, myLabelConstraint);
myResult.add(control, myControlConstraint);
if (myLabelConstraint.insets.top <= 0) {
myLabelConstraint.insets.top = myControlConstraint.insets.top = 15;
}
JLabel errorLabel = new JLabel();
Font font = errorLabel.getFont();
errorLabel.setFont(font.deriveFont((float)font.getSize() - 2));
errorLabel.setForeground(Color.RED);
errorLabel.setVisible(false);
myResult.add(errorLabel, myErrorLabelConstraint);
return errorLabel;
myResult.add(label, myConstraint);
myConstraint.insets.top = BOTTOM_INSET;
myResult.add(control, myConstraint);
}
/**
* Instructs current builder to expose target property using the given UI controls.
*
* @param keyComponent control that provides information about the target property (e.g. its name or description)
* @param valueComponent control that holds available property values and (possibly) allows to choose between them
*/
public void add(@NotNull JComponent keyComponent, @NotNull JComponent valueComponent) {
myConstraint.insets.top = TOP_INSET;
myResult.add(keyComponent, myConstraint);
myConstraint.insets.top = BOTTOM_INSET;
myResult.add(valueComponent, myConstraint);
}
/**
* @return GUI component that shows all of the stuff registered earlier via {@link #add(String, JComponent)}
*/
@NotNull
public JComponent build() {
// We don't check that this method hasn't been called already. Add that check if necessary.
GridBagConstraints constraints = new GridBagConstraints();