diff options
author | Carsten Hammer | 2020-07-05 16:03:39 +0000 |
---|---|---|
committer | Alexandr Miloslavskiy | 2020-07-15 18:59:43 +0000 |
commit | bd6c66bfe56580a4d962ef167bb8eaff1f3be166 (patch) | |
tree | 8639cf3c7a0dfdc71ef221308149f7552f82ab26 | |
parent | a28df98681d6598ecac3355facc6c2d818d01e0f (diff) | |
download | eclipse.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.java | 31 |
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); } } |