import com.android.ide.eclipse.adt.AdtConstants;
import com.android.ide.eclipse.adt.AdtPlugin;
+import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.SdkConstants;
import com.android.sdklib.internal.project.ProjectProperties;
-import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
import com.android.sdklib.internal.project.ProjectPropertiesWorkingCopy;
+import com.android.sdklib.internal.project.ProjectProperties.PropertyType;
import com.android.sdklib.xml.AndroidManifest;
import com.android.sdklib.xml.ManifestData;
import com.android.sdklib.xml.ManifestData.Activity;
* Do not derive from this class.
*/
public class NewProjectCreationPage extends WizardPage {
+ /** Suffix added by default to activity names */
+ private static final String ACTIVITY_NAME_SUFFIX = "Activity"; //$NON-NLS-1$
// constants
private static final String MAIN_PAGE_NAME = "newAndroidProjectPage"; //$NON-NLS-1$
private boolean mInternalApplicationNameUpdate;
private boolean mInternalCreateActivityUpdate;
private boolean mInternalActivityNameUpdate;
+ private boolean mInternalMinSdkUpdate;
private boolean mProjectNameModifiedByUser;
private boolean mApplicationNameModifiedByUser;
+ private boolean mActivityNameModifiedByUser;
+ private boolean mMinSdkModifiedByUser;
private final ArrayList<String> mSamplesPaths = new ArrayList<String>();
private Combo mSamplesCombo;
mProjectNameField.setFont(parent.getFont());
mProjectNameField.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
- if (!mInternalProjectNameUpdate) {
- mProjectNameModifiedByUser = true;
- }
- updateLocationPathField(null);
+ onProjectFieldModified();
}
});
}
-
/**
* Creates the group for the Project options:
* [radio] Create new project
mApplicationNameField.setFont(parent.getFont());
mApplicationNameField.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
- if (!mInternalApplicationNameUpdate) {
- mApplicationNameModifiedByUser = true;
- }
+ onApplicationFieldModified();
}
});
mMinSdkVersionField.setFont(parent.getFont());
mMinSdkVersionField.addListener(SWT.Modify, new Listener() {
public void handleEvent(Event event) {
+ onMinSdkFieldUpdated();
validatePageComplete();
}
});
}
}
+ private void onProjectFieldModified() {
+ if (!mInternalProjectNameUpdate) {
+ mProjectNameModifiedByUser = true;
+
+ if (!mApplicationNameModifiedByUser) {
+ String name = DescriptorsUtils.capitalize(mProjectNameField.getText());
+ try {
+ mInternalApplicationNameUpdate = true;
+ mApplicationNameField.setText(name);
+ } finally {
+ mInternalApplicationNameUpdate = false;
+ }
+ }
+ if (!mActivityNameModifiedByUser) {
+ String name = DescriptorsUtils.capitalize(mProjectNameField.getText());
+ try {
+ mInternalActivityNameUpdate = true;
+ mActivityNameField.setText(name + ACTIVITY_NAME_SUFFIX);
+ } finally {
+ mInternalActivityNameUpdate = false;
+ }
+
+ }
+ }
+ updateLocationPathField(null);
+ }
+
+ private void onMinSdkFieldUpdated() {
+ if (!mInternalMinSdkUpdate) {
+ mMinSdkModifiedByUser = true;
+ }
+ }
+
+ private void onApplicationFieldModified() {
+ if (!mInternalApplicationNameUpdate) {
+ mApplicationNameModifiedByUser = true;
+ if (!mActivityNameModifiedByUser) {
+ String name = DescriptorsUtils.capitalize(mApplicationNameField.getText());
+ try {
+ mInternalActivityNameUpdate = true;
+ mActivityNameField.setText(name + ACTIVITY_NAME_SUFFIX);
+ } finally {
+ mInternalActivityNameUpdate = false;
+ }
+ }
+ }
+ }
+
/**
* The location path field is either modified internally (from updateLocationPathField)
* or manually by the user when the custom_location mode is not set.
* validate the page.
*/
private void onActivityNameFieldModified() {
+ if (!mInternalActivityNameUpdate) {
+ mActivityNameModifiedByUser = true;
+ }
+
if (mInfo.isNewProject() && !mInternalActivityNameUpdate) {
mUserActivityName = mInfo.getActivityName();
validatePageComplete();
private void onSdkTargetModified() {
IAndroidTarget target = mInfo.getSdkTarget();
+ // Update the minimum SDK text field?
+ // We do if one of two conditions are met:
+ if (target != null) {
+ boolean setMinSdk = false;
+ int apiLevel = target.getVersion().getApiLevel();
+ // 1. Has the user not manually edited the SDK field yet? If so, keep
+ // updating it to the selected value.
+ if (!mMinSdkModifiedByUser) {
+ setMinSdk = true;
+ } else {
+ // 2. Is the API level set to a higher level than the newly selected
+ // target SDK? If so, change it down to the new lower value.
+ String s = mMinSdkVersionField.getText().trim();
+ if (s.length() > 0) {
+ try {
+ int currentApi = Integer.parseInt(s);
+ if (currentApi > apiLevel) {
+ setMinSdk = true;
+ }
+ } catch (NumberFormatException nfe) {
+ // User may have typed something invalid -- ignore
+ }
+ }
+ }
+ if (setMinSdk) {
+ try {
+ mInternalMinSdkUpdate = true;
+ mMinSdkVersionField.setText(Integer.toString(apiLevel));
+ } finally {
+ mInternalMinSdkUpdate = false;
+ }
+ }
+ }
+
loadSamplesForTarget(target);
enableLocationWidgets();
onSampleSelected();
return setStatus("Activity name must be specified.", MSG_ERROR);
}
+ if (ACTIVITY_NAME_SUFFIX.equals(activityFieldContents)) {
+ return setStatus("Enter a valid activity name", MSG_ERROR);
+ }
+
// The activity field can actually contain part of a sub-package name
// or it can start with a dot "." to indicates it comes from the parent package name.
String packageName = ""; //$NON-NLS-1$