mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
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:
@@ -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() {
|
||||
|
||||
+1
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+13
-14
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
+196
-11
@@ -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
|
||||
|
||||
+38
-28
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user