From ede4ac3f9dbfd60f80f74ee61c4a06ecab276ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Kubitz?= Date: Thu, 1 Sep 2022 16:40:27 +0200 Subject: [PATCH] fix #307: Progress View sometimes shows short living jobs twice There is a lot of code to handle equal JobTreeElement, but JobInfo did not implement equals(). Since the JobInfo is now reliable avoided to be added each time to the bottom, the sort order has to be maintained also on remove. --- .../progress/DetailedProgressViewer.java | 30 ++++++++++--------- .../eclipse/ui/internal/progress/JobInfo.java | 13 ++++++++ .../META-INF/MANIFEST.MF | 2 +- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/DetailedProgressViewer.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/DetailedProgressViewer.java index 0fafa080ad0..da91c77721a 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/DetailedProgressViewer.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/DetailedProgressViewer.java @@ -165,16 +165,23 @@ private void updateMaxDisplayedValue(IPreferenceStore prefs) { @Override public void add(JobTreeElement... elements) { - ViewerComparator sorter = getComparator(); - - // Use a Set in case we are getting something added that exists - Set newItems = new LinkedHashSet<>(jobItemControls.keySet()); + Set items = getItems(); for (JobTreeElement element : elements) { if (element != null) { - newItems.add(element); + items.add(element); } } + updateItems(items); + } + + private Set getItems() { + // Use a Set in case we are getting something added that exists + Set newItems = new LinkedHashSet<>(jobItemControls.keySet()); + return newItems; + } + private void updateItems(Set newItems) { + ViewerComparator sorter = getComparator(); JobTreeElement[] infos = newItems.toArray(new JobTreeElement[0]); if (sorter != null) { sorter.sort(this, infos); @@ -369,6 +376,7 @@ protected void internalRefresh(Object element) { @Override public void remove(JobTreeElement... elements) { + Set items = getItems(); for (Object element : elements) { JobTreeElement treeElement = (JobTreeElement) element; // Make sure we are not keeping this one @@ -387,19 +395,13 @@ public void remove(JobTreeElement... elements) { remove(parent); } if (item != null) { - jobItemControls.remove(element); + items.remove(element); unmapElement(element); - item.dispose(); } } } - - Control[] existingChildren = control.getChildren(); - for (int i = 0; i < existingChildren.length; i++) { - ProgressInfoItem item = (ProgressInfoItem) existingChildren[i]; - item.setColor(i); - } - updateForShowingProgress(); + // also sort again, otherwise removed job may appear at top again: + updateItems(items); } @Override diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/JobInfo.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/JobInfo.java index faea8fbf4cc..3e02270dd72 100644 --- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/JobInfo.java +++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/progress/JobInfo.java @@ -60,6 +60,19 @@ protected JobInfo(Job enclosingJob) { this.taskInfo = Optional.empty(); } + @Override + public int hashCode() { + return job.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof JobInfo) { + return job.equals(((JobInfo) obj).job); + } + return false; + } + /** * Adds the subtask to the receiver. * diff --git a/bundles/org.eclipse.ui.workbench/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.workbench/META-INF/MANIFEST.MF index 6520dc75511..dfc48220337 100644 --- a/bundles/org.eclipse.ui.workbench/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.ui.workbench/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.ui.workbench; singleton:=true -Bundle-Version: 3.126.0.qualifier +Bundle-Version: 3.126.100.qualifier Bundle-ClassPath: . Bundle-Activator: org.eclipse.ui.internal.WorkbenchPlugin Bundle-ActivationPolicy: lazy