summaryrefslogtreecommitdiff
path: root/src/plugins/android/src/com/motorola/studio/android/wizards/widget/NewAndroidWidgetProjectWizard.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/android/src/com/motorola/studio/android/wizards/widget/NewAndroidWidgetProjectWizard.java')
-rw-r--r--src/plugins/android/src/com/motorola/studio/android/wizards/widget/NewAndroidWidgetProjectWizard.java283
1 files changed, 283 insertions, 0 deletions
diff --git a/src/plugins/android/src/com/motorola/studio/android/wizards/widget/NewAndroidWidgetProjectWizard.java b/src/plugins/android/src/com/motorola/studio/android/wizards/widget/NewAndroidWidgetProjectWizard.java
new file mode 100644
index 0000000..5276c77
--- /dev/null
+++ b/src/plugins/android/src/com/motorola/studio/android/wizards/widget/NewAndroidWidgetProjectWizard.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.motorola.studio.android.wizards.widget;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceDescription;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
+
+import com.android.sdklib.IAndroidTarget;
+import com.motorola.studio.android.AndroidPlugin;
+import com.motorola.studio.android.common.log.StudioLogger;
+import com.motorola.studio.android.common.preferences.DialogWithToggleUtils;
+import com.motorola.studio.android.common.utilities.EclipseUtils;
+import com.motorola.studio.android.i18n.AndroidNLS;
+import com.motorola.studio.android.model.AndroidProject;
+import com.motorola.studio.android.model.AndroidProject.SourceTypes;
+
+/**
+ * Class that represents the Android New Widget Project Wizard
+ */
+public class NewAndroidWidgetProjectWizard extends BasicNewProjectResourceWizard implements
+ INewWizard
+{
+
+ private static final String WIZARD_BANNER = "icons/wizban/widget_provider_prj_wiz.png"; //$NON-NLS-1$
+
+ private final AndroidProject project = new AndroidProject();
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#canFinish()
+ */
+ @Override
+ public boolean canFinish()
+ {
+ return (project.getStatus().getSeverity() != IStatus.ERROR)
+ && !project.needMoreInformation();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard#performFinish()
+ */
+ @Override
+ public boolean performFinish()
+ {
+ DoSave doSave = new DoSave();
+
+ try
+ {
+ getContainer().run(false, false, doSave);
+ }
+ catch (InvocationTargetException e)
+ {
+ String errMsg =
+ NLS.bind(
+ AndroidNLS.EXC_NewAndroidProjectWizard_AnErrorHasOccurredWhenCreatingTheProject,
+ e.getCause().getLocalizedMessage());
+ StudioLogger.error(NewAndroidWidgetProjectWizard.class, errMsg, e);
+
+ EclipseUtils.showErrorDialog(AndroidNLS.UI_GenericErrorDialogTitle, errMsg, null);
+ }
+ catch (InterruptedException e)
+ {
+ String errMsg =
+ NLS.bind(
+ AndroidNLS.EXC_NewAndroidProjectWizard_AnErrorHasOccurredWhenCreatingTheProject,
+ e.getLocalizedMessage());
+ StudioLogger.error(NewAndroidWidgetProjectWizard.class, errMsg, e);
+
+ EclipseUtils.showErrorDialog(AndroidNLS.UI_GenericErrorDialogTitle, errMsg, null);
+ }
+
+ if (doSave.saved)
+ {
+ // Collecting usage data for statistical purposes
+ try
+ {
+ StudioLogger.collectUsageData(StudioLogger.WHAT_APP_MANAGEMENT_CREATE,
+ StudioLogger.KIND_APP_MANAGEMENT, this.project.getSourceType().name()
+ .toLowerCase(), AndroidPlugin.PLUGIN_ID, AndroidPlugin.getDefault()
+ .getBundle().getVersion().toString());
+ }
+ catch (Throwable e)
+ {
+ //Do nothing, but error on the log should never prevent app from working
+ }
+ }
+
+ return doSave.saved;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
+ */
+ @Override
+ public void init(IWorkbench workbench, IStructuredSelection selection)
+ {
+ setWindowTitle(AndroidNLS.UI_NewAndroidWidgetProjectWizard_TitleNewProjectWizard);
+ setNeedsProgressMonitor(true);
+ setDefaultPageImageDescriptor(AndroidPlugin.getImageDescriptor(WIZARD_BANNER));
+
+ // Set project type to widget
+ project.setSourceType(SourceTypes.WIDGET);
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.wizard.Wizard#performCancel()
+ */
+ @Override
+ public boolean performCancel()
+ {
+ try
+ {
+ project.finalize();
+ }
+ catch (Throwable e)
+ {
+ StudioLogger.error(NewAndroidWidgetProjectWizard.class, e.getLocalizedMessage(), e);
+ }
+ return super.performCancel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard#addPages()
+ */
+ @Override
+ public void addPages()
+ {
+ addPage(new NewAndroidWidgetProjectMainPage(project));
+ }
+
+ /**
+ * Implements an IRunnableWithProgress to run the save process
+ */
+ private class DoSave implements IRunnableWithProgress
+ {
+ private static final String OPHONE_JAR = "oms.jar";
+
+ private static final String OPHONESDK_PROMPT_KEY = "OphoneSDK"; //$NON-NLS-1$
+
+ boolean saved = false;
+
+ public void run(IProgressMonitor monitor) throws InvocationTargetException,
+ InterruptedException
+ {
+ // Gets the auto-building configuration to set it back in the end
+ final boolean autoBuild = ResourcesPlugin.getWorkspace().isAutoBuilding();
+
+ final IWorkspaceDescription wsd = ResourcesPlugin.getWorkspace().getDescription();
+ wsd.setAutoBuilding(false);
+ try
+ {
+ // Set auto-build off for performance reasons
+ ResourcesPlugin.getWorkspace().setDescription(wsd);
+ }
+ catch (CoreException e)
+ {
+ StudioLogger.error(NewAndroidWidgetProjectWizard.class,
+ "Error cleaning workspace after project creation: " + e.getMessage()); //$NON-NLS-1$
+ }
+
+ saved = project.save(getContainer(), monitor);
+ updatePerspective();
+
+ IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(project.getName());
+
+ addOphoneSDK(p);
+
+ try
+ {
+ p.build(IncrementalProjectBuilder.CLEAN_BUILD, new NullProgressMonitor());
+ }
+ catch (Exception e1)
+ {
+ StudioLogger.error(NewAndroidWidgetProjectWizard.class,
+ "Sleep error when cleaning workspace after project creation: " //$NON-NLS-1$
+ + e1.getMessage());
+ }
+
+ wsd.setAutoBuilding(autoBuild);
+ try
+ {
+ // roollback the auto-bulding setting to the original state
+ ResourcesPlugin.getWorkspace().setDescription(wsd);
+ }
+ catch (CoreException e)
+ {
+ StudioLogger.error(NewAndroidWidgetProjectWizard.class,
+ "Error cleaning workspace after project creation: " + e.getMessage()); //$NON-NLS-1$
+ }
+
+ }
+
+ private void addOphoneSDK(IProject p)
+ {
+ IAndroidTarget sdkTarget = project.getSdkTarget();
+ File platformLocation = new File(sdkTarget.getLocation());
+ File[] listFiles = platformLocation.listFiles();
+
+ boolean found = false;
+ int i = 0;
+ File file = null;
+ while (!found && (i < listFiles.length))
+ {
+ file = listFiles[i];
+ if (file.getName().equals(OPHONE_JAR))
+ {
+ found = true;
+ }
+ i++;
+ }
+
+ if (found)
+ {
+ boolean addClasspath =
+ DialogWithToggleUtils.showQuestion(OPHONESDK_PROMPT_KEY,
+ AndroidNLS.NewAndroidProjectWizard_OPhonePromptTitle,
+ AndroidNLS.NewAndroidProjectWizard_OPhonePromptMessage);
+
+ if (addClasspath)
+ {
+ IJavaProject javaProject = JavaCore.create(p);
+ if ((javaProject != null) && javaProject.exists())
+ {
+ try
+ {
+ javaProject.open(new NullProgressMonitor());
+ IClasspathEntry[] rawClasspath = javaProject.getRawClasspath();
+ IClasspathEntry[] newClasspath =
+ new IClasspathEntry[rawClasspath.length + 1];
+
+ System.arraycopy(rawClasspath, 0, newClasspath, 0, rawClasspath.length);
+ newClasspath[newClasspath.length - 1] =
+ JavaCore.newLibraryEntry(new Path(file.getAbsolutePath()),
+ null, null);
+ javaProject.setRawClasspath(newClasspath, new NullProgressMonitor());
+ }
+ catch (JavaModelException e)
+ {
+ StudioLogger.error(NewAndroidWidgetProjectWizard.class,
+ "Error while setting up the oms.jar on the project classpath: " //$NON-NLS-1$
+ + e.getMessage());
+ }
+ }
+ }
+ }
+ }
+ }
+
+}