plugins/org.symbian.tools.tmw.ui/src/org/symbian/tools/tmw/internal/ui/importwizard/ApplicationImportWizardPage.java
changeset 481 e908ec135fa1
child 483 109da596fa9d
--- /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();
+    }
+
+}