blob: a65ec6ecaa5ddeacb27cbf266d322ebe17add585 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}