optimize clear() and clearAll()
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 ceb51cf..711c81a 100755
--- 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
@@ -1674,6 +1674,7 @@
 		item = tvItem.lParam != -1 ? items [(int)/*64*/tvItem.lParam] : null;
 	}
 	if (item != null) {
+		if ((style & SWT.VIRTUAL) != 0 && !item.cached) return;
 		item.clear ();
 		item.redraw ();
 	}
@@ -1702,9 +1703,21 @@
 	checkWidget ();
 	int /*long*/ hItem = OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_ROOT, 0);
 	if (hItem == 0) return;
-	TVITEM tvItem = new TVITEM ();
-	tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
-	clearAll (hItem, tvItem, all);
+	if (all) {
+		boolean redraw = false;
+		for (int i=0; i<items.length; i++) {
+			TreeItem item = items [i];
+			if (item != null && item != currentItem) {
+				item.clear ();
+				redraw = true;
+			}
+		}
+		if (redraw) OS.InvalidateRect (handle, null, true);
+	} else {
+		TVITEM tvItem = new TVITEM ();
+		tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
+		clearAll (hItem, tvItem, all);
+	}
 }
 
 void clearAll (int /*long*/ hItem, TVITEM tvItem, boolean all) {