Application import wizard was refactored into extensible code
authorEugene Ostroukhov <eugeneo@symbian.org>
Wed, 01 Sep 2010 16:27:43 -0700
changeset 481 e908ec135fa1
parent 480 b6d992b9b998
child 482 2973198ae2a9
Application import wizard was refactored into extensible code
plugins/org.symbian.tools.tmw.core/src/org/symbian/tools/tmw/core/projects/AbstractJSDTFaceletDetector.java
plugins/org.symbian.tools.tmw.core/src/org/symbian/tools/tmw/core/utilities/CoreUtil.java
plugins/org.symbian.tools.tmw.ui/icons/full/etool16/importapplication.png
plugins/org.symbian.tools.tmw.ui/plugin.xml
plugins/org.symbian.tools.tmw.ui/schema/applicationImporter.exsd
plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/internal/ui/importwizard/ApplicationImportWizard.java
plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/internal/ui/importwizard/ApplicationImportWizardPage.java
plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/ui/TMWCoreUI.java
plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/ui/project/AbstractZippedApplicationImporter.java
plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/ui/project/IApplicationImporter.java
plugins/org.symbian.tools.wrttools/plugin.xml
plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/libraries/PhoneGapFacetDetector.java
plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/libraries/WrtKitFacetDetector.java
plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/project/WgzImporter.java
plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/WgzImportWizard.java
plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/WgzImportWizardPage.java
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.tmw.core/src/org/symbian/tools/tmw/core/projects/AbstractJSDTFaceletDetector.java	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,34 @@
+/**
+ * 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.core.projects;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetDetector;
+
+public class AbstractJSDTFaceletDetector extends ProjectFacetDetector {
+
+    @Override
+    public void detect(IFacetedProjectWorkingCopy fpjwc, IProgressMonitor monitor) throws CoreException {
+        // TODO Auto-generated method stub
+
+    }
+
+}
--- a/plugins/org.symbian.tools.tmw.core/src/org/symbian/tools/tmw/core/utilities/CoreUtil.java	Tue Aug 31 15:21:04 2010 -0700
+++ b/plugins/org.symbian.tools.tmw.core/src/org/symbian/tools/tmw/core/utilities/CoreUtil.java	Wed Sep 01 16:27:43 2010 -0700
@@ -18,7 +18,12 @@
  */
 package org.symbian.tools.tmw.core.utilities;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.jsdt.core.IJavaScriptProject;
+import org.eclipse.wst.jsdt.core.IType;
+import org.eclipse.wst.jsdt.core.JavaScriptCore;
+import org.eclipse.wst.jsdt.core.JavaScriptModelException;
 
 /**
  * Utilities used all over the TMW code base. Users can rely on this methods 
@@ -43,4 +48,29 @@
     public static String notNull(final String string) {
         return string == null ? "" : string.trim();
     }
+
+    public final static boolean hasTypes(IProject p, String... typeNames) throws JavaScriptModelException {
+        final IJavaScriptProject project = JavaScriptCore.create(p);
+        if (project != null && project.exists()) {
+            for (String typeName : typeNames) {
+                if (!hasType(project, typeName)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=318656
+    private static boolean hasType(IJavaScriptProject project, String name) throws JavaScriptModelException {
+        final IType[] types = project.findTypes(name);
+        if (types != null) {
+            for (IType type : types) {
+                if (type.getJavaScriptProject().equals(project)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
 }
Binary file plugins/org.symbian.tools.tmw.ui/icons/full/etool16/importapplication.png has changed
--- a/plugins/org.symbian.tools.tmw.ui/plugin.xml	Tue Aug 31 15:21:04 2010 -0700
+++ b/plugins/org.symbian.tools.tmw.ui/plugin.xml	Wed Sep 01 16:27:43 2010 -0700
@@ -5,6 +5,7 @@
    <extension-point id="targetPresentation" name="Deployment Target Presentation" schema="schema/targetPresentation.exsd"/>
    <extension-point id="projectTemplate" name="Mobile Application Project Templates" schema="schema/projectTemplate.exsd"/>
    <extension-point id="wizardPages" name="Extensions for the New Application Wizard" schema="schema/wizardPages.exsd"/>
+   <extension-point id="applicationImporter" name="Application Importers" schema="schema/applicationImporter.exsd"/>
 	<!-- Navigator Extensions -->
 	<extension point="org.eclipse.ui.navigator.viewer">
 	  <viewerActionBinding
@@ -21,7 +22,7 @@
        <commonWizard
              associatedExtensionId="org.eclipse.wst.jsdt.java.ui.javaContent"
              type="import"
-             wizardId="org.symbian.tools.wrttools.importwgz">
+             wizardId="org.symbian.tools.tmw.importapplication">
           <enablement>
              <or>
                 <adapt
@@ -275,4 +276,20 @@
            version="1.0">
      </image>
   </extension>
+  	<extension point="org.eclipse.ui.importWizards">
+		<category id="org.symbian.tools.tmw.import" name="Tools for Mobile Web">
+		</category>
+		<wizard
+          category="org.symbian.tools.tmw.import"
+          class="org.symbian.tools.tmw.internal.ui.importwizard.ApplicationImportWizard"
+          icon="icons/full/etool16/importapplication.png"
+          id="org.symbian.tools.tmw.importapplication"
+          name="Mobile Web Application">
+        <description>
+          Create project from application archive
+        </description>
+      </wizard>
+		
+    </extension>
+  
 </plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.tmw.ui/schema/applicationImporter.exsd	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.symbian.tools.tmw.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.symbian.tools.tmw.ui" id="applicationImporter" name="Application Importers"/>
+      </appinfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="importer" minOccurs="1" maxOccurs="unbounded"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="importer">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.symbian.tools.tmw.ui.project.IApplicationImporter"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="apiinfo"/>
+      </appinfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="implementation"/>
+      </appinfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/internal/ui/importwizard/ApplicationImportWizard.java	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,195 @@
+package org.symbian.tools.tmw.internal.ui.importwizard;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
+import org.eclipse.wst.common.project.facet.core.FacetedProjectFramework;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+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.runtime.IRuntime;
+import org.symbian.tools.tmw.core.TMWCore;
+import org.symbian.tools.tmw.core.runtimes.IMobileWebRuntime;
+import org.symbian.tools.tmw.internal.util.OpenFilesRunnable;
+import org.symbian.tools.tmw.ui.TMWCoreUI;
+import org.symbian.tools.tmw.ui.project.IApplicationImporter;
+
+public class ApplicationImportWizard extends Wizard implements IImportWizard, INewWizard, IExecutableExtension {
+    public static final String RECENT_IMPORT_PATH = "application.import.path";
+
+    private IFile file;
+    private ApplicationImportWizardPage page;
+    private IConfigurationElement config;
+
+    public ApplicationImportWizard() {
+        setWindowTitle("Import WRT Application Archive");
+        //        setDefaultPageImageDescriptor(WRTImages.importWgzWizardBanner());
+        setNeedsProgressMonitor(true);
+    }
+
+    @Override
+    public void addPages() {
+        page = new ApplicationImportWizardPage(file);
+        addPage(page);
+    }
+
+    private IProject createProject(String archiveName, String projectName, URI uri, IApplicationImporter importer,
+            IProgressMonitor monitor) throws CoreException {
+        monitor.beginTask("Importing application archive", 50);
+        final IFacetedProjectWorkingCopy project = FacetedProjectFramework.createNewProject();
+        final File file = new File(archiveName);
+        final IMobileWebRuntime applicationRuntime = importer.getApplicationRuntime(file);
+        final IRuntime runtime = TMWCore.getFProjSupport().getRuntime(applicationRuntime);
+
+        project.setTargetedRuntimes(Collections.singleton(runtime));
+        project.setPrimaryRuntime(runtime);
+        project.setProjectName(projectName);
+        if (uri != null) {
+            final File loc = new File(uri);
+            Path path = new Path(loc.getAbsolutePath());
+            if (!path.removeLastSegments(1).equals(ResourcesPlugin.getWorkspace().getRoot().getLocation())) {
+                project.setProjectLocation(path);
+            }
+        }
+        final Set<IProjectFacetVersion> facets = getProjectFacetVersion(file, importer, applicationRuntime);
+        project.setProjectFacets(facets);
+        final Set<IProjectFacet> fcoll = new HashSet<IProjectFacet>();
+
+        for (IProjectFacetVersion facetVersion : facets) {
+            fcoll.add(facetVersion.getProjectFacet());
+        }
+        project.setFixedProjectFacets(fcoll);
+        project.commitChanges(new SubProgressMonitor(monitor, 10));
+
+        boolean success = false;
+        try {
+            importer.extractFiles(file, applicationRuntime, project.getProject(), new SubProgressMonitor(monitor, 40));
+            success = true;
+        } finally {
+            if (!success) {
+                project.getProject().delete(true, true, new NullProgressMonitor());
+            }
+        }
+        final IFile[] toOpen = importer.getFilesToOpen(project.getProject());
+        project.detect(new NullProgressMonitor());
+        project.commitChanges(new NullProgressMonitor());
+        monitor.done();
+        if (toOpen != null && toOpen.length > 0) {
+            final OpenFilesRunnable runnable = new OpenFilesRunnable(new HashSet<IFile>(Arrays.asList(toOpen)));
+            Display.getDefault().asyncExec(new Runnable() {
+                public void run() {
+                    try {
+                        runnable.run(new NullProgressMonitor());
+                    } catch (InvocationTargetException e) {
+                        TMWCoreUI.log(e);
+                    } catch (InterruptedException e) {
+                        TMWCoreUI.log(e);
+                    }
+                }
+            });
+        }
+        return project.getProject();
+    }
+
+    private Set<IProjectFacetVersion> getProjectFacetVersion(final File file, IApplicationImporter importer,
+            final IMobileWebRuntime applicationRuntime) {
+        final Set<IProjectFacetVersion> facets = new HashSet<IProjectFacetVersion>();
+        facets.addAll(TMWCore.getFProjSupport().getFixedFacetsVersions(applicationRuntime));
+        final IProjectFacetVersion[] f = importer.getConfiguredFacets(file);
+        if (f != null && f.length > 0) {
+            facets.addAll(Arrays.asList(f));
+        }
+        return facets;
+    }
+
+    @Override
+    public boolean performFinish() {
+        try {
+            final String projectName = page.getProjectName();
+            final URI uri = page.getLocationURI();
+            final String archiveName = page.getArchiveFile();
+            final IApplicationImporter importer = page.getImporter();
+
+            final IProject[] holder = new IProject[1];
+            getContainer().run(true, true, new IRunnableWithProgress() {
+
+                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+                    try {
+                        ResourcesPlugin.getWorkspace().run(new IWorkspaceRunnable() {
+
+                            public void run(IProgressMonitor monitor) throws CoreException {
+                                holder[0] = createProject(archiveName, projectName, uri, importer, monitor);
+                            }
+
+                        }, monitor);
+                    } catch (final CoreException e) {
+                        getShell().getDisplay().asyncExec(new Runnable() {
+                            public void run() {
+                                StatusManager.getManager().handle(e.getStatus(),
+                                        StatusManager.SHOW | StatusManager.BLOCK | StatusManager.LOG);
+                            }
+                        });
+                    }
+                }
+            });
+            if (holder[0] != null) {
+                BasicNewProjectResourceWizard.updatePerspective(config);
+                TMWCoreUI.getDefault().getPreferenceStore()
+                        .setValue(RECENT_IMPORT_PATH, new File(archiveName).getParentFile().getAbsolutePath());
+                //                ProjectUtils.focusOn(holder[0]);
+            }
+        } catch (InvocationTargetException e) {
+            TMWCoreUI.log(e);
+        } catch (InterruptedException e) {
+            TMWCoreUI.log(e);
+        }
+        return true;
+    }
+
+    public void init(IWorkbench workbench, IStructuredSelection selection) {
+        file = null;
+        if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
+            Object element = (selection).getFirstElement();
+            if (element instanceof IAdaptable) {
+                IResource resource = (IResource) ((IAdaptable) element).getAdapter(IResource.class);
+                if (resource != null && resource.getType() == IResource.FILE
+                        && "wgz".equalsIgnoreCase(resource.getProjectRelativePath().getFileExtension())) {
+                    file = (IFile) resource;
+                }
+            }
+        }
+    }
+
+    public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
+            throws CoreException {
+        this.config = config;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/internal/ui/importwizard/ApplicationImportWizardPage.java	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,504 @@
+package org.symbian.tools.tmw.internal.ui.importwizard;
+
+import java.io.File;
+import java.net.URI;
+import java.text.MessageFormat;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+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.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
+import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea;
+import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter;
+import org.symbian.tools.tmw.core.runtimes.IMobileWebRuntime;
+import org.symbian.tools.tmw.ui.TMWCoreUI;
+import org.symbian.tools.tmw.ui.project.IApplicationImporter;
+
+@SuppressWarnings("restriction")
+public class ApplicationImportWizardPage extends WizardPage {
+    public class MapContentProvider implements IStructuredContentProvider {
+
+        public void dispose() {
+            // Do nothing
+        }
+
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+            // Do nothing
+        }
+
+        @SuppressWarnings("unchecked")
+        public Object[] getElements(Object inputElement) {
+            return ((Map<String, IApplicationImporter>) inputElement).entrySet().toArray();
+        }
+
+    }
+
+    // constants
+    private static final int SIZING_TEXT_FIELD_WIDTH = 250;
+    private final IFile file;
+    // initial value stores
+    private String initialProjectFieldValue;
+    private ProjectContentsLocationArea locationArea;
+    private final Listener nameModifyListener = new Listener() {
+        public void handleEvent(Event e) {
+            setLocationForSelection();
+            boolean valid = validatePage();
+            setPageComplete(valid);
+
+        }
+    };
+    // widgets
+    private Text projectNameField;
+    private Text fileName;
+    private ComboViewer runtimes;
+
+    protected ApplicationImportWizardPage(IFile file) {
+        super("ImportApplication");
+        this.file = file;
+        setTitle("Import Mobile Web Application");
+        setDescription("Create mobile web application project from application package file");
+        setPageComplete(false);
+    }
+
+    protected void browse() {
+        FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN);
+        String path = fileName.getText();
+        path = path.trim().length() > 0 ? path.trim() : TMWCoreUI.getDefault().getPreferenceStore()
+                .getString(ApplicationImportWizard.RECENT_IMPORT_PATH);
+        fileDialog.setFilterPath(path);
+
+        final Map<String, String> filters = new TreeMap<String, String>();
+        filters.put("*", "All files (*.*)");
+        final IApplicationImporter[] importers = TMWCoreUI.getApplicationImporters();
+        for (IApplicationImporter importer : importers) {
+            filters.putAll(importer.getFileFilters());
+        }
+
+        final String[] extensions = filters.keySet().toArray(new String[filters.size()]);
+        final String[] names = filters.values().toArray(new String[filters.size()]);
+
+        fileDialog.setFilterExtensions(extensions);
+        fileDialog.setFilterNames(names);
+        String res = fileDialog.open();
+        if (res != null) {
+            updateWgzName(path.trim(), res);
+            fileName.setText(res);
+            setPageComplete(validatePage());
+        }
+    }
+
+    public void createControl(Composite parent) {
+        Composite composite = new Composite(parent, SWT.NULL);
+
+        initializeDialogUnits(parent);
+
+        composite.setLayout(new GridLayout());
+        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+        createProjectNameGroup(composite);
+        locationArea = new ProjectContentsLocationArea(getErrorReporter(), composite);
+        if (initialProjectFieldValue != null) {
+            locationArea.updateProjectName(initialProjectFieldValue);
+        }
+
+        // Scale the button based on the rest of the dialog
+        setButtonLayoutData(locationArea.getBrowseButton());
+        if (file != null) {
+            fileName.setText(file.getLocation().toOSString());
+        }
+        setPageComplete(validatePage());
+        // Show description on opening
+        setErrorMessage(null);
+        setMessage(null);
+        setControl(composite);
+        Dialog.applyDialogFont(composite);
+
+        setControl(composite);
+    }
+
+    /**
+     * Creates the project name specification controls.
+     * 
+     * @param parent
+     *            the parent composite
+     */
+    private final void createProjectNameGroup(Composite parent) {
+        // project specification group
+        Composite projectGroup = new Composite(parent, SWT.NONE);
+        GridLayout layout = new GridLayout();
+        layout.numColumns = 2;
+        projectGroup.setLayout(layout);
+        projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+        Label label = new Label(projectGroup, SWT.NONE);
+        label.setText("WGZ archive:");
+
+        Composite buttonText = new Composite(projectGroup, SWT.NONE);
+
+        buttonText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+        GridLayout gridLayout = new GridLayout(2, false);
+        gridLayout.marginWidth = 0;
+        gridLayout.marginHeight = 0;
+        buttonText.setLayout(gridLayout);
+
+        fileName = new Text(buttonText, SWT.BORDER);
+        fileName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        fileName.addModifyListener(new ModifyListener() {
+            public void modifyText(ModifyEvent e) {
+                String val = fileName.getData() != null ? fileName.getData().toString() : "";
+                String name = fileName.getText().trim();
+                updateWgzName(val, name);
+                fileName.setData(name);
+                setPageComplete(validatePage());
+            }
+        });
+        Button browse = new Button(buttonText, SWT.NONE);
+        browse.setText("Browse...");
+        browse.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                browse();
+            }
+        });
+
+        new Label(projectGroup, SWT.NONE).setText("Targeted runtime:");
+        runtimes = new ComboViewer(projectGroup, SWT.BORDER | SWT.READ_ONLY);
+        runtimes.getCombo().setEnabled(false);
+        runtimes.setContentProvider(new MapContentProvider());
+        runtimes.setLabelProvider(new LabelProvider() {
+            @SuppressWarnings("unchecked")
+            @Override
+            public String getText(Object element) {
+                return ((Map.Entry<String, IApplicationImporter>) element).getKey().toString();
+            }
+        });
+        runtimes.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        runtimes.addSelectionChangedListener(new ISelectionChangedListener() {
+            public void selectionChanged(SelectionChangedEvent event) {
+                setPageComplete(validatePage());
+            }
+        });
+
+        Label separator = new Label(projectGroup, SWT.NONE);
+        GridDataFactory.generate(separator, 2, 2);
+
+        // new project label
+        Label projectLabel = new Label(projectGroup, SWT.NONE);
+        projectLabel.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
+        projectLabel.setFont(parent.getFont());
+
+        // new project name entry field
+        projectNameField = new Text(projectGroup, SWT.BORDER);
+        GridData data = new GridData(GridData.FILL_HORIZONTAL);
+        data.widthHint = SIZING_TEXT_FIELD_WIDTH;
+        projectNameField.setLayoutData(data);
+        projectNameField.setFont(parent.getFont());
+
+        // Set the initial value first before listener
+        // to avoid handling an event during the creation.
+        if (initialProjectFieldValue != null) {
+            projectNameField.setText(initialProjectFieldValue);
+        }
+        projectNameField.addListener(SWT.Modify, nameModifyListener);
+    }
+
+    public String getArchiveFile() {
+        return fileName.getText().trim();
+    }
+
+    /**
+     * Get an error reporter for the receiver.
+     * 
+     * @return IErrorMessageReporter
+     */
+    private IErrorMessageReporter getErrorReporter() {
+        return new IErrorMessageReporter() {
+            /*
+             * (non-Javadoc)
+             * 
+             * @see
+             * org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea
+             * .IErrorMessageReporter#reportError(java.lang.String)
+             */
+            public void reportError(String errorMessage, boolean infoOnly) {
+                if (infoOnly) {
+                    setMessage(errorMessage, IStatus.INFO);
+                    setErrorMessage(null);
+                } else {
+                    setErrorMessage(errorMessage);
+                }
+                boolean valid = errorMessage == null;
+                if (valid) {
+                    valid = validatePage();
+                }
+
+                setPageComplete(valid);
+            }
+        };
+    }
+
+    /**
+     * Returns the current project location path as entered by the user, or its
+     * anticipated initial value. Note that if the default has been returned the
+     * path in a project description used to create a project should not be set.
+     * 
+     * @return the project location path or its anticipated initial value.
+     */
+    public IPath getLocationPath() {
+        return new Path(locationArea.getProjectLocation());
+    }
+
+    /**
+     * /** Returns the current project location URI as entered by the user, or
+     * <code>null</code> if a valid project location has not been entered.
+     * 
+     * @return the project location URI, or <code>null</code>
+     * @since 3.2
+     */
+    public URI getLocationURI() {
+        return locationArea.getProjectLocationURI();
+    }
+
+    /**
+     * Creates a project resource handle for the current project name field
+     * value. The project handle is created relative to the workspace root.
+     * <p>
+     * This method does not create the project resource; this is the
+     * responsibility of <code>IProject::create</code> invoked by the new
+     * project resource wizard.
+     * </p>
+     * 
+     * @return the new project resource handle
+     */
+    public IProject getProjectHandle() {
+        return ResourcesPlugin.getWorkspace().getRoot().getProject(getProjectName());
+    }
+
+    /**
+     * Returns the current project name as entered by the user, or its
+     * anticipated initial value.
+     * 
+     * @return the project name, its anticipated initial value, or
+     *         <code>null</code> if no project name is known
+     */
+    public String getProjectName() {
+        if (projectNameField == null) {
+            return initialProjectFieldValue;
+        }
+
+        return getProjectNameFieldValue();
+    }
+
+    /**
+     * Returns the value of the project name field with leading and trailing
+     * spaces removed.
+     * 
+     * @return the project name in the field
+     */
+    private String getProjectNameFieldValue() {
+        if (projectNameField == null) {
+            return ""; //$NON-NLS-1$
+        }
+
+        return projectNameField.getText().trim();
+    }
+
+    /**
+     * Sets the initial project name that this page will use when created. The
+     * name is ignored if the createControl(Composite) method has already been
+     * called. Leading and trailing spaces in the name are ignored. Providing
+     * the name of an existing project will not necessarily cause the wizard to
+     * warn the user. Callers of this method should first check if the project
+     * name passed already exists in the workspace.
+     * 
+     * @param name
+     *            initial project name for this page
+     * 
+     * @see IWorkspace#validateName(String, int)
+     * 
+     */
+    public void setInitialProjectName(String name) {
+        if (name == null) {
+            initialProjectFieldValue = null;
+        } else {
+            initialProjectFieldValue = name.trim();
+            if (locationArea != null) {
+                locationArea.updateProjectName(name.trim());
+            }
+        }
+    }
+
+    /**
+     * Set the location to the default location if we are set to useDefaults.
+     */
+    void setLocationForSelection() {
+        locationArea.updateProjectName(getProjectNameFieldValue());
+    }
+
+    private void updateWgzName(String oldValue, String newValue) {
+        String project = projectNameField.getText().trim();
+        if (project.length() == 0 || project.equals(new Path(oldValue).removeFileExtension().lastSegment())) {
+            String projectName = new Path(newValue).removeFileExtension().lastSegment();
+            projectNameField.setText(projectName);
+            locationArea.updateProjectName(projectName);
+        }
+    }
+
+    /**
+     * Returns the useDefaults.
+     * 
+     * @return boolean
+     */
+    public boolean useDefaults() {
+        return locationArea.isDefault();
+    }
+
+    private boolean validating = false;
+
+    /**
+     * Returns whether this page's controls currently all contain valid values.
+     * 
+     * @return <code>true</code> if all controls are valid, and
+     *         <code>false</code> if at least one is invalid
+     */
+    protected synchronized boolean validatePage() {
+        if (validating) {
+            return true;
+        }
+        validating = true;
+        try {
+            final IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
+            final String archive = fileName.getText().trim();
+            if (archive.equals("")) {
+                setErrorMessage(null);
+                setMessage("Archive name must be specified");
+                return false;
+            }
+
+            final File f = new File(archive);
+            if (!isValidArchive(f)) {
+                setErrorMessage(MessageFormat.format("{0} is not a valid application archive", archive));
+                return false;
+            }
+
+            final String projectFieldContents = getProjectNameFieldValue();
+            if (projectFieldContents.equals("")) { //$NON-NLS-1$
+                setErrorMessage(null);
+                setMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectNameEmpty);
+                return false;
+            }
+
+            final IStatus nameStatus = workspace.validateName(projectFieldContents, IResource.PROJECT);
+            if (!nameStatus.isOK()) {
+                setErrorMessage(nameStatus.getMessage());
+                return false;
+            }
+
+            final IProject handle = getProjectHandle();
+            if (handle.exists()) {
+                setErrorMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectExistsMessage);
+                return false;
+            }
+
+            final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getProjectNameFieldValue());
+            locationArea.setExistingProject(project);
+
+            final String validLocationMessage = locationArea.checkValidLocation();
+            if (validLocationMessage != null) { // there is no destination location given
+                setErrorMessage(validLocationMessage);
+                return false;
+            }
+            if (runtimes.getSelection().isEmpty()) {
+                setErrorMessage("Select target runtime");
+                return false;
+            }
+
+            setErrorMessage(null);
+            setMessage(null);
+            return true;
+        } finally {
+            validating = false;
+        }
+    }
+
+    private boolean isValidArchive(File f) {
+        if (f.isFile()) {
+            final Map<String, IApplicationImporter> importers = new TreeMap<String, IApplicationImporter>();
+            final IApplicationImporter[] applicationImporters = TMWCoreUI.getApplicationImporters();
+            for (IApplicationImporter importer : applicationImporters) {
+                final IMobileWebRuntime runtime = importer.getApplicationRuntime(f);
+                if (runtime != null) {
+                    importers.put(runtime.getName(), importer);
+                }
+            }
+            final ISelection selection = runtimes.getSelection();
+            Object sel = null;
+            if (!selection.isEmpty()) {
+                @SuppressWarnings("unchecked")
+                Map.Entry<String, IApplicationImporter> entry = (Entry<String, IApplicationImporter>) ((IStructuredSelection) selection)
+                        .getFirstElement();
+                for (Entry<String, IApplicationImporter> ent : importers.entrySet()) {
+                    if (ent.getKey().equals(entry.getKey())) {
+                        sel = ent;
+                    }
+                }
+            }
+            runtimes.setInput(importers);
+            if (sel != null) {
+                runtimes.setSelection(new StructuredSelection(sel));
+            } else if (importers.size() == 1) {
+                runtimes.setSelection(new StructuredSelection(importers.entrySet().iterator().next()));
+            }
+            runtimes.getControl().setEnabled(importers.size() > 1);
+            return !runtimes.getSelection().isEmpty();
+        }
+        return false;
+    }
+
+    public IApplicationImporter getImporter() {
+        if (runtimes == null || runtimes.getControl().isDisposed()) {
+            return null;
+        }
+        @SuppressWarnings("unchecked")
+        final Map.Entry<String, IApplicationImporter> element = (Entry<String, IApplicationImporter>) ((IStructuredSelection) runtimes
+                .getSelection()).getFirstElement();
+        return element.getValue();
+    }
+
+}
--- a/plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/ui/TMWCoreUI.java	Tue Aug 31 15:21:04 2010 -0700
+++ b/plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/ui/TMWCoreUI.java	Wed Sep 01 16:27:43 2010 -0700
@@ -1,10 +1,15 @@
 package org.symbian.tools.tmw.ui;
 
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.WeakHashMap;
 
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jface.resource.ImageRegistry;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
@@ -13,23 +18,93 @@
 import org.symbian.tools.tmw.internal.ui.deployment.DeploymentTargetPresentationsManager;
 import org.symbian.tools.tmw.internal.ui.deployment.DeploymentTargetTypesRegistry;
 import org.symbian.tools.tmw.internal.ui.project.ProjectTemplateManagerImpl;
+import org.symbian.tools.tmw.ui.project.IApplicationImporter;
 import org.symbian.tools.tmw.ui.project.IProjectTemplateManager;
 
 /**
  * The activator class controls the plug-in life cycle
  */
 public class TMWCoreUI extends AbstractUIPlugin {
-    private final Map<IProject, ProjectMemo> MEMOS = new WeakHashMap<IProject, ProjectMemo>();
-    private final DeploymentTargetTypesRegistry typesRegistry = new DeploymentTargetTypesRegistry();
-
+    // The shared instance
+    private static TMWCoreUI plugin;
     // The plug-in ID
     public static final String PLUGIN_ID = "org.symbian.tools.tmw.ui"; //$NON-NLS-1$
 
-    // The shared instance
-    private static TMWCoreUI plugin;
+    public static IApplicationImporter[] getApplicationImporters() {
+        if (getDefault().importers == null) {
+            final Collection<IApplicationImporter> collection = new LinkedList<IApplicationImporter>();
+            final IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(
+                    PLUGIN_ID, "applicationImporter");
+            for (IConfigurationElement element : elements) {
+                try {
+                    collection.add((IApplicationImporter) element.createExecutableExtension("class"));
+                } catch (CoreException e) {
+                    TMWCoreUI.log(String.format(
+                            "Application importer %s cannot be instantiated. It is declared in plug-in %s",
+                            element.getAttribute("class"), element.getContributor().getName()), e);
+                }
+            }
+            getDefault().importers = collection.toArray(new IApplicationImporter[collection.size()]);
+        }
+        return getDefault().importers;
+    }
+
+    /**
+     * Returns the shared instance
+     *
+     * @return the shared instance
+     */
+    public static TMWCoreUI getDefault() {
+        return plugin;
+    }
+    public static Images getImages() {
+        if (getDefault().images == null) {
+            getDefault().images = new Images(getDefault().getImageRegistry());
+        }
+        return getDefault().images;
+    }
+    public static ProjectMemo getMemo(ITMWProject project) {
+        return getDefault().getMemoForProject(project);
+    }
+    public static IProjectTemplateManager getProjectTemplateManager() {
+        return getDefault().projectTemplateManager;
+    }
+
+    public static void log(Exception e) {
+        log(null, e);
+    }
+
+    public static void log(String message, Exception e) {
+        getDefault().getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, message, e));
+    }
+
+    public static void log(String message, Object... args) {
+        log(String.format(message, args), (Exception) null);
+    }
+
+    private Images images;
+    private IApplicationImporter[] importers;
+    private final Map<IProject, ProjectMemo> MEMOS = new WeakHashMap<IProject, ProjectMemo>();
+    private final DeploymentTargetPresentationsManager presentations = new DeploymentTargetPresentationsManager();
     private IProjectTemplateManager projectTemplateManager;
-    private Images images;
-    private final DeploymentTargetPresentationsManager presentations = new DeploymentTargetPresentationsManager();
+    private final DeploymentTargetTypesRegistry typesRegistry = new DeploymentTargetTypesRegistry();
+
+    public DeploymentTargetTypesRegistry getDeploymentTypesRegistry() {
+        return typesRegistry;
+    }
+
+    private synchronized ProjectMemo getMemoForProject(ITMWProject project) {
+        ProjectMemo memo = MEMOS.get(project.getProject());
+        if (memo == null) {
+            memo = new ProjectMemo(project);
+            MEMOS.put(project.getProject(), memo);
+        }
+        return memo;
+    }
+
+    public DeploymentTargetPresentationsManager getPresentations() {
+        return presentations;
+    }
 
     @Override
     protected void initializeImageRegistry(ImageRegistry reg) {
@@ -46,57 +121,4 @@
         plugin = null;
         super.stop(context);
     }
-
-    /**
-     * Returns the shared instance
-     *
-     * @return the shared instance
-     */
-    public static TMWCoreUI getDefault() {
-        return plugin;
-    }
-
-    public static void log(String message, Exception e) {
-        getDefault().getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, message, e));
-    }
-
-    public static void log(String message, Object... args) {
-        log(String.format(message, args), (Exception) null);
-    }
-
-    public static void log(Exception e) {
-        log(null, e);
-    }
-
-    public static ProjectMemo getMemo(ITMWProject project) {
-        return getDefault().getMemoForProject(project);
-    }
-
-    private synchronized ProjectMemo getMemoForProject(ITMWProject project) {
-        ProjectMemo memo = MEMOS.get(project.getProject());
-        if (memo == null) {
-            memo = new ProjectMemo(project);
-            MEMOS.put(project.getProject(), memo);
-        }
-        return memo;
-    }
-
-    public DeploymentTargetTypesRegistry getDeploymentTypesRegistry() {
-        return typesRegistry;
-    }
-
-    public static Images getImages() {
-        if (getDefault().images == null) {
-            getDefault().images = new Images(getDefault().getImageRegistry());
-        }
-        return getDefault().images;
-    }
-
-    public DeploymentTargetPresentationsManager getPresentations() {
-        return presentations;
-    }
-
-    public static IProjectTemplateManager getProjectTemplateManager() {
-        return getDefault().projectTemplateManager;
-    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/ui/project/AbstractZippedApplicationImporter.java	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,102 @@
+/**
+ * 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.ui.project;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+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.core.runtime.Status;
+import org.symbian.tools.tmw.core.runtimes.IMobileWebRuntime;
+import org.symbian.tools.tmw.core.utilities.NonClosingStream;
+import org.symbian.tools.tmw.ui.TMWCoreUI;
+
+/**
+ * This is base class for importers that work with zip-based application
+ * packages. W3C specification mandates using Zip as archive format and
+ * it looks like all mobile web runtime use Zip as their format.
+ * 
+ * @author Eugene Ostroukhov (eugeneo@symbian.org)
+ */
+public abstract class AbstractZippedApplicationImporter implements IApplicationImporter {
+    public Map<String, String> getFileFilters() {
+        return Collections.singletonMap("*.zip", "Application Archive (*.zip)");
+    }
+
+    public void extractFiles(File file, IMobileWebRuntime runtime, IProject project, IProgressMonitor monitor)
+            throws CoreException {
+        ZipInputStream zipInputStream = null;
+        try {
+            zipInputStream = new ZipInputStream(new FileInputStream(file));
+            ZipEntry entry = null;
+            while ((entry = zipInputStream.getNextEntry()) != null) {
+                if (!entry.isDirectory()) {
+                    final IPath path = getApplicationRelativePath(entry);
+                    final IFile f = project.getFile(path);
+                    if (!f.exists()) {
+                        createContainers(f.getParent());
+                        f.create(new NonClosingStream(zipInputStream), false, new NullProgressMonitor());
+                    }
+                }
+            }
+        } catch (IOException e) {
+            throw new CoreException(new Status(IStatus.ERROR, TMWCoreUI.PLUGIN_ID, String.format(
+                    "Cannot extract files from archive %s", file.getAbsoluteFile()), e));
+        } finally {
+            if (zipInputStream != null) {
+                try {
+                    zipInputStream.close();
+                } catch (IOException e) {
+                    // Do nothing
+                }
+            }
+        }
+    }
+
+    private void createContainers(IContainer parent) throws CoreException {
+        if (parent != null && !parent.exists() && parent.getType() == IResource.FOLDER) {
+            createContainers(parent.getParent());
+            ((IFolder) parent).create(false, true, new NullProgressMonitor());
+        }
+    }
+
+    /**
+     * This base calss assumes application files are in the application
+     * package root. Symbian WRT has files in the subfolder so it will need
+     * to override this method.
+     */
+    protected IPath getApplicationRelativePath(ZipEntry entry) {
+        return new Path(entry.getName());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/ui/project/IApplicationImporter.java	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,80 @@
+/**
+ * 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.ui.project;
+
+import java.io.File;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.symbian.tools.tmw.core.runtimes.IMobileWebRuntime;
+
+/**
+ * Classes implementing this interface help create projects from application
+ * archives.
+ * 
+ * @author Eugene Ostroukhov (eugeneo@symbian.org)
+ */
+public interface IApplicationImporter {
+    /**
+     * Importer can support only one runtime (i.e. several extensions need to 
+     * be contributed for several runtimes). 
+     * 
+     * @param file application package 
+     * @return runtime that created project should target. <code>null</code> if
+     * this importer can't import the file.
+     */
+    IMobileWebRuntime getApplicationRuntime(File file);
+
+    /**
+     * @return filters that users can use to navigate filesystem. They are 
+     * returned as "file extension-description" pairs
+     * @see org.eclipse.swt.widgets.FileDialog#setFilterExtensions(String[])
+     * @see org.eclipse.swt.widgets.FileDialog#setFilterNames(String[])
+     */
+    Map<String, String> getFileFilters();
+
+    /**
+     * @param file application package
+     * @return collection of the enabled facets. These facets will be "locked"
+     * on the project
+     */
+    IProjectFacetVersion[] getConfiguredFacets(File file);
+
+    /**
+     * Extracts files from application archive to workspace project
+     * 
+     * @param file mobile web application archive
+     * @param runtime mobile web runtime
+     * @param project workspace project
+     * @param monitor progress monitor
+     * @throws CoreException this exception signals failure to extract files
+     */
+    void extractFiles(File file, IMobileWebRuntime runtime, IProject project, IProgressMonitor monitor)
+            throws CoreException;
+
+    /**
+     * @param project newly imported application project
+     * @return collection of the files to open
+     */
+    IFile[] getFilesToOpen(IProject project);
+}
--- a/plugins/org.symbian.tools.wrttools/plugin.xml	Tue Aug 31 15:21:04 2010 -0700
+++ b/plugins/org.symbian.tools.wrttools/plugin.xml	Wed Sep 01 16:27:43 2010 -0700
@@ -104,9 +104,7 @@
 	
 <!-- Import Wizard -->
 	<extension point="org.eclipse.ui.importWizards">
-		<category id="org.symbian.tools.wrttools.import" name="Mobile Web Tools">
-		</category>
-		<wizard category="org.symbian.tools.wrttools.import"
+		<wizard category="org.symbian.tools.tmw.import"
 			class="org.symbian.tools.wrttools.wizards.projectimport.WrtProjectsImportWizard"
 			icon="icons/import_aptana_project.gif" id="org.symbian.tools.wrttools.import.projectImport"
 			name="Existing Mobile Web Projects into Workspace">
@@ -114,18 +112,7 @@
         Import WRT project created in Aptana, Adobe Dreamweaver or WRT IDE
      </description>
 		</wizard>
-		
-		<wizard
-          category="org.symbian.tools.wrttools.import"
-          class="org.symbian.tools.wrttools.wizards.WgzImportWizard"
-          icon="icons/import_16x16px.png"
-          id="org.symbian.tools.wrttools.importwgz"
-          name="Application Archive (WGZ)">
-        <description>
-          Create WRT project from deployable WGZ application archive
-        </description>
-      </wizard>
-		
+	
     </extension>
 	
 <!-- WRT Content Descriptor (.plist) file -->
@@ -657,7 +644,6 @@
            component-version="1.1"
            name="Symbian WRT 1.1">
         <runtime-component
-              alwayson="true"
               id="tmw.geolocation"
               version="1.0">
         </runtime-component>
@@ -1057,5 +1043,20 @@
             runtime-version="1.1">
       </layout-provider>
    </extension>
+   <extension
+         point="org.symbian.tools.tmw.ui.applicationImporter">
+      <importer
+            class="org.symbian.tools.wrttools.core.project.WgzImporter">
+      </importer>
+   </extension>
+   <extension
+         point="org.eclipse.wst.common.project.facet.core.detectors">
+      <detector
+            class="org.symbian.tools.wrttools.core.libraries.WrtKitFacetDetector">
+      </detector>
+      <detector
+            class="org.symbian.tools.wrttools.core.libraries.PhoneGapFacetDetector">
+      </detector>
+   </extension>
  
 </plugin>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/libraries/PhoneGapFacetDetector.java	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,42 @@
+/**
+ * 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.wrttools.core.libraries;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+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.ProjectFacetDetector;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.symbian.tools.tmw.core.utilities.CoreUtil;
+
+public class PhoneGapFacetDetector extends ProjectFacetDetector {
+
+    @Override
+    public void detect(IFacetedProjectWorkingCopy fpjwc, IProgressMonitor monitor) throws CoreException {
+        if (CoreUtil.hasTypes(fpjwc.getProject(), "AccelerationOptions", "DeviceError")) {
+            final IProjectFacet facet = ProjectFacetsManager.getProjectFacet("symbian.phonegap");
+            final IProjectFacetVersion latestVersion = facet.getLatestVersion();
+            fpjwc.addProjectFacet(latestVersion);
+            fpjwc.setProjectFacetActionConfig(facet, null);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/libraries/WrtKitFacetDetector.java	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,41 @@
+/**
+ * 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.wrttools.core.libraries;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
+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.ProjectFacetDetector;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.symbian.tools.tmw.core.utilities.CoreUtil;
+
+public class WrtKitFacetDetector extends ProjectFacetDetector {
+    @Override
+    public void detect(IFacetedProjectWorkingCopy fpjwc, IProgressMonitor monitor) throws CoreException {
+        if (CoreUtil.hasTypes(fpjwc.getProject(), "UIManager", "NavigationButton", "NotificationPopup")) {
+            final IProjectFacet facet = ProjectFacetsManager.getProjectFacet("symbian.wrtkit");
+            final IProjectFacetVersion latestVersion = facet.getLatestVersion();
+            fpjwc.addProjectFacet(latestVersion);
+            fpjwc.setProjectFacetActionConfig(facet, null);
+        }
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/core/project/WgzImporter.java	Wed Sep 01 16:27:43 2010 -0700
@@ -0,0 +1,98 @@
+/**
+ * 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.wrttools.core.project;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.symbian.tools.tmw.core.TMWCore;
+import org.symbian.tools.tmw.core.runtimes.IMobileWebRuntime;
+import org.symbian.tools.tmw.ui.project.AbstractZippedApplicationImporter;
+import org.symbian.tools.wrttools.Activator;
+import org.symbian.tools.wrttools.WRTProject;
+import org.symbian.tools.wrttools.util.CoreUtil;
+
+public class WgzImporter extends AbstractZippedApplicationImporter {
+
+    public IMobileWebRuntime getApplicationRuntime(File file) {
+        if (file.isFile()) {
+            ZipInputStream stream = null;
+            try {
+                stream = new ZipInputStream(new FileInputStream(file));
+                ZipEntry entry = null;
+                while ((entry = stream.getNextEntry()) != null) {
+                    if (!entry.isDirectory()) {
+                        IPath path = new Path(entry.getName());
+                        if (path.segmentCount() == 2 && "Info.plist".equalsIgnoreCase(path.lastSegment())) {
+                            return TMWCore.getRuntimesManager().getRuntime(WRTProject.WRT11_RUNTIME,
+                                    WRTProject.WRT11_VERSION);
+                        }
+                    }
+                }
+            } catch (IOException e) {
+                Activator.log(e);
+            } finally {
+                if (stream != null) {
+                    try {
+                        stream.close();
+                    } catch (IOException e) {
+                        Activator.log(e);
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    public Map<String, String> getFileFilters() {
+        Map<String, String> filters = new TreeMap<String, String>();
+        filters.put("*.wgz", "WRT Application Archive (*.wgz)");
+        filters.put("*.zip", "Zip Archive (*.zip)");
+        return filters;
+    }
+
+    public IFile[] getFilesToOpen(IProject project) {
+        try {
+            return new IFile[] { CoreUtil.getIndexFile(project) };
+        } catch (CoreException e) {
+            Activator.log(e);
+            return null;
+        }
+    }
+
+    public IProjectFacetVersion[] getConfiguredFacets(File file) {
+        return null;
+    }
+
+    @Override
+    protected IPath getApplicationRelativePath(ZipEntry entry) {
+        return new Path(entry.getName()).removeFirstSegments(1);
+    }
+}
--- a/plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/WgzImportWizard.java	Tue Aug 31 15:21:04 2010 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-package org.symbian.tools.wrttools.wizards;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
-import org.symbian.tools.wrttools.Activator;
-import org.symbian.tools.wrttools.core.WRTImages;
-import org.symbian.tools.wrttools.core.WrtIdeCorePreferences;
-import org.symbian.tools.wrttools.util.ProjectUtils;
-
-public class WgzImportWizard extends Wizard implements IImportWizard, INewWizard, IExecutableExtension {
-	private IFile file;
-	private WgzImportWizardPage page;
-    private IConfigurationElement config;
-
-	public WgzImportWizard() {
-		setWindowTitle("Import WRT Application Archive");
-        setDefaultPageImageDescriptor(WRTImages.importWgzWizardBanner());
-		setNeedsProgressMonitor(true);
-	}
-
-	@Override
-	public void addPages() {
-		page = new WgzImportWizardPage(file);
-		addPage(page);
-	}
-
-	private IProject createProject(String archiveName, String projectName, URI uri,
-			IProgressMonitor monitor) throws CoreException {
-		monitor.beginTask("Importing WRT application archive", 50);
-		// 1. Create project
-		IProject project = ProjectUtils.createWrtProject(projectName, uri,
-				new SubProgressMonitor(monitor, 10));
-
-		// 2. Unpack archive
-        boolean success = false;
-		try {
-            // TODO
-            //			ProjectUtils.unzip(archiveName, project, 1, new SubProgressMonitor(
-            //					monitor, 40));
-            success = true;
-            //            throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID,
-            //					
-            //		} catch (IO"Archive unpacking failed", e));
-        } finally {
-            if (!success) {
-                project.delete(true, true, new NullProgressMonitor());
-            }
-		}
-		monitor.done();
-		return project;
-	}
-
-	@Override
-	public boolean performFinish() {
-		try {
-			final String projectName = page.getProjectName();
-			final URI uri = page.getLocationURI();
-			final String archiveName = page.getArchiveFile();
-			final IProject[] holder = new IProject[1];
-			getContainer().run(true, true, new IRunnableWithProgress() {
-
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException, InterruptedException {
-					try {
-						ResourcesPlugin.getWorkspace().run(
-								new IWorkspaceRunnable() {
-
-									public void run(IProgressMonitor monitor)
-											throws CoreException {
-										holder[0] = createProject(archiveName, projectName,
-												uri, monitor);
-									}
-
-								}, monitor);
-                    } catch (final CoreException e) {
-                        getShell().getDisplay().asyncExec(new Runnable() {
-                            public void run() {
-                                StatusManager.getManager().handle(e.getStatus(),
-                                        StatusManager.SHOW | StatusManager.BLOCK | StatusManager.LOG);
-                            }
-                        });
-					}
-				}
-			});
-			if (holder[0] != null) {
-                BasicNewProjectResourceWizard.updatePerspective(config);
-                Activator.getDefault().getPreferenceStore().setValue(WrtIdeCorePreferences.WGZ_IMPORT_PATH,
-                        new File(archiveName).getParentFile().getAbsolutePath());
-				ProjectUtils.focusOn(holder[0]);
-			}
-		} catch (InvocationTargetException e) {
-			Activator.log(e);
-		} catch (InterruptedException e) {
-			Activator.log(e);
-		}
-		return true;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		file = null;
-		if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
-			Object element = (selection)
-					.getFirstElement();
-			if (element instanceof IAdaptable) {
-				IResource resource = (IResource) ((IAdaptable) element)
-						.getAdapter(IResource.class);
-				if (resource != null
-						&& resource.getType() == IResource.FILE
-						&& "wgz".equalsIgnoreCase(resource
-								.getProjectRelativePath().getFileExtension())) {
-					file = (IFile) resource;
-				}
-			}
-		}
-	}
-
-    public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
-            throws CoreException {
-        this.config = config;
-    }
-
-}
--- a/plugins/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/WgzImportWizardPage.java	Tue Aug 31 15:21:04 2010 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,467 +0,0 @@
-package org.symbian.tools.wrttools.wizards;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.net.URI;
-import java.text.MessageFormat;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-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.Event;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.WorkingSetGroup;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
-import org.eclipse.ui.internal.ide.IIDEHelpContextIds;
-import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea;
-import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea.IErrorMessageReporter;
-import org.symbian.tools.wrttools.Activator;
-import org.symbian.tools.wrttools.core.WrtIdeCorePreferences;
-import org.symbian.tools.wrttools.util.CoreUtil;
-
-@SuppressWarnings("restriction")
-public class WgzImportWizardPage extends WizardPage {
-	// constants
-	private static final int SIZING_TEXT_FIELD_WIDTH = 250;
-
-	private final IFile file;
-	// initial value stores
-	private String initialProjectFieldValue;
-	private ProjectContentsLocationArea locationArea;
-	private final Listener nameModifyListener = new Listener() {
-		public void handleEvent(Event e) {
-			setLocationForSelection();
-			boolean valid = validatePage();
-			setPageComplete(valid);
-
-		}
-	};
-	// widgets
-    private Text projectNameField;
-	private Text wgzName;
-	private WorkingSetGroup workingSetGroup;
-
-	protected WgzImportWizardPage(IFile file) {
-		super("ImportWgz");
-		this.file = file;
-		setTitle("Import WGZ Archive");
-		setDescription("Import WGZ archive as a new WRT application project");
-		setPageComplete(false);
-	}
-
-	protected void browse() {
-		FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN);
-		String path = wgzName.getText();
-        path = path.trim().length() > 0 ? path.trim() : Activator.getDefault().getPreferenceStore().getString(
-                WrtIdeCorePreferences.WGZ_IMPORT_PATH);
-        fileDialog.setFilterPath(path);
-		fileDialog.setFilterExtensions(new String[] {"*.wgz", "*.*"} );
-		fileDialog.setFilterNames(new String[] {"WRT Archive (wgz)", "All Files"} );
-		String res = fileDialog.open();
-		if (res != null) {
-			updateWgzName(path.trim(), res);
-			wgzName.setText(res);
-			setPageComplete(validatePage());
-		}
-	}
-
-	public void createControl(Composite parent) {
-		Composite composite = new Composite(parent, SWT.NULL);
-
-		initializeDialogUnits(parent);
-
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
-				IIDEHelpContextIds.NEW_PROJECT_WIZARD_PAGE);
-
-		composite.setLayout(new GridLayout());
-		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		createProjectNameGroup(composite);
-		locationArea = new ProjectContentsLocationArea(getErrorReporter(),
-				composite);
-		if (initialProjectFieldValue != null) {
-			locationArea.updateProjectName(initialProjectFieldValue);
-		}
-
-		// Scale the button based on the rest of the dialog
-		setButtonLayoutData(locationArea.getBrowseButton());
-
-		if (file != null) {
-			wgzName.setText(file.getLocation().toOSString());
-		}
-		
-		setPageComplete(validatePage());
-		// Show description on opening
-		setErrorMessage(null);
-		setMessage(null);
-		setControl(composite);
-		Dialog.applyDialogFont(composite);
-
-		setControl(composite);
-	}
-
-	/**
-	 * Creates the project name specification controls.
-	 * 
-	 * @param parent
-	 *            the parent composite
-	 */
-	private final void createProjectNameGroup(Composite parent) {
-		// project specification group
-		Composite projectGroup = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		projectGroup.setLayout(layout);
-		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		Label label = new Label(projectGroup, SWT.NONE);
-		label.setText("WGZ archive:");
-
-		Composite buttonText = new Composite(projectGroup, SWT.NONE);
-
-		buttonText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		
-		GridLayout gridLayout = new GridLayout(2, false);
-		gridLayout.marginWidth = 0;
-		gridLayout.marginHeight = 0;
-		buttonText.setLayout(gridLayout);
-		
-		wgzName = new Text(buttonText, SWT.BORDER);
-		wgzName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		wgzName.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String val = wgzName.getData() != null ? wgzName.getData()
-						.toString() : "";
-				String name = wgzName.getText().trim();
-				updateWgzName(val, name);
-				wgzName.setData(name);
-				setPageComplete(validatePage());
-			}
-		});
-		Button browse = new Button(buttonText, SWT.NONE);
-		browse.setText("Browse...");
-		browse.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				browse();
-			}
-		});
-
-		Label separator = new Label(projectGroup, SWT.NONE);
-		GridDataFactory.generate(separator, 2, 2);
-		
-		// new project label
-		Label projectLabel = new Label(projectGroup, SWT.NONE);
-		projectLabel
-				.setText(IDEWorkbenchMessages.WizardNewProjectCreationPage_nameLabel);
-		projectLabel.setFont(parent.getFont());
-
-		// new project name entry field
-		projectNameField = new Text(projectGroup, SWT.BORDER);
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.widthHint = SIZING_TEXT_FIELD_WIDTH;
-		projectNameField.setLayoutData(data);
-		projectNameField.setFont(parent.getFont());
-
-		// Set the initial value first before listener
-		// to avoid handling an event during the creation.
-		if (initialProjectFieldValue != null) {
-			projectNameField.setText(initialProjectFieldValue);
-		}
-		projectNameField.addListener(SWT.Modify, nameModifyListener);
-	}
-
-	/**
-	 * Create a working set group for this page. This method can only be called
-	 * once.
-	 * 
-	 * @param composite
-	 *            the composite in which to create the group
-	 * @param selection
-	 *            the current workbench selection
-	 * @param supportedWorkingSetTypes
-	 *            an array of working set type IDs that will restrict what types
-	 *            of working sets can be chosen in this group
-	 * @return the created group. If this method has been called previously the
-	 *         original group will be returned.
-	 * @since 3.4
-	 */
-	public WorkingSetGroup createWorkingSetGroup(Composite composite,
-			IStructuredSelection selection, String[] supportedWorkingSetTypes) {
-		if (workingSetGroup != null) {
-            return workingSetGroup;
-        }
-		workingSetGroup = new WorkingSetGroup(composite, selection,
-				supportedWorkingSetTypes);
-		return workingSetGroup;
-	}
-
-	public String getArchiveFile() {
-		return wgzName.getText().trim();
-	}
-
-	/**
-	 * Get an error reporter for the receiver.
-	 * 
-	 * @return IErrorMessageReporter
-	 */
-	private IErrorMessageReporter getErrorReporter() {
-		return new IErrorMessageReporter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see
-			 * org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea
-			 * .IErrorMessageReporter#reportError(java.lang.String)
-			 */
-			public void reportError(String errorMessage, boolean infoOnly) {
-				if (infoOnly) {
-					setMessage(errorMessage, IStatus.INFO);
-					setErrorMessage(null);
-				} else {
-                    setErrorMessage(errorMessage);
-                }
-				boolean valid = errorMessage == null;
-				if (valid) {
-					valid = validatePage();
-				}
-
-				setPageComplete(valid);
-			}
-		};
-	}
-
-	/**
-	 * Returns the current project location path as entered by the user, or its
-	 * anticipated initial value. Note that if the default has been returned the
-	 * path in a project description used to create a project should not be set.
-	 * 
-	 * @return the project location path or its anticipated initial value.
-	 */
-	public IPath getLocationPath() {
-		return new Path(locationArea.getProjectLocation());
-	}
-
-	/**
-	 * /** Returns the current project location URI as entered by the user, or
-	 * <code>null</code> if a valid project location has not been entered.
-	 * 
-	 * @return the project location URI, or <code>null</code>
-	 * @since 3.2
-	 */
-	public URI getLocationURI() {
-		return locationArea.getProjectLocationURI();
-	}
-
-	/**
-	 * Creates a project resource handle for the current project name field
-	 * value. The project handle is created relative to the workspace root.
-	 * <p>
-	 * This method does not create the project resource; this is the
-	 * responsibility of <code>IProject::create</code> invoked by the new
-	 * project resource wizard.
-	 * </p>
-	 * 
-	 * @return the new project resource handle
-	 */
-	public IProject getProjectHandle() {
-		return ResourcesPlugin.getWorkspace().getRoot().getProject(
-				getProjectName());
-	}
-
-	/**
-	 * Returns the current project name as entered by the user, or its
-	 * anticipated initial value.
-	 * 
-	 * @return the project name, its anticipated initial value, or
-	 *         <code>null</code> if no project name is known
-	 */
-	public String getProjectName() {
-		if (projectNameField == null) {
-			return initialProjectFieldValue;
-		}
-
-		return getProjectNameFieldValue();
-	}
-
-	/**
-	 * Returns the value of the project name field with leading and trailing
-	 * spaces removed.
-	 * 
-	 * @return the project name in the field
-	 */
-	private String getProjectNameFieldValue() {
-		if (projectNameField == null) {
-			return ""; //$NON-NLS-1$
-		}
-
-		return projectNameField.getText().trim();
-	}
-
-	/**
-	 * Return the selected working sets, if any. If this page is not configured
-	 * to interact with working sets this will be an empty array.
-	 * 
-	 * @return the selected working sets
-	 * @since 3.4
-	 */
-	public IWorkingSet[] getSelectedWorkingSets() {
-		return workingSetGroup == null ? new IWorkingSet[0] : workingSetGroup
-				.getSelectedWorkingSets();
-	}
-
-	/**
-	 * Sets the initial project name that this page will use when created. The
-	 * name is ignored if the createControl(Composite) method has already been
-	 * called. Leading and trailing spaces in the name are ignored. Providing
-	 * the name of an existing project will not necessarily cause the wizard to
-	 * warn the user. Callers of this method should first check if the project
-	 * name passed already exists in the workspace.
-	 * 
-	 * @param name
-	 *            initial project name for this page
-	 * 
-	 * @see IWorkspace#validateName(String, int)
-	 * 
-	 */
-	public void setInitialProjectName(String name) {
-		if (name == null) {
-			initialProjectFieldValue = null;
-		} else {
-			initialProjectFieldValue = name.trim();
-			if (locationArea != null) {
-				locationArea.updateProjectName(name.trim());
-			}
-		}
-	}
-
-	/**
-	 * Set the location to the default location if we are set to useDefaults.
-	 */
-	void setLocationForSelection() {
-		locationArea.updateProjectName(getProjectNameFieldValue());
-	}
-
-	private void updateWgzName(String oldValue, String newValue) {
-		String project = projectNameField.getText().trim();
-		if (project.length() == 0 || project.equals(new Path(oldValue).removeFileExtension().lastSegment())) {
-			String projectName = new Path(newValue).removeFileExtension().lastSegment();
-			projectNameField.setText(projectName);
-			locationArea.updateProjectName(projectName);
-		}
-	}
-
-	/**
-	 * Returns the useDefaults.
-	 * 
-	 * @return boolean
-	 */
-	public boolean useDefaults() {
-		return locationArea.isDefault();
-	}
-
-	/**
-	 * Returns whether this page's controls currently all contain valid values.
-	 * 
-	 * @return <code>true</code> if all controls are valid, and
-	 *         <code>false</code> if at least one is invalid
-	 */
-	protected boolean validatePage() {
-		IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
-
-		String archive = wgzName.getText().trim();
-		
-		if (archive.equals("")) {
-			setErrorMessage(null);
-			setMessage("Archive name must be specified");
-			return false;
-		}
-		
-		File f = new File(archive);
-        if (!isValidArchive(f)) {
-			setErrorMessage(MessageFormat.format("{0} is not a valid WRT archive", archive));
-			return false;
-		}
-		
-		String projectFieldContents = getProjectNameFieldValue();
-		if (projectFieldContents.equals("")) { //$NON-NLS-1$
-			setErrorMessage(null);
-			setMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectNameEmpty);
-			return false;
-		}
-
-		IStatus nameStatus = workspace.validateName(projectFieldContents,
-				IResource.PROJECT);
-		if (!nameStatus.isOK()) {
-			setErrorMessage(nameStatus.getMessage());
-			return false;
-		}
-
-		IProject handle = getProjectHandle();
-		if (handle.exists()) {
-			setErrorMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectExistsMessage);
-			return false;
-		}
-
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
-				getProjectNameFieldValue());
-		locationArea.setExistingProject(project);
-
-		String validLocationMessage = locationArea.checkValidLocation();
-		if (validLocationMessage != null) { // there is no destination location
-											// given
-			setErrorMessage(validLocationMessage);
-			return false;
-		}
-
-		setErrorMessage(null);
-		setMessage(null);
-		return true;
-	}
-
-    private boolean isValidArchive(File f) {
-        if (f.isFile()) {
-            try {
-                final ZipInputStream stream = new ZipInputStream(new FileInputStream(f));
-                ZipEntry entry;
-                while ((entry = stream.getNextEntry()) != null) {
-                    final IPath path = new Path(entry.getName());
-                    if (path.segmentCount() == 2 && CoreUtil.METADATA_FILE.equalsIgnoreCase(path.segment(1))) {
-                        return true;
-                    }
-                }
-            } catch (IOException e) {
-                // Not a valid archive
-            }
-        }
-        return false;
-    }
-
-}