Bug 578643 - visual stable Sort Order in Progress View never let a new job pop up above an already shown one. Change-Id: Ife1d803ceaae857f199179fbfd4b255c6843778d Signed-off-by: Joerg Kubitz <jkubitz-eclipse@gmx.de> Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.ui/+/190578 Tested-by: Platform Bot <platform-bot@eclipse.org>
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManagerUtil.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManagerUtil.java index 6e912c5..8256270 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManagerUtil.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/ProgressManagerUtil.java
@@ -18,6 +18,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.core.runtime.jobs.Job; @@ -49,6 +51,10 @@ public class ProgressManagerUtil { static class ProgressViewerComparator extends ViewerComparator { + private final HashMap<Object, Integer> lastIndexes = new HashMap<>(); + private final Comparator<Object> byIndex = Comparator.comparing(lastIndexes::get, + Comparator.nullsLast(Integer::compare)); // makes visual sort order stable + @Override @SuppressWarnings({ "rawtypes", "unchecked" }) public int compare(Viewer testViewer, Object e1, Object e2) { @@ -60,18 +66,18 @@ /* * https://bugs.eclipse.org/371354 * - * This ordering is inherently unstable, since it relies on modifiable - * properties of the elements: E.g. the default implementation in JobTreeElement - * compares getDisplayString(), many of whose implementations use - * getPercentDone(). - * * JavaSE 7+'s TimSort introduced a breaking change: It now throws a new * IllegalArgumentException for bad comparators. Workaround is to retry a few * times. */ for (int retries = 3; retries > 0; retries--) { try { - Arrays.sort(elements, (a, b) -> ProgressViewerComparator.this.compare(viewer, a, b)); + Arrays.sort(elements, + byIndex.thenComparing((a, b) -> ProgressViewerComparator.this.compare(viewer, a, b))); + lastIndexes.clear(); + for (int i = 0; i < elements.length; i++) { + lastIndexes.put(elements[i], i); + } return; // success } catch (IllegalArgumentException e) { // retry