Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarsten Hammer2020-07-05 16:03:39 +0000
committerAlexandr Miloslavskiy2020-07-15 18:59:43 +0000
commitbd6c66bfe56580a4d962ef167bb8eaff1f3be166 (patch)
tree8639cf3c7a0dfdc71ef221308149f7552f82ab26
parenta28df98681d6598ecac3355facc6c2d818d01e0f (diff)
downloadeclipse.platform.swt-bd6c66bfe56580a4d962ef167bb8eaff1f3be166.tar.gz
eclipse.platform.swt-bd6c66bfe56580a4d962ef167bb8eaff1f3be166.tar.xz
eclipse.platform.swt-bd6c66bfe56580a4d962ef167bb8eaff1f3be166.zip
Bug 565061 - faster deletion in TreeViewer.removeAll()
Looking at the test Bug548982_TreeAddRemoveMany.java. Without this change I get CreateTreeItems: 3437 ms DeleteTreeItems: 8980 ms CreateTreeItems: 3576 ms DeleteTreeItems: 9065 ms With this change CreateTreeItems: 3326 ms DeleteTreeItems: 2729 ms CreateTreeItems: 3276 ms DeleteTreeItems: 2739 ms In tests with less than 20-30 elements of treeview switching off redraw in removeAll() method does not have a clear advantage. Times measured are fluctuating strongly. So to be on the safe side only do this for more than 30 elements. Change-Id: Ibccb6a316ebe7f85c83a0b4224290bd01265a7a1 Signed-off-by: Carsten Hammer <carsten.hammer@t-online.de>
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TreeItem.java31
1 files changed, 22 insertions, 9 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TreeItem.java
index 4c33e37e27..78134778e7 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TreeItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TreeItem.java
@@ -1028,16 +1028,29 @@ public void removeAll () {
TVITEM tvItem = new TVITEM ();
tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
tvItem.hItem = OS.SendMessage (hwnd, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, handle);
- while (tvItem.hItem != 0) {
- OS.SendMessage (hwnd, OS.TVM_GETITEM, 0, tvItem);
- TreeItem item = tvItem.lParam != -1 ? parent.items [(int)tvItem.lParam] : null;
- if (item != null && !item.isDisposed ()) {
- item.dispose ();
- } else {
- parent.releaseItem (tvItem.hItem, tvItem, false);
- parent.destroyItem (null, tvItem.hItem);
+ /**
+ * Performance optimization, switch off redraw for high amount of elements
+ */
+ boolean disableRedraw = parent.itemCount > 30;
+ if (disableRedraw) {
+ parent.setRedraw(false);
+ }
+ try {
+ while (tvItem.hItem != 0) {
+ OS.SendMessage (hwnd, OS.TVM_GETITEM, 0, tvItem);
+ TreeItem item = tvItem.lParam != -1 ? parent.items [(int)tvItem.lParam] : null;
+ if (item != null && !item.isDisposed ()) {
+ item.dispose ();
+ } else {
+ parent.releaseItem (tvItem.hItem, tvItem, false);
+ parent.destroyItem (null, tvItem.hItem);
+ }
+ tvItem.hItem = OS.SendMessage (hwnd, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, handle);
+ }
+ } finally {
+ if (disableRedraw) {
+ parent.setRedraw(true);
}
- tvItem.hItem = OS.SendMessage (hwnd, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, handle);
}
}

Back to the top