treeview: EnsureVisible fix

Huw D M Davies h.davies1 at physics.ox.ac.uk
Wed Nov 26 06:41:56 CST 2003


Alexandre, please apply after 'treeview: GetItemT'

        Ulrich Czekalla <ulrich at codeweavers.com>
        In TREEVIEW_EnsureVisible handle case where firstVisble is NULL
-- 
Huw Davies
huw at codeweavers.com
--- winehq.orig/dlls/comctl32/treeview.c	2003-11-26 12:26:57.000000000 +0000
+++ winehq/dlls/comctl32/treeview.c	2003-11-26 12:35:59.000000000 +0000
@@ -4382,8 +4382,10 @@ static INT TREEVIEW_ProcessLetterKeys(
 static LRESULT
 TREEVIEW_EnsureVisible(TREEVIEW_INFO *infoPtr, HTREEITEM item, BOOL bHScroll)
 {
+    int viscount;
+    BOOL hasFirstVisible = infoPtr->firstVisible != NULL;
     HTREEITEM newFirstVisible = NULL;
-    int visible_pos;
+    int visible_pos = -1;
 
     if (!TREEVIEW_ValidItem(infoPtr, item))
 	return FALSE;
@@ -4408,23 +4410,26 @@ TREEVIEW_EnsureVisible(TREEVIEW_INFO *in
 	}
     }
 
-    TRACE("%p (%s) %ld - %ld\n", item, TREEVIEW_ItemName(item), item->visibleOrder,
-	  infoPtr->firstVisible->visibleOrder);
+    viscount = TREEVIEW_GetVisibleCount(infoPtr);
 
-    visible_pos = item->visibleOrder - infoPtr->firstVisible->visibleOrder;
+    TRACE("%p (%s) %ld - %ld viscount(%d)\n", item, TREEVIEW_ItemName(item), item->visibleOrder, 
+        hasFirstVisible ? infoPtr->firstVisible->visibleOrder : -1, viscount);
+
+    if (hasFirstVisible)
+        visible_pos = item->visibleOrder - infoPtr->firstVisible->visibleOrder;
 
     if (visible_pos < 0)
     {
 	/* item is before the start of the list: put it at the top. */
 	newFirstVisible = item;
     }
-    else if (visible_pos >= TREEVIEW_GetVisibleCount(infoPtr)
+    else if (visible_pos >= viscount
 	     /* Sometimes, before we are displayed, GVC is 0, causing us to
 	      * spuriously scroll up. */
 	     && visible_pos > 0)
     {
 	/* item is past the end of the list. */
-	int scroll = visible_pos - TREEVIEW_GetVisibleCount(infoPtr);
+	int scroll = visible_pos - viscount;
 
 	newFirstVisible = TREEVIEW_GetListItem(infoPtr, infoPtr->firstVisible,
 					       scroll + 1);



More information about the wine-patches mailing list