aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/ActivityPage.java
diff options
context:
space:
mode:
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.java326
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) {
+ }
+}