From 5a6f956187027e1c2e3f2644ee103b7aa3d2ee87 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Florian=20K=C3=B6berle?= Date: Tue, 21 Apr 2009 12:03:42 +0200 Subject: [PATCH] comctl32: Fix expanding of invisible sub trees. --- dlls/comctl32/tests/treeview.c | 3 -- dlls/comctl32/treeview.c | 83 ++++++++++++++++++++++-------------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c index 8939a779747..05a52373ac3 100644 --- a/dlls/comctl32/tests/treeview.c +++ b/dlls/comctl32/tests/treeview.c @@ -810,13 +810,10 @@ static void TestExpandInvisible(void) nodeVisible = TreeView_GetItemRect(hTree, node[1], &dummyRect, FALSE); ok(!nodeVisible, "Node 1 should not be visible.\n"); nodeVisible = TreeView_GetItemRect(hTree, node[2], &dummyRect, FALSE); -todo_wine ok(!nodeVisible, "Node 2 should not be visible.\n"); nodeVisible = TreeView_GetItemRect(hTree, node[3], &dummyRect, FALSE); -todo_wine ok(!nodeVisible, "Node 3 should not be visible.\n"); nodeVisible = TreeView_GetItemRect(hTree, node[4], &dummyRect, FALSE); -todo_wine ok(!nodeVisible, "Node 4 should not be visible.\n"); } diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c index 43ae7b67556..4aa57250c93 100644 --- a/dlls/comctl32/treeview.c +++ b/dlls/comctl32/treeview.c @@ -3292,56 +3292,59 @@ TREEVIEW_Expand(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem, if (bExpandPartial) FIXME("TVE_EXPANDPARTIAL not implemented\n"); - TREEVIEW_RecalculateVisibleOrder(infoPtr, wineItem); - TREEVIEW_UpdateSubTree(infoPtr, wineItem); - TREEVIEW_UpdateScrollBars(infoPtr); - - scrollRect.left = 0; - scrollRect.bottom = infoPtr->treeHeight; - scrollRect.right = infoPtr->clientWidth; - if (nextItem) + if (ISVISIBLE(wineItem)) { - scrollDist = nextItem->rect.top - orgNextTop; - scrollRect.top = orgNextTop; + TREEVIEW_RecalculateVisibleOrder(infoPtr, wineItem); + TREEVIEW_UpdateSubTree(infoPtr, wineItem); + TREEVIEW_UpdateScrollBars(infoPtr); - ScrollWindowEx (infoPtr->hwnd, 0, scrollDist, &scrollRect, NULL, - NULL, NULL, SW_ERASE | SW_INVALIDATE); - TREEVIEW_Invalidate (infoPtr, wineItem); - } else { - scrollRect.top = wineItem->rect.top; - InvalidateRect(infoPtr->hwnd, &scrollRect, FALSE); - } + scrollRect.left = 0; + scrollRect.bottom = infoPtr->treeHeight; + scrollRect.right = infoPtr->clientWidth; + if (nextItem) + { + scrollDist = nextItem->rect.top - orgNextTop; + scrollRect.top = orgNextTop; + + ScrollWindowEx (infoPtr->hwnd, 0, scrollDist, &scrollRect, NULL, + NULL, NULL, SW_ERASE | SW_INVALIDATE); + TREEVIEW_Invalidate (infoPtr, wineItem); + } else { + scrollRect.top = wineItem->rect.top; + InvalidateRect(infoPtr->hwnd, &scrollRect, FALSE); + } - /* Scroll up so that as many children as possible are visible. - * This fails when expanding causes an HScroll bar to appear, but we - * don't know that yet, so the last item is obscured. */ - if (wineItem->firstChild != NULL) - { - int nChildren = wineItem->lastChild->visibleOrder - - wineItem->firstChild->visibleOrder + 1; + /* Scroll up so that as many children as possible are visible. + * This fails when expanding causes an HScroll bar to appear, but we + * don't know that yet, so the last item is obscured. */ + if (wineItem->firstChild != NULL) + { + int nChildren = wineItem->lastChild->visibleOrder + - wineItem->firstChild->visibleOrder + 1; - int visible_pos = wineItem->visibleOrder - - infoPtr->firstVisible->visibleOrder; + int visible_pos = wineItem->visibleOrder + - infoPtr->firstVisible->visibleOrder; - int rows_below = TREEVIEW_GetVisibleCount(infoPtr) - visible_pos - 1; + int rows_below = TREEVIEW_GetVisibleCount(infoPtr) - visible_pos - 1; - if (visible_pos > 0 && nChildren > rows_below) - { - int scroll = nChildren - rows_below; + if (visible_pos > 0 && nChildren > rows_below) + { + int scroll = nChildren - rows_below; - if (scroll > visible_pos) - scroll = visible_pos; + if (scroll > visible_pos) + scroll = visible_pos; - if (scroll > 0) - { - TREEVIEW_ITEM *newFirstVisible - = TREEVIEW_GetListItem(infoPtr, infoPtr->firstVisible, - scroll); + if (scroll > 0) + { + TREEVIEW_ITEM *newFirstVisible + = TREEVIEW_GetListItem(infoPtr, infoPtr->firstVisible, + scroll); - TREEVIEW_SetFirstVisible(infoPtr, newFirstVisible, TRUE); - } - } + TREEVIEW_SetFirstVisible(infoPtr, newFirstVisible, TRUE); + } + } + } } return TRUE; -- 2.11.4.GIT