diff options
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java')
-rw-r--r-- | eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java new file mode 100644 index 000000000..ba4aedc8a --- /dev/null +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java @@ -0,0 +1,326 @@ +/* + * Copyright (C) 2012 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.templates; + +import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.CATEGORY_ACTIVITIES; +import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.CATEGORY_OTHER; +import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.IS_LAUNCHER; +import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.PREVIEW_PADDING; +import static com.android.ide.eclipse.adt.internal.wizards.templates.TemplateHandler.PREVIEW_WIDTH; + +import com.android.ide.eclipse.adt.AdtPlugin; +import com.android.ide.eclipse.adt.internal.editors.layout.gle2.ImageControl; +import com.google.common.collect.Lists; +import com.google.common.io.Files; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.resource.JFaceResources; +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.graphics.Font; +import org.eclipse.swt.graphics.Image; +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.swt.widgets.Label; +import org.eclipse.swt.widgets.List; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +class ActivityPage extends WizardPage implements SelectionListener { + private final NewProjectWizardState mValues; + private List mList; + private Button mCreateToggle; + private java.util.List<File> mTemplates; + + private boolean mIgnore; + private boolean mShown; + private ImageControl mPreview; + private Image mPreviewImage; + private boolean mDisposePreviewImage; + private Label mHeading; + private Label mDescription; + private boolean mOnlyActivities; + private boolean mAskCreate; + private boolean mLauncherActivitiesOnly; + + /** + * Create the wizard. + */ + ActivityPage(NewProjectWizardState values, boolean onlyActivities, boolean askCreate) { + super("activityPage"); //$NON-NLS-1$ + mValues = values; + mOnlyActivities = onlyActivities; + mAskCreate = askCreate; + + if (onlyActivities) { + setTitle("Create Activity"); + } else { + setTitle("Create Android Object"); + } + if (onlyActivities && askCreate) { + setDescription( + "Select whether to create an activity, and if so, what kind of activity."); + } else { + setDescription("Select which template to use"); + } + } + + /** Sets whether the activity page should only offer launcher activities */ + void setLauncherActivitiesOnly(boolean launcherActivitiesOnly) { + mLauncherActivitiesOnly = launcherActivitiesOnly; + } + + @Override + public void createControl(Composite parent) { + Composite container = new Composite(parent, SWT.NULL); + setControl(container); + } + + @SuppressWarnings("unused") // SWT constructors have side effects and aren't unused + private void onEnter() { + Composite container = (Composite) getControl(); + container.setLayout(new GridLayout(3, false)); + + if (mAskCreate) { + mCreateToggle = new Button(container, SWT.CHECK); + mCreateToggle.setSelection(true); + mCreateToggle.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); + mCreateToggle.setText("Create Activity"); + mCreateToggle.addSelectionListener(this); + } + + mList = new List(container, SWT.BORDER | SWT.V_SCROLL); + mList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); + + + TemplateManager manager = mValues.template.getManager(); + java.util.List<File> templates = manager.getTemplates(CATEGORY_ACTIVITIES); + + if (!mOnlyActivities) { + templates.addAll(manager.getTemplates(CATEGORY_OTHER)); + } + java.util.List<String> names = new ArrayList<String>(templates.size()); + File current = mValues.activityValues.getTemplateLocation(); + mTemplates = Lists.newArrayListWithExpectedSize(templates.size()); + int index = -1; + for (int i = 0, n = templates.size(); i < n; i++) { + File template = templates.get(i); + TemplateMetadata metadata = manager.getTemplate(template); + if (metadata == null) { + continue; + } + if (mLauncherActivitiesOnly) { + Parameter parameter = metadata.getParameter(IS_LAUNCHER); + if (parameter == null) { + continue; + } + } + mTemplates.add(template); + names.add(metadata.getTitle()); + if (template.equals(current)) { + index = names.size(); + } + } + String[] items = names.toArray(new String[names.size()]); + mList.setItems(items); + if (index == -1 && !mTemplates.isEmpty()) { + mValues.activityValues.setTemplateLocation(mTemplates.get(0)); + index = 0; + } + if (index >= 0) { + mList.setSelection(index); + mList.addSelectionListener(this); + } + + // Preview + mPreview = new ImageControl(container, SWT.NONE, null); + mPreview.setDisposeImage(false); // Handled manually in this class + GridData gd_mImage = new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1); + gd_mImage.widthHint = PREVIEW_WIDTH + 2 * PREVIEW_PADDING; + mPreview.setLayoutData(gd_mImage); + new Label(container, SWT.NONE); + + mHeading = new Label(container, SWT.NONE); + mHeading.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1)); + new Label(container, SWT.NONE); + + mDescription = new Label(container, SWT.WRAP); + mDescription.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1)); + + Font font = JFaceResources.getFontRegistry().getBold(JFaceResources.BANNER_FONT); + if (font != null) { + mHeading.setFont(font); + } + + updatePreview(); + } + + private void updatePreview() { + Image oldImage = mPreviewImage; + boolean dispose = mDisposePreviewImage; + mPreviewImage = null; + + String title = ""; + String description = ""; + TemplateHandler handler = mValues.activityValues.getTemplateHandler(); + TemplateMetadata template = handler.getTemplate(); + if (template != null) { + String thumb = template.getThumbnailPath(); + if (thumb != null && !thumb.isEmpty()) { + File file = new File(mValues.activityValues.getTemplateLocation(), + thumb.replace('/', File.separatorChar)); + if (file != null) { + try { + byte[] bytes = Files.toByteArray(file); + ByteArrayInputStream input = new ByteArrayInputStream(bytes); + mPreviewImage = new Image(getControl().getDisplay(), input); + mDisposePreviewImage = true; + input.close(); + } catch (IOException e) { + AdtPlugin.log(e, null); + } + } + } else { + // Fallback icon + mDisposePreviewImage = false; + mPreviewImage = TemplateMetadata.getDefaultTemplateIcon(); + } + title = template.getTitle(); + description = template.getDescription(); + } + + mHeading.setText(title); + mDescription.setText(description); + mPreview.setImage(mPreviewImage); + mPreview.fitToWidth(PREVIEW_WIDTH); + + if (oldImage != null && dispose) { + oldImage.dispose(); + } + + Composite parent = (Composite) getControl(); + parent.layout(true, true); + parent.redraw(); + } + + @Override + public void dispose() { + super.dispose(); + + if (mPreviewImage != null && mDisposePreviewImage) { + mDisposePreviewImage = false; + mPreviewImage.dispose(); + mPreviewImage = null; + } + } + + @Override + public void setVisible(boolean visible) { + if (visible && !mShown) { + onEnter(); + } + + super.setVisible(visible); + + if (visible) { + mShown = true; + if (mAskCreate) { + try { + mIgnore = true; + mCreateToggle.setSelection(mValues.createActivity); + } finally { + mIgnore = false; + } + } + } + + validatePage(); + } + + + private void validatePage() { + IStatus status = null; + + if (mValues.createActivity) { + if (mList.getSelectionCount() < 1) { + status = new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, + "Select an activity type"); + } else { + TemplateHandler templateHandler = mValues.activityValues.getTemplateHandler(); + status = templateHandler.validateTemplate(mValues.minSdkLevel, + mValues.getBuildApi()); + } + } + + 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); + } + } + + @Override + public boolean isPageComplete() { + // Ensure that the Finish button isn't enabled until + // the user has reached and completed this page + if (!mShown && mValues.createActivity) { + return false; + } + + return super.isPageComplete(); + } + + // ---- Implements SelectionListener ---- + + @Override + public void widgetSelected(SelectionEvent e) { + if (mIgnore) { + return; + } + + Object source = e.getSource(); + if (source == mCreateToggle) { + mValues.createActivity = mCreateToggle.getSelection(); + mList.setEnabled(mValues.createActivity); + } else if (source == mList) { + int index = mList.getSelectionIndex(); + if (index >= 0 && index < mTemplates.size()) { + File template = mTemplates.get(index); + mValues.activityValues.setTemplateLocation(template); + updatePreview(); + } + } + + validatePage(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + } +} |