From 944ed637ee27b1afe8f63ddc1be51d9fca79b1ea Mon Sep 17 00:00:00 2001 From: Silenio Quarti Date: Thu, 5 Nov 2009 21:39:04 +0000 Subject: Bug 142593 - Scrolling a table eventually locks up the entire application (back port to 3.3.2) --- .../win32/org/eclipse/swt/widgets/Table.java | 26 +++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java index c162d185d1..32e62313fc 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java @@ -5843,7 +5843,18 @@ LRESULT wmNotifyChild (NMHDR hdr, int wParam, int lParam) { // if (drawCount != 0 || !OS.IsWindowVisible (handle)) break; NMLVDISPINFO plvfi = new NMLVDISPINFO (); OS.MoveMemory (plvfi, lParam, NMLVDISPINFO.sizeof); - + + /* + * Feature in Windows. When a new table item is inserted + * using LVM_INSERTITEM in a table that is transparent + * (ie. LVM_SETBKCOLOR has been called with CLR_NONE), + * TVM_INSERTITEM calls LVN_GETDISPINFO before the item + * has been added to the array. The fix is to check for + * null. + */ + TableItem item = _getItem (plvfi.iItem); + if (item == null) break; + /* * When an item is being deleted from a virtual table, do not * allow the application to provide data for a new item that @@ -5853,23 +5864,12 @@ LRESULT wmNotifyChild (NMHDR hdr, int wParam, int lParam) { * in an inconsistent state. Rather than answering the data * right away, queue a redraw for later. */ - if ((style & SWT.VIRTUAL) != 0) { + if ((style & SWT.VIRTUAL) != 0 && !item.cached) { if (ignoreShrink) { OS.SendMessage (handle, OS.LVM_REDRAWITEMS, plvfi.iItem, plvfi.iItem); break; } } - - /* - * Feature in Windows. When a new table item is inserted - * using LVM_INSERTITEM in a table that is transparent - * (ie. LVM_SETBKCOLOR has been called with CLR_NONE), - * TVM_INSERTITEM calls LVN_GETDISPINFO before the item - * has been added to the array. The fix is to check for - * null. - */ - TableItem item = _getItem (plvfi.iItem); - if (item == null) break; /* * The cached flag is used by both virtual and non-virtual -- cgit v1.2.3