diff --git a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java index 72f2a7c3add3..c74c9276a5fe 100644 --- a/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java +++ b/java/idea-ui/src/com/intellij/ide/util/newProjectWizard/SelectTemplateStep.java @@ -769,6 +769,11 @@ public class SelectTemplateStep extends ModuleWizardStep implements SettingsStep myModuleNameDocListenerEnabled = true; } + @NotNull + public JTextField getModuleNameField() { + return myModuleName; + } + protected String getModuleName() { return myModuleName.getText().trim(); } diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidAppPropertiesEditor.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidAppPropertiesEditor.java index 84bbbc2fb2d1..f1d50d5af867 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidAppPropertiesEditor.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidAppPropertiesEditor.java @@ -30,6 +30,7 @@ import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.util.AndroidBundle; import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.event.DocumentEvent; @@ -125,7 +126,12 @@ public class AndroidAppPropertiesEditor { } private String validatePackageName(boolean library) { - String candidate = myPackageNameField.getText().trim(); + final String candidate = myPackageNameField.getText().trim(); + return doValidatePackageName(library, candidate, myModulesProvider); + } + + @NotNull + static String doValidatePackageName(boolean library, @NotNull String candidate, @Nullable ModulesProvider modulesProvider) { if (candidate.length() == 0) { return AndroidBundle.message("specify.package.name.error"); } @@ -137,7 +143,7 @@ public class AndroidAppPropertiesEditor { } if (!library) { - for (Module module : myModulesProvider.getModules()) { + for (Module module : modulesProvider.getModules()) { final AndroidFacet facet = AndroidFacet.getInstance(module); if (facet != null && !facet.getConfiguration().LIBRARY_PROJECT) { final Manifest manifest = facet.getManifest(); diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidLibraryModifiedSettingsStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidLibraryModifiedSettingsStep.java new file mode 100644 index 000000000000..176dce9ff39c --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidLibraryModifiedSettingsStep.java @@ -0,0 +1,72 @@ +package org.jetbrains.android.newProject; + +import com.intellij.ide.util.newProjectWizard.SelectTemplateStep; +import com.intellij.ide.util.projectWizard.SettingsStep; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.ui.DocumentAdapter; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; + +/** +* @author Eugene.Kudelevsky +*/ +class AndroidLibraryModifiedSettingsStep extends AndroidModifiedSettingsStep { + + private final JTextField myPackageNameField; + private boolean myPackageNameFieldChangedByUser; + + public AndroidLibraryModifiedSettingsStep(@NotNull AndroidModuleBuilder builder, @NotNull SettingsStep settingsStep) { + super(builder, settingsStep); + myPackageNameField = new JTextField(); + final SelectTemplateStep step = (SelectTemplateStep)settingsStep; + updatePackageNameField(step); + settingsStep.addSettingsField("Pa\u001Bckage name: ", myPackageNameField); + + myPackageNameField.getDocument().addDocumentListener(new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + myPackageNameFieldChangedByUser = true; + } + }); + + step.getModuleNameField().getDocument().addDocumentListener(new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + if (!myPackageNameFieldChangedByUser) { + updatePackageNameField(step); + myPackageNameFieldChangedByUser = false; + } + } + }); + } + + private void updatePackageNameField(SelectTemplateStep settingsStep) { + final String moduleName = settingsStep.getModuleNameField().getText().trim(); + + if (moduleName.length() > 0) { + myPackageNameField.setText(AndroidAppPropertiesEditor.getDefaultPackageNameByModuleName(moduleName)); + } + } + + @Override + public boolean validate() throws ConfigurationException { + final String message = AndroidAppPropertiesEditor.doValidatePackageName(true, getPackageName(), null); + + if (message.length() > 0) { + throw new ConfigurationException(message); + } + return true; + } + + @Override + public void updateDataModel() { + super.updateDataModel(); + myBuilder.setPackageName(getPackageName()); + } + + private String getPackageName() { + return myPackageNameField.getText().trim(); + } +} diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModifiedSettingsStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModifiedSettingsStep.java new file mode 100644 index 000000000000..a48f6f41f44d --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModifiedSettingsStep.java @@ -0,0 +1,37 @@ +package org.jetbrains.android.newProject; + +import com.intellij.ide.util.projectWizard.SdkSettingsStep; +import com.intellij.ide.util.projectWizard.SettingsStep; +import com.intellij.openapi.projectRoots.SdkTypeId; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; + +/** +* @author Eugene.Kudelevsky +*/ +class AndroidModifiedSettingsStep extends SdkSettingsStep { + protected AndroidModuleBuilder myBuilder; + + AndroidModifiedSettingsStep(@NotNull final AndroidModuleBuilder builder, @NotNull SettingsStep settingsStep) { + super(settingsStep, builder, new Condition() { + @Override + public boolean value(SdkTypeId sdkType) { + return builder.isSuitableSdkType(sdkType); + } + }); + myBuilder = builder; + } + + @Override + public void updateDataModel() { + super.updateDataModel(); + final String path = myBuilder.getContentEntryPath(); + + if (path != null) { + myBuilder.setSourcePaths(Collections.singletonList(Pair.create(path + "/src", ""))); + } + } +} diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java index 079739ae59fd..f4fde62f00ed 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleBuilder.java @@ -28,9 +28,7 @@ import com.intellij.execution.RunnerAndConfigurationSettings; import com.intellij.execution.configurations.GeneralCommandLine; import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.ide.fileTemplates.FileTemplateManager; -import com.intellij.ide.util.projectWizard.JavaModuleBuilder; -import com.intellij.ide.util.projectWizard.ModuleWizardStep; -import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.ide.util.projectWizard.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; @@ -688,6 +686,26 @@ public class AndroidModuleBuilder extends JavaModuleBuilder { return StdModuleTypes.JAVA; } + @Nullable + @Override + public ModuleWizardStep modifySettingsStep(final SettingsStep settingsStep) { + if (myProjectType == null) { + return super.modifySettingsStep(settingsStep); + } + switch (myProjectType) { + + case APPLICATION: + return new AndroidModifiedSettingsStep(this, settingsStep); + case LIBRARY: + return new AndroidLibraryModifiedSettingsStep(this, settingsStep); + case TEST: + return new AndroidTestModifiedSettingsStep(this, settingsStep); + default: + LOG.error("Unknown project type " + myProjectType); + return super.modifySettingsStep(settingsStep); + } + } + public void setTestedModule(Module module) { myTestedModule = module; } @@ -753,6 +771,12 @@ public class AndroidModuleBuilder extends JavaModuleBuilder { public String getBuilderId() { return "android.library"; } + + @Override + public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext, + ModulesProvider modulesProvider) { + return ModuleWizardStep.EMPTY_ARRAY; + } } public static class Test extends AndroidModuleBuilder { @@ -760,6 +784,11 @@ public class AndroidModuleBuilder extends JavaModuleBuilder { super(ProjectType.TEST); } + @Override + public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext, ModulesProvider modulesProvider) { + return ModuleWizardStep.EMPTY_ARRAY; + } + @Override public String getBuilderId() { return "android.test"; diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java index 0259b3144b9a..179914734d09 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidModuleWizardStep.java @@ -87,6 +87,7 @@ public class AndroidModuleWizardStep extends ModuleWizardStep { @NonNls private static final String TARGET_SELECTION_MODE_FOR_NEW_MODULE_PROPERTY = "ANDROID_TARGET_SELECTION_MODE_FOR_NEW_MODULE"; @NonNls private static final String TARGET_AVD_FOR_NEW_MODULE_PROPERTY = "ANDROID_TARGET_AVD_FOR_NEW_MODULE"; + private boolean myInitialized; public AndroidModuleWizardStep(@NotNull AndroidModuleBuilder moduleBuilder, final WizardContext context, @@ -211,7 +212,19 @@ public class AndroidModuleWizardStep extends ModuleWizardStep { } } + @Override + public void updateStep() { + if (!myInitialized) { + myInitialized = true; + initialize(); + } + } + public JComponent getComponent() { + return myPanel; + } + + private void initialize() { final String moduleName = myModuleBuilder.getName(); if (moduleName != null) { @@ -230,7 +243,6 @@ public class AndroidModuleWizardStep extends ModuleWizardStep { } updateDeploymentTargetPanel(); - return myPanel; } @Override diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidTestModifiedSettingsStep.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidTestModifiedSettingsStep.java new file mode 100644 index 000000000000..aa3bf108cfed --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidTestModifiedSettingsStep.java @@ -0,0 +1,59 @@ +package org.jetbrains.android.newProject; + +import com.intellij.execution.RunManager; +import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.ide.util.projectWizard.SettingsStep; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.openapi.project.Project; +import org.jetbrains.android.run.AndroidRunConfiguration; +import org.jetbrains.android.run.AndroidRunConfigurationType; +import org.jetbrains.android.run.TargetSelectionMode; +import org.jetbrains.annotations.NotNull; + +/** +* @author Eugene.Kudelevsky +*/ +class AndroidTestModifiedSettingsStep extends AndroidModifiedSettingsStep { + private final AndroidModulesComboBox myModulesCombo; + private final Project myProject; + + public AndroidTestModifiedSettingsStep(@NotNull AndroidModuleBuilder builder, @NotNull SettingsStep settingsStep) { + super(builder, settingsStep); + myModulesCombo = new AndroidModulesComboBox(); + myProject = settingsStep.getContext().getProject(); + assert myProject != null : "test module can't be created as first module"; + myModulesCombo.init(myProject); + settingsStep.addSettingsField("\u001BTested module: ", myModulesCombo); + } + + @Override + public void updateDataModel() { + super.updateDataModel(); + final Module testedModule = myModulesCombo.getModule(); + myBuilder.setTestedModule(testedModule); + myBuilder.setTargetSelectionMode(chooseTargetSelectionMode(testedModule)); + } + + @NotNull + private TargetSelectionMode chooseTargetSelectionMode(@NotNull Module testedModule) { + final RunConfiguration[] androidConfigurations = + RunManager.getInstance(myProject).getConfigurations(AndroidRunConfigurationType.getInstance()); + + for (RunConfiguration configuration : androidConfigurations) { + final AndroidRunConfiguration cfg = (AndroidRunConfiguration)configuration; + final Module module = cfg.getConfigurationModule().getModule(); + + if (testedModule.equals(module)) { + return cfg.getTargetSelectionMode(); + } + } + return TargetSelectionMode.EMULATOR; + } + + @Override + public boolean validate() throws ConfigurationException { + AndroidTestPropertiesEditor.doValidate(myModulesCombo.getModule()); + return true; + } +} diff --git a/plugins/android/src/org/jetbrains/android/newProject/AndroidTestPropertiesEditor.java b/plugins/android/src/org/jetbrains/android/newProject/AndroidTestPropertiesEditor.java index 2353931228ad..d8f78061d89f 100644 --- a/plugins/android/src/org/jetbrains/android/newProject/AndroidTestPropertiesEditor.java +++ b/plugins/android/src/org/jetbrains/android/newProject/AndroidTestPropertiesEditor.java @@ -43,7 +43,10 @@ public class AndroidTestPropertiesEditor { } public void validate() throws ConfigurationException { - Module module = myModulesCombo.getModule(); + doValidate(myModulesCombo.getModule()); + } + + static void doValidate(Module module) throws ConfigurationException { if (module == null) { throw new ConfigurationException(AndroidBundle.message("android.wizard.specify.tested.module.error")); }