diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index df9969acd658..d0624415b827 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -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: diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleAdjustImportSettingsUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleAdjustImportSettingsUtil.java index 1fefd3a3b99b..b309b0014431 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleAdjustImportSettingsUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleAdjustImportSettingsUtil.java @@ -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. * diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleModuleSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleModuleSettings.java index 502063ec0284..3bc37e8ad1b5 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleModuleSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleModuleSettings.java @@ -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 pair = setupCompileOutput(builder); myInheritProjectCompileOutputPathButton = pair.first; myUseModuleCompileOutputPathButton = pair.second; @@ -70,15 +65,6 @@ public class GradleModuleSettings implements GradleProjectStructureNodeSettings return new Pair(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 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); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleProjectSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleProjectSettings.java index 429563fa33b2..133b04eb3fcd 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleProjectSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/manage/wizard/adjust/GradleProjectSettings.java @@ -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 levels = new HashMap(); @@ -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 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());