[PATCH] Some expand notifications tests

Nikolay Sivov nsivov at codeweavers.com
Wed Jun 9 16:32:06 CDT 2010


---
 dlls/comctl32/tests/treeview.c |  229 +++++++++++++++++++++++++++++++---------
 dlls/comctl32/treeview.c       |   10 +-
 2 files changed, 185 insertions(+), 54 deletions(-)

diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c
index 848d4ca..a0d8e77 100644
--- a/dlls/comctl32/tests/treeview.c
+++ b/dlls/comctl32/tests/treeview.c
@@ -34,12 +34,13 @@
 
 const char *TEST_CALLBACK_TEXT = "callback_text";
 
-#define NUM_MSG_SEQUENCES   1
+#define NUM_MSG_SEQUENCES   2
 #define TREEVIEW_SEQ_INDEX  0
+#define PARENT_SEQ_INDEX    1
 
 #define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got)
 
-static struct msg_sequence *MsgSequences[NUM_MSG_SEQUENCES];
+static struct msg_sequence *sequences[NUM_MSG_SEQUENCES];
 
 static const struct message FillRootSeq[] = {
     { TVM_INSERTITEM, sent },
@@ -184,6 +185,16 @@ static const struct message test_get_set_unicodeformat_seq[] = {
     { 0 }
 };
 
+static const struct message parent_expand_seq[] = {
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDING },
+    { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDED },
+    { 0 }
+};
+
+static const struct message empty_seq[] = {
+    { 0 }
+};
+
 static HWND hMainWnd;
 
 static HTREEITEM hRoot, hChild;
@@ -233,7 +244,7 @@ static LRESULT WINAPI TreeviewWndProc(HWND hwnd, UINT message, WPARAM wParam, LP
     if (defwndproc_counter) msg.flags |= defwinproc;
     msg.wParam = wParam;
     msg.lParam = lParam;
-    add_message(MsgSequences, TREEVIEW_SEQ_INDEX, &msg);
+    add_message(sequences, TREEVIEW_SEQ_INDEX, &msg);
 
     defwndproc_counter++;
     ret = CallWindowProcA(lpOldProc, hwnd, message, wParam, lParam);
@@ -286,7 +297,7 @@ static void test_fillroot(void)
 
     hTree = create_treeview_control();
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     fill_tree(hTree);
 
@@ -296,7 +307,7 @@ static void test_fillroot(void)
     AddItem('B');
     assert(hChild);
     AddItem('.');
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, FillRootSeq, "FillRoot", FALSE);
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, FillRootSeq, "FillRoot", FALSE);
     ok(!strcmp(sequence, "AB."), "Item creation\n");
 
     /* UMLPad 1.15 depends on this being not -1 (I_IMAGECALLBACK) */
@@ -386,7 +397,7 @@ static void test_select(void)
     fill_tree(hTree);
 
     /* root-none select tests */
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
     r = TreeView_SelectItem(hTree, NULL);
     expect(TRUE, r);
     Clear();
@@ -407,11 +418,11 @@ static void test_select(void)
     expect(TRUE, r);
     AddItem('.');
     ok(!strcmp(sequence, "1(nR)nR23(Rn)Rn45(nR)nR."), "root-none select test\n");
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, rootnone_select_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, rootnone_select_seq,
                 "root-none select seq", FALSE);
 
     /* root-child select tests */
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
     r = TreeView_SelectItem(hTree, NULL);
     expect(TRUE, r);
 
@@ -433,7 +444,7 @@ static void test_select(void)
     expect(TRUE, r);
     AddItem('.');
     ok(!strcmp(sequence, "1(nR)nR23(RC)RC45(CR)CR."), "root-child select test\n");
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, rootchild_select_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, rootchild_select_seq,
                 "root-child select seq", FALSE);
 
     DestroyWindow(hTree);
@@ -452,7 +463,7 @@ static void test_getitemtext(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* add an item without TVIF_TEXT mask and pszText == NULL */
     ins.hParent = hRoot;
@@ -472,7 +483,7 @@ static void test_getitemtext(void)
     SendMessageA( hTree, TVM_GETITEM, 0, (LPARAM)&tvi );
     ok(!strcmp(szBuffer, ""), "szBuffer=\"%s\", expected \"\"\n", szBuffer);
     ok(SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)hChild), "DeleteItem failed\n");
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, getitemtext_seq, "get item text seq", FALSE);
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, getitemtext_seq, "get item text seq", FALSE);
 
     DestroyWindow(hTree);
 }
@@ -489,7 +500,7 @@ static void test_focus(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* This test verifies that when a label is being edited, scrolling
      * the treeview does not cause the label to lose focus. To test
@@ -513,7 +524,7 @@ static void test_focus(void)
     hEdit = TreeView_EditLabel(hTree, hChild);
     ScrollWindowEx(hTree, -10, 0, NULL, NULL, NULL, NULL, SW_SCROLLCHILDREN);
     ok(GetFocus() == hEdit, "Edit control should have focus\n");
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, focus_seq, "focus test", TRUE);
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, focus_seq, "focus test", TRUE);
 
     DestroyWindow(hTree);
 }
@@ -526,7 +537,7 @@ static void test_get_set_bkcolor(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* If the value is -1, the control is using the system color for the background color. */
     crColor = (COLORREF)SendMessage( hTree, TVM_GETBKCOLOR, 0, 0 );
@@ -545,7 +556,7 @@ static void test_get_set_bkcolor(void)
     /* Reset the default background */
     SendMessage( hTree, TVM_SETBKCOLOR, 0, -1 );
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_bkcolor_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_bkcolor_seq,
         "test get set bkcolor", FALSE);
 
     DestroyWindow(hTree);
@@ -559,7 +570,7 @@ static void test_get_set_imagelist(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* Test a NULL HIMAGELIST */
     SendMessage( hTree, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hImageList );
@@ -568,7 +579,7 @@ static void test_get_set_imagelist(void)
 
     /* TODO: Test an actual image list */
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_imagelist_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_imagelist_seq,
         "test get imagelist", FALSE);
 
     DestroyWindow(hTree);
@@ -584,7 +595,7 @@ static void test_get_set_indent(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* Finding the minimum indent */
     SendMessage( hTree, TVM_SETINDENT, 0, 0 );
@@ -596,7 +607,7 @@ static void test_get_set_indent(void)
     ulIndent = (DWORD)SendMessage( hTree, TVM_GETINDENT, 0, 0 );
     ok(ulIndent == ulMoreThanTwiceMin, "Indent reported as %d, expected %d\n", ulIndent, ulMoreThanTwiceMin);
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_indent_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_indent_seq,
         "test get set indent", FALSE);
 
     DestroyWindow(hTree);
@@ -610,13 +621,13 @@ static void test_get_set_insertmark(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     SendMessage( hTree, TVM_SETINSERTMARKCOLOR, 0, crColor );
     crColor = (COLORREF)SendMessage( hTree, TVM_GETINSERTMARKCOLOR, 0, 0 );
     ok(crColor == RGB(0,0,0), "Insert mark color reported as 0x%.8x, expected 0x00000000\n", crColor);
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_insertmarkcolor_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_insertmarkcolor_seq,
         "test get set insertmark color", FALSE);
 
     DestroyWindow(hTree);
@@ -632,7 +643,7 @@ static void test_get_set_item(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* Test the root item */
     tviRoot.hItem = hRoot;
@@ -654,7 +665,7 @@ static void test_get_set_item(void)
     strncpy(szBuffer, "Root", nBufferSize);
     SendMessage( hTree, TVM_SETITEM, 0, (LPARAM)&tviRoot );
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_item_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_item_seq,
         "test get set item", FALSE);
 
     DestroyWindow(hTree);
@@ -669,7 +680,7 @@ static void test_get_set_itemheight(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* Assuming default height to begin with */
     ulOldHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 );
@@ -689,7 +700,7 @@ static void test_get_set_itemheight(void)
     ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 );
     ok(ulNewHeight == 8, "Uneven height not set properly, reported %d, expected %d\n", ulNewHeight, 8);
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_itemheight_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_itemheight_seq,
         "test get set item height", FALSE);
 
     DestroyWindow(hTree);
@@ -704,13 +715,13 @@ static void test_get_set_scrolltime(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     SendMessage( hTree, TVM_SETSCROLLTIME, ulExpectedTime, 0 );
     ulTime = (int)SendMessage( hTree, TVM_GETSCROLLTIME, 0, 0 );
     ok(ulTime == ulExpectedTime, "Scroll time reported as %d, expected %d\n", ulTime, ulExpectedTime);
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_scrolltime_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_scrolltime_seq,
         "test get set scroll time", FALSE);
 
     DestroyWindow(hTree);
@@ -725,7 +736,7 @@ static void test_get_set_textcolor(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     crColor = (COLORREF)SendMessage( hTree, TVM_GETTEXTCOLOR, 0, 0 );
     ok(crColor == -1, "Default text color reported as 0x%.8x\n", crColor);
@@ -743,7 +754,7 @@ static void test_get_set_textcolor(void)
     /* Reset the default text color */
     SendMessage( hTree, TVM_SETTEXTCOLOR, 0, CLR_NONE );
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_textcolor_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_textcolor_seq,
         "test get set text color", FALSE);
 
     DestroyWindow(hTree);
@@ -758,7 +769,7 @@ static void test_get_set_tooltips(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* show even WS_POPUP treeview don't send NM_TOOLTIPSCREATED */
     hPopupTreeView = CreateWindow(WC_TREEVIEW, NULL, WS_POPUP|WS_VISIBLE, 0, 0, 100, 100, hMainWnd, NULL, NULL, NULL);
@@ -769,7 +780,7 @@ static void test_get_set_tooltips(void)
     hwndLastToolTip = (HWND)SendMessage( hTree, TVM_GETTOOLTIPS, 0, 0 );
     ok(hwndLastToolTip == NULL, "NULL tool tip, reported as 0x%p, expected 0.\n", hwndLastToolTip);
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_tooltips_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_tooltips_seq,
         "test get set tooltips", TRUE);
 
     /* TODO: Add a test of an actual tooltip */
@@ -785,7 +796,7 @@ static void test_get_set_unicodeformat(void)
     hTree = create_treeview_control();
     fill_tree(hTree);
 
-    flush_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
 
     /* Set to Unicode */
     bPreviousSetting = (BOOL)SendMessage( hTree, TVM_SETUNICODEFORMAT, 1, 0 );
@@ -800,54 +811,117 @@ static void test_get_set_unicodeformat(void)
     /* Revert to original setting */
     SendMessage( hTree, TVM_SETUNICODEFORMAT, bPreviousSetting, 0 );
 
-    ok_sequence(MsgSequences, TREEVIEW_SEQ_INDEX, test_get_set_unicodeformat_seq,
+    ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_unicodeformat_seq,
         "test get set unicode format", FALSE);
 
     DestroyWindow(hTree);
 }
 
-static LRESULT CALLBACK MyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+static TVITEMA g_item_expanding, g_item_expanded;
+static BOOL g_get_from_expand;
+
+static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
-    switch(msg) {
+    static LONG defwndproc_counter = 0;
+    struct message msg;
+    LRESULT ret;
+
+    msg.message = message;
+    msg.flags = sent|wparam|lparam;
+    if (defwndproc_counter) msg.flags |= defwinproc;
+    msg.wParam = wParam;
+    msg.lParam = lParam;
+    if (message == WM_NOTIFY && lParam) msg.id = ((NMHDR*)lParam)->code;
+
+    /* log system messages, except for painting */
+    if (message < WM_USER &&
+        message != WM_PAINT &&
+        message != WM_ERASEBKGND &&
+        message != WM_NCPAINT &&
+        message != WM_NCHITTEST &&
+        message != WM_GETTEXT &&
+        message != WM_GETICON &&
+        message != WM_DEVICECHANGE)
+    {
+        trace("parent: %p, %04x, %08lx, %08lx\n", hWnd, message, wParam, lParam);
+        add_message(sequences, PARENT_SEQ_INDEX, &msg);
+    }
+
+    switch(message) {
     case WM_NOTIFY:
     {
         NMHDR *pHdr = (NMHDR *)lParam;
     
-        ok(pHdr->code != NM_FIRST - 19, "Treeview should not send NM_TOOLTIPSCREATED\n");
-        if (pHdr->idFrom == 100) {
+        ok(pHdr->code != NM_TOOLTIPSCREATED, "Treeview should not send NM_TOOLTIPSCREATED\n");
+        if (pHdr->idFrom == 100)
+        {
             NMTREEVIEWA *pTreeView = (LPNMTREEVIEWA) lParam;
-            switch(pHdr->code) {
+            switch(pHdr->code)
+            {
             case TVN_SELCHANGINGA:
                 AddItem('(');
                 IdentifyItem(pTreeView->itemOld.hItem);
                 IdentifyItem(pTreeView->itemNew.hItem);
-                return 0;
+                break;
             case TVN_SELCHANGEDA:
                 AddItem(')');
                 IdentifyItem(pTreeView->itemOld.hItem);
                 IdentifyItem(pTreeView->itemNew.hItem);
-                return 0;
+                break;
             case TVN_GETDISPINFOA: {
                 NMTVDISPINFOA *disp = (NMTVDISPINFOA *)lParam;
                 if (disp->item.mask & TVIF_TEXT) {
                     lstrcpyn(disp->item.pszText, TEST_CALLBACK_TEXT, disp->item.cchTextMax);
                 }
-                return 0;
+                break;
               }
             case TVN_ENDLABELEDIT: return TRUE;
+            case TVN_ITEMEXPANDING:
+                ok(pTreeView->itemNew.mask ==
+                   (TVIF_HANDLE | TVIF_SELECTEDIMAGE | TVIF_IMAGE | TVIF_PARAM | TVIF_STATE),
+                   "got wrong mask %x\n", pTreeView->itemNew.mask);
+                ok((pTreeView->itemNew.state & TVIS_EXPANDED) == 0,
+                   "got wrong state %x\n", pTreeView->itemNew.state);
+                ok(pTreeView->itemOld.mask == 0,
+                   "got wrong mask %x\n", pTreeView->itemOld.mask);
+
+                if (g_get_from_expand)
+                {
+                  g_item_expanding.mask = TVIF_STATE;
+                  g_item_expanding.hItem = hRoot;
+                  ret = SendMessageA(pHdr->hwndFrom, TVM_GETITEMA, 0, (LPARAM)&g_item_expanding);
+                  ok(ret == TRUE, "got %lu\n", ret);
+                }
+                break;
+            case TVN_ITEMEXPANDED:
+                ok(pTreeView->itemNew.mask & TVIF_STATE, "got wrong mask %x\n", pTreeView->itemNew.mask);
+                ok(pTreeView->itemNew.state & (TVIS_EXPANDED|TVIS_EXPANDEDONCE),
+                   "got wrong mask %x\n", pTreeView->itemNew.mask);
+                ok(pTreeView->itemOld.mask == 0,
+                   "got wrong mask %x\n", pTreeView->itemOld.mask);
+
+                if (g_get_from_expand)
+                {
+                  g_item_expanded.mask = TVIF_STATE;
+                  g_item_expanded.hItem = hRoot;
+                  ret = SendMessageA(pHdr->hwndFrom, TVM_GETITEMA, 0, (LPARAM)&g_item_expanded);
+                  ok(ret == TRUE, "got %lu\n", ret);
+                }
+                break;
             }
         }
-        return 0;
     }
-  
+
     case WM_DESTROY:
         PostQuitMessage(0);
         break;
-  
-    default:
-        return DefWindowProcA(hWnd, msg, wParam, lParam);
     }
-    return 0L;
+
+    defwndproc_counter++;
+    ret = DefWindowProcA(hWnd, message, wParam, lParam);
+    defwndproc_counter--;
+
+    return ret;
 }
 
 static void test_expandinvisible(void)
@@ -1037,6 +1111,62 @@ static void test_get_insertmarkcolor(void)
     DestroyWindow(hTree);
 }
 
+static void test_expandnotify(void)
+{
+    HWND hTree;
+    BOOL ret;
+    TVITEMA item;
+
+    hTree = create_treeview_control();
+    fill_tree(hTree);
+
+    item.hItem = hRoot;
+    item.mask = TVIF_STATE;
+
+    item.state = TVIS_EXPANDED;
+    ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
+    ok(ret == TRUE, "got %d\n", ret);
+    ok((item.state & TVIS_EXPANDED) == 0, "expected collapsed\n");
+
+    /* preselect root node here */
+    ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hRoot);
+    ok(ret == TRUE, "got %d\n", ret);
+
+    g_get_from_expand = TRUE;
+    /* expand */
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+    g_item_expanding.state = 0xdeadbeef;
+    g_item_expanded.state = 0xdeadbeef;
+    ret = SendMessageA(hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)hRoot);
+    ok(ret == TRUE, "got %d\n", ret);
+    ok(g_item_expanding.state == TVIS_SELECTED, "got state on TVN_ITEMEXPANDING 0x%08x\n",
+       g_item_expanding.state);
+    ok(g_item_expanded.state == (TVIS_SELECTED|TVIS_EXPANDED), "got state on TVN_ITEMEXPANDED 0x%08x\n",
+       g_item_expanded.state);
+    ok_sequence(sequences, PARENT_SEQ_INDEX, parent_expand_seq, "expand notifications", FALSE);
+    g_get_from_expand = FALSE;
+
+    /* check that it's expanded */
+    item.state = TVIS_EXPANDED;
+    ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
+    ok(ret == TRUE, "got %d\n", ret);
+    ok((item.state & TVIS_EXPANDED) == TVIS_EXPANDED, "expected expanded\n");
+
+    /* collapse */
+    flush_sequences(sequences, NUM_MSG_SEQUENCES);
+    ret = SendMessageA(hTree, TVM_EXPAND, TVE_COLLAPSE, (LPARAM)hRoot);
+    ok(ret == TRUE, "got %d\n", ret);
+    item.state = TVIS_EXPANDED;
+    ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
+    ok(ret == TRUE, "got %d\n", ret);
+    ok((item.state & TVIS_EXPANDED) == 0, "expected collapsed\n");
+    /* all next collapse/expand attempts won't produce any notifications,
+       the only way is to reset with all children removed */
+    ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "collapse after expand notifications", FALSE);
+
+    DestroyWindow(hTree);
+}
+
 START_TEST(treeview)
 {
     HMODULE hComctl32;
@@ -1056,7 +1186,7 @@ START_TEST(treeview)
     else
         InitCommonControls();
 
-    init_msg_sequences(MsgSequences, NUM_MSG_SEQUENCES);
+    init_msg_sequences(sequences, NUM_MSG_SEQUENCES);
   
     wc.style = CS_HREDRAW | CS_VREDRAW;
     wc.cbClsExtra = 0;
@@ -1067,7 +1197,7 @@ START_TEST(treeview)
     wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
     wc.lpszMenuName = NULL;
     wc.lpszClassName = "MyTestWnd";
-    wc.lpfnWndProc = MyWndProc;
+    wc.lpfnWndProc = parent_wnd_proc;
     RegisterClassA(&wc);
 
     hMainWnd = CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW,
@@ -1096,6 +1226,7 @@ START_TEST(treeview)
     test_expandinvisible();
     test_itemedit();
     test_treeview_classinfo();
+    test_expandnotify();
 
     PostMessageA(hMainWnd, WM_CLOSE, 0, 0);
     while(GetMessageA(&msg,0,0,0)) {
diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c
index 8022556..5adbb30 100644
--- a/dlls/comctl32/treeview.c
+++ b/dlls/comctl32/treeview.c
@@ -2875,7 +2875,7 @@ TREEVIEW_Paint(TREEVIEW_INFO *infoPtr, HDC hdc_ref)
     PAINTSTRUCT ps;
     RECT rc;
 
-    TRACE("\n");
+    TRACE("(%p %p)\n", infoPtr, hdc_ref);
 
     if (hdc_ref)
     {
@@ -3280,7 +3280,7 @@ TREEVIEW_Expand(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
     RECT scrollRect;
     TREEVIEW_ITEM *nextItem, *tmpItem;
 
-    TRACE("\n");
+    TRACE("(%p, %p, partial=%d, %d\n", infoPtr, wineItem, bExpandPartial, bUser);
 
     if (wineItem->state & TVIS_EXPANDED)
        return TRUE;
@@ -3422,9 +3422,9 @@ TREEVIEW_ExpandMsg(TREEVIEW_INFO *infoPtr, UINT flag, HTREEITEM wineItem)
     if (!TREEVIEW_ValidItem(infoPtr, wineItem))
 	return 0;
 
-    TRACE("For (%s) item:%d, flags %x, state:%d\n",
-	      TREEVIEW_ItemName(wineItem), flag,
-	      TREEVIEW_GetItemIndex(infoPtr, wineItem), wineItem->state);
+    TRACE("For (%s) item:%d, flags 0x%x, state:%d\n",
+	      TREEVIEW_ItemName(wineItem), TREEVIEW_GetItemIndex(infoPtr, wineItem),
+              flag, wineItem->state);
 
     switch (flag & TVE_TOGGLE)
     {
-- 
1.5.6.5


--------------030504050801030306060009--



More information about the wine-patches mailing list