diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookup.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookup.java index c1c17d2ac7e..9d3e92b8175 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookup.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/resources/ResourceLookup.java @@ -11,6 +11,9 @@ package org.eclipse.cdt.internal.core.resources; import java.net.URI; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; @@ -114,6 +117,35 @@ public class ResourceLookup { return best; } + /** + * Sorts files by relevance for CDT, by the criteria listed below. The most relevant files + * is listed first. + *
Accessible files + *
Files of preferred project + *
Files of CDT projects + *
Files on a source root of a CDT project + */ + public static void sortFilesByRelevance(IFile[] filesToSort, final IProject preferredProject) { + Collections.sort(Arrays.asList(filesToSort), new Comparator() { + public int compare(IFile f1, IFile f2) { + boolean a1= f1.isAccessible(); + boolean a2= f2.isAccessible(); + if (a1 != a2) + return a1 ? -1 : 1; + + int r1= FileRelevance.getRelevance(f1, preferredProject); + int r2= FileRelevance.getRelevance(f2, preferredProject); + + if (r1 > r2) + return -1; + if (r1 < r2) + return 1; + + return f1.getFullPath().toString().compareTo(f2.getFullPath().toString()); + } + }); + } + /** * For testing, only. */