IDEA-101677 Gradle: 'Import project' enhancements

This commit is contained in:
Denis.Zhdanov
2013-02-25 12:33:40 +04:00
parent a6bad4822f
commit 606bc0cace
4 changed files with 83 additions and 88 deletions
@@ -26,8 +26,9 @@ gradle.import.structure.settings.label.project.config.location=Project location:
gradle.import.structure.settings.title.project.config.location=Project location
gradle.import.structure.settings.label.project.compile.output.location=Project compiler output:
gradle.import.structure.settings.title.project.compile.output.location=Project compiler output
gradle.import.structure.settings.label.module.config.location=Module file location:
gradle.import.structure.settings.title.module.config.location=Module file location
gradle.import.structure.settings.label.iml.location=Module files location:
gradle.import.structure.settings.label.iml.location.per.module=module content root
gradle.import.structure.settings.label.iml.location.project.dir=project dir
gradle.import.structure.settings.label.export=Exported:
gradle.import.structure.settings.label.scope=Scope:
gradle.import.structure.settings.label.root.source=Source roots:
@@ -11,8 +11,6 @@ import org.jetbrains.plugins.gradle.util.GradleBundle;
import org.jetbrains.plugins.gradle.util.GradleUtil;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/**
* @author Denis Zhdanov
@@ -23,41 +21,6 @@ public class GradleAdjustImportSettingsUtil {
private GradleAdjustImportSettingsUtil() {
}
/**
* Setups given builder to expose controls for management of the given component's name.
*
* @param builder target settings builder
* @param component component which name management should be exposed
* @return UI control that holds target component's name
*/
@NotNull
public static JTextField 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();
}
@Override
public void removeUpdate(DocumentEvent e) {
applyNewName();
}
@Override
public void changedUpdate(DocumentEvent e) {
}
private void applyNewName() {
String text = result.getText();
if (text == null) {
return;
}
component.setName(text.trim());
}
});
return result;
}
/**
* Performs generic check of the name of the given component.
*
@@ -15,7 +15,6 @@ import org.jetbrains.plugins.gradle.util.GradleUtil;
import javax.swing.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
/**
* Manages settings of {@link GradleModule gradle module} component.
@@ -27,8 +26,6 @@ public class GradleModuleSettings implements GradleProjectStructureNodeSettings
private final JComponent myComponent;
private final GradleModule myModule;
private final JTextField myNameControl;
private final TextFieldWithBrowseButton myModuleFileLocationField;
private final JRadioButton myInheritProjectCompileOutputPathButton;
private final JRadioButton myUseModuleCompileOutputPathButton;
private final TextFieldWithBrowseButton myOutputLocationField;
@@ -37,8 +34,6 @@ public class GradleModuleSettings implements GradleProjectStructureNodeSettings
public GradleModuleSettings(@NotNull GradleModule module) {
myModule = module;
GradleProjectSettingsBuilder builder = new GradleProjectSettingsBuilder();
myNameControl = GradleAdjustImportSettingsUtil.configureNameControl(builder, myModule);
myModuleFileLocationField = setupModuleFileLocation(builder);
Pair<JRadioButton, JRadioButton> pair = setupCompileOutput(builder);
myInheritProjectCompileOutputPathButton = pair.first;
myUseModuleCompileOutputPathButton = pair.second;
@@ -70,15 +65,6 @@ public class GradleModuleSettings implements GradleProjectStructureNodeSettings
return new Pair<JRadioButton, JRadioButton>(inheritButton, moduleButton);
}
@NotNull
private static TextFieldWithBrowseButton setupModuleFileLocation(@NotNull GradleProjectSettingsBuilder builder) {
TextFieldWithBrowseButton result = new TextFieldWithBrowseButton();
String title = GradleBundle.message("gradle.import.structure.settings.title.module.config.location");
result.addBrowseFolderListener(title, "", null, BrowseFilesListener.SINGLE_DIRECTORY_DESCRIPTOR);
builder.add("gradle.import.structure.settings.label.module.config.location", result);
return result;
}
@NotNull
private static Pair<TextFieldWithBrowseButton, TextFieldWithBrowseButton> setupOutputLocation(
@NotNull GradleProjectSettingsBuilder builder)
@@ -98,19 +84,6 @@ public class GradleModuleSettings implements GradleProjectStructureNodeSettings
@Override
public boolean validate() {
if (!GradleAdjustImportSettingsUtil.validate(myModule, myNameControl)) {
return false;
}
String moduleFileDir = myModuleFileLocationField.getText();
if (moduleFileDir == null || StringUtil.isEmpty(moduleFileDir.trim())) {
GradleUtil.showBalloon(
myModuleFileLocationField,
MessageType.ERROR,
GradleBundle.message("gradle.import.text.error.module.undefined.config.location")
);
return false;
}
myModule.setModuleFileDirectoryPath(moduleFileDir.trim());
if (myUseModuleCompileOutputPathButton.isSelected()) {
String outputLocation = myOutputLocationField.getText();
if (outputLocation == null || StringUtil.isEmpty(outputLocation.trim())) {
@@ -139,8 +112,6 @@ public class GradleModuleSettings implements GradleProjectStructureNodeSettings
@Override
public void refresh() {
myNameControl.setText(myModule.getName());
myModuleFileLocationField.setText(new File(myModule.getModuleFilePath()).getParent());
if (myModule.isInheritProjectCompileOutputPath()) {
myInheritProjectCompileOutputPathButton.setSelected(true);
}
@@ -1,27 +1,35 @@
package org.jetbrains.plugins.gradle.manage.wizard.adjust;
import com.intellij.ide.util.BrowseFilesListener;
import com.intellij.ide.util.PropertiesComponent;
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.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.ui.components.JBRadioButton;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.PropertyKey;
import org.jetbrains.plugins.gradle.model.gradle.GradleContentRoot;
import org.jetbrains.plugins.gradle.model.gradle.GradleModule;
import org.jetbrains.plugins.gradle.model.gradle.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.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.*;
import java.util.List;
import java.util.Map;
/**
* Manages settings of {@link GradleProject gradle project} component.
@@ -30,28 +38,33 @@ import java.util.Map;
* @since 8/12/11 2:58 PM
*/
public class GradleProjectSettings implements GradleProjectStructureNodeSettings {
private final JComponent myComponent;
private final GradleProject myProject;
private final JTextField myNameControl;
private final JComboBox myLanguageLevelComboBox;
private final DefaultComboBoxModel mySdkModel;
private final TextFieldWithBrowseButton myProjectConfigLocationField;
private final TextFieldWithBrowseButton myProjectCompileOutputLocationField;
private static final String KEEP_IML_AT_MODULE_DIR_PROPERTY_KEY = "gradle.iml.at.module.dir";
@NotNull private final JComponent myComponent;
@NotNull private final GradleProject myProject;
@NotNull private final JComboBox myLanguageLevelComboBox;
@NotNull private final DefaultComboBoxModel mySdkModel;
@NotNull private final TextFieldWithBrowseButton myProjectConfigLocationField;
@NotNull private final TextFieldWithBrowseButton myProjectCompileOutputLocationField;
@NotNull private final JRadioButton myImlAtModuleContentRootsButton;
@NotNull private final JRadioButton myImlAtProjectDirButton;
public GradleProjectSettings(@NotNull GradleProject project) {
myProject = project;
GradleProjectSettingsBuilder builder = new GradleProjectSettingsBuilder();
myNameControl = GradleAdjustImportSettingsUtil.configureNameControl(builder, project);
myLanguageLevelComboBox = setupLanguageLevelControls(builder);
setupSdkControls(mySdkModel = new DefaultComboBoxModel(), builder);
myProjectConfigLocationField = setupProjectConfigLocation(builder);
myProjectCompileOutputLocationField = setupProjectCompileOutputLocation(builder);
filterSdksByLanguageLevel();
filterSdksByLanguageLevel();
myImlAtModuleContentRootsButton = new JBRadioButton(GradleBundle.message("gradle.import.structure.settings.label.iml.location.per.module"));
myImlAtProjectDirButton = new JBRadioButton(GradleBundle.message("gradle.import.structure.settings.label.iml.location.project.dir"));
setModuleFilesLocationControl(builder);
myComponent = builder.build();
refresh();
}
private JComboBox setupLanguageLevelControls(@NotNull GradleProjectSettingsBuilder builder) {
JComboBox result = new JComboBox();
final Map<Object, LanguageLevel> levels = new HashMap<Object, LanguageLevel>();
@@ -140,14 +153,62 @@ public class GradleProjectSettings implements GradleProjectStructureNodeSettings
builder.add("gradle.import.structure.settings.label.project.compile.output.location", result);
return result;
}
private void setModuleFilesLocationControl(@NotNull GradleProjectSettingsBuilder builder) {
ButtonGroup group = new ButtonGroup();
group.add(myImlAtModuleContentRootsButton);
group.add(myImlAtProjectDirButton);
JPanel panel = new JPanel(new GridLayout(2, 1));
panel.add(myImlAtModuleContentRootsButton);
panel.add(myImlAtProjectDirButton);
myImlAtModuleContentRootsButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() != ItemEvent.SELECTED) {
return;
}
for (GradleModule module : myProject.getModules()) {
Collection<GradleContentRoot> contentRoots = module.getContentRoots();
if (contentRoots.isEmpty()) {
continue;
}
module.setModuleFileDirectoryPath(contentRoots.iterator().next().getRootPath());
}
PropertiesComponent.getInstance().setValue(KEEP_IML_AT_MODULE_DIR_PROPERTY_KEY, String.valueOf(true));
}
});
myImlAtProjectDirButton.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() != ItemEvent.SELECTED) {
return;
}
String dirPath = myProjectConfigLocationField.getText();
if (StringUtil.isEmpty(dirPath)) {
return;
}
boolean goodDir = FileUtilRt.createDirectory(new File(dirPath));
if (!goodDir) {
return;
}
for (GradleModule module : myProject.getModules()) {
module.setModuleFileDirectoryPath(dirPath);
}
PropertiesComponent.getInstance().setValue(KEEP_IML_AT_MODULE_DIR_PROPERTY_KEY, String.valueOf(false));
}
});
boolean imlAtModuleDir = PropertiesComponent.getInstance().getBoolean(KEEP_IML_AT_MODULE_DIR_PROPERTY_KEY, true);
if (imlAtModuleDir) {
myImlAtModuleContentRootsButton.setSelected(true);
}
else {
myImlAtProjectDirButton.setSelected(true);
}
builder.add("gradle.import.structure.settings.label.iml.location", panel);
}
@Override
public boolean validate() {
boolean nameIsValid = GradleAdjustImportSettingsUtil.validate(myProject, myNameControl);
if (!nameIsValid) {
return false;
}
if (!validateDirLocation(myProjectConfigLocationField, "gradle.import.text.error.project.undefined.config.location",
"gradle.import.text.error.file.config.location"))
{
@@ -167,7 +228,6 @@ public class GradleProjectSettings implements GradleProjectStructureNodeSettings
@Override
public void refresh() {
myNameControl.setText(myProject.getName());
myProjectConfigLocationField.setText(myProject.getProjectFileDirectoryPath());
myProjectCompileOutputLocationField.setText(myProject.getCompileOutputPath());
myLanguageLevelComboBox.setSelectedItem(myProject.getLanguageLevel().getPresentableText());