| /******************************************************************************* |
| * Copyright (c) 2014-2016 Red Hat Inc., and others |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Mickael Istria (Red Hat Inc.) - initial API and implementation |
| * Aurelien Pupier (Bonitasoft S.A.) - bug fix 470024 |
| ******************************************************************************/ |
| package org.eclipse.ui.internal.wizards.datatransfer; |
| |
| import java.util.List; |
| import java.util.Map.Entry; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.jobs.Job; |
| import org.eclipse.jface.viewers.ArrayContentProvider; |
| import org.eclipse.jface.viewers.ColumnLabelProvider; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.viewers.TableViewerColumn; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.viewers.ViewerComparator; |
| import org.eclipse.jface.viewers.ViewerFilter; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.internal.progress.ProgressMonitorFocusJobDialog; |
| import org.eclipse.ui.wizards.datatransfer.ProjectConfigurator; |
| |
| /** |
| * A dedicated dialog to report progress and results of an {@link SmartImportJob}. |
| * |
| * @since 3.12 |
| * |
| */ |
| public class SmartImportJobReportDialog extends ProgressMonitorFocusJobDialog { |
| |
| private SmartImportJob job; |
| |
| /** |
| * Constructs an instance of the dialog for the specified job. |
| * |
| * @param shell |
| */ |
| public SmartImportJobReportDialog(Shell shell) { |
| super(shell); |
| setShellStyle(SWT.RESIZE | SWT.MIN); |
| } |
| |
| @Override |
| public Composite createDialogArea(Composite parent) { |
| getShell().setText(DataTransferMessages.SmartImportReport_importedProjects); |
| final Composite res = new Composite(parent, SWT.NONE); |
| res.setLayout(new GridLayout(2, false)); |
| res.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); |
| |
| //// Nested projects |
| final Label nestedProjectsLabel = new Label(res, SWT.NONE); |
| nestedProjectsLabel.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false, 2, 1)); |
| nestedProjectsLabel.setText(NLS.bind(DataTransferMessages.SmartImportReport_importedProjectsWithCount, 0)); |
| |
| final TableViewer nestedProjectsTable = new TableViewer(res); |
| nestedProjectsTable.setContentProvider(ArrayContentProvider.getInstance()); |
| nestedProjectsTable.setComparator(new ViewerComparator() { |
| @Override |
| public int compare(Viewer viewer, Object o1, Object o2) { |
| IProject project1 = ((Entry<IProject, List<ProjectConfigurator>>) o1).getKey(); |
| IProject project2 = ((Entry<IProject, List<ProjectConfigurator>>) o2).getKey(); |
| return toString(project1).compareTo(toString(project2)); |
| } |
| |
| private String toString(IProject p) { |
| IPath location = p.getLocation(); |
| return location == null ? "" : location.toString(); //$NON-NLS-1$ |
| } |
| }); |
| nestedProjectsTable.setFilters(new ViewerFilter[] { new ViewerFilter() { |
| @Override |
| public boolean select(Viewer viewer, Object parentElement, Object element) { |
| Entry<IProject, List<ProjectConfigurator>> entry = (Entry<IProject, List<ProjectConfigurator>>) element; |
| return SmartImportWizard.toAbsolutePath(entry.getKey()).startsWith(job.getRoot().getAbsolutePath()); |
| } |
| } }); |
| nestedProjectsTable.getTable().setHeaderVisible(true); |
| GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); |
| tableLayoutData.heightHint = 200; |
| nestedProjectsTable.getControl().setLayoutData(tableLayoutData); |
| |
| TableViewerColumn projectColumn = new TableViewerColumn(nestedProjectsTable, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); |
| projectColumn.getColumn().setWidth(200); |
| projectColumn.getColumn().setText(DataTransferMessages.SmartImportReport_project); |
| projectColumn.setLabelProvider(new ColumnLabelProvider() { |
| @Override |
| public String getText(Object element) { |
| return ((Entry<IProject, List<ProjectConfigurator>>)element).getKey().getName(); |
| } |
| }); |
| |
| TableViewerColumn configuratorsColumn = new TableViewerColumn(nestedProjectsTable, SWT.NONE); |
| configuratorsColumn.getColumn().setWidth(200); |
| configuratorsColumn.getColumn().setText(DataTransferMessages.SmartImportReport_natures); |
| configuratorsColumn.setLabelProvider(new ColumnLabelProvider() { |
| @Override |
| public String getText(Object element) { |
| StringBuilder builder = new StringBuilder(); |
| for (ProjectConfigurator configurator : ((Entry<IProject, List<ProjectConfigurator>>)element).getValue()) { |
| builder.append(ProjectConfiguratorExtensionManager.getLabel(configurator)); |
| builder.append(", "); //$NON-NLS-1$ |
| }; |
| if (builder.length() > 0) { |
| builder.delete(builder.length() - 2, builder.length()); |
| } |
| return builder.toString(); |
| } |
| }); |
| |
| TableViewerColumn relativePathColumn = new TableViewerColumn(nestedProjectsTable, SWT.LEFT); |
| relativePathColumn.getColumn().setText(DataTransferMessages.SmartImportReport_relativePath); |
| relativePathColumn.getColumn().setWidth(300); |
| relativePathColumn.setLabelProvider(new ColumnLabelProvider() { |
| @Override |
| public String getText(Object element) { |
| IProject project = ((Entry<IProject, List<ProjectConfigurator>>)element).getKey(); |
| IPath projectLocation = project.getLocation(); |
| if (projectLocation == null) { |
| return "?"; //$NON-NLS-1$ |
| } |
| return projectLocation.toFile().getAbsolutePath().substring(job.getRoot().getAbsolutePath().length()); |
| } |
| }); |
| nestedProjectsTable.setInput(this.job.getConfiguredProjects().entrySet()); |
| |
| |
| //// Errors |
| final Label errorsLabel = new Label(res, SWT.NONE); |
| GridData errorLabelLayoutData = new GridData(SWT.FILL, SWT.NONE, true, false, 2, 1); |
| errorLabelLayoutData.exclude = true; |
| errorsLabel.setLayoutData(errorLabelLayoutData); |
| errorsLabel.setText(NLS.bind(DataTransferMessages.SmartImportReport_importErrors, 0)); |
| |
| final TableViewer errorsTable = new TableViewer(res); |
| errorsTable.setContentProvider(ArrayContentProvider.getInstance()); |
| errorsTable.setComparator(new ViewerComparator() { |
| @Override |
| public int compare(Viewer viewer, Object o1, Object o2) { |
| IPath location1 = ((Entry<IPath, Exception>) o1).getKey(); |
| IPath location2 = ((Entry<IPath, Exception>) o2).getKey(); |
| return location1.toString().compareTo(location2.toString()); |
| } |
| }); |
| errorsTable.getTable().setHeaderVisible(true); |
| GridData errorTableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); |
| errorTableLayoutData.heightHint = 100; |
| errorTableLayoutData.exclude = true; |
| errorsTable.getControl().setLayoutData(errorTableLayoutData); |
| |
| TableViewerColumn errorRelativePathColumn = new TableViewerColumn(errorsTable, SWT.LEFT); |
| errorRelativePathColumn.getColumn().setText(DataTransferMessages.SmartImportReport_relativePath); |
| errorRelativePathColumn.getColumn().setWidth(300); |
| errorRelativePathColumn.setLabelProvider(new ColumnLabelProvider() { |
| @Override |
| public String getText(Object element) { |
| IPath rootLocation = new Path(job.getRoot().getAbsolutePath()); |
| IPath projectLocation = ((Entry<IPath, Exception>)element).getKey(); |
| return projectLocation.makeRelativeTo(rootLocation).toString(); |
| } |
| }); |
| TableViewerColumn errorColumn = new TableViewerColumn(errorsTable, SWT.LEFT); |
| errorColumn.getColumn().setText(DataTransferMessages.SmartImportReport_error); |
| errorColumn.getColumn().setWidth(500); |
| errorColumn.setLabelProvider(new ColumnLabelProvider() { |
| @Override |
| public String getText(Object element) { |
| return ((Entry<IPath, Exception>)element).getValue().getMessage(); |
| } |
| }); |
| errorsTable.setInput(this.job.getErrors().entrySet()); |
| |
| RecursiveImportListener tableReportFiller = new RecursiveImportListener() { |
| @Override |
| public void projectCreated(IProject project) { |
| if (nestedProjectsTable.getControl().isDisposed()) { |
| return; |
| } |
| nestedProjectsTable.getControl().getDisplay().asyncExec(new Runnable() { |
| @Override |
| public void run() { |
| if (nestedProjectsTable.getControl().isDisposed()) { |
| return; |
| } |
| nestedProjectsTable.refresh(); |
| nestedProjectsTable.getTable().update(); |
| nestedProjectsTable.getTable().redraw(); |
| nestedProjectsLabel.setText(NLS.bind(DataTransferMessages.SmartImportReport_importedProjects, |
| job.getConfiguredProjects().size())); |
| } |
| }); |
| } |
| |
| @Override |
| public void projectConfigured(IProject project, ProjectConfigurator configurator) { |
| if (nestedProjectsTable.getControl().isDisposed()) { |
| return; |
| } |
| nestedProjectsTable.getControl().getDisplay().asyncExec(new Runnable() { |
| @Override |
| public void run() { |
| if (nestedProjectsTable.getControl().isDisposed()) { |
| return; |
| } |
| nestedProjectsTable.refresh(); |
| nestedProjectsTable.getTable().update(); |
| nestedProjectsTable.getTable().redraw(); |
| } |
| }); |
| } |
| |
| @Override |
| public void errorHappened(IPath location, Exception error) { |
| if (errorsTable.getControl().isDisposed()) { |
| return; |
| } |
| errorsTable.getControl().getDisplay().asyncExec(new Runnable() { |
| @Override |
| public void run() { |
| if (errorsTable.getControl().isDisposed()) { |
| return; |
| } |
| GridData gridData = (GridData) errorsTable.getControl().getLayoutData(); |
| if (gridData.exclude) { |
| gridData.exclude = false; |
| ((GridData) errorsLabel.getLayoutData()).exclude = false; |
| } |
| errorsTable.refresh(); |
| errorsTable.getTable().update(); |
| errorsLabel.setText( |
| NLS.bind(DataTransferMessages.SmartImportReport_importErrors, job.getErrors().size())); |
| res.layout(true); |
| } |
| }); |
| } |
| }; |
| job.setListener(tableReportFiller); |
| |
| super.createDialogArea(parent); |
| |
| return res; |
| } |
| |
| @Override |
| public void show(Job jobToWatch, Shell shell) { |
| if (jobToWatch instanceof SmartImportJob) { |
| this.job = (SmartImportJob) jobToWatch; |
| } else { |
| throw new IllegalArgumentException("Job must be an instance of " + SmartImportJob.class.getSimpleName()); //$NON-NLS-1$ |
| } |
| super.show(job, shell); |
| } |
| |
| @Override |
| public Image getImage() { |
| return null; |
| } |
| |
| } |