summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarolyn MacLeod <Carolyn_MacLeod@ca.ibm.com>2012-10-16 16:17:25 -0400
committerCarolyn MacLeod <Carolyn_MacLeod@ca.ibm.com>2012-10-16 16:17:25 -0400
commit33011ccbbc0b6a948bfc91856458fefc7ae32f4e (patch)
treeed86f967751a033b721c6505ed7a2156b5c32cb8
parent4d14d1d7f1ee27438fcb7cae794de91c14605b9e (diff)
downloadeclipse.platform.swt-33011ccbbc0b6a948bfc91856458fefc7ae32f4e.tar.gz
eclipse.platform.swt-33011ccbbc0b6a948bfc91856458fefc7ae32f4e.tar.xz
eclipse.platform.swt-33011ccbbc0b6a948bfc91856458fefc7ae32f4e.zip
Bug 259141 - Tree.getSelection() is extremely slow with SWT.VIRTUAL and
SWT.MULTI
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java13
1 files changed, 9 insertions, 4 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java
index 822b2212d9..da21aac00e 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Tree.java
@@ -3350,6 +3350,7 @@ public TreeItem getParentItem () {
int getSelection (long /*int*/ hItem, TVITEM tvItem, TreeItem [] selection, int index, int count, boolean bigSelection, boolean all) {
while (hItem != 0) {
+ boolean expanded = true;
if (OS.IsWinCE || bigSelection) {
tvItem.hItem = hItem;
OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem);
@@ -3359,8 +3360,9 @@ int getSelection (long /*int*/ hItem, TVITEM tvItem, TreeItem [] selection, int
}
index++;
}
+ expanded = (tvItem.state & OS.TVIS_EXPANDED) != 0;
} else {
- int state = (int)/*64*/OS.SendMessage (handle, OS.TVM_GETITEMSTATE, hItem, OS.TVIS_SELECTED);
+ int state = (int)/*64*/OS.SendMessage (handle, OS.TVM_GETITEMSTATE, hItem, OS.TVIS_SELECTED | OS.TVIS_EXPANDED);
if ((state & OS.TVIS_SELECTED) != 0) {
if (tvItem != null && selection != null && index < selection.length) {
tvItem.hItem = hItem;
@@ -3369,12 +3371,15 @@ int getSelection (long /*int*/ hItem, TVITEM tvItem, TreeItem [] selection, int
}
index++;
}
+ expanded = (state & OS.TVIS_EXPANDED) != 0;
}
if (index == count) break;
if (all) {
- long /*int*/ hFirstItem = OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hItem);
- if ((index = getSelection (hFirstItem, tvItem, selection, index, count, bigSelection, all)) == count) {
- break;
+ if (expanded) {
+ long /*int*/ hFirstItem = OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hItem);
+ if ((index = getSelection (hFirstItem, tvItem, selection, index, count, bigSelection, all)) == count) {
+ break;
+ }
}
hItem = OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, hItem);
} else {