comctl32/treeview: Properly update image state index when TVS_CHECKBOXES is switched on.

This commit is contained in:
Nikolay Sivov 2011-05-14 16:21:33 +04:00 committed by Alexandre Julliard
parent f9b14fda02
commit 7ef4546cfb
2 changed files with 118 additions and 30 deletions

View File

@ -279,13 +279,13 @@ static LRESULT WINAPI TreeviewWndProc(HWND hwnd, UINT message, WPARAM wParam, LP
return ret;
}
static HWND create_treeview_control(void)
static HWND create_treeview_control(DWORD style)
{
WNDPROC pOldWndProc;
HWND hTree;
hTree = CreateWindowExA(WS_EX_CLIENTEDGE, WC_TREEVIEWA, NULL, WS_CHILD|WS_VISIBLE|
TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS|TVS_EDITLABELS,
TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS|TVS_EDITLABELS|style,
0, 0, 120, 100, hMainWnd, (HMENU)100, GetModuleHandleA(0), 0);
SetFocus(hTree);
@ -321,7 +321,7 @@ static void test_fillroot(void)
TVITEMA tvi;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -358,7 +358,7 @@ static void test_callback(void)
HWND hTree;
DWORD ret;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
ret = TreeView_DeleteAllItems(hTree);
expect(TRUE, ret);
@ -435,7 +435,7 @@ static void test_callback(void)
tvi.state = TVIS_SELECTED;
ret = TreeView_GetItem(hTree, &tvi);
expect(TRUE, ret);
todo_wine ok(tvi.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", tvi.state);
ok(tvi.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", tvi.state);
ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq,
"no TVN_GETDISPINFO for a state seq", FALSE);
@ -456,7 +456,7 @@ static void test_callback(void)
tvi.state = 0;
ret = TreeView_GetItem(hTree, &tvi);
expect(TRUE, ret);
todo_wine ok(tvi.state == (INDEXTOSTATEIMAGEMASK(1) | TVIS_FOCUSED), "got 0x%x\n", tvi.state);
ok(tvi.state == (INDEXTOSTATEIMAGEMASK(1) | TVIS_FOCUSED), "got 0x%x\n", tvi.state);
ok_sequence(sequences, PARENT_SEQ_INDEX, parent_get_dispinfo_seq,
"callback for state/overlay image index, noop seq", FALSE);
@ -486,7 +486,7 @@ static void test_select(void)
BOOL r;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
/* root-none select tests */
@ -553,7 +553,7 @@ static void test_getitemtext(void)
CHAR szBuffer[80] = "Blah";
int nBufferSize = sizeof(szBuffer)/sizeof(CHAR);
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -590,7 +590,7 @@ static void test_focus(void)
HWND hTree;
HWND hEdit;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -627,7 +627,7 @@ static void test_get_set_bkcolor(void)
COLORREF crColor = RGB(0,0,0);
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -660,7 +660,7 @@ static void test_get_set_imagelist(void)
HIMAGELIST hImageList = NULL;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -685,7 +685,7 @@ static void test_get_set_indent(void)
int ulMoreThanTwiceMin = -1;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -711,7 +711,7 @@ static void test_get_set_insertmark(void)
COLORREF crColor = RGB(0,0,0);
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -734,7 +734,7 @@ static void test_get_set_item(void)
DWORD ret;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
tviRoot.hItem = hRoot;
@ -785,7 +785,7 @@ static void test_get_set_itemheight(void)
int ulNewHeight = 0;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -846,7 +846,7 @@ static void test_get_set_scrolltime(void)
int ulTime = 0;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -867,7 +867,7 @@ static void test_get_set_textcolor(void)
COLORREF crColor = RGB(0,0,0);
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -900,7 +900,7 @@ static void test_get_set_tooltips(void)
HWND hPopupTreeView;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -927,7 +927,7 @@ static void test_get_set_unicodeformat(void)
BOOL bNewSetting = 0;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@ -1111,7 +1111,7 @@ static void test_expandinvisible(void)
LRESULT ret;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
/* The test builds the following tree and expands then node 1, while node 0 is collapsed.
*
@ -1184,7 +1184,7 @@ static void test_itemedit(void)
CHAR buff[2];
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
/* try with null item */
@ -1259,7 +1259,7 @@ static void test_get_linecolor(void)
COLORREF clr;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
/* newly created control has default color */
clr = (COLORREF)SendMessage(hTree, TVM_GETLINECOLOR, 0, 0);
@ -1276,7 +1276,7 @@ static void test_get_insertmarkcolor(void)
COLORREF clr;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
/* newly created control has default color */
clr = (COLORREF)SendMessage(hTree, TVM_GETINSERTMARKCOLOR, 0, 0);
@ -1294,7 +1294,7 @@ static void test_expandnotify(void)
BOOL ret;
TVITEMA item;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
item.hItem = hRoot;
@ -1344,7 +1344,7 @@ static void test_expandnotify(void)
DestroyWindow(hTree);
/* test TVM_GETITEMRECT inside TVN_ITEMEXPANDED notification */
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
g_get_rect_in_expand = TRUE;
ret = TreeView_Select(hTree, hChild, TVGN_CARET);
@ -1359,7 +1359,7 @@ static void test_expandedimage(void)
HWND hTree;
BOOL ret;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
item.mask = TVIF_EXPANDEDIMAGE;
@ -1397,7 +1397,7 @@ static void test_TVS_SINGLEEXPAND(void)
HWND hTree;
BOOL ret;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
SetWindowLongA(hTree, GWL_STYLE, GetWindowLong(hTree, GWL_STYLE) | TVS_SINGLEEXPAND);
/* to avoid paiting related notifications */
ShowWindow(hTree, SW_HIDE);
@ -1426,7 +1426,7 @@ static void test_WM_PAINT(void)
RECT rc;
HDC hdc;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
clr = SendMessageA(hTree, TVM_SETBKCOLOR, 0, RGB(255, 0, 0));
ok(clr == -1, "got %d, expected -1\n", clr);
@ -1457,7 +1457,7 @@ static void test_delete_items(void)
HWND hTree;
INT ret;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
/* check delete order */
@ -1504,7 +1504,7 @@ static void test_htreeitem_layout(void)
HTREEITEM item1, item2;
HWND hTree;
hTree = create_treeview_control();
hTree = create_treeview_control(0);
fill_tree(hTree);
/* root has some special pointer in parent field */
@ -1533,6 +1533,75 @@ static void test_htreeitem_layout(void)
DestroyWindow(hTree);
}
static void test_TVS_CHECKBOXES(void)
{
TVITEMA item;
HWND hTree;
DWORD ret;
hTree = create_treeview_control(0);
fill_tree(hTree);
item.hItem = hRoot;
item.mask = TVIF_STATE;
item.state = INDEXTOSTATEIMAGEMASK(1);
item.stateMask = TVIS_STATEIMAGEMASK;
ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
expect(TRUE, ret);
ok(item.state == 0, "got 0x%x\n", item.state);
/* set some index for a child */
item.hItem = hChild;
item.mask = TVIF_STATE;
item.state = INDEXTOSTATEIMAGEMASK(4);
item.stateMask = TVIS_STATEIMAGEMASK;
ret = SendMessageA(hTree, TVM_SETITEMA, 0, (LPARAM)&item);
expect(TRUE, ret);
/* enabling check boxes set all items to 1 state image index */
SetWindowLongA(hTree, GWL_STYLE, GetWindowLongA(hTree, GWL_STYLE) | TVS_CHECKBOXES);
item.hItem = hRoot;
item.mask = TVIF_STATE;
item.state = 0;
item.stateMask = TVIS_STATEIMAGEMASK;
ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
expect(TRUE, ret);
ok(item.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", item.state);
item.hItem = hChild;
item.mask = TVIF_STATE;
item.state = 0;
item.stateMask = TVIS_STATEIMAGEMASK;
ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
expect(TRUE, ret);
ok(item.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", item.state);
DestroyWindow(hTree);
/* the same, but initially created with TVS_CHECKBOXES */
hTree = create_treeview_control(TVS_CHECKBOXES);
fill_tree(hTree);
item.hItem = hRoot;
item.mask = TVIF_STATE;
item.state = 0;
item.stateMask = TVIS_STATEIMAGEMASK;
ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
expect(TRUE, ret);
ok(item.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", item.state);
item.hItem = hChild;
item.mask = TVIF_STATE;
item.state = 0;
item.stateMask = TVIS_STATEIMAGEMASK;
ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item);
expect(TRUE, ret);
ok(item.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", item.state);
DestroyWindow(hTree);
}
START_TEST(treeview)
{
HMODULE hComctl32;
@ -1602,6 +1671,7 @@ START_TEST(treeview)
test_WM_PAINT();
test_delete_items();
test_htreeitem_layout();
test_TVS_CHECKBOXES();
if (!load_v6_module(&ctx_cookie, &hCtx))
{

View File

@ -5428,6 +5428,21 @@ TREEVIEW_Size(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
return 0;
}
static void TREEVIEW_ResetImageStateIndex(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item)
{
TREEVIEW_ITEM *child = item->firstChild;
item->state &= ~TVIS_STATEIMAGEMASK;
item->state |= INDEXTOSTATEIMAGEMASK(1);
while (child)
{
TREEVIEW_ITEM *next = child->nextSibling;
TREEVIEW_ResetImageStateIndex(infoPtr, child);
child = next;
}
}
static LRESULT
TREEVIEW_StyleChanged(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
@ -5443,6 +5458,9 @@ TREEVIEW_StyleChanged(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
initialize_checkboxes(infoPtr);
TRACE("checkboxes enabled\n");
/* set all items to state image index 1 */
TREEVIEW_ResetImageStateIndex(infoPtr, infoPtr->root);
}
else
{