/*
* 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());
}
}
}
}
}
}
}