From b54c0aa67b08da051e974342cbe2014c4fe1e4af Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Wed, 7 Sep 2011 15:57:41 +0400 Subject: [PATCH] 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; --- .../openapi/projectRoots/JavaSdkVersion.java | 40 +++- .../resources/i18n/GradleBundle.properties | 11 + .../gradle/config/GradleConfigurable.java | 17 +- .../gradle/importing/model/GradleProject.java | 13 +- .../wizard/GradleProjectImportBuilder.java | 1 + .../GradleAdjustImportSettingsUtil.java | 27 ++- .../wizard/adjust/GradleLibrarySettings.java | 6 +- .../wizard/adjust/GradleModuleSettings.java | 6 +- .../wizard/adjust/GradleProjectSettings.java | 207 +++++++++++++++++- .../adjust/GradleProjectSettingsBuilder.java | 66 +++--- 10 files changed, 323 insertions(+), 71 deletions(-) diff --git a/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java b/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java index 23a53de54f60..57a56966449f 100644 --- a/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java +++ b/java/openapi/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java @@ -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())) + ); + } } diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index a71f2e886bfb..a370eae55bb7 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -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 diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java index 26ec00ff440c..eb6ec8ab900d 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/config/GradleConfigurable.java @@ -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)) ? diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleProject.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleProject.java index 0b891fa520e3..1b6f20019c5f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleProject.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/model/GradleProject.java @@ -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() { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/GradleProjectImportBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/GradleProjectImportBuilder.java index 613c17faf48b..ebf946c67f54 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/GradleProjectImportBuilder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/GradleProjectImportBuilder.java @@ -216,6 +216,7 @@ public class GradleProjectImportBuilder extends ProjectImportBuildertrue if validation is successful; false 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; } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleLibrarySettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleLibrarySettings.java index 18e2a5b13bd0..53887602435a 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleLibrarySettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleLibrarySettings.java @@ -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 diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleModuleSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleModuleSettings.java index a5b40db0ce2a..4ae83e7d04e5 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleModuleSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleModuleSettings.java @@ -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 diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectSettings.java index f4807180966e..644f51dcee09 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectSettings.java @@ -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 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 levels = new HashMap(); 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 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 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 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(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 diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectSettingsBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectSettingsBuilder.java index 629c8ce8e1b4..caeee6760982 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectSettingsBuilder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/importing/wizard/adjust/GradleProjectSettingsBuilder.java @@ -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();