diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/TestTargetPage.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/TestTargetPage.java | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/TestTargetPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/TestTargetPage.java new file mode 100644 index 000000000..f1c188ae9 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/TestTargetPage.java @@ -0,0 +1,293 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Eclipse Public License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.eclipse.org/org/documents/epl-v10.php + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.ide.eclipse.adt.internal.wizards.newproject; + +import com.android.ide.common.xml.ManifestData; +import com.android.ide.eclipse.adt.internal.project.AndroidManifestHelper; +import com.android.ide.eclipse.adt.internal.project.ProjectChooserHelper; +import com.android.ide.eclipse.adt.internal.sdk.Sdk; +import com.android.sdklib.IAndroidTarget; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jdt.core.IJavaModel; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.ui.JavaElementLabelProvider; +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.dialogs.FilteredList; + +/** + * Page shown when creating a test project which lets you choose between testing + * yourself and testing a different project + */ +class TestTargetPage extends WizardPage implements SelectionListener { + private final NewProjectWizardState mValues; + /** Flag used when setting button/text state manually to ignore listener updates */ + private boolean mIgnore; + private String mLastExistingPackageName; + + private Button mCurrentRadioButton; + private Button mExistingRadioButton; + private FilteredList mProjectList; + private boolean mPageShown; + + /** + * Create the wizard. + */ + TestTargetPage(NewProjectWizardState values) { + super("testTargetPage"); //$NON-NLS-1$ + setTitle("Select Test Target"); + setDescription("Choose a project to test"); + mValues = values; + } + + /** + * Create contents of the wizard. + */ + @Override + public void createControl(Composite parent) { + Composite container = new Composite(parent, SWT.NULL); + + setControl(container); + container.setLayout(new GridLayout(2, false)); + + mCurrentRadioButton = new Button(container, SWT.RADIO); + mCurrentRadioButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); + mCurrentRadioButton.setText("This project"); + mCurrentRadioButton.addSelectionListener(this); + + mExistingRadioButton = new Button(container, SWT.RADIO); + mExistingRadioButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); + mExistingRadioButton.setText("An existing Android project:"); + mExistingRadioButton.addSelectionListener(this); + + ILabelProvider labelProvider = new JavaElementLabelProvider( + JavaElementLabelProvider.SHOW_DEFAULT); + mProjectList = new FilteredList(container, + SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.SINGLE, labelProvider, + true /*ignoreCase*/, false /*allowDuplicates*/, true /* matchEmptyString*/); + mProjectList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); + mProjectList.addSelectionListener(this); + } + + private void initializeList() { + ProjectChooserHelper helper = new ProjectChooserHelper(getShell(), null /*filter*/); + IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); + IJavaModel javaModel = JavaCore.create(workspaceRoot); + IJavaProject[] androidProjects = helper.getAndroidProjects(javaModel); + mProjectList.setElements(androidProjects); + if (mValues.testedProject != null) { + for (IJavaProject project : androidProjects) { + if (project.getProject() == mValues.testedProject) { + mProjectList.setSelection(new Object[] { project }); + break; + } + } + } else { + // No initial selection: force the user to choose + mProjectList.setSelection(new int[0]); + } + } + + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + mPageShown = true; + + if (visible) { + try { + mIgnore = true; + mCurrentRadioButton.setSelection(mValues.testingSelf); + mExistingRadioButton.setSelection(!mValues.testingSelf); + mProjectList.setEnabled(!mValues.testingSelf); + + if (mProjectList.isEmpty()) { + initializeList(); + } + if (!mValues.testingSelf) { + mProjectList.setFocus(); + IProject project = getSelectedProject(); + if (project != null) { + // The FilteredList seems to -insist- on selecting the first item + // in the list, even when the selection is explicitly set to an empty + // array. This means the user is looking at a selection, so we need + // to also go ahead and select this item in the model such that the + // two agree, even if we would have preferred to have no initial + // selection. + mValues.testedProject = project; + } + } + } finally { + mIgnore = false; + } + } + + validatePage(); + } + + @Override + public void widgetSelected(SelectionEvent e) { + if (mIgnore) { + return; + } + + Object source = e.getSource(); + if (source == mExistingRadioButton) { + mProjectList.setEnabled(true); + mValues.testingSelf = false; + setExistingProject(getSelectedProject()); + mProjectList.setFocus(); + } else if (source == mCurrentRadioButton) { + mProjectList.setEnabled(false); + mValues.testingSelf = true; + mValues.testedProject = null; + } else { + // The event must be from the project list, which unfortunately doesn't + // pass itself as the selection event, it passes a reference to some internal + // table widget that it uses, so we check for this case last + IProject project = getSelectedProject(); + if (project != mValues.testedProject) { + setExistingProject(project); + } + } + + validatePage(); + } + + private IProject getSelectedProject() { + Object[] selection = mProjectList.getSelection(); + IProject project = selection != null && selection.length == 1 + ? ((IJavaProject) selection[0]).getProject() : null; + return project; + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + private void setExistingProject(IProject project) { + mValues.testedProject = project; + + // Try to update the application, package, sdk target and minSdkVersion accordingly + if (project != null && + (!mValues.applicationNameModifiedByUser || + !mValues.packageNameModifiedByUser || + !mValues.targetModifiedByUser || + !mValues.minSdkModifiedByUser)) { + ManifestData manifestData = AndroidManifestHelper.parseForData(project); + if (manifestData != null) { + String appName = String.format("%1$sTest", project.getName()); + String packageName = manifestData.getPackage(); + String minSdkVersion = manifestData.getMinSdkVersionString(); + IAndroidTarget sdkTarget = null; + if (Sdk.getCurrent() != null) { + sdkTarget = Sdk.getCurrent().getTarget(project); + } + + if (packageName == null) { + packageName = ""; //$NON-NLS-1$ + } + mLastExistingPackageName = packageName; + + if (!mValues.projectNameModifiedByUser) { + mValues.projectName = appName; + } + + if (!mValues.applicationNameModifiedByUser) { + mValues.applicationName = appName; + } + + if (!mValues.packageNameModifiedByUser) { + packageName += ".test"; //$NON-NLS-1$ + mValues.packageName = packageName; + } + + if (!mValues.targetModifiedByUser && sdkTarget != null) { + mValues.target = sdkTarget; + } + + if (!mValues.minSdkModifiedByUser) { + if (minSdkVersion != null || sdkTarget != null) { + mValues.minSdk = minSdkVersion; + } + if (sdkTarget == null) { + mValues.updateSdkTargetToMatchMinSdkVersion(); + } + } + } + } + + updateTestTargetPackageField(mLastExistingPackageName); + } + + /** + * Updates the test target package name + * + * When using the "self-test" option, the packageName argument is ignored and the + * current value from the project package is used. + * + * Otherwise the packageName is used if it is not null. + */ + private void updateTestTargetPackageField(String packageName) { + if (mValues.testingSelf) { + mValues.testTargetPackageName = mValues.packageName; + } else if (packageName != null) { + mValues.testTargetPackageName = packageName; + } + } + + @Override + public boolean isPageComplete() { + // Ensure that the user sees the page and makes a selection + if (!mPageShown) { + return false; + } + + return super.isPageComplete(); + } + + private void validatePage() { + String error = null; + + if (!mValues.testingSelf) { + if (mValues.testedProject == null) { + error = "Please select an existing Android project as a test target."; + } else if (mValues.projectName.equals(mValues.testedProject.getName())) { + error = "The main project name and the test project name must be different."; + } + } + + // -- update UI & enable finish if there's no error + setPageComplete(error == null); + if (error != null) { + setMessage(error, IMessageProvider.ERROR); + } else { + setErrorMessage(null); + setMessage(null); + } + } +} |