Bug 398711 - NPE in AbstractTreeViewer.getSelection trying to select
non-expanded nodes
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 03ee3b5..71ad922 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
@@ -4317,6 +4317,7 @@
 		}
 		return;
 	}
+	expandToItem(item);
 	TVITEM tvItem = new TVITEM ();
 	tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
 	tvItem.stateMask = OS.TVIS_SELECTED;
@@ -4865,6 +4866,7 @@
 			}
 		} else {
 			if (index != selection.length) {
+				expandToItem(_getItem(hItem));
 				tvItem.state = OS.TVIS_SELECTED;
 				OS.SendMessage (handle, OS.TVM_SETITEM, 0, tvItem);
 			}
@@ -5015,6 +5017,7 @@
 					}
 				} else {
 					if (index != length) {
+						expandToItem(item);
 						tvItem.state = OS.TVIS_SELECTED;
 						OS.SendMessage (handle, OS.TVM_SETITEM, 0, tvItem);
 					}
@@ -5025,6 +5028,14 @@
 	OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, oldProc);
 }
 
+void expandToItem(TreeItem item) {
+	TreeItem parentItem = item.getParentItem();
+	if (parentItem != null && !parentItem.getExpanded()) {
+		expandToItem(parentItem);
+		parentItem.setExpanded(true);
+	}
+}
+
 /**
  * Sets the column used by the sort indicator for the receiver. A null
  * value will clear the sort indicator.  The current sort column is cleared