# HG changeset patch # User Eugene Ostroukhov # Date 1282077628 25200 # Node ID 129c94e783756d834035153eb73b4bb4cd0987e9 # Parent 87920e15f8eba39a8b1fbc8b426504b2b8599279 Project creation from the templates was implemented diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/schema/projectTemplate.exsd --- a/org.symbian.tools.mtw.ui/schema/projectTemplate.exsd Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/schema/projectTemplate.exsd Tue Aug 17 13:40:28 2010 -0700 @@ -137,6 +137,13 @@ + + + + Allows the template to specify files that will be opened in the editor after the project was created. This is a semicolon-separated list. This string will be expanded using Velocity so it may contain template keys. + + + diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/CompoundInstaller.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/CompoundInstaller.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/CompoundInstaller.java Tue Aug 17 13:40:28 2010 -0700 @@ -31,6 +31,8 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.symbian.tools.tmw.internal.util.DelegateRunnable; import org.symbian.tools.tmw.ui.project.IProjectTemplateContext; import org.symbian.tools.tmw.ui.project.ITemplateInstaller; @@ -129,4 +131,15 @@ installer.prepare(project, context); } } + + public IRunnableWithProgress getPostCreateAction() { + final Collection runnables = new LinkedList(); + for (ITemplateInstaller installer : installers) { + final IRunnableWithProgress action = installer.getPostCreateAction(); + if (action != null) { + runnables.add(action); + } + } + return runnables.size() > 0 ? new DelegateRunnable(runnables) : null; + } } diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/LazyInstaller.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/LazyInstaller.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/LazyInstaller.java Tue Aug 17 13:40:28 2010 -0700 @@ -23,6 +23,7 @@ import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; import org.symbian.tools.tmw.ui.TMWCoreUI; import org.symbian.tools.tmw.ui.project.IProjectTemplateContext; import org.symbian.tools.tmw.ui.project.ITemplateInstaller; @@ -44,6 +45,10 @@ public void prepare(IProject project, IProjectTemplateContext context) { // Do nothing } + + public IRunnableWithProgress getPostCreateAction() { + return null; + } } private final IConfigurationElement element; private ITemplateInstaller installer; @@ -79,4 +84,8 @@ public void prepare(IProject project, IProjectTemplateContext context) { getInstaller().prepare(project, context); } + + public IRunnableWithProgress getPostCreateAction() { + return getInstaller().getPostCreateAction(); + } } diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/ProjectTemplateImpl.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/ProjectTemplateImpl.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/ProjectTemplateImpl.java Tue Aug 17 13:40:28 2010 -0700 @@ -18,6 +18,7 @@ */ package org.symbian.tools.tmw.internal.ui.project; +import java.lang.reflect.InvocationTargetException; import java.util.Map; import java.util.TreeMap; @@ -27,8 +28,12 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; +import org.eclipse.ui.PlatformUI; import org.eclipse.wst.common.project.facet.core.IProjectFacet; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; @@ -138,6 +143,22 @@ final IPath[] files = templateInstaller.getFiles(); monitor.beginTask("Copying project files", files.length * 10); templateInstaller.copyFiles(files, new SubProgressMonitor(monitor, files.length * 10)); + final IRunnableWithProgress action = templateInstaller.getPostCreateAction(); + if (action != null) { + Display.getDefault().asyncExec(new Runnable() { + public void run() { + ProgressMonitorDialog dialog = new ProgressMonitorDialog(PlatformUI.getWorkbench() + .getActiveWorkbenchWindow().getShell()); + try { + dialog.run(false, true, action); + } catch (InvocationTargetException e) { + TMWCoreUI.log(e); + } catch (InterruptedException e) { + TMWCoreUI.log(e); + } + } + }); + } } catch (CoreException e) { TMWCoreUI.log(e); } finally { diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/ZipInstaller.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/ZipInstaller.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/project/ZipInstaller.java Tue Aug 17 13:40:28 2010 -0700 @@ -32,12 +32,14 @@ import java.util.Collection; import java.util.HashSet; import java.util.LinkedList; +import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.context.AbstractContext; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; @@ -50,6 +52,9 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.symbian.tools.tmw.internal.util.OpenFilesRunnable; +import org.symbian.tools.tmw.internal.util.Util; import org.symbian.tools.tmw.ui.TMWCoreUI; import org.symbian.tools.tmw.ui.project.IProjectTemplateContext; import org.symbian.tools.tmw.ui.project.ITemplateInstaller; @@ -65,6 +70,7 @@ private IProject project; private IProjectTemplateContext context; private String[] paths; + private final Set openFiles = new HashSet(); public ZipInstaller(IConfigurationElement element) { this.element = element; @@ -83,6 +89,7 @@ public void cleanup() { project = null; context = null; + openFiles.clear(); } public IPath[] getFiles() throws CoreException { @@ -147,6 +154,7 @@ } public void copyFiles(IPath[] files, IProgressMonitor monitor) throws CoreException { + final String filesToOpen = Util.neverNull(element.getAttribute("open-files")); HashSet fls = new HashSet(Arrays.asList(files)); ZipInputStream stream = null; try { @@ -156,15 +164,20 @@ ZipEntry entry; while ((entry = stream.getNextEntry()) != null && !monitor.isCanceled()) { String nm = entry.getName(); + boolean open = filesToOpen.contains(nm.endsWith(TEMPLATE_FILE_EXTENSION) ? nm.substring(0, nm.length() + - TEMPLATE_FILE_EXTENSION.length()) : nm); IPath name = new Path(filter(nm)); if (fls.contains(name)) { - final InputStream contents; - if (nm.endsWith(TEMPLATE_FILE_EXTENSION)) { - contents = copyTemplate(project, name, stream, (int) entry.getSize(), ctx, monitor); - } else { - contents = new NonClosingStream(stream); - } - context.addFile(project, name, contents, new SubProgressMonitor(monitor, 10)); + final InputStream contents; + if (nm.endsWith(TEMPLATE_FILE_EXTENSION)) { + contents = copyTemplate(project, name, stream, (int) entry.getSize(), ctx, monitor); + } else { + contents = new NonClosingStream(stream); + } + IFile file = context.addFile(project, name, contents, new SubProgressMonitor(monitor, 10)); + if (open) { + openFiles.add(file); + } } stream.closeEntry(); } @@ -183,8 +196,7 @@ } private InputStream copyTemplate(IProject project, IPath name, ZipInputStream stream, int size, - VelocityContext ctx, - IProgressMonitor monitor) throws IOException, CoreException { + VelocityContext ctx, IProgressMonitor monitor) throws IOException, CoreException { // Templates will not be more then a few megs - we can afford the memory ByteArrayOutputStream file = new ByteArrayOutputStream(); @@ -248,4 +260,11 @@ } } + + public IRunnableWithProgress getPostCreateAction() { + if (openFiles.size() > 0) { + return new OpenFilesRunnable(openFiles); + } + return null; + } } diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/wizard/NewApplicationWizard.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/wizard/NewApplicationWizard.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/wizard/NewApplicationWizard.java Tue Aug 17 13:40:28 2010 -0700 @@ -46,6 +46,8 @@ private NewApplicationFacetsWizardPage facetsPage; private NewApplicationDetailsWizardPage firstPage; private IStructuredSelection selection; + private IProjectTemplate template = null; + private INewApplicationWizardPage[] templatePages = new INewApplicationWizardPage[0]; private NewApplicationTemplateWizardPage templatesPage; private final WizardContext wizardContext = new WizardContext(); private IWorkbench workbench; @@ -79,7 +81,6 @@ firstPage = new NewApplicationDetailsWizardPage(wizardContext, databindingContext); return firstPage; } - @Override public IWizardPage getNextPage(final IWizardPage page) { if (page == this.firstPage) { @@ -99,9 +100,6 @@ return nextPage; } - private IProjectTemplate template = null; - private INewApplicationWizardPage[] templatePages = new INewApplicationWizardPage[0]; - public IWizardPage[] getPages() { final IProjectTemplate current = wizardContext.getTemplate(); if (template != current) { @@ -167,9 +165,4 @@ this.workbench = workbench; this.selection = selection; } - - public boolean performFinish() { - super.performFinish(); - return true; - } } diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/wizard/WizardContext.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/wizard/WizardContext.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/ui/wizard/WizardContext.java Tue Aug 17 13:40:28 2010 -0700 @@ -66,7 +66,7 @@ } } - public void addFile(IProject project, IPath name, InputStream contents, IProgressMonitor monitor) + public IFile addFile(IProject project, IPath name, InputStream contents, IProgressMonitor monitor) throws CoreException { monitor.beginTask(name.toOSString(), 100); final IFile file = project.getFile(name); @@ -75,6 +75,7 @@ } file.create(contents, false, new SubProgressMonitor(monitor, 100)); monitor.done(); + return file; } public void addPropertyChangeListener(PropertyChangeListener arg0) { diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/util/DelegateRunnable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/util/DelegateRunnable.java Tue Aug 17 13:40:28 2010 -0700 @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2010 Symbian Foundation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Symbian Foundation - initial contribution. + * Contributors: + * Description: + * Overview: + * Details: + * Platforms/Drives/Compatibility: + * Assumptions/Requirement/Pre-requisites: + * Failures and causes: + */ +package org.symbian.tools.tmw.internal.util; + +import java.lang.reflect.InvocationTargetException; +import java.util.Collection; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.SubProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; + +public class DelegateRunnable implements IRunnableWithProgress { + private final Collection runnables; + + public DelegateRunnable(Collection runnables) { + this.runnables = runnables; + } + + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + monitor.beginTask("Preparing project", runnables.size() * 20); + for (IRunnableWithProgress runnable : runnables) { + runnable.run(new SubProgressMonitor(monitor, 20)); + } + monitor.done(); + } + +} diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/util/OpenFilesRunnable.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/util/OpenFilesRunnable.java Tue Aug 17 13:40:28 2010 -0700 @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2010 Symbian Foundation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Symbian Foundation - initial contribution. + * Contributors: + * Description: + * Overview: + * Details: + * Platforms/Drives/Compatibility: + * Assumptions/Requirement/Pre-requisites: + * Failures and causes: + */ +package org.symbian.tools.tmw.internal.util; + +import java.lang.reflect.InvocationTargetException; +import java.util.Set; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.ide.IDE; +import org.symbian.tools.tmw.ui.TMWCoreUI; + +public class OpenFilesRunnable implements IRunnableWithProgress { + private final IFile[] openFiles; + + public OpenFilesRunnable(Set openFiles) { + this.openFiles = openFiles.toArray(new IFile[openFiles.size()]); + } + + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + monitor.beginTask("Opening files in editors", openFiles.length); + for (IFile file : openFiles) { + IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); + try { + IDE.openEditor(page, file); + } catch (PartInitException e) { + TMWCoreUI.log(e); + } + monitor.worked(1); + } + monitor.done(); + } +} diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/util/Util.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/util/Util.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/internal/util/Util.java Tue Aug 17 13:40:28 2010 -0700 @@ -24,4 +24,8 @@ return value != null ? value.trim().replace(" ", "") : ""; } + public static String neverNull(String string) { + return string == null ? "" : string.trim(); + } + } diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/ui/project/IProjectTemplateContext.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/ui/project/IProjectTemplateContext.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/ui/project/IProjectTemplateContext.java Tue Aug 17 13:40:28 2010 -0700 @@ -21,6 +21,7 @@ import java.io.InputStream; import org.eclipse.core.databinding.observable.value.IObservableValue; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -64,7 +65,7 @@ * @param monitor progress monitor * @throws CoreException */ - void addFile(IProject project, IPath name, InputStream contents, IProgressMonitor monitor) throws CoreException; + IFile addFile(IProject project, IPath name, InputStream contents, IProgressMonitor monitor) throws CoreException; /** * Allows binding to parameter value from UI. diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/ui/project/ITemplateInstaller.java --- a/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/ui/project/ITemplateInstaller.java Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.mtw.ui/src/org/symbian/tools/tmw/ui/project/ITemplateInstaller.java Tue Aug 17 13:40:28 2010 -0700 @@ -22,6 +22,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.operation.IRunnableWithProgress; public interface ITemplateInstaller { /** @@ -45,4 +46,10 @@ */ void copyFiles(IPath[] files, IProgressMonitor monitor) throws CoreException; + /** + * These actions will be ran after the new project setup completes. They will be + * ran in SWT thread. + * @return runnable that will be ran after the project create finishes. Can be null. + */ + IRunnableWithProgress getPostCreateAction(); } diff -r 87920e15f8eb -r 129c94e78375 org.symbian.tools.wrttools/plugin.xml --- a/org.symbian.tools.wrttools/plugin.xml Mon Aug 16 16:23:25 2010 -0700 +++ b/org.symbian.tools.wrttools/plugin.xml Tue Aug 17 13:40:28 2010 -0700 @@ -840,7 +840,8 @@ name="Flickr Project" weight="3"> + file="projecttemplates/flickr.zip" + open-files="${mainHtml}.html"> This wizard generates an Flickr project with a minimal Info.plist, html,css and js and WRTKit.