# HG changeset patch # User Eugene Ostroukhov # Date 1267138702 28800 # Node ID bb3a18c4e0372a1c8019180b5a178414cbabe738 # Parent 53c1b4c3d78369b55e6191dd3992f3a9c1a5730e Refactoring, some messages were updated diff -r 53c1b4c3d783 -r bb3a18c4e037 org.symbian.tools.wrttools/plugin.xml --- 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 @@ - @@ -273,9 +272,12 @@ + + Import WRT project created in Aptana, Adobe Dreamweaver or WRT IDE + + + Create WRT project from deployable WGZ application archive + @@ -532,7 +537,7 @@ + wizardId="org.symbian.tools.wrttools.import.projectImport"> 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 true 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 true 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 true 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 true 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 WizardDataTransfer implementation of this - * IOverwriteQuery method asks the user whether the existing - * resource at the given path should be overwritten. - * - * @param pathString - * @return the user's reply: one of "YES", "NO", - * "ALL", or "CANCEL" - */ - 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); - } - } -} diff -r 53c1b4c3d783 -r bb3a18c4e037 org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/projectimport/AptanaProjectsImportWizard.java --- 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 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; - } -} diff -r 53c1b4c3d783 -r bb3a18c4e037 org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/projectimport/WrtProjectLocationWizardPage.java --- /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 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 true 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 true 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 true 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 true 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 WizardDataTransfer implementation of this + * IOverwriteQuery method asks the user whether the existing + * resource at the given path should be overwritten. + * + * @param pathString + * @return the user's reply: one of "YES", "NO", + * "ALL", or "CANCEL" + */ + 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); + } + } +} diff -r 53c1b4c3d783 -r bb3a18c4e037 org.symbian.tools.wrttools/src/org/symbian/tools/wrttools/wizards/projectimport/WrtProjectsImportWizard.java --- /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 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; + } +}