Bug 575242 - fix elementsChanged() to not refresh viewer too much
Don't refresh viewer on every changed element, that makes UI completely
unresponsible if there are too many search matches. Instead, refresh
viewer only once - either if only one element changed, on concrete
element, or after all elements are updated in elementsChanged().
That reduces ~10 minutes wait time to a second.
Change-Id: I04e6c64cc3319cd5416f4b512d983e76cb081946
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.text/+/183701
Tested-by: Platform Bot <platform-bot@eclipse.org>
Reviewed-by: Simeon Andreev <simeon.danailov.andreev@gmail.com>
diff --git a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/FileTreeContentProvider.java b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/FileTreeContentProvider.java
index e38f226..e976f89 100644
--- a/org.eclipse.search/search/org/eclipse/search/internal/ui/text/FileTreeContentProvider.java
+++ b/org.eclipse.search/search/org/eclipse/search/internal/ui/text/FileTreeContentProvider.java
@@ -194,28 +194,36 @@
@Override
public synchronized void elementsChanged(Object[] updatedElements) {
- for (Object updatedElement : updatedElements) {
- if (!(updatedElement instanceof LineElement)) {
- // change events to elements are reported in file search
- if (fResult.getMatchCount(updatedElement) > 0) {
- insert(updatedElement, true);
- } else {
- remove(updatedElement, true);
- }
- } else {
- // change events to line elements are reported in text search
- LineElement lineElement = (LineElement) updatedElement;
- int nMatches= lineElement.getNumberOfMatches(fResult);
- if (nMatches > 0) {
- if (hasChild(lineElement.getParent(), lineElement)) {
- fTreeViewer.update(new Object[] { lineElement, lineElement.getParent() }, null);
+ boolean singleElement = updatedElements.length == 1;
+ try {
+ for (Object updatedElement : updatedElements) {
+ if (!(updatedElement instanceof LineElement)) {
+ // change events to elements are reported in file search
+ if (fResult.getMatchCount(updatedElement) > 0) {
+ insert(updatedElement, singleElement);
} else {
- insert(lineElement, true);
+ remove(updatedElement, singleElement);
}
} else {
- remove(lineElement, true);
+ // change events to line elements are reported in text
+ // search
+ LineElement lineElement = (LineElement) updatedElement;
+ int nMatches = lineElement.getNumberOfMatches(fResult);
+ if (nMatches > 0) {
+ if (singleElement && hasChild(lineElement.getParent(), lineElement)) {
+ fTreeViewer.update(new Object[] { lineElement, lineElement.getParent() }, null);
+ } else {
+ insert(lineElement, singleElement);
+ }
+ } else {
+ remove(lineElement, singleElement);
+ }
}
}
+ } finally {
+ if (updatedElements.length > 0 && !singleElement) {
+ fTreeViewer.refresh();
+ }
}
}