We need to send TVN_EXPAND* on collapsing either when the user has
initiated it with the mouse/keybaord or in response to a TVM_EXPAND
when the state is not TVIS_EXPANDEDONCE.  This brings the logic into
line with TREEVIEW_Expand.

diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index 2a025eb..833bfe8 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -3134,7 +3134,7 @@
     if (!(wineItem->state & TVIS_EXPANDED))
 	return FALSE;
 
-    if (bUser)
+    if (bUser || !(wineItem->state & TVIS_EXPANDEDONCE))
 	TREEVIEW_SendExpanding(infoPtr, wineItem, action);
 
     if (wineItem->firstChild == NULL)
@@ -3142,7 +3142,7 @@
 
     wineItem->state &= ~TVIS_EXPANDED;
 
-    if (bUser)
+    if (bUser || !(wineItem->state & TVIS_EXPANDEDONCE))
 	TREEVIEW_SendExpanded(infoPtr, wineItem, action);
 
     bSetSelection = (infoPtr->selectedItem != NULL
@@ -3153,9 +3153,11 @@
 
     if (bRemoveChildren)
     {
+        INT old_cChildren = wineItem->cChildren;
 	TRACE("TVE_COLLAPSERESET\n");
 	wineItem->state &= ~TVIS_EXPANDEDONCE;
 	TREEVIEW_RemoveAllChildren(infoPtr, wineItem);
+        wineItem->cChildren = old_cChildren;
     }
 
     if (wineItem->firstChild)