diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SampleSelectionPage.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SampleSelectionPage.java | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SampleSelectionPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SampleSelectionPage.java new file mode 100644 index 000000000..197247083 --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/newproject/SampleSelectionPage.java @@ -0,0 +1,271 @@ +/* + * 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.SdkConstants; +import com.android.ide.eclipse.adt.AdtPlugin; +import com.android.ide.eclipse.adt.internal.wizards.newproject.NewProjectWizardState.Mode; +import com.android.sdklib.IAndroidTarget; +import com.android.utils.Pair; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.viewers.ArrayContentProvider; +import org.eclipse.jface.viewers.ColumnLabelProvider; +import org.eclipse.jface.viewers.IBaseLabelProvider; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.Text; + +import java.io.File; + +/** Page where the user can select a sample to "instantiate" */ +class SampleSelectionPage extends WizardPage implements SelectionListener, ModifyListener { + private final NewProjectWizardState mValues; + private boolean mIgnore; + + private Table mTable; + private TableViewer mTableViewer; + private IAndroidTarget mCurrentSamplesTarget; + private Text mSampleProjectName; + + /** + * Create the wizard. + */ + SampleSelectionPage(NewProjectWizardState values) { + super("samplePage"); //$NON-NLS-1$ + setTitle("Select Sample"); + setDescription("Select which sample to create"); + mValues = values; + } + + /** + * Create contents of the wizard. + */ + @Override + public void createControl(Composite parent) { + Composite container = new Composite(parent, SWT.NULL); + container.setLayout(new GridLayout(2, false)); + + mTableViewer = new TableViewer(container, SWT.BORDER | SWT.FULL_SELECTION); + mTable = mTableViewer.getTable(); + GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); + gridData.heightHint = 300; + mTable.setLayoutData(gridData); + mTable.addSelectionListener(this); + + setControl(container); + + Label projectLabel = new Label(container, SWT.NONE); + projectLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); + projectLabel.setText("Project Name:"); + + mSampleProjectName = new Text(container, SWT.BORDER); + mSampleProjectName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); + mSampleProjectName.addModifyListener(this); + } + + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + + if (visible) { + if (mValues.projectName != null) { + try { + mIgnore = true; + mSampleProjectName.setText(mValues.projectName); + } finally { + mIgnore = false; + } + } + + // Update samples list if the SDK target has changed (or if it hasn't yet + // been populated) + if (mCurrentSamplesTarget != mValues.target) { + mCurrentSamplesTarget = mValues.target; + updateSamples(); + } + + validatePage(); + } + } + + private void updateSamples() { + IBaseLabelProvider labelProvider = new ColumnLabelProvider() { + @Override + public Image getImage(Object element) { + return AdtPlugin.getAndroidLogo(); + } + + @Override + public String getText(Object element) { + if (element instanceof Pair<?, ?>) { + Object name = ((Pair<?, ?>) element).getFirst(); + return name.toString(); + } + return element.toString(); // Fallback. Should not happen. + } + }; + + mTableViewer.setContentProvider(new ArrayContentProvider()); + mTableViewer.setLabelProvider(labelProvider); + + if (mValues.samples != null && mValues.samples.size() > 0) { + Object[] samples = mValues.samples.toArray(); + mTableViewer.setInput(samples); + + mTable.select(0); + selectSample(mValues.samples.get(0).getSecond()); + extractNamesFromAndroidManifest(); + } + } + + private void selectSample(File sample) { + mValues.chosenSample = sample; + if (sample != null && !mValues.projectNameModifiedByUser) { + mValues.projectName = sample.getName(); + if (SdkConstants.FD_SAMPLE.equals(mValues.projectName) && + sample.getParentFile() != null) { + mValues.projectName = sample.getParentFile().getName() + '_' + mValues.projectName; + } + try { + mIgnore = true; + mSampleProjectName.setText(mValues.projectName); + } finally { + mIgnore = false; + } + updatedProjectName(); + } + } + + @SuppressWarnings("unchecked") + @Override + public void widgetSelected(SelectionEvent e) { + if (mIgnore) { + return; + } + + if (e.getSource() == mTable) { + extractNamesFromAndroidManifest(); + int index = mTable.getSelectionIndex(); + if (index >= 0) { + Object[] roots = (Object[]) mTableViewer.getInput(); + selectSample(((Pair<String, File>) roots[index]).getSecond()); + } else { + selectSample(null); + } + } else { + assert false : e.getSource(); + } + + validatePage(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } + + @Override + public void modifyText(ModifyEvent e) { + if (mIgnore) { + return; + } + + if (e.getSource() == mSampleProjectName) { + mValues.projectName = mSampleProjectName.getText().trim(); + mValues.projectNameModifiedByUser = true; + updatedProjectName(); + } + + validatePage(); + } + + private void updatedProjectName() { + if (mValues.useDefaultLocation) { + mValues.projectLocation = Platform.getLocation().toFile(); + } + } + + /** + * A sample was selected. Update the location field, manifest and validate. + * Extract names from an android manifest. + * This is done only if the user selected the "use existing source" and a manifest xml file + * can actually be found in the custom user directory. + */ + private void extractNamesFromAndroidManifest() { + if (mValues.chosenSample == null || !mValues.chosenSample.isDirectory()) { + return; + } + + Path path = new Path(mValues.chosenSample.getPath()); + mValues.extractFromAndroidManifest(path); + } + + @Override + public boolean isPageComplete() { + if (mValues.mode != Mode.SAMPLE) { + return true; + } + + // Ensure that when creating samples, the Finish button isn't enabled until + // the user has reached and completed this page + if (mValues.chosenSample == null) { + return false; + } + + return super.isPageComplete(); + } + + private void validatePage() { + IStatus status = null; + if (mValues.samples == null || mValues.samples.size() == 0) { + status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, + "The chosen SDK does not contain any samples"); + } else if (mValues.chosenSample == null) { + status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, "Choose a sample"); + } else if (!mValues.chosenSample.exists()) { + status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, + String.format("Sample does not exist: %1$s", mValues.chosenSample.getPath())); + } else { + status = ProjectNamePage.validateProjectName(mValues.projectName); + } + + // -- update UI & enable finish if there's no error + setPageComplete(status == null || status.getSeverity() != IStatus.ERROR); + if (status != null) { + setMessage(status.getMessage(), + status.getSeverity() == IStatus.ERROR + ? IMessageProvider.ERROR : IMessageProvider.WARNING); + } else { + setErrorMessage(null); + setMessage(null); + } + } +} |