--- a/org.symbian.tools.wrttools/plugin.xml Thu Feb 25 14:30:54 2010 -0800
+++ b/org.symbian.tools.wrttools/plugin.xml Thu Feb 25 14:58:22 2010 -0800
@@ -188,7 +188,6 @@
</validator>
</extension>
-<!-- WRT WidgetWizard and AptanaProjectImportWizard -->
<extension point="org.eclipse.ui.newWizards">
<category id="org.symbian.tools.wrttools.core.category" name="Web Runtime(WRT)">
</category>
@@ -273,9 +272,12 @@
<category id="org.symbian.tools.wrttools.import" name="Web Runtime(WRT)">
</category>
<wizard category="org.symbian.tools.wrttools.import"
- class="org.symbian.tools.wrttools.wizards.projectimport.AptanaProjectsImportWizard"
- icon="icons/import_aptana_project.gif" id="org.symbian.tools.wrttools.import.aptanaImport"
+ class="org.symbian.tools.wrttools.wizards.projectimport.WrtProjectsImportWizard"
+ icon="icons/import_aptana_project.gif" id="org.symbian.tools.wrttools.import.projectImport"
name="WRT Project">
+ <description>
+ Import WRT project created in Aptana, Adobe Dreamweaver or WRT IDE
+ </description>
</wizard>
<wizard
category="org.symbian.tools.wrttools.import"
@@ -283,6 +285,9 @@
icon="icons/WRTImport.gif"
id="org.symbian.tools.wrttools.importwgz"
name="Sources from WGZ File">
+ <description>
+ Create WRT project from deployable WGZ application archive
+ </description>
</wizard>
</extension>
@@ -532,7 +537,7 @@
</commonWizard>
<commonWizard
type="import"
- wizardId="org.symbian.tools.wrttools.import.aptanaImport">
+ wizardId="org.symbian.tools.wrttools.import.projectImport">
<enablement>
<or>
<adapt
--- a/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/util/ProjectUtils.java Thu Feb 25 14:30:54 2010 -0800
+++ b/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/util/ProjectUtils.java Thu Feb 25 14:58:22 2010 -0800
@@ -297,7 +297,7 @@
}
}
- public static File isAptanaProject(File[] contents) {
+ public static File isWrtProject(File[] contents) {
for (int i = 0; i < contents.length; i++) {
File file = contents[i];
if (file.isFile() && file.getName().equalsIgnoreCase(CoreUtil.METADATA_FILE)) {
--- a/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/projectimport/AptanaProjectLocationWizardPage.java Thu Feb 25 14:30:54 2010 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1346 +0,0 @@
-/**
- * Copyright (c) 2009 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.wizards.projectimport;
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.zip.ZipException;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectDescription;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.PixelConverter;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Color;
-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.DirectoryDialog;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkingSet;
-import org.eclipse.ui.IWorkingSetManager;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-import org.eclipse.ui.dialogs.IOverwriteQuery;
-import org.eclipse.ui.dialogs.WorkingSetGroup;
-import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
-import org.eclipse.ui.internal.ide.StatusUtil;
-import org.eclipse.ui.internal.wizards.datatransfer.ArchiveFileManipulations;
-import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
-import org.eclipse.ui.internal.wizards.datatransfer.ILeveledImportStructureProvider;
-import org.eclipse.ui.internal.wizards.datatransfer.TarException;
-import org.eclipse.ui.internal.wizards.datatransfer.TarFile;
-import org.eclipse.ui.internal.wizards.datatransfer.TarLeveledStructureProvider;
-import org.eclipse.ui.internal.wizards.datatransfer.ZipLeveledStructureProvider;
-import org.eclipse.ui.statushandlers.StatusManager;
-import org.eclipse.ui.wizards.datatransfer.ImportOperation;
-import org.symbian.tools.wrttools.Activator;
-import org.symbian.tools.wrttools.util.ProjectUtils;
-
-@SuppressWarnings({"restriction", "unchecked"})
-public class AptanaProjectLocationWizardPage extends WizardPage implements
- IOverwriteQuery {
-
- /**
- * @since 3.5
- *
- */
- private final class ProjectLabelProvider extends LabelProvider implements
- IColorProvider {
-
- public Color getBackground(Object element) {
- return null;
- }
-
- public Color getForeground(Object element) {
- ProjectRecord projectRecord = (ProjectRecord) element;
- if (projectRecord.hasConflicts()) {
- return getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY);
- }
- return null;
- }
-
- public String getText(Object element) {
- return ((ProjectRecord) element).getProjectLabel();
- }
- }
-
- // constant from WizardArchiveFileResourceImportPage1
- private static final String[] FILE_IMPORT_MASK = {
- "*.jar;*.zip;*.tar;*.tar.gz;*.tgz", "*.*" }; //$NON-NLS-1$ //$NON-NLS-2$
-
- /**
- * The name of the folder containing metadata information for the workspace.
- */
- public static final String METADATA_FOLDER = ".metadata"; //$NON-NLS-1$
-
- // Keep track of the archive that we browsed to last time
- // the wizard was invoked.
- private static String previouslyBrowsedArchive = ""; //$NON-NLS-1$
-
- // Keep track of the directory that we browsed to last time
- // the wizard was invoked.
- private static String previouslyBrowsedDirectory = ""; //$NON-NLS-1$
-
- private final static String STORE_ARCHIVE_SELECTED = "WizardProjectsImportPage.STORE_ARCHIVE_SELECTED"; //$NON-NLS-1$
-
- private Text archivePathField;
-
- private Button browseArchivesButton;
-
- private Button browseDirectoriesButton;
-
- List createdProjects;
-
- private IStructuredSelection currentSelection;
-
- private Text directoryPathField;
-
- // The initial path to set
- private String initialPath;
-
- // The last time that the file or folder at the selected path was modified
- // to mimize searches
- private long lastModified;
-
- // The last selected path to minimize searches
- private String lastPath;
-
- private Button projectFromArchiveRadio;
-
- private Button projectFromDirectoryRadio;
-
- private CheckboxTreeViewer projectsList;
- private ProjectRecord[] selectedProjects = new ProjectRecord[0];
-
- /**
- * The import structure provider.
- *
- * @since 3.4
- */
- private ILeveledImportStructureProvider structureProvider;
-
- private WorkingSetGroup workingSetGroup;
-
- private IProject[] wsProjects;
-
- public AptanaProjectLocationWizardPage() {
- super("projectlocation", "Import Aptana WRT Projects", null);
- setDescription("Select location of the Aptana WRT projects");
- }
-
- private void addToWorkingSets() {
-
- IWorkingSet[] selectedWorkingSets = workingSetGroup
- .getSelectedWorkingSets();
- if (selectedWorkingSets == null || selectedWorkingSets.length == 0) {
- return; // no Working set is selected
- }
- IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
- .getWorkingSetManager();
- for (Iterator i = createdProjects.iterator(); i.hasNext();) {
- IProject project = (IProject) i.next();
- workingSetManager.addToWorkingSets(project, selectedWorkingSets);
- }
- }
-
- private void archiveRadioSelected() {
- if (projectFromArchiveRadio.getSelection()) {
- directoryPathField.setEnabled(false);
- browseDirectoriesButton.setEnabled(false);
- archivePathField.setEnabled(true);
- browseArchivesButton.setEnabled(true);
- updateProjectsList(archivePathField.getText());
- archivePathField.setFocus();
- }
- }
-
- public List<IProject> getCreatedProjects() {
- return createdProjects;
- }
-
- /**
- * Collect the list of .project files that are under directory into files.
- *
- * @param files
- * @param directory
- * @param directoriesVisited
- * Set of canonical paths of directories, used as recursion guard
- * @param monitor
- * The monitor to report to
- * @return boolean <code>true</code> if the operation was completed.
- */
- private boolean collectProjectFilesFromDirectory(Collection files,
- File directory, Set directoriesVisited, IProgressMonitor monitor) {
-
- if (monitor.isCanceled()) {
- return false;
- }
- monitor.subTask(NLS.bind(
- DataTransferMessages.WizardProjectsImportPage_CheckingMessage,
- directory.getPath()));
- File[] contents = directory.listFiles();
- if (contents == null) {
- return false;
- }
-
- // Initialize recursion guard for recursive symbolic links
- if (directoriesVisited == null) {
- directoriesVisited = new HashSet();
- try {
- directoriesVisited.add(directory.getCanonicalPath());
- } catch (IOException exception) {
- StatusManager.getManager().handle(
- StatusUtil.newStatus(IStatus.ERROR, exception
- .getLocalizedMessage(), exception));
- }
- }
-
-
- File dotProjectFile = ProjectUtils.isAptanaProject(contents);
-
- if (dotProjectFile != null) {
- files.add(dotProjectFile);
- // don't search sub-directories since we can't have nested
- // projects
- return true;
- }
- // no project description found, so recurse into sub-directories
- for (int i = 0; i < contents.length; i++) {
- if (contents[i].isDirectory()) {
- if (!contents[i].getName().equals(METADATA_FOLDER)) {
- try {
- String canonicalPath = contents[i].getCanonicalPath();
- if (!directoriesVisited.add(canonicalPath)) {
- // already been here --> do not recurse
- continue;
- }
- } catch (IOException exception) {
- StatusManager.getManager().handle(
- StatusUtil.newStatus(IStatus.ERROR, exception
- .getLocalizedMessage(), exception));
-
- }
- collectProjectFilesFromDirectory(files, contents[i],
- directoriesVisited, monitor);
- }
- }
- }
- return true;
- }
-
- /**
- * Collect the list of .project files that are under directory into files.
- *
- * @param files
- * @param monitor
- * The monitor to report to
- * @return boolean <code>true</code> if the operation was completed.
- */
- private boolean collectProjectFilesFromProvider(Collection files,
- Object entry, int level, IProgressMonitor monitor) {
-
- if (monitor.isCanceled()) {
- return false;
- }
- monitor.subTask(NLS.bind(
- DataTransferMessages.WizardProjectsImportPage_CheckingMessage,
- structureProvider.getLabel(entry)));
- List children = structureProvider.getChildren(entry);
- if (children == null) {
- children = new ArrayList(1);
- }
- Iterator childrenEnum = children.iterator();
- boolean hasPreviewFolder = false;
- boolean hasFrameHtml = false;
- ProjectRecord projectRecord = null;
- while (childrenEnum.hasNext()) {
- Object child = childrenEnum.next();
- String elementLabel = structureProvider.getLabel(child);
- if (structureProvider.isFolder(child)) {
- if (ProjectUtils.PREVIEW_FOLDER.equalsIgnoreCase(elementLabel)) {
- hasPreviewFolder = true;
- }
- collectProjectFilesFromProvider(files, child, level + 1,
- monitor);
- }
- if (elementLabel.equals(IProjectDescription.DESCRIPTION_FILE_NAME)) {
- projectRecord = new ArchivedProject(child, entry, level, structureProvider);
- }
- if (ProjectUtils.PREVIEW_FRAME_FILE.equalsIgnoreCase(elementLabel)) {
- hasFrameHtml = true;
- }
- }
- if (projectRecord != null && hasPreviewFolder && hasFrameHtml) {
- files.add(projectRecord);
- }
- return true;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
- * .Composite)
- */
- public void createControl(Composite parent) {
-
- initializeDialogUnits(parent);
-
- Composite workArea = new Composite(parent, SWT.NONE);
- setControl(workArea);
-
- workArea.setLayout(new GridLayout());
- workArea.setLayoutData(new GridData(GridData.FILL_BOTH
- | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
-
- createProjectsRoot(workArea);
- createProjectsList(workArea);
- createWorkingSetGroup(workArea);
- restoreWidgetValues();
- Dialog.applyDialogFont(workArea);
-
- updateProjectsList(directoryPathField.getText().trim());
- }
-
- /**
- * Create the project described in record. If it is successful return true.
- *
- * @param record
- * @return boolean <code>true</code> if successful
- * @throws InterruptedException
- */
- private boolean createExistingProject(final ProjectRecord record,
- IProgressMonitor monitor) throws InvocationTargetException,
- InterruptedException {
- monitor.beginTask(MessageFormat.format("Creating {0}", record
- .getProjectName()), IProgressMonitor.UNKNOWN);
-
- try {
- IProject project = ProjectUtils.createWrtProject(record
- .getProjectName(), null,
- new SubProgressMonitor(monitor, 10));
- createdProjects.add(project);
- ImportOperation operation = record.getImportOperation(project, structureProvider, this);
- if (operation != null) {
- operation.setContext(getShell());
- operation.run(monitor);
- }
- return true;
- } catch (CoreException e) {
- Activator.log(e);
- return false;
- } finally {
- monitor.done();
- }
- }
-
- /**
- * Create the selected projects
- *
- * @return boolean <code>true</code> if all project creations were
- * successful.
- */
- public boolean createProjects() {
- saveWidgetValues();
-
- final Object[] selected = projectsList.getCheckedElements();
- createdProjects = new ArrayList();
- WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
- protected void execute(IProgressMonitor monitor)
- throws InvocationTargetException, InterruptedException {
- try {
- monitor.beginTask("", selected.length);
- if (monitor.isCanceled()) {
- throw new OperationCanceledException();
- }
- for (int i = 0; i < selected.length; i++) {
- createExistingProject((ProjectRecord) selected[i],
- new SubProgressMonitor(monitor, 1));
- }
- } finally {
- monitor.done();
- }
- }
- };
- // run the new project creation operation
- try {
- getContainer().run(true, true, op);
- } catch (InterruptedException e) {
- return false;
- } catch (InvocationTargetException e) {
- // one of the steps resulted in a core exception
- Throwable t = e.getTargetException();
- String message = DataTransferMessages.WizardExternalProjectImportPage_errorMessage;
- IStatus status;
- if (t instanceof CoreException) {
- status = ((CoreException) t).getStatus();
- } else {
- status = new Status(IStatus.ERROR,
- Activator.PLUGIN_ID, 1, message, t);
- }
- ErrorDialog.openError(getShell(), message, null, status);
- return false;
- }
- ArchiveFileManipulations.closeStructureProvider(structureProvider,
- getShell());
-
- // Adds the projects to the working sets
- addToWorkingSets();
-
- return true;
- }
-
- /**
- * Create the checkbox list for the found projects.
- *
- * @param workArea
- */
- private void createProjectsList(Composite workArea) {
-
- Label title = new Label(workArea, SWT.NONE);
- title
- .setText(DataTransferMessages.WizardProjectsImportPage_ProjectsListTitle);
-
- Composite listComposite = new Composite(workArea, SWT.NONE);
- GridLayout layout = new GridLayout();
- layout.numColumns = 2;
- layout.marginWidth = 0;
- layout.makeColumnsEqualWidth = false;
- listComposite.setLayout(layout);
-
- listComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
- | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
-
- projectsList = new CheckboxTreeViewer(listComposite, SWT.BORDER);
- GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
- gridData.widthHint = new PixelConverter(projectsList.getControl())
- .convertWidthInCharsToPixels(25);
- gridData.heightHint = new PixelConverter(projectsList.getControl())
- .convertHeightInCharsToPixels(10);
- projectsList.getControl().setLayoutData(gridData);
- projectsList.setContentProvider(new ITreeContentProvider() {
-
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.jface.viewers.IContentProvider#dispose()
- */
- public void dispose() {
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java
- * .lang.Object)
- */
- public Object[] getChildren(Object parentElement) {
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jface.viewers.IStructuredContentProvider#getElements
- * (java.lang.Object)
- */
- public Object[] getElements(Object inputElement) {
- return getProjectRecords();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jface.viewers.ITreeContentProvider#getParent(java
- * .lang.Object)
- */
- public Object getParent(Object element) {
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java
- * .lang.Object)
- */
- public boolean hasChildren(Object element) {
- return false;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse
- * .jface.viewers.Viewer, java.lang.Object, java.lang.Object)
- */
- public void inputChanged(Viewer viewer, Object oldInput,
- Object newInput) {
- }
-
- });
-
- projectsList.setLabelProvider(new ProjectLabelProvider());
-
- projectsList.addCheckStateListener(new ICheckStateListener() {
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged
- * (org.eclipse.jface.viewers.CheckStateChangedEvent)
- */
- public void checkStateChanged(CheckStateChangedEvent event) {
- ProjectRecord element = (ProjectRecord) event.getElement();
- if (element.hasConflicts()) {
- projectsList.setChecked(element, false);
- }
- setPageComplete(projectsList.getCheckedElements().length > 0);
- }
- });
-
- projectsList.setInput(this);
- projectsList.setComparator(new ViewerComparator());
- createSelectionButtons(listComposite);
- }
-
- /**
- * Create the area where you select the root directory for the projects.
- *
- * @param workArea
- * Composite
- */
- private void createProjectsRoot(Composite workArea) {
-
- // project specification group
- Composite projectGroup = new Composite(workArea, SWT.NONE);
- GridLayout layout = new GridLayout();
- layout.numColumns = 3;
- layout.makeColumnsEqualWidth = false;
- layout.marginWidth = 0;
- projectGroup.setLayout(layout);
- projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
- // new project from directory radio button
- projectFromDirectoryRadio = new Button(projectGroup, SWT.RADIO);
- projectFromDirectoryRadio
- .setText(DataTransferMessages.WizardProjectsImportPage_RootSelectTitle);
-
- // project location entry field
- this.directoryPathField = new Text(projectGroup, SWT.BORDER);
-
- GridData directoryPathData = new GridData(SWT.FILL, SWT.NONE, true,
- false);
- directoryPathData.widthHint = new PixelConverter(directoryPathField)
- .convertWidthInCharsToPixels(25);
- directoryPathField.setLayoutData(directoryPathData);
-
- directoryPathField.setText(ProjectUtils.getDefaultAptanaLocation());
-
- // browse button
- browseDirectoriesButton = new Button(projectGroup, SWT.PUSH);
- browseDirectoriesButton
- .setText(DataTransferMessages.DataTransfer_browse);
- setButtonLayoutData(browseDirectoriesButton);
-
- // new project from archive radio button
- projectFromArchiveRadio = new Button(projectGroup, SWT.RADIO);
- projectFromArchiveRadio
- .setText(DataTransferMessages.WizardProjectsImportPage_ArchiveSelectTitle);
-
- // project location entry field
- archivePathField = new Text(projectGroup, SWT.BORDER);
-
- GridData archivePathData = new GridData(SWT.FILL, SWT.NONE, true, false);
- archivePathData.widthHint = new PixelConverter(archivePathField)
- .convertWidthInCharsToPixels(25);
- archivePathField.setLayoutData(archivePathData); // browse button
- browseArchivesButton = new Button(projectGroup, SWT.PUSH);
- browseArchivesButton.setText(DataTransferMessages.DataTransfer_browse);
- setButtonLayoutData(browseArchivesButton);
-
- projectFromDirectoryRadio.setSelection(true);
- archivePathField.setEnabled(false);
- browseArchivesButton.setEnabled(false);
-
- browseDirectoriesButton.addSelectionListener(new SelectionAdapter() {
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.swt.events.SelectionAdapter#widgetS
- * elected(org.eclipse.swt.events.SelectionEvent)
- */
- public void widgetSelected(SelectionEvent e) {
- handleLocationDirectoryButtonPressed();
- }
-
- });
-
- browseArchivesButton.addSelectionListener(new SelectionAdapter() {
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
- * .swt.events.SelectionEvent)
- */
- public void widgetSelected(SelectionEvent e) {
- handleLocationArchiveButtonPressed();
- }
-
- });
-
- directoryPathField.addTraverseListener(new TraverseListener() {
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.TraverseListener#keyTraversed(org.eclipse
- * .swt.events.TraverseEvent)
- */
- public void keyTraversed(TraverseEvent e) {
- if (e.detail == SWT.TRAVERSE_RETURN) {
- e.doit = false;
- updateProjectsList(directoryPathField.getText().trim());
- }
- }
-
- });
-
- directoryPathField.addFocusListener(new FocusAdapter() {
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt
- * .events.FocusEvent)
- */
- public void focusLost(org.eclipse.swt.events.FocusEvent e) {
- updateProjectsList(directoryPathField.getText().trim());
- }
-
- });
-
- archivePathField.addTraverseListener(new TraverseListener() {
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.TraverseListener#keyTraversed(org.eclipse
- * .swt.events.TraverseEvent)
- */
- public void keyTraversed(TraverseEvent e) {
- if (e.detail == SWT.TRAVERSE_RETURN) {
- e.doit = false;
- updateProjectsList(archivePathField.getText().trim());
- }
- }
-
- });
-
- archivePathField.addFocusListener(new FocusAdapter() {
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt
- * .events.FocusEvent)
- */
- public void focusLost(org.eclipse.swt.events.FocusEvent e) {
- updateProjectsList(archivePathField.getText().trim());
- }
- });
-
- projectFromDirectoryRadio.addSelectionListener(new SelectionAdapter() {
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse
- * .swt.events.SelectionEvent)
- */
- public void widgetSelected(SelectionEvent e) {
- directoryRadioSelected();
- }
- });
-
- projectFromArchiveRadio.addSelectionListener(new SelectionAdapter() {
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse
- * .swt.events.SelectionEvent)
- */
- public void widgetSelected(SelectionEvent e) {
- archiveRadioSelected();
- }
- });
- }
-
- /**
- * Create the selection buttons in the listComposite.
- *
- * @param listComposite
- */
- private void createSelectionButtons(Composite listComposite) {
- Composite buttonsComposite = new Composite(listComposite, SWT.NONE);
- GridLayout layout = new GridLayout();
- layout.marginWidth = 0;
- layout.marginHeight = 0;
- buttonsComposite.setLayout(layout);
-
- buttonsComposite.setLayoutData(new GridData(
- GridData.VERTICAL_ALIGN_BEGINNING));
-
- Button selectAll = new Button(buttonsComposite, SWT.PUSH);
- selectAll.setText(DataTransferMessages.DataTransfer_selectAll);
- selectAll.addSelectionListener(new SelectionAdapter() {
- public void widgetSelected(SelectionEvent e) {
- for (int i = 0; i < selectedProjects.length; i++) {
- if (selectedProjects[i].hasConflicts()) {
- projectsList.setChecked(selectedProjects[i], false);
- } else {
- projectsList.setChecked(selectedProjects[i], true);
- }
- }
- setPageComplete(projectsList.getCheckedElements().length > 0);
- }
- });
- Dialog.applyDialogFont(selectAll);
- setButtonLayoutData(selectAll);
-
- Button deselectAll = new Button(buttonsComposite, SWT.PUSH);
- deselectAll.setText(DataTransferMessages.DataTransfer_deselectAll);
- deselectAll.addSelectionListener(new SelectionAdapter() {
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
- * .swt.events.SelectionEvent)
- */
- public void widgetSelected(SelectionEvent e) {
-
- projectsList.setCheckedElements(new Object[0]);
- setPageComplete(false);
- }
- });
- Dialog.applyDialogFont(deselectAll);
- setButtonLayoutData(deselectAll);
-
- Button refresh = new Button(buttonsComposite, SWT.PUSH);
- refresh.setText(DataTransferMessages.DataTransfer_refresh);
- refresh.addSelectionListener(new SelectionAdapter() {
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
- * .swt.events.SelectionEvent)
- */
- public void widgetSelected(SelectionEvent e) {
- if (projectFromDirectoryRadio.getSelection()) {
- updateProjectsList(directoryPathField.getText().trim());
- } else {
- updateProjectsList(archivePathField.getText().trim());
- }
- }
- });
- Dialog.applyDialogFont(refresh);
- setButtonLayoutData(refresh);
- }
-
- /**
- * @param workArea
- */
- private void createWorkingSetGroup(Composite workArea) {
- String[] workingSetIds = new String[] {
- "org.eclipse.ui.resourceWorkingSetPage", //$NON-NLS-1$
- "org.eclipse.jdt.ui.JavaWorkingSetPage" }; //$NON-NLS-1$
- workingSetGroup = new WorkingSetGroup(workArea, currentSelection,
- workingSetIds);
- }
-
- private void directoryRadioSelected() {
- if (projectFromDirectoryRadio.getSelection()) {
- directoryPathField.setEnabled(true);
- browseDirectoriesButton.setEnabled(true);
- archivePathField.setEnabled(false);
- browseArchivesButton.setEnabled(false);
- updateProjectsList(directoryPathField.getText());
- directoryPathField.setFocus();
- }
- }
-
- /**
- * Display an error dialog with the specified message.
- *
- * @param message
- * the error message
- */
- protected void displayErrorDialog(String message) {
- MessageDialog.open(MessageDialog.ERROR, getContainer().getShell(),
- getErrorDialogTitle(), message, SWT.SHEET);
- }
-
- /**
- * Get the title for an error dialog. Subclasses should override.
- */
- protected String getErrorDialogTitle() {
- return IDEWorkbenchMessages.WizardExportPage_internalErrorTitle;
- }
-
- /**
- * Method used for test suite.
- *
- * @return Button the Import from Directory RadioButton
- */
- public Button getProjectFromDirectoryRadio() {
- return projectFromDirectoryRadio;
- }
-
- /**
- * Get the array of project records that can be imported from the source
- * workspace or archive, selected by the user. If a project with the same
- * name exists in both the source workspace and the current workspace, then
- * the hasConflicts flag would be set on that project record.
- *
- * Method declared public for test suite.
- *
- * @return ProjectRecord[] array of projects that can be imported into the
- * workspace
- */
- public ProjectRecord[] getProjectRecords() {
- List projectRecords = new ArrayList();
- for (int i = 0; i < selectedProjects.length; i++) {
- if (isProjectInWorkspace(selectedProjects[i].getProjectName())) {
- selectedProjects[i].setHasConflicts(true);
- }
- projectRecords.add(selectedProjects[i]);
- }
- return (ProjectRecord[]) projectRecords
- .toArray(new ProjectRecord[projectRecords.size()]);
- }
-
- /**
- * Retrieve all the projects in the current workspace.
- *
- * @return IProject[] array of IProject in the current workspace
- */
- private IProject[] getProjectsInWorkspace() {
- if (wsProjects == null) {
- wsProjects = ResourcesPlugin.getWorkspace().getRoot()
- .getProjects();
- }
- return wsProjects;
- }
-
- /**
- * Method used for test suite.
- *
- * @return CheckboxTreeViewer the viewer containing all the projects found
- */
- public CheckboxTreeViewer getProjectsList() {
- return projectsList;
- }
-
- /**
- * Answer a handle to the zip file currently specified as being the source.
- * Return null if this file does not exist or is not of valid format.
- */
- private TarFile getSpecifiedTarSourceFile(String fileName) {
- if (fileName.length() == 0) {
- return null;
- }
-
- try {
- return new TarFile(fileName);
- } catch (TarException e) {
- displayErrorDialog(DataTransferMessages.TarImport_badFormat);
- } catch (IOException e) {
- displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
- }
-
- archivePathField.setFocus();
- return null;
- }
-
- /**
- * Answer a handle to the zip file currently specified as being the source.
- * Return null if this file does not exist or is not of valid format.
- */
- private ZipFile getSpecifiedZipSourceFile(String fileName) {
- if (fileName.length() == 0) {
- return null;
- }
-
- try {
- return new ZipFile(fileName);
- } catch (ZipException e) {
- displayErrorDialog(DataTransferMessages.ZipImport_badFormat);
- } catch (IOException e) {
- displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
- }
-
- archivePathField.setFocus();
- return null;
- }
-
- /**
- * The browse button has been selected. Select the location.
- */
- protected void handleLocationArchiveButtonPressed() {
-
- FileDialog dialog = new FileDialog(archivePathField.getShell(),
- SWT.SHEET);
- dialog.setFilterExtensions(FILE_IMPORT_MASK);
- dialog
- .setText(DataTransferMessages.WizardProjectsImportPage_SelectArchiveDialogTitle);
-
- String fileName = archivePathField.getText().trim();
- if (fileName.length() == 0) {
- fileName = previouslyBrowsedArchive;
- }
-
- if (fileName.length() == 0) {
- dialog.setFilterPath(ResourcesPlugin.getWorkspace()
- .getRoot().getLocation().toOSString());
- } else {
- File path = new File(fileName).getParentFile();
- if (path != null && path.exists()) {
- dialog.setFilterPath(path.toString());
- }
- }
-
- String selectedArchive = dialog.open();
- if (selectedArchive != null) {
- previouslyBrowsedArchive = selectedArchive;
- archivePathField.setText(previouslyBrowsedArchive);
- updateProjectsList(selectedArchive);
- }
-
- }
-
- /**
- * The browse button has been selected. Select the location.
- */
- protected void handleLocationDirectoryButtonPressed() {
-
- DirectoryDialog dialog = new DirectoryDialog(directoryPathField
- .getShell(), SWT.SHEET);
- dialog
- .setMessage(DataTransferMessages.WizardProjectsImportPage_SelectDialogTitle);
-
- String dirName = directoryPathField.getText().trim();
- if (dirName.length() == 0) {
- dirName = previouslyBrowsedDirectory;
- }
-
- if (dirName.length() == 0) {
- dialog.setFilterPath(ResourcesPlugin.getWorkspace()
- .getRoot().getLocation().toOSString());
- } else {
- File path = new File(dirName);
- if (path.exists()) {
- dialog.setFilterPath(new Path(dirName).toOSString());
- }
- }
-
- String selectedDirectory = dialog.open();
- if (selectedDirectory != null) {
- previouslyBrowsedDirectory = selectedDirectory;
- directoryPathField.setText(previouslyBrowsedDirectory);
- updateProjectsList(selectedDirectory);
- }
-
- }
-
- /**
- * Determine if the project with the given name is in the current workspace.
- *
- * @param projectName
- * String the project name to check
- * @return boolean true if the project with the given name is in this
- * workspace
- */
- private boolean isProjectInWorkspace(String projectName) {
- if (projectName == null) {
- return false;
- }
- IProject[] workspaceProjects = getProjectsInWorkspace();
- for (int i = 0; i < workspaceProjects.length; i++) {
- if (projectName.equals(workspaceProjects[i].getName())) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Performs clean-up if the user cancels the wizard without doing anything
- */
- public void performCancel() {
- ArchiveFileManipulations.closeStructureProvider(structureProvider,
- getShell());
- }
-
- /**
- * The <code>WizardDataTransfer</code> implementation of this
- * <code>IOverwriteQuery</code> method asks the user whether the existing
- * resource at the given path should be overwritten.
- *
- * @param pathString
- * @return the user's reply: one of <code>"YES"</code>, <code>"NO"</code>,
- * <code>"ALL"</code>, or <code>"CANCEL"</code>
- */
- public String queryOverwrite(String pathString) {
-
- Path path = new Path(pathString);
-
- String messageString;
- // Break the message up if there is a file name and a directory
- // and there are at least 2 segments.
- if (path.getFileExtension() == null || path.segmentCount() < 2) {
- messageString = NLS.bind(
- IDEWorkbenchMessages.WizardDataTransfer_existsQuestion,
- pathString);
- } else {
- messageString = NLS
- .bind(
- IDEWorkbenchMessages.WizardDataTransfer_overwriteNameAndPathQuestion,
- path.lastSegment(), path.removeLastSegments(1)
- .toOSString());
- }
-
- final MessageDialog dialog = new MessageDialog(getContainer()
- .getShell(), IDEWorkbenchMessages.Question, null,
- messageString, MessageDialog.QUESTION, new String[] {
- IDialogConstants.YES_LABEL,
- IDialogConstants.YES_TO_ALL_LABEL,
- IDialogConstants.NO_LABEL,
- IDialogConstants.NO_TO_ALL_LABEL,
- IDialogConstants.CANCEL_LABEL }, 0) {
- protected int getShellStyle() {
- return super.getShellStyle() | SWT.SHEET;
- }
- };
- String[] response = new String[] { YES, ALL, NO, NO_ALL, CANCEL };
- // run in syncExec because callback is from an operation,
- // which is probably not running in the UI thread.
- getControl().getDisplay().syncExec(new Runnable() {
- public void run() {
- dialog.open();
- }
- });
- return dialog.getReturnCode() < 0 ? CANCEL : response[dialog
- .getReturnCode()];
- }
-
- /**
- * Use the dialog store to restore widget values to the values that they
- * held last time this wizard was used to completion, or alternatively, if
- * an initial path is specified, use it to select values.
- *
- * Method declared public only for use of tests.
- */
- public void restoreWidgetValues() {
-
- // First, check to see if we have resore settings, and
- // take care of the checkbox
- IDialogSettings settings = getDialogSettings();
-
- // Second, check to see if we don't have an initial path,
- // and if we do have restore settings. If so, set the
- // radio selection properly to restore settings
-
- if (initialPath == null && settings != null) {
- // radio selection
- boolean archiveSelected = settings
- .getBoolean(STORE_ARCHIVE_SELECTED);
- projectFromDirectoryRadio.setSelection(!archiveSelected);
- projectFromArchiveRadio.setSelection(archiveSelected);
- if (archiveSelected) {
- archiveRadioSelected();
- } else {
- directoryRadioSelected();
- }
- }
- // Third, if we do have an initial path, set the proper
- // path and radio buttons to the initial value. Move
- // cursor to the end of the path so user can see the
- // most relevant part (directory / archive name)
- else if (initialPath != null) {
- boolean dir = new File(initialPath).isDirectory();
-
- projectFromDirectoryRadio.setSelection(dir);
- projectFromArchiveRadio.setSelection(!dir);
-
- if (dir) {
- directoryPathField.setText(initialPath);
- directoryPathField.setSelection(initialPath.length());
- directoryRadioSelected();
- } else {
- archivePathField.setText(initialPath);
- archivePathField.setSelection(initialPath.length());
- archiveRadioSelected();
- }
- }
- }
-
- /**
- * Since Finish was pressed, write widget values to the dialog store so that
- * they will persist into the next invocation of this wizard page.
- *
- * Method declared public only for use of tests.
- */
- public void saveWidgetValues() {
- IDialogSettings settings = getDialogSettings();
- if (settings != null) {
- settings.put(STORE_ARCHIVE_SELECTED, projectFromArchiveRadio
- .getSelection());
- }
- }
-
- /*
- * (non-Javadoc) Method declared on IDialogPage. Set the focus on path
- * fields when page becomes visible.
- */
- public void setVisible(boolean visible) {
- super.setVisible(visible);
- if (visible && this.projectFromDirectoryRadio.getSelection()) {
- this.directoryPathField.setFocus();
- }
- if (visible && this.projectFromArchiveRadio.getSelection()) {
- this.archivePathField.setFocus();
- }
- }
-
- /**
- * Update the list of projects based on path. Method declared public only
- * for test suite.
- *
- * @param path
- */
- public void updateProjectsList(final String path) {
- // on an empty path empty selectedProjects
- if (path == null || path.length() == 0) {
- setMessage(DataTransferMessages.WizardProjectsImportPage_ImportProjectsDescription);
- selectedProjects = new ProjectRecord[0];
- projectsList.refresh(true);
- projectsList.setCheckedElements(selectedProjects);
- setPageComplete(projectsList.getCheckedElements().length > 0);
- lastPath = path;
- return;
- }
-
- final File directory = new File(path);
- long modified = directory.lastModified();
- if (path.equals(lastPath) && lastModified == modified) {
- // since the file/folder was not modified and the path did not
- // change, no refreshing is required
- return;
- }
-
- lastPath = path;
- lastModified = modified;
-
- // We can't access the radio button from the inner class so get the
- // status beforehand
- final boolean dirSelected = this.projectFromDirectoryRadio
- .getSelection();
- try {
- getContainer().run(true, true, new IRunnableWithProgress() {
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.jface.operation.IRunnableWithProgress#run(org
- * .eclipse.core.runtime.IProgressMonitor)
- */
- public void run(IProgressMonitor monitor) {
-
- monitor
- .beginTask(
- DataTransferMessages.WizardProjectsImportPage_SearchingMessage,
- 100);
- selectedProjects = new ProjectRecord[0];
- Collection files = new ArrayList();
- monitor.worked(10);
- if (!dirSelected
- && ArchiveFileManipulations.isTarFile(path)) {
- TarFile sourceTarFile = getSpecifiedTarSourceFile(path);
- if (sourceTarFile == null) {
- return;
- }
-
- structureProvider = new TarLeveledStructureProvider(
- sourceTarFile);
- Object child = structureProvider.getRoot();
-
- if (!collectProjectFilesFromProvider(files, child, 0,
- monitor)) {
- return;
- }
- Iterator filesIterator = files.iterator();
- selectedProjects = new ProjectRecord[files.size()];
- int index = 0;
- monitor.worked(50);
- monitor
- .subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
- while (filesIterator.hasNext()) {
- selectedProjects[index++] = (ProjectRecord) filesIterator
- .next();
- }
- } else if (!dirSelected
- && ArchiveFileManipulations.isZipFile(path)) {
- ZipFile sourceFile = getSpecifiedZipSourceFile(path);
- if (sourceFile == null) {
- return;
- }
- structureProvider = new ZipLeveledStructureProvider(
- sourceFile);
- Object child = structureProvider.getRoot();
-
- if (!collectProjectFilesFromProvider(files, child, 0,
- monitor)) {
- return;
- }
- Iterator filesIterator = files.iterator();
- selectedProjects = new ProjectRecord[files.size()];
- int index = 0;
- monitor.worked(50);
- monitor
- .subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
- while (filesIterator.hasNext()) {
- selectedProjects[index++] = (ProjectRecord) filesIterator
- .next();
- }
- }
-
- else if (dirSelected && directory.isDirectory()) {
-
- if (!collectProjectFilesFromDirectory(files, directory,
- null, monitor)) {
- return;
- }
- Iterator filesIterator = files.iterator();
- selectedProjects = new ProjectRecord[files.size()];
- int index = 0;
- monitor.worked(50);
- monitor
- .subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
- while (filesIterator.hasNext()) {
- File file = (File) filesIterator.next();
- selectedProjects[index] = new FileSystemProject(file);
- index++;
- }
- } else {
- monitor.worked(60);
- }
- monitor.done();
- }
-
- });
- } catch (InvocationTargetException e) {
- Activator.log(e.getMessage(), e);
- } catch (InterruptedException e) {
- // Nothing to do if the user interrupts.
- }
-
- projectsList.refresh(true);
- ProjectRecord[] projects = getProjectRecords();
- boolean displayWarning = false;
- for (int i = 0; i < projects.length; i++) {
- if (projects[i].hasConflicts()) {
- displayWarning = true;
- projectsList.setGrayed(projects[i], true);
- } else {
- projectsList.setChecked(projects[i], true);
- }
- }
-
- if (displayWarning) {
- setMessage(
- DataTransferMessages.WizardProjectsImportPage_projectsInWorkspace,
- WARNING);
- } else {
- setMessage(DataTransferMessages.WizardProjectsImportPage_ImportProjectsDescription);
- }
- setPageComplete(projectsList.getCheckedElements().length > 0);
- if (selectedProjects.length == 0) {
- setMessage(
- DataTransferMessages.WizardProjectsImportPage_noProjectsToImport,
- WARNING);
- }
- }
-}
--- a/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/projectimport/AptanaProjectsImportWizard.java Thu Feb 25 14:30:54 2010 -0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/**
- * Copyright (c) 2009 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.wizards.projectimport;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-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.wizards.newresource.BasicNewProjectResourceWizard;
-import org.symbian.tools.wrttools.util.ProjectUtils;
-
-public class AptanaProjectsImportWizard extends Wizard implements
- IImportWizard, INewWizard, IExecutableExtension {
-
- private AptanaProjectLocationWizardPage mainPage;
- private IConfigurationElement config;
-
- public AptanaProjectsImportWizard() {
- setWindowTitle("Import Aptana Project");
- setNeedsProgressMonitor(true);
- }
-
- @Override
- public boolean performCancel() {
- mainPage.performCancel();
- return true;
- }
-
- @Override
- public boolean performFinish() {
- if (mainPage.createProjects()) {
- BasicNewProjectResourceWizard.updatePerspective(config);
- List<IProject> projects = mainPage.getCreatedProjects();
- ProjectUtils.focusOn(projects.toArray(new IProject[projects.size()]));
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public void addPages() {
- mainPage = new AptanaProjectLocationWizardPage();
- addPage(mainPage);
- }
-
- public void init(IWorkbench workbench, IStructuredSelection selection) {
- // Do nothing
- }
-
- 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/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/projectimport/WrtProjectLocationWizardPage.java Thu Feb 25 14:58:22 2010 -0800
@@ -0,0 +1,1346 @@
+/**
+ * Copyright (c) 2009 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.wizards.projectimport;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.IColorProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+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.DirectoryDialog;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkingSet;
+import org.eclipse.ui.IWorkingSetManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.dialogs.IOverwriteQuery;
+import org.eclipse.ui.dialogs.WorkingSetGroup;
+import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
+import org.eclipse.ui.internal.ide.StatusUtil;
+import org.eclipse.ui.internal.wizards.datatransfer.ArchiveFileManipulations;
+import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
+import org.eclipse.ui.internal.wizards.datatransfer.ILeveledImportStructureProvider;
+import org.eclipse.ui.internal.wizards.datatransfer.TarException;
+import org.eclipse.ui.internal.wizards.datatransfer.TarFile;
+import org.eclipse.ui.internal.wizards.datatransfer.TarLeveledStructureProvider;
+import org.eclipse.ui.internal.wizards.datatransfer.ZipLeveledStructureProvider;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.eclipse.ui.wizards.datatransfer.ImportOperation;
+import org.symbian.tools.wrttools.Activator;
+import org.symbian.tools.wrttools.util.ProjectUtils;
+
+@SuppressWarnings({"restriction", "unchecked"})
+public class WrtProjectLocationWizardPage extends WizardPage implements
+ IOverwriteQuery {
+
+ /**
+ * @since 3.5
+ *
+ */
+ private final class ProjectLabelProvider extends LabelProvider implements
+ IColorProvider {
+
+ public Color getBackground(Object element) {
+ return null;
+ }
+
+ public Color getForeground(Object element) {
+ ProjectRecord projectRecord = (ProjectRecord) element;
+ if (projectRecord.hasConflicts()) {
+ return getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY);
+ }
+ return null;
+ }
+
+ public String getText(Object element) {
+ return ((ProjectRecord) element).getProjectLabel();
+ }
+ }
+
+ // constant from WizardArchiveFileResourceImportPage1
+ private static final String[] FILE_IMPORT_MASK = {
+ "*.jar;*.zip;*.tar;*.tar.gz;*.tgz", "*.*" }; //$NON-NLS-1$ //$NON-NLS-2$
+
+ /**
+ * The name of the folder containing metadata information for the workspace.
+ */
+ public static final String METADATA_FOLDER = ".metadata"; //$NON-NLS-1$
+
+ // Keep track of the archive that we browsed to last time
+ // the wizard was invoked.
+ private static String previouslyBrowsedArchive = ""; //$NON-NLS-1$
+
+ // Keep track of the directory that we browsed to last time
+ // the wizard was invoked.
+ private static String previouslyBrowsedDirectory = ""; //$NON-NLS-1$
+
+ private final static String STORE_ARCHIVE_SELECTED = "WizardProjectsImportPage.STORE_ARCHIVE_SELECTED"; //$NON-NLS-1$
+
+ private Text archivePathField;
+
+ private Button browseArchivesButton;
+
+ private Button browseDirectoriesButton;
+
+ List createdProjects;
+
+ private IStructuredSelection currentSelection;
+
+ private Text directoryPathField;
+
+ // The initial path to set
+ private String initialPath;
+
+ // The last time that the file or folder at the selected path was modified
+ // to mimize searches
+ private long lastModified;
+
+ // The last selected path to minimize searches
+ private String lastPath;
+
+ private Button projectFromArchiveRadio;
+
+ private Button projectFromDirectoryRadio;
+
+ private CheckboxTreeViewer projectsList;
+ private ProjectRecord[] selectedProjects = new ProjectRecord[0];
+
+ /**
+ * The import structure provider.
+ *
+ * @since 3.4
+ */
+ private ILeveledImportStructureProvider structureProvider;
+
+ private WorkingSetGroup workingSetGroup;
+
+ private IProject[] wsProjects;
+
+ public WrtProjectLocationWizardPage() {
+ super("projectlocation", "Import WRT Projects", null);
+ setDescription("Import existing WRT project created in any IDEs");
+ }
+
+ private void addToWorkingSets() {
+
+ IWorkingSet[] selectedWorkingSets = workingSetGroup
+ .getSelectedWorkingSets();
+ if (selectedWorkingSets == null || selectedWorkingSets.length == 0) {
+ return; // no Working set is selected
+ }
+ IWorkingSetManager workingSetManager = PlatformUI.getWorkbench()
+ .getWorkingSetManager();
+ for (Iterator i = createdProjects.iterator(); i.hasNext();) {
+ IProject project = (IProject) i.next();
+ workingSetManager.addToWorkingSets(project, selectedWorkingSets);
+ }
+ }
+
+ private void archiveRadioSelected() {
+ if (projectFromArchiveRadio.getSelection()) {
+ directoryPathField.setEnabled(false);
+ browseDirectoriesButton.setEnabled(false);
+ archivePathField.setEnabled(true);
+ browseArchivesButton.setEnabled(true);
+ updateProjectsList(archivePathField.getText());
+ archivePathField.setFocus();
+ }
+ }
+
+ public List<IProject> getCreatedProjects() {
+ return createdProjects;
+ }
+
+ /**
+ * Collect the list of .project files that are under directory into files.
+ *
+ * @param files
+ * @param directory
+ * @param directoriesVisited
+ * Set of canonical paths of directories, used as recursion guard
+ * @param monitor
+ * The monitor to report to
+ * @return boolean <code>true</code> if the operation was completed.
+ */
+ private boolean collectProjectFilesFromDirectory(Collection files,
+ File directory, Set directoriesVisited, IProgressMonitor monitor) {
+
+ if (monitor.isCanceled()) {
+ return false;
+ }
+ monitor.subTask(NLS.bind(
+ DataTransferMessages.WizardProjectsImportPage_CheckingMessage,
+ directory.getPath()));
+ File[] contents = directory.listFiles();
+ if (contents == null) {
+ return false;
+ }
+
+ // Initialize recursion guard for recursive symbolic links
+ if (directoriesVisited == null) {
+ directoriesVisited = new HashSet();
+ try {
+ directoriesVisited.add(directory.getCanonicalPath());
+ } catch (IOException exception) {
+ StatusManager.getManager().handle(
+ StatusUtil.newStatus(IStatus.ERROR, exception
+ .getLocalizedMessage(), exception));
+ }
+ }
+
+
+ File dotProjectFile = ProjectUtils.isWrtProject(contents);
+
+ if (dotProjectFile != null) {
+ files.add(dotProjectFile);
+ // don't search sub-directories since we can't have nested
+ // projects
+ return true;
+ }
+ // no project description found, so recurse into sub-directories
+ for (int i = 0; i < contents.length; i++) {
+ if (contents[i].isDirectory()) {
+ if (!contents[i].getName().equals(METADATA_FOLDER)) {
+ try {
+ String canonicalPath = contents[i].getCanonicalPath();
+ if (!directoriesVisited.add(canonicalPath)) {
+ // already been here --> do not recurse
+ continue;
+ }
+ } catch (IOException exception) {
+ StatusManager.getManager().handle(
+ StatusUtil.newStatus(IStatus.ERROR, exception
+ .getLocalizedMessage(), exception));
+
+ }
+ collectProjectFilesFromDirectory(files, contents[i],
+ directoriesVisited, monitor);
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Collect the list of .project files that are under directory into files.
+ *
+ * @param files
+ * @param monitor
+ * The monitor to report to
+ * @return boolean <code>true</code> if the operation was completed.
+ */
+ private boolean collectProjectFilesFromProvider(Collection files,
+ Object entry, int level, IProgressMonitor monitor) {
+
+ if (monitor.isCanceled()) {
+ return false;
+ }
+ monitor.subTask(NLS.bind(
+ DataTransferMessages.WizardProjectsImportPage_CheckingMessage,
+ structureProvider.getLabel(entry)));
+ List children = structureProvider.getChildren(entry);
+ if (children == null) {
+ children = new ArrayList(1);
+ }
+ Iterator childrenEnum = children.iterator();
+ boolean hasPreviewFolder = false;
+ boolean hasFrameHtml = false;
+ ProjectRecord projectRecord = null;
+ while (childrenEnum.hasNext()) {
+ Object child = childrenEnum.next();
+ String elementLabel = structureProvider.getLabel(child);
+ if (structureProvider.isFolder(child)) {
+ if (ProjectUtils.PREVIEW_FOLDER.equalsIgnoreCase(elementLabel)) {
+ hasPreviewFolder = true;
+ }
+ collectProjectFilesFromProvider(files, child, level + 1,
+ monitor);
+ }
+ if (elementLabel.equals(IProjectDescription.DESCRIPTION_FILE_NAME)) {
+ projectRecord = new ArchivedProject(child, entry, level, structureProvider);
+ }
+ if (ProjectUtils.PREVIEW_FRAME_FILE.equalsIgnoreCase(elementLabel)) {
+ hasFrameHtml = true;
+ }
+ }
+ if (projectRecord != null && hasPreviewFolder && hasFrameHtml) {
+ files.add(projectRecord);
+ }
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
+ * .Composite)
+ */
+ public void createControl(Composite parent) {
+
+ initializeDialogUnits(parent);
+
+ Composite workArea = new Composite(parent, SWT.NONE);
+ setControl(workArea);
+
+ workArea.setLayout(new GridLayout());
+ workArea.setLayoutData(new GridData(GridData.FILL_BOTH
+ | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+ createProjectsRoot(workArea);
+ createProjectsList(workArea);
+ createWorkingSetGroup(workArea);
+ restoreWidgetValues();
+ Dialog.applyDialogFont(workArea);
+
+ updateProjectsList(directoryPathField.getText().trim());
+ }
+
+ /**
+ * Create the project described in record. If it is successful return true.
+ *
+ * @param record
+ * @return boolean <code>true</code> if successful
+ * @throws InterruptedException
+ */
+ private boolean createExistingProject(final ProjectRecord record,
+ IProgressMonitor monitor) throws InvocationTargetException,
+ InterruptedException {
+ monitor.beginTask(MessageFormat.format("Creating {0}", record
+ .getProjectName()), IProgressMonitor.UNKNOWN);
+
+ try {
+ IProject project = ProjectUtils.createWrtProject(record
+ .getProjectName(), null,
+ new SubProgressMonitor(monitor, 10));
+ createdProjects.add(project);
+ ImportOperation operation = record.getImportOperation(project, structureProvider, this);
+ if (operation != null) {
+ operation.setContext(getShell());
+ operation.run(monitor);
+ }
+ return true;
+ } catch (CoreException e) {
+ Activator.log(e);
+ return false;
+ } finally {
+ monitor.done();
+ }
+ }
+
+ /**
+ * Create the selected projects
+ *
+ * @return boolean <code>true</code> if all project creations were
+ * successful.
+ */
+ public boolean createProjects() {
+ saveWidgetValues();
+
+ final Object[] selected = projectsList.getCheckedElements();
+ createdProjects = new ArrayList();
+ WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+ protected void execute(IProgressMonitor monitor)
+ throws InvocationTargetException, InterruptedException {
+ try {
+ monitor.beginTask("", selected.length);
+ if (monitor.isCanceled()) {
+ throw new OperationCanceledException();
+ }
+ for (int i = 0; i < selected.length; i++) {
+ createExistingProject((ProjectRecord) selected[i],
+ new SubProgressMonitor(monitor, 1));
+ }
+ } finally {
+ monitor.done();
+ }
+ }
+ };
+ // run the new project creation operation
+ try {
+ getContainer().run(true, true, op);
+ } catch (InterruptedException e) {
+ return false;
+ } catch (InvocationTargetException e) {
+ // one of the steps resulted in a core exception
+ Throwable t = e.getTargetException();
+ String message = DataTransferMessages.WizardExternalProjectImportPage_errorMessage;
+ IStatus status;
+ if (t instanceof CoreException) {
+ status = ((CoreException) t).getStatus();
+ } else {
+ status = new Status(IStatus.ERROR,
+ Activator.PLUGIN_ID, 1, message, t);
+ }
+ ErrorDialog.openError(getShell(), message, null, status);
+ return false;
+ }
+ ArchiveFileManipulations.closeStructureProvider(structureProvider,
+ getShell());
+
+ // Adds the projects to the working sets
+ addToWorkingSets();
+
+ return true;
+ }
+
+ /**
+ * Create the checkbox list for the found projects.
+ *
+ * @param workArea
+ */
+ private void createProjectsList(Composite workArea) {
+
+ Label title = new Label(workArea, SWT.NONE);
+ title
+ .setText(DataTransferMessages.WizardProjectsImportPage_ProjectsListTitle);
+
+ Composite listComposite = new Composite(workArea, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+ layout.marginWidth = 0;
+ layout.makeColumnsEqualWidth = false;
+ listComposite.setLayout(layout);
+
+ listComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+ | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
+
+ projectsList = new CheckboxTreeViewer(listComposite, SWT.BORDER);
+ GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ gridData.widthHint = new PixelConverter(projectsList.getControl())
+ .convertWidthInCharsToPixels(25);
+ gridData.heightHint = new PixelConverter(projectsList.getControl())
+ .convertHeightInCharsToPixels(10);
+ projectsList.getControl().setLayoutData(gridData);
+ projectsList.setContentProvider(new ITreeContentProvider() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.viewers.IContentProvider#dispose()
+ */
+ public void dispose() {
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java
+ * .lang.Object)
+ */
+ public Object[] getChildren(Object parentElement) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.viewers.IStructuredContentProvider#getElements
+ * (java.lang.Object)
+ */
+ public Object[] getElements(Object inputElement) {
+ return getProjectRecords();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.viewers.ITreeContentProvider#getParent(java
+ * .lang.Object)
+ */
+ public Object getParent(Object element) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java
+ * .lang.Object)
+ */
+ public boolean hasChildren(Object element) {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse
+ * .jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput,
+ Object newInput) {
+ }
+
+ });
+
+ projectsList.setLabelProvider(new ProjectLabelProvider());
+
+ projectsList.addCheckStateListener(new ICheckStateListener() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged
+ * (org.eclipse.jface.viewers.CheckStateChangedEvent)
+ */
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ ProjectRecord element = (ProjectRecord) event.getElement();
+ if (element.hasConflicts()) {
+ projectsList.setChecked(element, false);
+ }
+ setPageComplete(projectsList.getCheckedElements().length > 0);
+ }
+ });
+
+ projectsList.setInput(this);
+ projectsList.setComparator(new ViewerComparator());
+ createSelectionButtons(listComposite);
+ }
+
+ /**
+ * Create the area where you select the root directory for the projects.
+ *
+ * @param workArea
+ * Composite
+ */
+ private void createProjectsRoot(Composite workArea) {
+
+ // project specification group
+ Composite projectGroup = new Composite(workArea, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ layout.makeColumnsEqualWidth = false;
+ layout.marginWidth = 0;
+ projectGroup.setLayout(layout);
+ projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ // new project from directory radio button
+ projectFromDirectoryRadio = new Button(projectGroup, SWT.RADIO);
+ projectFromDirectoryRadio
+ .setText(DataTransferMessages.WizardProjectsImportPage_RootSelectTitle);
+
+ // project location entry field
+ this.directoryPathField = new Text(projectGroup, SWT.BORDER);
+
+ GridData directoryPathData = new GridData(SWT.FILL, SWT.NONE, true,
+ false);
+ directoryPathData.widthHint = new PixelConverter(directoryPathField)
+ .convertWidthInCharsToPixels(25);
+ directoryPathField.setLayoutData(directoryPathData);
+
+ directoryPathField.setText(ProjectUtils.getDefaultAptanaLocation());
+
+ // browse button
+ browseDirectoriesButton = new Button(projectGroup, SWT.PUSH);
+ browseDirectoriesButton
+ .setText(DataTransferMessages.DataTransfer_browse);
+ setButtonLayoutData(browseDirectoriesButton);
+
+ // new project from archive radio button
+ projectFromArchiveRadio = new Button(projectGroup, SWT.RADIO);
+ projectFromArchiveRadio
+ .setText(DataTransferMessages.WizardProjectsImportPage_ArchiveSelectTitle);
+
+ // project location entry field
+ archivePathField = new Text(projectGroup, SWT.BORDER);
+
+ GridData archivePathData = new GridData(SWT.FILL, SWT.NONE, true, false);
+ archivePathData.widthHint = new PixelConverter(archivePathField)
+ .convertWidthInCharsToPixels(25);
+ archivePathField.setLayoutData(archivePathData); // browse button
+ browseArchivesButton = new Button(projectGroup, SWT.PUSH);
+ browseArchivesButton.setText(DataTransferMessages.DataTransfer_browse);
+ setButtonLayoutData(browseArchivesButton);
+
+ projectFromDirectoryRadio.setSelection(true);
+ archivePathField.setEnabled(false);
+ browseArchivesButton.setEnabled(false);
+
+ browseDirectoriesButton.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetS
+ * elected(org.eclipse.swt.events.SelectionEvent)
+ */
+ public void widgetSelected(SelectionEvent e) {
+ handleLocationDirectoryButtonPressed();
+ }
+
+ });
+
+ browseArchivesButton.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
+ * .swt.events.SelectionEvent)
+ */
+ public void widgetSelected(SelectionEvent e) {
+ handleLocationArchiveButtonPressed();
+ }
+
+ });
+
+ directoryPathField.addTraverseListener(new TraverseListener() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.TraverseListener#keyTraversed(org.eclipse
+ * .swt.events.TraverseEvent)
+ */
+ public void keyTraversed(TraverseEvent e) {
+ if (e.detail == SWT.TRAVERSE_RETURN) {
+ e.doit = false;
+ updateProjectsList(directoryPathField.getText().trim());
+ }
+ }
+
+ });
+
+ directoryPathField.addFocusListener(new FocusAdapter() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt
+ * .events.FocusEvent)
+ */
+ public void focusLost(org.eclipse.swt.events.FocusEvent e) {
+ updateProjectsList(directoryPathField.getText().trim());
+ }
+
+ });
+
+ archivePathField.addTraverseListener(new TraverseListener() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.TraverseListener#keyTraversed(org.eclipse
+ * .swt.events.TraverseEvent)
+ */
+ public void keyTraversed(TraverseEvent e) {
+ if (e.detail == SWT.TRAVERSE_RETURN) {
+ e.doit = false;
+ updateProjectsList(archivePathField.getText().trim());
+ }
+ }
+
+ });
+
+ archivePathField.addFocusListener(new FocusAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt
+ * .events.FocusEvent)
+ */
+ public void focusLost(org.eclipse.swt.events.FocusEvent e) {
+ updateProjectsList(archivePathField.getText().trim());
+ }
+ });
+
+ projectFromDirectoryRadio.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse
+ * .swt.events.SelectionEvent)
+ */
+ public void widgetSelected(SelectionEvent e) {
+ directoryRadioSelected();
+ }
+ });
+
+ projectFromArchiveRadio.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse
+ * .swt.events.SelectionEvent)
+ */
+ public void widgetSelected(SelectionEvent e) {
+ archiveRadioSelected();
+ }
+ });
+ }
+
+ /**
+ * Create the selection buttons in the listComposite.
+ *
+ * @param listComposite
+ */
+ private void createSelectionButtons(Composite listComposite) {
+ Composite buttonsComposite = new Composite(listComposite, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ buttonsComposite.setLayout(layout);
+
+ buttonsComposite.setLayoutData(new GridData(
+ GridData.VERTICAL_ALIGN_BEGINNING));
+
+ Button selectAll = new Button(buttonsComposite, SWT.PUSH);
+ selectAll.setText(DataTransferMessages.DataTransfer_selectAll);
+ selectAll.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ for (int i = 0; i < selectedProjects.length; i++) {
+ if (selectedProjects[i].hasConflicts()) {
+ projectsList.setChecked(selectedProjects[i], false);
+ } else {
+ projectsList.setChecked(selectedProjects[i], true);
+ }
+ }
+ setPageComplete(projectsList.getCheckedElements().length > 0);
+ }
+ });
+ Dialog.applyDialogFont(selectAll);
+ setButtonLayoutData(selectAll);
+
+ Button deselectAll = new Button(buttonsComposite, SWT.PUSH);
+ deselectAll.setText(DataTransferMessages.DataTransfer_deselectAll);
+ deselectAll.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
+ * .swt.events.SelectionEvent)
+ */
+ public void widgetSelected(SelectionEvent e) {
+
+ projectsList.setCheckedElements(new Object[0]);
+ setPageComplete(false);
+ }
+ });
+ Dialog.applyDialogFont(deselectAll);
+ setButtonLayoutData(deselectAll);
+
+ Button refresh = new Button(buttonsComposite, SWT.PUSH);
+ refresh.setText(DataTransferMessages.DataTransfer_refresh);
+ refresh.addSelectionListener(new SelectionAdapter() {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse
+ * .swt.events.SelectionEvent)
+ */
+ public void widgetSelected(SelectionEvent e) {
+ if (projectFromDirectoryRadio.getSelection()) {
+ updateProjectsList(directoryPathField.getText().trim());
+ } else {
+ updateProjectsList(archivePathField.getText().trim());
+ }
+ }
+ });
+ Dialog.applyDialogFont(refresh);
+ setButtonLayoutData(refresh);
+ }
+
+ /**
+ * @param workArea
+ */
+ private void createWorkingSetGroup(Composite workArea) {
+ String[] workingSetIds = new String[] {
+ "org.eclipse.ui.resourceWorkingSetPage", //$NON-NLS-1$
+ "org.eclipse.jdt.ui.JavaWorkingSetPage" }; //$NON-NLS-1$
+ workingSetGroup = new WorkingSetGroup(workArea, currentSelection,
+ workingSetIds);
+ }
+
+ private void directoryRadioSelected() {
+ if (projectFromDirectoryRadio.getSelection()) {
+ directoryPathField.setEnabled(true);
+ browseDirectoriesButton.setEnabled(true);
+ archivePathField.setEnabled(false);
+ browseArchivesButton.setEnabled(false);
+ updateProjectsList(directoryPathField.getText());
+ directoryPathField.setFocus();
+ }
+ }
+
+ /**
+ * Display an error dialog with the specified message.
+ *
+ * @param message
+ * the error message
+ */
+ protected void displayErrorDialog(String message) {
+ MessageDialog.open(MessageDialog.ERROR, getContainer().getShell(),
+ getErrorDialogTitle(), message, SWT.SHEET);
+ }
+
+ /**
+ * Get the title for an error dialog. Subclasses should override.
+ */
+ protected String getErrorDialogTitle() {
+ return IDEWorkbenchMessages.WizardExportPage_internalErrorTitle;
+ }
+
+ /**
+ * Method used for test suite.
+ *
+ * @return Button the Import from Directory RadioButton
+ */
+ public Button getProjectFromDirectoryRadio() {
+ return projectFromDirectoryRadio;
+ }
+
+ /**
+ * Get the array of project records that can be imported from the source
+ * workspace or archive, selected by the user. If a project with the same
+ * name exists in both the source workspace and the current workspace, then
+ * the hasConflicts flag would be set on that project record.
+ *
+ * Method declared public for test suite.
+ *
+ * @return ProjectRecord[] array of projects that can be imported into the
+ * workspace
+ */
+ public ProjectRecord[] getProjectRecords() {
+ List projectRecords = new ArrayList();
+ for (int i = 0; i < selectedProjects.length; i++) {
+ if (isProjectInWorkspace(selectedProjects[i].getProjectName())) {
+ selectedProjects[i].setHasConflicts(true);
+ }
+ projectRecords.add(selectedProjects[i]);
+ }
+ return (ProjectRecord[]) projectRecords
+ .toArray(new ProjectRecord[projectRecords.size()]);
+ }
+
+ /**
+ * Retrieve all the projects in the current workspace.
+ *
+ * @return IProject[] array of IProject in the current workspace
+ */
+ private IProject[] getProjectsInWorkspace() {
+ if (wsProjects == null) {
+ wsProjects = ResourcesPlugin.getWorkspace().getRoot()
+ .getProjects();
+ }
+ return wsProjects;
+ }
+
+ /**
+ * Method used for test suite.
+ *
+ * @return CheckboxTreeViewer the viewer containing all the projects found
+ */
+ public CheckboxTreeViewer getProjectsList() {
+ return projectsList;
+ }
+
+ /**
+ * Answer a handle to the zip file currently specified as being the source.
+ * Return null if this file does not exist or is not of valid format.
+ */
+ private TarFile getSpecifiedTarSourceFile(String fileName) {
+ if (fileName.length() == 0) {
+ return null;
+ }
+
+ try {
+ return new TarFile(fileName);
+ } catch (TarException e) {
+ displayErrorDialog(DataTransferMessages.TarImport_badFormat);
+ } catch (IOException e) {
+ displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
+ }
+
+ archivePathField.setFocus();
+ return null;
+ }
+
+ /**
+ * Answer a handle to the zip file currently specified as being the source.
+ * Return null if this file does not exist or is not of valid format.
+ */
+ private ZipFile getSpecifiedZipSourceFile(String fileName) {
+ if (fileName.length() == 0) {
+ return null;
+ }
+
+ try {
+ return new ZipFile(fileName);
+ } catch (ZipException e) {
+ displayErrorDialog(DataTransferMessages.ZipImport_badFormat);
+ } catch (IOException e) {
+ displayErrorDialog(DataTransferMessages.ZipImport_couldNotRead);
+ }
+
+ archivePathField.setFocus();
+ return null;
+ }
+
+ /**
+ * The browse button has been selected. Select the location.
+ */
+ protected void handleLocationArchiveButtonPressed() {
+
+ FileDialog dialog = new FileDialog(archivePathField.getShell(),
+ SWT.SHEET);
+ dialog.setFilterExtensions(FILE_IMPORT_MASK);
+ dialog
+ .setText(DataTransferMessages.WizardProjectsImportPage_SelectArchiveDialogTitle);
+
+ String fileName = archivePathField.getText().trim();
+ if (fileName.length() == 0) {
+ fileName = previouslyBrowsedArchive;
+ }
+
+ if (fileName.length() == 0) {
+ dialog.setFilterPath(ResourcesPlugin.getWorkspace()
+ .getRoot().getLocation().toOSString());
+ } else {
+ File path = new File(fileName).getParentFile();
+ if (path != null && path.exists()) {
+ dialog.setFilterPath(path.toString());
+ }
+ }
+
+ String selectedArchive = dialog.open();
+ if (selectedArchive != null) {
+ previouslyBrowsedArchive = selectedArchive;
+ archivePathField.setText(previouslyBrowsedArchive);
+ updateProjectsList(selectedArchive);
+ }
+
+ }
+
+ /**
+ * The browse button has been selected. Select the location.
+ */
+ protected void handleLocationDirectoryButtonPressed() {
+
+ DirectoryDialog dialog = new DirectoryDialog(directoryPathField
+ .getShell(), SWT.SHEET);
+ dialog
+ .setMessage(DataTransferMessages.WizardProjectsImportPage_SelectDialogTitle);
+
+ String dirName = directoryPathField.getText().trim();
+ if (dirName.length() == 0) {
+ dirName = previouslyBrowsedDirectory;
+ }
+
+ if (dirName.length() == 0) {
+ dialog.setFilterPath(ResourcesPlugin.getWorkspace()
+ .getRoot().getLocation().toOSString());
+ } else {
+ File path = new File(dirName);
+ if (path.exists()) {
+ dialog.setFilterPath(new Path(dirName).toOSString());
+ }
+ }
+
+ String selectedDirectory = dialog.open();
+ if (selectedDirectory != null) {
+ previouslyBrowsedDirectory = selectedDirectory;
+ directoryPathField.setText(previouslyBrowsedDirectory);
+ updateProjectsList(selectedDirectory);
+ }
+
+ }
+
+ /**
+ * Determine if the project with the given name is in the current workspace.
+ *
+ * @param projectName
+ * String the project name to check
+ * @return boolean true if the project with the given name is in this
+ * workspace
+ */
+ private boolean isProjectInWorkspace(String projectName) {
+ if (projectName == null) {
+ return false;
+ }
+ IProject[] workspaceProjects = getProjectsInWorkspace();
+ for (int i = 0; i < workspaceProjects.length; i++) {
+ if (projectName.equals(workspaceProjects[i].getName())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Performs clean-up if the user cancels the wizard without doing anything
+ */
+ public void performCancel() {
+ ArchiveFileManipulations.closeStructureProvider(structureProvider,
+ getShell());
+ }
+
+ /**
+ * The <code>WizardDataTransfer</code> implementation of this
+ * <code>IOverwriteQuery</code> method asks the user whether the existing
+ * resource at the given path should be overwritten.
+ *
+ * @param pathString
+ * @return the user's reply: one of <code>"YES"</code>, <code>"NO"</code>,
+ * <code>"ALL"</code>, or <code>"CANCEL"</code>
+ */
+ public String queryOverwrite(String pathString) {
+
+ Path path = new Path(pathString);
+
+ String messageString;
+ // Break the message up if there is a file name and a directory
+ // and there are at least 2 segments.
+ if (path.getFileExtension() == null || path.segmentCount() < 2) {
+ messageString = NLS.bind(
+ IDEWorkbenchMessages.WizardDataTransfer_existsQuestion,
+ pathString);
+ } else {
+ messageString = NLS
+ .bind(
+ IDEWorkbenchMessages.WizardDataTransfer_overwriteNameAndPathQuestion,
+ path.lastSegment(), path.removeLastSegments(1)
+ .toOSString());
+ }
+
+ final MessageDialog dialog = new MessageDialog(getContainer()
+ .getShell(), IDEWorkbenchMessages.Question, null,
+ messageString, MessageDialog.QUESTION, new String[] {
+ IDialogConstants.YES_LABEL,
+ IDialogConstants.YES_TO_ALL_LABEL,
+ IDialogConstants.NO_LABEL,
+ IDialogConstants.NO_TO_ALL_LABEL,
+ IDialogConstants.CANCEL_LABEL }, 0) {
+ protected int getShellStyle() {
+ return super.getShellStyle() | SWT.SHEET;
+ }
+ };
+ String[] response = new String[] { YES, ALL, NO, NO_ALL, CANCEL };
+ // run in syncExec because callback is from an operation,
+ // which is probably not running in the UI thread.
+ getControl().getDisplay().syncExec(new Runnable() {
+ public void run() {
+ dialog.open();
+ }
+ });
+ return dialog.getReturnCode() < 0 ? CANCEL : response[dialog
+ .getReturnCode()];
+ }
+
+ /**
+ * Use the dialog store to restore widget values to the values that they
+ * held last time this wizard was used to completion, or alternatively, if
+ * an initial path is specified, use it to select values.
+ *
+ * Method declared public only for use of tests.
+ */
+ public void restoreWidgetValues() {
+
+ // First, check to see if we have resore settings, and
+ // take care of the checkbox
+ IDialogSettings settings = getDialogSettings();
+
+ // Second, check to see if we don't have an initial path,
+ // and if we do have restore settings. If so, set the
+ // radio selection properly to restore settings
+
+ if (initialPath == null && settings != null) {
+ // radio selection
+ boolean archiveSelected = settings
+ .getBoolean(STORE_ARCHIVE_SELECTED);
+ projectFromDirectoryRadio.setSelection(!archiveSelected);
+ projectFromArchiveRadio.setSelection(archiveSelected);
+ if (archiveSelected) {
+ archiveRadioSelected();
+ } else {
+ directoryRadioSelected();
+ }
+ }
+ // Third, if we do have an initial path, set the proper
+ // path and radio buttons to the initial value. Move
+ // cursor to the end of the path so user can see the
+ // most relevant part (directory / archive name)
+ else if (initialPath != null) {
+ boolean dir = new File(initialPath).isDirectory();
+
+ projectFromDirectoryRadio.setSelection(dir);
+ projectFromArchiveRadio.setSelection(!dir);
+
+ if (dir) {
+ directoryPathField.setText(initialPath);
+ directoryPathField.setSelection(initialPath.length());
+ directoryRadioSelected();
+ } else {
+ archivePathField.setText(initialPath);
+ archivePathField.setSelection(initialPath.length());
+ archiveRadioSelected();
+ }
+ }
+ }
+
+ /**
+ * Since Finish was pressed, write widget values to the dialog store so that
+ * they will persist into the next invocation of this wizard page.
+ *
+ * Method declared public only for use of tests.
+ */
+ public void saveWidgetValues() {
+ IDialogSettings settings = getDialogSettings();
+ if (settings != null) {
+ settings.put(STORE_ARCHIVE_SELECTED, projectFromArchiveRadio
+ .getSelection());
+ }
+ }
+
+ /*
+ * (non-Javadoc) Method declared on IDialogPage. Set the focus on path
+ * fields when page becomes visible.
+ */
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if (visible && this.projectFromDirectoryRadio.getSelection()) {
+ this.directoryPathField.setFocus();
+ }
+ if (visible && this.projectFromArchiveRadio.getSelection()) {
+ this.archivePathField.setFocus();
+ }
+ }
+
+ /**
+ * Update the list of projects based on path. Method declared public only
+ * for test suite.
+ *
+ * @param path
+ */
+ public void updateProjectsList(final String path) {
+ // on an empty path empty selectedProjects
+ if (path == null || path.length() == 0) {
+ setMessage("Select a directory to search for existing WRT projects.");
+ selectedProjects = new ProjectRecord[0];
+ projectsList.refresh(true);
+ projectsList.setCheckedElements(selectedProjects);
+ setPageComplete(projectsList.getCheckedElements().length > 0);
+ lastPath = path;
+ return;
+ }
+
+ final File directory = new File(path);
+ long modified = directory.lastModified();
+ if (path.equals(lastPath) && lastModified == modified) {
+ // since the file/folder was not modified and the path did not
+ // change, no refreshing is required
+ return;
+ }
+
+ lastPath = path;
+ lastModified = modified;
+
+ // We can't access the radio button from the inner class so get the
+ // status beforehand
+ final boolean dirSelected = this.projectFromDirectoryRadio
+ .getSelection();
+ try {
+ getContainer().run(true, true, new IRunnableWithProgress() {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.jface.operation.IRunnableWithProgress#run(org
+ * .eclipse.core.runtime.IProgressMonitor)
+ */
+ public void run(IProgressMonitor monitor) {
+
+ monitor
+ .beginTask(
+ DataTransferMessages.WizardProjectsImportPage_SearchingMessage,
+ 100);
+ selectedProjects = new ProjectRecord[0];
+ Collection files = new ArrayList();
+ monitor.worked(10);
+ if (!dirSelected
+ && ArchiveFileManipulations.isTarFile(path)) {
+ TarFile sourceTarFile = getSpecifiedTarSourceFile(path);
+ if (sourceTarFile == null) {
+ return;
+ }
+
+ structureProvider = new TarLeveledStructureProvider(
+ sourceTarFile);
+ Object child = structureProvider.getRoot();
+
+ if (!collectProjectFilesFromProvider(files, child, 0,
+ monitor)) {
+ return;
+ }
+ Iterator filesIterator = files.iterator();
+ selectedProjects = new ProjectRecord[files.size()];
+ int index = 0;
+ monitor.worked(50);
+ monitor
+ .subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
+ while (filesIterator.hasNext()) {
+ selectedProjects[index++] = (ProjectRecord) filesIterator
+ .next();
+ }
+ } else if (!dirSelected
+ && ArchiveFileManipulations.isZipFile(path)) {
+ ZipFile sourceFile = getSpecifiedZipSourceFile(path);
+ if (sourceFile == null) {
+ return;
+ }
+ structureProvider = new ZipLeveledStructureProvider(
+ sourceFile);
+ Object child = structureProvider.getRoot();
+
+ if (!collectProjectFilesFromProvider(files, child, 0,
+ monitor)) {
+ return;
+ }
+ Iterator filesIterator = files.iterator();
+ selectedProjects = new ProjectRecord[files.size()];
+ int index = 0;
+ monitor.worked(50);
+ monitor
+ .subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
+ while (filesIterator.hasNext()) {
+ selectedProjects[index++] = (ProjectRecord) filesIterator
+ .next();
+ }
+ }
+
+ else if (dirSelected && directory.isDirectory()) {
+
+ if (!collectProjectFilesFromDirectory(files, directory,
+ null, monitor)) {
+ return;
+ }
+ Iterator filesIterator = files.iterator();
+ selectedProjects = new ProjectRecord[files.size()];
+ int index = 0;
+ monitor.worked(50);
+ monitor
+ .subTask(DataTransferMessages.WizardProjectsImportPage_ProcessingMessage);
+ while (filesIterator.hasNext()) {
+ File file = (File) filesIterator.next();
+ selectedProjects[index] = new FileSystemProject(file);
+ index++;
+ }
+ } else {
+ monitor.worked(60);
+ }
+ monitor.done();
+ }
+
+ });
+ } catch (InvocationTargetException e) {
+ Activator.log(e.getMessage(), e);
+ } catch (InterruptedException e) {
+ // Nothing to do if the user interrupts.
+ }
+
+ projectsList.refresh(true);
+ ProjectRecord[] projects = getProjectRecords();
+ boolean displayWarning = false;
+ for (int i = 0; i < projects.length; i++) {
+ if (projects[i].hasConflicts()) {
+ displayWarning = true;
+ projectsList.setGrayed(projects[i], true);
+ } else {
+ projectsList.setChecked(projects[i], true);
+ }
+ }
+
+ if (displayWarning) {
+ setMessage(
+ DataTransferMessages.WizardProjectsImportPage_projectsInWorkspace,
+ WARNING);
+ } else {
+ setMessage("Select a directory to search for existing WRT projects.");
+ }
+ setPageComplete(projectsList.getCheckedElements().length > 0);
+ if (selectedProjects.length == 0) {
+ setMessage(
+ DataTransferMessages.WizardProjectsImportPage_noProjectsToImport,
+ WARNING);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/projectimport/WrtProjectsImportWizard.java Thu Feb 25 14:58:22 2010 -0800
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2009 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.wizards.projectimport;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+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.wizards.newresource.BasicNewProjectResourceWizard;
+import org.symbian.tools.wrttools.util.ProjectUtils;
+
+public class WrtProjectsImportWizard extends Wizard implements
+ IImportWizard, INewWizard, IExecutableExtension {
+
+ private WrtProjectLocationWizardPage mainPage;
+ private IConfigurationElement config;
+
+ public WrtProjectsImportWizard() {
+ setWindowTitle("Import WRT Project");
+ setNeedsProgressMonitor(true);
+ }
+
+ @Override
+ public boolean performCancel() {
+ mainPage.performCancel();
+ return true;
+ }
+
+ @Override
+ public boolean performFinish() {
+ if (mainPage.createProjects()) {
+ BasicNewProjectResourceWizard.updatePerspective(config);
+ List<IProject> projects = mainPage.getCreatedProjects();
+ ProjectUtils.focusOn(projects.toArray(new IProject[projects.size()]));
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void addPages() {
+ mainPage = new WrtProjectLocationWizardPage();
+ addPage(mainPage);
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ // Do nothing
+ }
+
+ public void setInitializationData(IConfigurationElement config,
+ String propertyName, Object data) throws CoreException {
+ this.config = config;
+ }
+}