Bug 142593 - Scrolling a table eventually locks up the entire application (back port to 3.3.2)
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 c162d18..32e6231 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,22 +5843,6 @@
// if (drawCount != 0 || !OS.IsWindowVisible (handle)) break;
NMLVDISPINFO plvfi = new NMLVDISPINFO ();
OS.MoveMemory (plvfi, lParam, NMLVDISPINFO.sizeof);
-
- /*
- * When an item is being deleted from a virtual table, do not
- * allow the application to provide data for a new item that
- * becomes visible until the item has been removed from the
- * items array. Because arbitrary application code can run
- * during the callback, the items array might be accessed
- * in an inconsistent state. Rather than answering the data
- * right away, queue a redraw for later.
- */
- if ((style & SWT.VIRTUAL) != 0) {
- if (ignoreShrink) {
- OS.SendMessage (handle, OS.LVM_REDRAWITEMS, plvfi.iItem, plvfi.iItem);
- break;
- }
- }
/*
* Feature in Windows. When a new table item is inserted
@@ -5870,6 +5854,22 @@
*/
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
+ * becomes visible until the item has been removed from the
+ * items array. Because arbitrary application code can run
+ * during the callback, the items array might be accessed
+ * in an inconsistent state. Rather than answering the data
+ * right away, queue a redraw for later.
+ */
+ if ((style & SWT.VIRTUAL) != 0 && !item.cached) {
+ if (ignoreShrink) {
+ OS.SendMessage (handle, OS.LVM_REDRAWITEMS, plvfi.iItem, plvfi.iItem);
+ break;
+ }
+ }
/*
* The cached flag is used by both virtual and non-virtual