treeview: selection notification in tvm_deleteitem

Huw D M Davies h.davies1 at physics.ox.ac.uk
Wed Jan 21 06:51:34 CST 2004


        Huw Davies <huw at codeweavers.com>
        Move the selection to the previous sibling if it can't go to
        the next or the parent.
        Fix the selection change logic.
-- 
Huw Davies
huw at codeweavers.com
Index: dlls/comctl32/treeview.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/treeview.c,v
retrieving revision 1.141
diff -u -r1.141 treeview.c
--- dlls/comctl32/treeview.c	7 Jan 2004 00:47:35 -0000	1.141
+++ dlls/comctl32/treeview.c	21 Jan 2004 12:45:04 -0000
@@ -1440,8 +1440,7 @@
 static LRESULT
 TREEVIEW_DeleteItem(TREEVIEW_INFO *infoPtr, HTREEITEM wineItem)
 {
-    TREEVIEW_ITEM *oldSelection = infoPtr->selectedItem;
-    TREEVIEW_ITEM *newSelection = oldSelection;
+    TREEVIEW_ITEM *newSelection = NULL;
     TREEVIEW_ITEM *newFirstVisible = NULL;
     TREEVIEW_ITEM *parent, *prev = NULL;
     BOOL visible = FALSE;
@@ -1476,6 +1475,9 @@
 		newSelection = wineItem->nextSibling;
 	    else if (wineItem->parent != infoPtr->root)
 		newSelection = wineItem->parent;
+            else
+                newSelection = wineItem->prevSibling;
+            TRACE("newSelection = %p\n", newSelection);
 	}
 
 	if (infoPtr->firstVisible == wineItem)
@@ -1494,13 +1496,11 @@
 	TREEVIEW_RemoveItem(infoPtr, wineItem);
     }
 
-    /* Don't change if somebody else already has. */
-    if (oldSelection == infoPtr->selectedItem)
+    /* Don't change if somebody else already has (infoPtr->selectedItem is cleared by FreeItem). */
+    if (!infoPtr->selectedItem && newSelection)
     {
 	if (TREEVIEW_ValidItem(infoPtr, newSelection))
 	    TREEVIEW_DoSelectItem(infoPtr, TVGN_CARET, newSelection, TVC_UNKNOWN);
-	else
-	    infoPtr->selectedItem = 0;
     }
 
     /* Validate insertMark dropItem.



More information about the wine-patches mailing list