improve creating android modules from templates

This commit is contained in:
Eugene Kudelevsky
2012-11-09 19:48:52 +04:00
parent de83aff267
commit a40737c481
8 changed files with 230 additions and 7 deletions
@@ -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();
}
@@ -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();
@@ -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();
}
}
@@ -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<SdkTypeId>() {
@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", "")));
}
}
}
@@ -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";
@@ -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
@@ -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;
}
}
@@ -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"));
}