[Importer] Make job and UI feedback a bit more "incremental"
diff --git a/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/EasymportJob.java b/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/EasymportJob.java
index 710261d..b600b87 100644
--- a/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/EasymportJob.java
+++ b/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/EasymportJob.java
@@ -20,7 +20,9 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
 import java.util.SortedSet;
+import java.util.TreeMap;
 import java.util.TreeSet;
 
 import org.eclipse.core.resources.IContainer;
@@ -136,41 +138,51 @@
 	        }
 
 			if (directoriesToImport != null) {
-				SortedSet<File> bottomUpDirectoriesToImport = new TreeSet<>(new Comparator<File>() {
-					@Override
+				Comparator<File> rootToLeafComparator = new Comparator<File>() {
 					public int compare(File arg0, File arg1) {
-						int lengthDiff = arg1.getAbsolutePath().length() - arg0.getAbsolutePath().length();
+						int lengthDiff = arg0.getAbsolutePath().length() - arg1.getAbsolutePath().length();
 						if (lengthDiff != 0) {
 							return lengthDiff;
 						} else {
 							return arg0.compareTo(arg1);
 						}
 					}
-				});
-				bottomUpDirectoriesToImport.addAll(this.directoriesToImport);
-				JobGroup multiDirectoriesJobGroup = new JobGroup("Importing selected directories", 20, 1);
-				for (final File directoryToImport : bottomUpDirectoriesToImport) {
+				};
+				SortedSet<File> directories = new TreeSet<>(rootToLeafComparator);
+				directories.addAll(this.directoriesToImport);
+				SortedMap<File, IProject> leafToRootProjects = new TreeMap<>(Collections.reverseOrder(rootToLeafComparator));
+				final Set<IProject> alreadyConfiguredProjects = new HashSet<>();
+				for (final File directoryToImport : directories) {
 					final boolean alreadyAnEclipseProject = new File(directoryToImport, IProjectDescription.DESCRIPTION_FILE_NAME).isFile();
-					Job directoryJob = new Job("Processing " + directoryToImport.getName()) {
-						protected IStatus run(IProgressMonitor monitor) {
-							try {
-								IProject newProject = toExistingOrNewProject(directoryToImport, monitor, IResource.BACKGROUND_REFRESH);
-								if (configureProjects) {
-									importProjectAndChildrenRecursively(newProject, deepChildrenDetection, !alreadyAnEclipseProject, monitor);
-								}
-								return Status.OK_STATUS;
-							} catch (Exception ex) {
-								return new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), ex.getMessage(), ex);
-							}
-						}
-					};
-					// Job1 on path1 and Job2 on path2 can be run in parallel IFF path1 isn't a prefix of path2 and vice-versa
-					directoryJob.setRule(new SubdirectoryOrSameNameSchedulingRule(directoryToImport));
-					directoryJob.setUser(true);
-					directoryJob.setJobGroup(multiDirectoriesJobGroup);
-					directoryJob.schedule();
+					IProject newProject = toExistingOrNewProject(directoryToImport, monitor, IResource.BACKGROUND_REFRESH);
+					if (alreadyAnEclipseProject) {
+						alreadyConfiguredProjects.add(newProject);
+					}
+					leafToRootProjects.put(directoryToImport, newProject);
 				}
-				multiDirectoriesJobGroup.join(0, monitor);
+				if (configureProjects) {
+					JobGroup multiDirectoriesJobGroup = new JobGroup("Configuring selected directories", 20, 1);
+					for (final IProject newProject : leafToRootProjects.values()) {
+						Job directoryJob = new Job("Configuring " + newProject.getName()) {
+							protected IStatus run(IProgressMonitor monitor) {
+								try {
+									importProjectAndChildrenRecursively(newProject, EasymportJob.this.deepChildrenDetection, !alreadyConfiguredProjects.contains(newProject), monitor);
+									return Status.OK_STATUS;
+								} catch (Exception ex) {
+									return new Status(IStatus.ERROR, Activator.getDefault().getBundle().getSymbolicName(), ex.getMessage(), ex);
+								}
+							}
+						};
+						// Job1 on path1 and Job2 on path2 can be run in parallel IFF path1 isn't a prefix of path2 and vice-versa
+						directoryJob.setRule(new SubdirectoryOrSameNameSchedulingRule(newProject));
+						directoryJob.setUser(true);
+						directoryJob.setJobGroup(multiDirectoriesJobGroup);
+						directoryJob.schedule();
+					}
+					multiDirectoriesJobGroup.join(0, monitor);
+				}
+				
+
 			} else { // no specific projects included, consider only root
 				File rootProjectFile = new File(this.rootDirectory, IProjectDescription.DESCRIPTION_FILE_NAME);
 				boolean isRootANewProject = !rootProjectFile.isFile();
@@ -253,7 +265,7 @@
 	}
 
 	private Set<IProject> searchAndImportChildrenProjectsRecursively(IContainer parentContainer, Set<IPath> directoriesToExclude, final IProgressMonitor progressMonitor) throws Exception {
-		for (IProject processedProjects : this.report.keySet()) {
+		for (IProject processedProjects : Collections.synchronizedSet(this.report.keySet())) {
 			if (processedProjects.getLocation().equals(parentContainer.getLocation())) {
 				return Collections.EMPTY_SET;
 			}
diff --git a/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/ImportProposalsWizardPage.java b/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/ImportProposalsWizardPage.java
index 61a032e..176e137 100644
--- a/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/ImportProposalsWizardPage.java
+++ b/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/ImportProposalsWizardPage.java
@@ -233,8 +233,8 @@
 
 	private void selectionChanged() {
 		Object[] selected = tree.getCheckedElements();
-		EasymportJob importJob = getWizard().getImportJob(); 
-		Set<File> excludedDirectories = new HashSet<>(importJob.getImportProposals(null).keySet());
+		EasymportJob importJob = getWizard().getImportJob();
+		Set<File> excludedDirectories = new HashSet(((Map<File, ?>)this.tree.getInput()).keySet());
 		Set<File> selectedProjects = new HashSet<File>();
 		for (Object item : selected) {
 			File directory = (File)item;
diff --git a/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/SubdirectoryOrSameNameSchedulingRule.java b/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/SubdirectoryOrSameNameSchedulingRule.java
index 08cf5a9..1c7d107 100644
--- a/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/SubdirectoryOrSameNameSchedulingRule.java
+++ b/bundles/org.eclipse.e4.ui.importer/src/org/eclipse/ui/internal/wizards/datatransfer/SubdirectoryOrSameNameSchedulingRule.java
@@ -31,7 +31,11 @@
 	public SubdirectoryOrSameNameSchedulingRule(File directory) {
 		this.directory = directory;
 	}
-	
+
+	public SubdirectoryOrSameNameSchedulingRule(IResource resource) {
+		this(resource.getLocation().toFile());
+	}
+
 	@Override
 	public boolean contains(ISchedulingRule rule) {
 		return rule == this || rule instanceof IResource;