Author: akhaldi
Date: Wed Jul 22 19:30:52 2015
New Revision: 68554
URL:
http://svn.reactos.org/svn/reactos?rev=68554&view=rev
Log:
[COMCTL32_WINETEST] Sync with Wine Staging 1.7.47. CORE-9924
Modified:
trunk/rostests/winetests/comctl32/button.c
trunk/rostests/winetests/comctl32/listview.c
trunk/rostests/winetests/comctl32/monthcal.c
trunk/rostests/winetests/comctl32/propsheet.c
trunk/rostests/winetests/comctl32/toolbar.c
trunk/rostests/winetests/comctl32/tooltips.c
trunk/rostests/winetests/comctl32/treeview.c
Modified: trunk/rostests/winetests/comctl32/button.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/comctl32/button…
==============================================================================
--- trunk/rostests/winetests/comctl32/button.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/comctl32/button.c [iso-8859-1] Wed Jul 22 19:30:52 2015
@@ -321,6 +321,7 @@
{ WM_PAINT, sent },
{ WM_NCPAINT, sent|defwinproc|optional }, /* FIXME: Wine sends it */
{ WM_ERASEBKGND, sent|defwinproc|optional },
+ { WM_PAINT, sent|optional },
{ 0 }
};
@@ -368,6 +369,7 @@
{ WM_PAINT, sent },
{ WM_NCPAINT, sent|optional }, /* FIXME: Wine sends it */
{ WM_ERASEBKGND, sent|defwinproc|optional },
+ { WM_PAINT, sent|optional },
{ 0 }
};
@@ -429,6 +431,7 @@
{
{ BM_SETCHECK, sent },
{ WM_APP, sent|wparam|lparam, 0, 0 },
+ { WM_PAINT, sent|optional },
{ 0 }
};
Modified: trunk/rostests/winetests/comctl32/listview.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/comctl32/listvi…
==============================================================================
--- trunk/rostests/winetests/comctl32/listview.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/comctl32/listview.c [iso-8859-1] Wed Jul 22 19:30:52 2015
@@ -179,6 +179,16 @@
static const struct message listview_getorderarray_seq[] = {
{ LVM_GETCOLUMNORDERARRAY, sent|id|wparam, 2, 0, LISTVIEW_ID },
{ HDM_GETORDERARRAY, sent|id|wparam, 2, 0, HEADER_ID },
+ { LVM_GETCOLUMNORDERARRAY, sent|id|wparam, 0, 0, LISTVIEW_ID },
+ { HDM_GETORDERARRAY, sent|id|wparam, 0, 0, HEADER_ID },
+ { 0 }
+};
+
+static const struct message listview_setorderarray_seq[] = {
+ { LVM_SETCOLUMNORDERARRAY, sent|id|wparam, 2, 0, LISTVIEW_ID },
+ { HDM_SETORDERARRAY, sent|id|wparam, 2, 0, HEADER_ID },
+ { LVM_SETCOLUMNORDERARRAY, sent|id|wparam, 0, 0, LISTVIEW_ID },
+ { HDM_SETORDERARRAY, sent|id|wparam, 0, 0, HEADER_ID },
{ 0 }
};
@@ -1416,13 +1426,28 @@
static void test_columns(void)
{
- HWND hwnd;
+ HWND hwnd, header;
LVCOLUMNA column;
LVITEMA item;
INT order[2];
CHAR buff[5];
DWORD rc;
+ hwnd = CreateWindowExA(0, "SysListView32", "foo", LVS_LIST,
+ 10, 10, 100, 200, hwndparent, NULL, NULL, NULL);
+ ok(hwnd != NULL, "failed to create listview window\n");
+
+ header = (HWND)SendMessageA(hwnd, LVM_GETHEADER, 0, 0);
+ ok(header == NULL, "got %p\n", header);
+
+ rc = SendMessageA(hwnd, LVM_GETCOLUMNORDERARRAY, 2, (LPARAM)&order);
+ ok(rc == 0, "got %d\n", rc);
+
+ header = (HWND)SendMessageA(hwnd, LVM_GETHEADER, 0, 0);
+ ok(header == NULL, "got %p\n", header);
+
+ DestroyWindow(hwnd);
+
hwnd = CreateWindowExA(0, "SysListView32", "foo", LVS_REPORT,
10, 10, 100, 200, hwndparent, NULL, NULL, NULL);
ok(hwnd != NULL, "failed to create listview window\n");
@@ -1460,7 +1485,23 @@
ok(order[0] == 0, "Expected order 0, got %d\n", order[0]);
ok(order[1] == 1, "Expected order 1, got %d\n", order[1]);
+ rc = SendMessageA(hwnd, LVM_GETCOLUMNORDERARRAY, 0, 0);
+ expect(0, rc);
+
ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_getorderarray_seq, "get
order array", FALSE);
+
+ /* LVM_SETCOLUMNORDERARRAY */
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+
+ order[0] = 0;
+ order[1] = 1;
+ rc = SendMessageA(hwnd, LVM_SETCOLUMNORDERARRAY, 2, (LPARAM)&order);
+ expect(1, rc);
+
+ rc = SendMessageA(hwnd, LVM_SETCOLUMNORDERARRAY, 0, 0);
+ expect(0, rc);
+
+ ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_setorderarray_seq, "set
order array", FALSE);
/* after column added subitem is considered as present */
insert_item(hwnd, 0);
@@ -3877,7 +3918,6 @@
LVCOLUMNA col;
INT order[2];
POINT pt;
- HDC hdc;
/* rectangle isn't empty for empty text items */
hwnd = create_listview_control(LVS_LIST);
@@ -3891,9 +3931,9 @@
expect(TRUE, r);
expect(0, rect.left);
expect(0, rect.top);
- hdc = GetDC(hwnd);
- todo_wine expect(((GetDeviceCaps(hdc, LOGPIXELSX) + 15) / 16) * 16, rect.right);
- ReleaseDC(hwnd, hdc);
+ /* estimate it as width / height ratio */
+todo_wine
+ ok((rect.right / rect.bottom) >= 5, "got right %d, bottom %d\n",
rect.right, rect.bottom);
DestroyWindow(hwnd);
hwnd = create_listview_control(LVS_REPORT);
@@ -4557,6 +4597,12 @@
style = GetWindowLongPtrA(hwnd, GWL_STYLE);
ok(style & LVS_LIST, "Expected style to be preserved\n");
+ /* now change window style to see if view is remapped */
+ style = GetWindowLongPtrA(hwnd, GWL_STYLE);
+ SetWindowLongPtrA(hwnd, GWL_STYLE, style | LVS_SHOWSELALWAYS);
+ ret = SendMessageA(hwnd, LVM_GETVIEW, 0, 0);
+ expect(LV_VIEW_SMALLICON, ret);
+
DestroyWindow(hwnd);
}
@@ -4789,6 +4835,36 @@
DestroyWindow(hwnd);
}
+static INT get_current_font_height(HWND listview)
+{
+ TEXTMETRICA tm;
+ HFONT hfont;
+ HWND hwnd;
+ HDC hdc;
+
+ hwnd = (HWND)SendMessageA(listview, LVM_GETHEADER, 0, 0);
+ if (!hwnd)
+ hwnd = listview;
+
+ hfont = (HFONT)SendMessageA(hwnd, WM_GETFONT, 0, 0);
+ if (!hfont) {
+ hdc = GetDC(hwnd);
+ GetTextMetricsA(hdc, &tm);
+ ReleaseDC(hwnd, hdc);
+ }
+ else {
+ HFONT oldfont;
+
+ hdc = GetDC(0);
+ oldfont = SelectObject(hdc, hfont);
+ GetTextMetricsA(hdc, &tm);
+ SelectObject(hdc, oldfont);
+ ReleaseDC(0, hdc);
+ }
+
+ return tm.tmHeight;
+}
+
static void test_getcolumnwidth(void)
{
HWND hwnd;
@@ -4796,7 +4872,7 @@
DWORD_PTR style;
LVCOLUMNA col;
LVITEMA itema;
- HDC hdc;
+ INT height;
/* default column width */
hwnd = create_listview_control(LVS_ICON);
@@ -4820,9 +4896,8 @@
memset(&itema, 0, sizeof(itema));
SendMessageA(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&itema);
ret = SendMessageA(hwnd, LVM_GETCOLUMNWIDTH, 0, 0);
- hdc = GetDC(hwnd);
- todo_wine expect(((GetDeviceCaps(hdc, LOGPIXELSX) + 15) / 16) * 16, ret);
- ReleaseDC(hwnd, hdc);
+ height = get_current_font_height(hwnd);
+ ok((ret / height) >= 6, "got width %d, height %d\n", ret, height);
DestroyWindow(hwnd);
}
@@ -5106,10 +5181,18 @@
static void test_hover(void)
{
- HWND hwnd;
+ HWND hwnd, fg;
DWORD r;
hwnd = create_listview_control(LVS_ICON);
+ SetForegroundWindow(hwndparent);
+ fg = GetForegroundWindow();
+ if (fg != hwndparent)
+ {
+ skip("Window is not in the foreground. Skipping hover tests.\n");
+ DestroyWindow(hwnd);
+ return;
+ }
/* test WM_MOUSEHOVER forwarding */
flush_sequences(sequences, NUM_MSG_SEQUENCES);
@@ -5638,6 +5721,30 @@
state = SendMessageA(hwnd, LVM_GETITEMSTATE, 1, LVIS_FOCUSED);
ok(state == LVIS_FOCUSED, "got %x\n", state);
+ DestroyWindow(hwnd);
+}
+
+static void test_header_proc(void)
+{
+ HWND hwnd, header, hdr;
+ WNDPROC proc1, proc2;
+
+ hwnd = create_listview_control(LVS_REPORT);
+
+ header = (HWND)SendMessageA(hwnd, LVM_GETHEADER, 0, 0);
+ ok(header != NULL, "got %p\n", header);
+
+ hdr = CreateWindowExA(0, WC_HEADERA, NULL,
+ WS_BORDER|WS_VISIBLE|HDS_BUTTONS|HDS_HORZ,
+ 0, 0, 0, 0,
+ NULL, NULL, NULL, NULL);
+ ok(hdr != NULL, "got %p\n", hdr);
+
+ proc1 = (WNDPROC)GetWindowLongPtrW(header, GWLP_WNDPROC);
+ proc2 = (WNDPROC)GetWindowLongPtrW(hdr, GWLP_WNDPROC);
+ ok(proc1 == proc2, "got %p, expected %p\n", proc1, proc2);
+
+ DestroyWindow(hdr);
DestroyWindow(hwnd);
}
@@ -5709,6 +5816,7 @@
test_imagelists();
test_deleteitem();
test_insertitem();
+ test_header_proc();
if (!load_v6_module(&ctx_cookie, &hCtx))
{
@@ -5726,6 +5834,7 @@
test_deleteitem();
test_multiselect();
test_insertitem();
+ test_header_proc();
unload_v6_module(ctx_cookie, hCtx);
Modified: trunk/rostests/winetests/comctl32/monthcal.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/comctl32/monthc…
==============================================================================
--- trunk/rostests/winetests/comctl32/monthcal.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/comctl32/monthcal.c [iso-8859-1] Wed Jul 22 19:30:52 2015
@@ -615,7 +615,9 @@
static HWND create_monthcal_control(DWORD style)
{
WNDPROC oldproc;
- HWND hwnd;
+ RECT rect;
+ HWND hwnd;
+ BOOL ret;
hwnd = CreateWindowExA(0, MONTHCAL_CLASSA, "", WS_CHILD | WS_BORDER |
WS_VISIBLE | style,
0, 0, 300, 400, parent_wnd, NULL, GetModuleHandleA(NULL), NULL);
@@ -627,6 +629,13 @@
SetWindowLongPtrA(hwnd, GWLP_USERDATA, (LONG_PTR)oldproc);
SendMessageA(hwnd, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FONT), 0);
+
+ /* make sure calendar grid is 2x1 */
+ ret = SendMessageA(hwnd, MCM_GETMINREQRECT, 0, (LPARAM)&rect);
+ ok(ret, "got %d\n", ret);
+
+ ret = SetWindowPos(hwnd, NULL, 0, 0, rect.right * 5 / 2, rect.bottom * 3 / 2,
SWP_NOMOVE);
+ ok(ret, "got %d\n", ret);
return hwnd;
}
Modified: trunk/rostests/winetests/comctl32/propsheet.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/comctl32/propsh…
==============================================================================
--- trunk/rostests/winetests/comctl32/propsheet.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/comctl32/propsheet.c [iso-8859-1] Wed Jul 22 19:30:52 2015
@@ -877,6 +877,7 @@
r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0);
ok(r == 3, "got %d\n", r);
+ DestroyPropertySheetPage(hpsp[4]);
DestroyWindow(hdlg);
}
Modified: trunk/rostests/winetests/comctl32/toolbar.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/comctl32/toolba…
==============================================================================
--- trunk/rostests/winetests/comctl32/toolbar.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/comctl32/toolbar.c [iso-8859-1] Wed Jul 22 19:30:52 2015
@@ -54,6 +54,40 @@
{ 0 }
};
+static const struct message save_parent_seq[] = {
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_SAVE, -1 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_SAVE, 0 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_SAVE, 1 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_SAVE, 2 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_SAVE, 3 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_SAVE, 4 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_SAVE, 5 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_SAVE, 6 },
+ { 0 }
+};
+
+static const struct message restore_parent_seq[] = {
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, -1 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 0 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 1 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 2 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 3 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 4 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 5 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 6 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 7 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 8 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 9 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_RESTORE, 0xa },
+ { WM_NOTIFY, sent|id, 0, 0, TBN_BEGINADJUST },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_GETBUTTONINFOA, 0 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_GETBUTTONINFOA, 1 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_GETBUTTONINFOA, 2 },
+ { WM_NOTIFY, sent|id|custdraw, 0, 0, TBN_GETBUTTONINFOA, 3 },
+ { WM_NOTIFY, sent|id, 0, 0, TBN_ENDADJUST },
+ { 0 }
+};
+
#define DEFINE_EXPECT(func) \
static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
@@ -92,6 +126,8 @@
p->fsStyle = fsStyle;
p->iString = nString;
}
+
+static void *alloced_str;
static LRESULT parent_wnd_notify(LPARAM lParam)
{
@@ -133,6 +169,135 @@
compare(nmdisp->dwMask, g_dwExpectedDispInfoMask, "%x");
ok(nmdisp->pszText == NULL, "pszText is not NULL\n");
break;
+ case TBN_SAVE:
+ {
+ NMTBSAVE *save = (NMTBSAVE *)lParam;
+ if (save->iItem == -1)
+ {
+ save->cbData = save->cbData * 2 + 11 * sizeof(DWORD);
+ save->pData = HeapAlloc( GetProcessHeap(), 0, save->cbData );
+ save->pData[0] = 0xcafe;
+ save->pCurrent = save->pData + 1;
+ }
+ else
+ {
+ save->pCurrent[0] = 0xcafe0000 + save->iItem;
+ save->pCurrent++;
+ }
+
+ /* Add on 5 more pseudo buttons. */
+ if (save->iItem == save->cButtons - 1)
+ {
+ save->pCurrent[0] = 0xffffffff;
+ save->pCurrent[1] = 0xcafe0007;
+ save->pCurrent[2] = 0xfffffffe;
+ save->pCurrent[3] = 0xcafe0008;
+ save->pCurrent[4] = 0x80000000;
+ save->pCurrent[5] = 0xcafe0009;
+ save->pCurrent[6] = 0x7fffffff;
+ save->pCurrent[7] = 0xcafe000a;
+ save->pCurrent[8] = 0x100;
+ save->pCurrent[9] = 0xcafe000b;
+ }
+
+ /* Return value is ignored */
+ return 1;
+ }
+ case TBN_RESTORE:
+ {
+ NMTBRESTORE *restore = (NMTBRESTORE *)lParam;
+
+ if (restore->iItem == -1)
+ {
+ ok( restore->cButtons == 25, "got %d\n",
restore->cButtons );
+ ok( *restore->pCurrent == 0xcafe, "got %08x\n",
*restore->pCurrent );
+ /* Skip the last one */
+ restore->cButtons = 11;
+ restore->pCurrent++;
+ /* BytesPerRecord is ignored */
+ restore->cbBytesPerRecord = 10;
+ }
+ else
+ {
+ ok( *restore->pCurrent == 0xcafe0000 + restore->iItem, "got
%08x\n", *restore->pCurrent );
+ if (restore->iItem < 7 || restore->iItem == 10)
+ {
+ ok( restore->tbButton.iBitmap == -1, "got %08x\n",
restore->tbButton.iBitmap );
+ if (restore->iItem < 7)
+ ok( restore->tbButton.idCommand == restore->iItem * 2 + 1,
"%d: got %08x\n", restore->iItem, restore->tbButton.idCommand );
+ else
+ ok( restore->tbButton.idCommand == 0x7fffffff, "%d: got
%08x\n", restore->iItem, restore->tbButton.idCommand );
+ ok( restore->tbButton.fsState == 0, "%d: got %02x\n",
restore->iItem, restore->tbButton.fsState );
+ ok( restore->tbButton.fsStyle == 0, "%d: got %02x\n",
restore->iItem, restore->tbButton.fsStyle );
+ }
+ else
+ {
+ ok( restore->tbButton.iBitmap == 8, "got %08x\n",
restore->tbButton.iBitmap );
+ ok( restore->tbButton.idCommand == 0, "%d: got %08x\n",
restore->iItem, restore->tbButton.idCommand );
+ if (restore->iItem == 7)
+ ok( restore->tbButton.fsState == 0, "%d: got
%02x\n", restore->iItem, restore->tbButton.fsState );
+ else
+ ok( restore->tbButton.fsState == TBSTATE_HIDDEN, "%d: got
%02x\n", restore->iItem, restore->tbButton.fsState );
+ ok( restore->tbButton.fsStyle == BTNS_SEP, "%d: got
%02x\n", restore->iItem, restore->tbButton.fsStyle );
+ }
+
+ ok( restore->tbButton.dwData == 0, "got %08lx\n",
restore->tbButton.dwData );
+ ok( restore->tbButton.iString == 0, "got %08lx\n",
restore->tbButton.iString );
+
+ restore->tbButton.iBitmap = 0;
+ restore->tbButton.fsState = TBSTATE_ENABLED;
+ restore->tbButton.fsStyle = 0;
+ restore->tbButton.dwData = restore->iItem;
+
+ if (restore->iItem == 0)
+ {
+ restore->tbButton.iString = (INT_PTR)HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY, 8 );
+ strcpy( (char *)restore->tbButton.iString, "foo" );
+ }
+ else if (restore->iItem == 1)
+ restore->tbButton.iString = 2;
+ else
+ restore->tbButton.iString = -1;
+
+ restore->pCurrent++;
+ /* Altering cButtons after the 1st call makes no difference. */
+ restore->cButtons--;
+ }
+
+ /* Returning non-zero from the 1st call aborts the restore,
+ otherwise the return value is ignored. */
+ if (restore->iItem == -1) return 0;
+ return 1;
+ }
+ case TBN_GETBUTTONINFOA:
+ {
+ NMTOOLBARA *tb = (NMTOOLBARA *)lParam;
+ tb->tbButton.iBitmap = 0;
+ tb->tbButton.fsState = 0;
+ tb->tbButton.fsStyle = 0;
+ tb->tbButton.dwData = 0;
+ ok( tb->cchText == 128, "got %d\n", tb->cchText );
+ switch (tb->iItem)
+ {
+ case 0:
+ tb->tbButton.idCommand = 7;
+ alloced_str = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 8 );
+ strcpy( alloced_str, "foo" );
+ tb->tbButton.iString = (INT_PTR)alloced_str;
+ return 1;
+ case 1:
+ tb->tbButton.idCommand = 9;
+ tb->tbButton.iString = 0;
+ /* tb->pszText is ignored */
+ strcpy( tb->pszText, "foo" );
+ return 1;
+ case 2:
+ tb->tbButton.idCommand = 11;
+ tb->tbButton.iString = 3;
+ return 1;
+ }
+ return 0;
+ }
}
return 0;
}
@@ -148,7 +313,31 @@
if (defwndproc_counter) msg.flags |= defwinproc;
msg.wParam = wParam;
msg.lParam = lParam;
- if (message == WM_NOTIFY && lParam) msg.id = ((NMHDR*)lParam)->code;
+ if (message == WM_NOTIFY && lParam)
+ {
+ msg.id = ((NMHDR*)lParam)->code;
+ switch (msg.id)
+ {
+ case TBN_SAVE:
+ {
+ NMTBSAVE *save = (NMTBSAVE *)lParam;
+ msg.stage = save->iItem;
+ }
+ break;
+ case TBN_RESTORE:
+ {
+ NMTBRESTORE *restore = (NMTBRESTORE *)lParam;
+ msg.stage = restore->iItem;
+ }
+ break;
+ case TBN_GETBUTTONINFOA:
+ {
+ NMTOOLBARA *tb = (NMTOOLBARA *)lParam;
+ msg.stage = tb->iItem;
+ }
+ break;
+ }
+ }
/* log system messages, except for painting */
if (message < WM_USER &&
@@ -748,7 +937,7 @@
static tbsize_result_t *tbsize_results;
-#define tbsize_results_num 24
+#define tbsize_results_num 28
static void init_tbsize_results(void) {
int fontheight = system_font_height();
@@ -991,6 +1180,18 @@
tbsize_results[23] = init_tbsize_result(2, 0, 0, 672, 42, 67, 41);
tbsize_addbutton(&tbsize_results[23], 0, 2, 672, 25 + fontheight);
tbsize_addbutton(&tbsize_results[23], 0, 25 + fontheight, 672, 48 +
2*fontheight);
+
+ tbsize_results[24] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40);
+ tbsize_addbutton(&tbsize_results[24], 0, 2, 11 + string_width(STRING2),
24);
+
+ tbsize_results[25] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40);
+ tbsize_addbutton(&tbsize_results[25], 0, 2, 40, 24);
+
+ tbsize_results[26] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40);
+ tbsize_addbutton(&tbsize_results[26], 0, 2, 40, 24);
+
+ tbsize_results[27] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40);
+ tbsize_addbutton(&tbsize_results[27], 0, 2, 40, 24);
}
static void free_tbsize_results(void) {
@@ -1062,12 +1263,18 @@
{0, 32, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0, }, 0, 1},
{0, 33, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0, }, 0, (UINT_PTR)STRING2}
};
+static TBBUTTON buttons4[] = {
+ {0, 40, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0, }, 0, (UINT_PTR)STRING2},
+ {0, 41, TBSTATE_ENABLED, 0, {0, }, 0, (UINT_PTR)STRING2},
+ {0, 41, TBSTATE_ENABLED, BTNS_SHOWTEXT, {0, }, 0, (UINT_PTR)STRING2}
+};
static void test_sizes(void)
{
HWND hToolbar = NULL;
HIMAGELIST himl, himl2;
TBBUTTONINFOA tbinfo;
+ TBBUTTON button;
int style;
int i;
int fontheight = system_font_height();
@@ -1083,9 +1290,13 @@
check_sizes();
SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0);
check_sizes();
+ SendMessageA(hToolbar, TB_GETBUTTON, 5, (LPARAM)&button);
+ ok(button.fsState == (TBSTATE_WRAP|TBSTATE_ENABLED), "got %08x\n",
button.fsState);
/* after setting the TBSTYLE_WRAPABLE the TBSTATE_WRAP is ignored */
SetWindowLongA(hToolbar, GWL_STYLE, style|TBSTYLE_WRAPABLE);
check_sizes();
+ SendMessageA(hToolbar, TB_GETBUTTON, 5, (LPARAM)&button);
+ ok(button.fsState == TBSTATE_ENABLED, "got %08x\n", button.fsState);
/* adding new buttons with TBSTYLE_WRAPABLE doesn't add a new row */
SendMessageA(hToolbar, TB_ADDBUTTONSA, 2, (LPARAM)buttons1);
check_sizes();
@@ -1094,6 +1305,11 @@
for (i=0; i<15; i++)
SendMessageA(hToolbar, TB_ADDBUTTONSA, 2, (LPARAM)buttons1);
check_sizes_todo(0x4);
+ SendMessageA(hToolbar, TB_GETBUTTON, 31, (LPARAM)&button);
+ ok(button.fsState == (TBSTATE_WRAP|TBSTATE_ENABLED), "got %08x\n",
button.fsState);
+ SetWindowLongA(hToolbar, GWL_STYLE, style);
+ SendMessageA(hToolbar, TB_GETBUTTON, 31, (LPARAM)&button);
+ ok(button.fsState == TBSTATE_ENABLED, "got %08x\n", button.fsState);
rebuild_toolbar_with_buttons(&hToolbar);
SendMessageA(hToolbar, TB_ADDBUTTONSA, 2, (LPARAM)buttons1);
@@ -1300,7 +1516,40 @@
{
tbinfo.dwMask = TBIF_SIZE;
ok(SendMessageA(hToolbar, TB_SETBUTTONINFOA, 33, (LPARAM)&tbinfo) != 0,
"TB_SETBUTTONINFOA failed\n");
- }
+ tbsize_numtests++;
+ }
+
+ /* Single BTNS_AUTOSIZE button with string. */
+ rebuild_toolbar(&hToolbar);
+ ok(SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons4[0]) == 1,
"TB_ADDBUTTONSA failed\n");
+ ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(40, 20)) == 1,
"TB_SETBUTTONSIZE failed\n");
+ SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
+ check_sizes();
+
+ /* Single non-BTNS_AUTOSIZE button with string. */
+ rebuild_toolbar(&hToolbar);
+ ok(SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons4[1]) == 1,
"TB_ADDBUTTONSA failed\n");
+ ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(40, 20)) == 1,
"TB_SETBUTTONSIZE failed\n");
+ SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
+ check_sizes();
+
+ /* Single non-BTNS_AUTOSIZE button with string with TBSTYLE_EX_MIXEDBUTTONS set. */
+ rebuild_toolbar(&hToolbar);
+ SendMessageA(hToolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
+ style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0);
+ ok(SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons4[1]) == 1,
"TB_ADDBUTTONSA failed\n");
+ ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(40, 20)) == 1,
"TB_SETBUTTONSIZE failed\n");
+ SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
+ check_sizes();
+
+ /* Single non-BTNS_AUTOSIZE, BTNS_SHOWTEXT button with string with
TBSTYLE_EX_MIXEDBUTTONS set. */
+ rebuild_toolbar(&hToolbar);
+ SendMessageA(hToolbar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
+ style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0);
+ ok(SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons4[2]) == 1,
"TB_ADDBUTTONSA failed\n");
+ ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(40, 20)) == 1,
"TB_SETBUTTONSIZE failed\n");
+ SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
+ check_sizes();
free_tbsize_results();
DestroyWindow(hToolbar);
@@ -1338,12 +1587,12 @@
RECT rect;
/* return to style with a 2px top margin */
SetWindowLongA(hToolbar, GWL_STYLE,
- GetWindowLongA(hToolbar, GWL_STYLE) & ~TBSTYLE_FLAT);
+ SendMessageA(hToolbar, TB_GETSTYLE, 0, 0) & ~TBSTYLE_FLAT);
/* recalc */
SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)&buttons3[3]);
/* top margin will be 0px if a recalc occurs */
SetWindowLongA(hToolbar, GWL_STYLE,
- GetWindowLongA(hToolbar, GWL_STYLE) | TBSTYLE_FLAT);
+ SendMessageA(hToolbar, TB_GETSTYLE, 0, 0) | TBSTYLE_FLAT);
/* safety check */
SendMessageA(hToolbar, TB_GETITEMRECT, 1, (LPARAM)&rect);
ok(rect.top == 2, "Test will make no sense because initial top is %d instead of
2\n",
@@ -1358,6 +1607,7 @@
const int EX_STYLES_COUNT = 5;
int i;
BOOL recalc;
+ DWORD style;
/* Like TB_ADDBUTTONSA tested in test_sized, inserting a button without text
* results in a relayout, while adding one with text forces a recalc */
@@ -1417,6 +1667,47 @@
/* undocumented exstyle 0x2 seems to change the top margin, which
* interferes with these tests */
+
+ /* Show that a change in TBSTYLE_WRAPABLE causes a recalc */
+ prepare_recalc_test(&hToolbar);
+ style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0);
+ SendMessageA(hToolbar, TB_SETSTYLE, 0, style);
+ recalc = did_recalc(hToolbar);
+ ok(!recalc, "recalc %d\n", recalc);
+
+ SendMessageA(hToolbar, TB_SETSTYLE, 0, style | TBSTYLE_TOOLTIPS | TBSTYLE_TRANSPARENT
| CCS_BOTTOM);
+ recalc = did_recalc(hToolbar);
+ ok(!recalc, "recalc %d\n", recalc);
+
+ SendMessageA(hToolbar, TB_SETSTYLE, 0, style | TBSTYLE_WRAPABLE);
+ recalc = did_recalc(hToolbar);
+ ok(recalc, "recalc %d\n", recalc);
+ restore_recalc_state(hToolbar);
+
+ SendMessageA(hToolbar, TB_SETSTYLE, 0, style | TBSTYLE_WRAPABLE);
+ recalc = did_recalc(hToolbar);
+ ok(!recalc, "recalc %d\n", recalc);
+
+ SendMessageA(hToolbar, TB_SETSTYLE, 0, style);
+ recalc = did_recalc(hToolbar);
+ ok(recalc, "recalc %d\n", recalc);
+ restore_recalc_state(hToolbar);
+
+ /* Changing CCS_VERT does not recalc */
+ SendMessageA(hToolbar, TB_SETSTYLE, 0, style | CCS_VERT);
+ recalc = did_recalc(hToolbar);
+ ok(!recalc, "recalc %d\n", recalc);
+ restore_recalc_state(hToolbar);
+
+ SendMessageA(hToolbar, TB_SETSTYLE, 0, style);
+ recalc = did_recalc(hToolbar);
+ ok(!recalc, "recalc %d\n", recalc);
+ restore_recalc_state(hToolbar);
+
+ /* Setting the window's style directly also causes recalc */
+ SetWindowLongA(hToolbar, GWL_STYLE, style | TBSTYLE_WRAPABLE);
+ recalc = did_recalc(hToolbar);
+ ok(recalc, "recalc %d\n", recalc);
DestroyWindow(hToolbar);
}
@@ -1917,9 +2208,159 @@
ok(style == TBSTYLE_EX_VERTICAL, "got style 0x%08x, expected 0x%08x\n",
style, TBSTYLE_EX_VERTICAL);
style = SendMessageA(hwnd, TB_GETSTYLE, 0, 0);
todo_wine
- ok(style == CCS_VERT, "got style 0x%08x, expected 0x%08x\n", style,
CCS_VERT);
+ ok(style == CCS_VERT, "got style 0x%08x, expected CCS_VERT\n", style);
DestroyWindow(hwnd);
+}
+
+static void test_noresize(void)
+{
+ HWND wnd;
+ int i;
+ TBBUTTON button = {0, 10, TBSTATE_ENABLED, 0, {0, }, 0, -1};
+
+ wnd = CreateWindowExA(0, TOOLBARCLASSNAMEA, NULL, WS_CHILD | WS_VISIBLE |
CCS_NORESIZE | TBSTYLE_WRAPABLE, 0, 0, 100, 20,
+ hMainWnd, (HMENU)5, GetModuleHandleA(NULL), NULL);
+ SendMessageA(wnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
+
+ for (i=0; i<30; i++)
+ {
+ button.idCommand = 10 + i;
+ SendMessageA(wnd, TB_ADDBUTTONSA, 1, (LPARAM)&button);
+ }
+
+ SendMessageA(wnd, TB_SETSTATE, 10, TBSTATE_WRAP|TBSTATE_ENABLED);
+
+ /* autosize clears the wrap on button 0 */
+ SendMessageA(wnd, TB_AUTOSIZE, 0, 0);
+ for (i=0; i<30; i++)
+ {
+ SendMessageA(wnd, TB_GETBUTTON, i, (LPARAM)&button);
+ if (i % 4 == 3)
+ ok(button.fsState == (TBSTATE_WRAP|TBSTATE_ENABLED), "%d: got
%08x\n", i, button.fsState);
+ else
+ ok(button.fsState == TBSTATE_ENABLED, "%d: got %08x\n", i,
button.fsState);
+ }
+
+ /* changing the parent doesn't do anything */
+ MoveWindow(hMainWnd, 0,0, 400, 200, FALSE);
+ for (i=0; i<30; i++)
+ {
+ SendMessageA(wnd, TB_GETBUTTON, i, (LPARAM)&button);
+ if (i % 4 == 3)
+ ok(button.fsState == (TBSTATE_WRAP|TBSTATE_ENABLED), "%d: got
%08x\n", i, button.fsState);
+ else
+ ok(button.fsState == TBSTATE_ENABLED, "%d: got %08x\n", i,
button.fsState);
+ }
+
+ /* again nothing here */
+ SendMessageA(wnd, TB_AUTOSIZE, 0, 0);
+ for (i=0; i<30; i++)
+ {
+ SendMessageA(wnd, TB_GETBUTTON, i, (LPARAM)&button);
+ if (i % 4 == 3)
+ ok(button.fsState == (TBSTATE_WRAP|TBSTATE_ENABLED), "%d: got
%08x\n", i, button.fsState);
+ else
+ ok(button.fsState == TBSTATE_ENABLED, "%d: got %08x\n", i,
button.fsState);
+ }
+
+ DestroyWindow(wnd);
+
+}
+
+static void test_save(void)
+{
+ HWND wnd = NULL;
+ TBSAVEPARAMSW params;
+ static const WCHAR subkey[] =
{'S','o','f','t','w','a','r','e','\\','W','i','n','e','T','e','s','t',0};
+ static const WCHAR value[] =
{'t','o','o','l','b','a','r','t','e','s','t',0};
+ LONG res;
+ HKEY key;
+ BYTE data[100];
+ DWORD size = sizeof(data), type, i, count;
+ TBBUTTON tb;
+ static const TBBUTTON more_btns[2] =
+ {
+ {0, 11, TBSTATE_HIDDEN, BTNS_BUTTON, {0}, 0, -1},
+ {0, 13, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, -1}
+ };
+ static const DWORD expect[] = {0xcafe, 1, 0xcafe0000, 3, 0xcafe0001, 5, 0xcafe0002,
7, 0xcafe0003,
+ 9, 0xcafe0004, 11, 0xcafe0005, 13, 0xcafe0006,
0xffffffff, 0xcafe0007,
+ 0xfffffffe, 0xcafe0008, 0x80000000, 0xcafe0009,
0x7fffffff, 0xcafe000a,
+ 0x100, 0xcafe000b};
+ static const TBBUTTON expect_btns[] =
+ {
+ {0, 1, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0},
+ {0, 3, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 1, 2},
+ {0, 5, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 2, 0},
+ {0, 7, 0, BTNS_BUTTON, {0}, 0, (INT_PTR)"foo"},
+ {0, 9, 0, BTNS_BUTTON, {0}, 0, 0},
+ {0, 11, 0, BTNS_BUTTON, {0}, 0, 3},
+ {0, 13, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 6, 0},
+ {0, 0, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 7, 0},
+ {0, 0, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 8, 0},
+ {0, 0, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 9, 0},
+ {0, 0x7fffffff, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0xa, 0},
+ };
+
+ params.hkr = HKEY_CURRENT_USER;
+ params.pszSubKey = subkey;
+ params.pszValueName = value;
+
+ rebuild_toolbar_with_buttons( &wnd );
+ SendMessageW( wnd, TB_ADDBUTTONSW, sizeof(more_btns) / sizeof(more_btns[0]),
(LPARAM)more_btns );
+
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+ res = SendMessageW( wnd, TB_SAVERESTOREW, TRUE, (LPARAM)¶ms );
+ ok( res, "saving failed\n" );
+ ok_sequence(sequences, PARENT_SEQ_INDEX, save_parent_seq, "save", FALSE);
+ DestroyWindow( wnd );
+
+ res = RegOpenKeyW( HKEY_CURRENT_USER, subkey, &key );
+ ok( !res, "got %08x\n", res );
+ res = RegQueryValueExW( key, value, NULL, &type, data, &size );
+ ok( !res, "got %08x\n", res );
+ ok( type == REG_BINARY, "got %08x\n", type );
+ ok( size == sizeof(expect), "got %08x\n", size );
+ ok( !memcmp( data, expect, size ), "mismatch\n" );
+
+ RegCloseKey( key );
+
+ wnd = NULL;
+ rebuild_toolbar( &wnd );
+
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+ res = SendMessageW( wnd, TB_SAVERESTOREW, FALSE, (LPARAM)¶ms );
+ ok( res, "restoring failed\n" );
+ ok_sequence(sequences, PARENT_SEQ_INDEX, restore_parent_seq, "restore",
FALSE);
+ count = SendMessageW( wnd, TB_BUTTONCOUNT, 0, 0 );
+ ok( count == sizeof(expect_btns) / sizeof(expect_btns[0]), "got %d\n",
count );
+
+ for (i = 0; i < count; i++)
+ {
+ res = SendMessageW( wnd, TB_GETBUTTON, i, (LPARAM)&tb );
+ ok( res, "got %d\n", res );
+
+ ok( tb.iBitmap == expect_btns[i].iBitmap, "%d: got %d\n", i, tb.iBitmap
);
+ ok( tb.idCommand == expect_btns[i].idCommand, "%d: got %d\n", i,
tb.idCommand );
+ ok( tb.fsState == expect_btns[i].fsState, "%d: got %02x\n", i,
tb.fsState );
+ ok( tb.fsStyle == expect_btns[i].fsStyle, "%d: got %02x\n", i,
tb.fsStyle );
+ ok( tb.dwData == expect_btns[i].dwData, "%d: got %lx\n", i, tb.dwData
);
+ if (IS_INTRESOURCE(expect_btns[i].iString))
+ ok( tb.iString == expect_btns[i].iString, "%d: got %lx\n", i,
tb.iString );
+ else
+ ok( !strcmp( (char *)tb.iString, (char *)expect_btns[i].iString ),
+ "%d: got %s\n", i, (char *)tb.iString );
+
+ /* In fact the ptr value set in TBN_GETBUTTONINFOA is simply copied */
+ if (tb.idCommand == 7)
+ ok( tb.iString == (INT_PTR)alloced_str, "string not set\n");
+ }
+
+ DestroyWindow( wnd );
+ RegOpenKeyW( HKEY_CURRENT_USER, subkey, &key );
+ RegDeleteValueW( key, value );
+ RegCloseKey( key );
}
START_TEST(toolbar)
@@ -1964,6 +2405,8 @@
test_get_set_style();
test_create();
test_TB_GET_SET_EXTENDEDSTYLE();
+ test_noresize();
+ test_save();
PostQuitMessage(0);
while(GetMessageA(&msg,0,0,0)) {
Modified: trunk/rostests/winetests/comctl32/tooltips.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/comctl32/toolti…
==============================================================================
--- trunk/rostests/winetests/comctl32/tooltips.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/comctl32/tooltips.c [iso-8859-1] Wed Jul 22 19:30:52 2015
@@ -26,6 +26,8 @@
#include <winnls.h>
#include <commctrl.h>
+#include "resources.h"
+
#define expect(expected, got) ok(got == expected, "Expected %d, got %d\n",
expected, got)
static void test_create_tooltip(void)
@@ -330,6 +332,30 @@
SendMessageA(hwnd, TTM_GETTOOLINFOA, 0, (LPARAM)&toolinfoA);
ok(toolinfoA.lpszText == NULL,
"expected NULL, got %p\n", toolinfoA.lpszText);
+
+ /* NULL hinst, valid resource id for text */
+ toolinfoA.cbSize = sizeof(TTTOOLINFOA);
+ toolinfoA.hwnd = NULL;
+ toolinfoA.hinst = NULL;
+ toolinfoA.uFlags = 0;
+ toolinfoA.uId = 0x1233ABCD;
+ toolinfoA.lpszText = MAKEINTRESOURCEA(IDS_TBADD1);
+ toolinfoA.lParam = 0xdeadbeef;
+ GetClientRect(hwnd, &toolinfoA.rect);
+ r = SendMessageA(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&toolinfoA);
+ ok(r, "failed to add a tool\n");
+
+ toolinfoA.hwnd = NULL;
+ toolinfoA.uId = 0x1233ABCD;
+ toolinfoA.lpszText = bufA;
+ SendMessageA(hwnd, TTM_GETTEXTA, 0, (LPARAM)&toolinfoA);
+ ok(strcmp(toolinfoA.lpszText, "abc") == 0, "lpszText should be an
empty string\n");
+
+ toolinfoA.hinst = (HINSTANCE)0xdeadbee;
+ SendMessageA(hwnd, TTM_GETTOOLINFOA, 0, (LPARAM)&toolinfoA);
+ ok(toolinfoA.hinst == NULL, "expected NULL, got %p\n",
toolinfoA.hinst);
+
+ SendMessageA(hwnd, TTM_DELTOOLA, 0, (LPARAM)&toolinfoA);
}
else
{
@@ -817,6 +843,154 @@
DestroyWindow(parent);
}
+static LRESULT CALLBACK info_wnd_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch(msg) {
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ break;
+
+ default:
+ return DefWindowProcA(hWnd, msg, wParam, lParam);
+ }
+ return 0;
+}
+
+static void test_setinfo(void)
+{
+ WNDCLASSA wc;
+ LRESULT lResult;
+ HWND parent, parent2, hwndTip, hwndTip2;
+ TTTOOLINFOA toolInfo = { 0 };
+ TTTOOLINFOA toolInfo2 = { 0 };
+ WNDPROC wndProc;
+
+ /* Create a class to use the custom draw wndproc */
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = GetModuleHandleA(NULL);
+ wc.hIcon = NULL;
+ wc.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
+ wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = "SetInfoClass";
+ wc.lpfnWndProc = info_wnd_proc;
+ RegisterClassA(&wc);
+
+ /* Create a main window */
+ parent = CreateWindowExA(0, "SetInfoClass", NULL,
+ WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
+ WS_MAXIMIZEBOX | WS_VISIBLE,
+ 50, 50,
+ 300, 300,
+ NULL, NULL, NULL, 0);
+ ok(parent != NULL, "Creation of main window failed\n");
+
+ parent2 = CreateWindowExA(0, "SetInfoClass", NULL,
+ WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX |
+ WS_MAXIMIZEBOX | WS_VISIBLE,
+ 50, 50,
+ 300, 300,
+ NULL, NULL, NULL, 0);
+ ok(parent2 != NULL, "Creation of main window failed\n");
+
+ /* Make it show */
+ ShowWindow(parent2, SW_SHOWNORMAL);
+ flush_events(100);
+
+ /* Create Tooltip */
+ hwndTip = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASSA,
+ NULL, TTS_NOPREFIX | TTS_ALWAYSTIP,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ parent, NULL, GetModuleHandleA(NULL), 0);
+ ok(hwndTip != NULL, "Creation of tooltip window failed\n");
+
+ hwndTip2 = CreateWindowExA(WS_EX_TOPMOST, TOOLTIPS_CLASSA,
+ NULL, TTS_NOPREFIX | TTS_ALWAYSTIP,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ parent, NULL, GetModuleHandleA(NULL), 0);
+ ok(hwndTip2 != NULL, "Creation of tooltip window failed\n");
+
+
+ /* Make it topmost, as per the MSDN */
+ SetWindowPos(hwndTip, HWND_TOPMOST, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+
+ /* Create a tool */
+ toolInfo.cbSize = TTTOOLINFOA_V1_SIZE;
+ toolInfo.hwnd = parent;
+ toolInfo.hinst = GetModuleHandleA(NULL);
+ toolInfo.uFlags = TTF_SUBCLASS;
+ toolInfo.uId = 0x1234ABCD;
+ toolInfo.lpszText = (LPSTR)"This is a test tooltip";
+ toolInfo.lParam = 0xdeadbeef;
+ GetClientRect (parent, &toolInfo.rect);
+ lResult = SendMessageA(hwndTip, TTM_ADDTOOLA, 0, (LPARAM)&toolInfo);
+ ok(lResult, "Adding the tool to the tooltip failed\n");
+
+ toolInfo.cbSize = TTTOOLINFOA_V1_SIZE;
+ toolInfo.hwnd = parent2;
+ toolInfo.hinst = GetModuleHandleA(NULL);
+ toolInfo.uFlags = 0;
+ toolInfo.uId = 0x1234ABCE;
+ toolInfo.lpszText = (LPSTR)"This is a test tooltip";
+ toolInfo.lParam = 0xdeadbeef;
+ GetClientRect (parent, &toolInfo.rect);
+ lResult = SendMessageA(hwndTip, TTM_ADDTOOLA, 0, (LPARAM)&toolInfo);
+ ok(lResult, "Adding the tool to the tooltip failed\n");
+
+ /* Try to Remove Subclass */
+ toolInfo2.cbSize = TTTOOLINFOA_V1_SIZE;
+ toolInfo2.hwnd = parent;
+ toolInfo2.uId = 0x1234ABCD;
+ lResult = SendMessageA(hwndTip, TTM_GETTOOLINFOA, 0, (LPARAM)&toolInfo2);
+ ok(lResult, "GetToolInfo failed\n");
+ ok(toolInfo2.uFlags & TTF_SUBCLASS, "uFlags does not have subclass\n");
+ wndProc = (WNDPROC)GetWindowLongPtrA(parent, GWLP_WNDPROC);
+ ok (wndProc != info_wnd_proc, "Window Proc is wrong\n");
+
+ toolInfo2.uFlags &= ~TTF_SUBCLASS;
+ SendMessageA(hwndTip, TTM_SETTOOLINFOA, 0, (LPARAM)&toolInfo2);
+ lResult = SendMessageA(hwndTip, TTM_GETTOOLINFOA, 0, (LPARAM)&toolInfo2);
+ ok(lResult, "GetToolInfo failed\n");
+ ok(!(toolInfo2.uFlags & TTF_SUBCLASS), "uFlags has subclass\n");
+ wndProc = (WNDPROC)GetWindowLongPtrA(parent, GWLP_WNDPROC);
+ ok (wndProc != info_wnd_proc, "Window Proc is wrong\n");
+
+ /* Try to Add Subclass */
+
+ /* Make it topmost, as per the MSDN */
+ SetWindowPos(hwndTip2, HWND_TOPMOST, 0, 0, 0, 0,
+ SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
+
+ toolInfo2.cbSize = TTTOOLINFOA_V1_SIZE;
+ toolInfo2.hwnd = parent2;
+ toolInfo2.uId = 0x1234ABCE;
+ lResult = SendMessageA(hwndTip, TTM_GETTOOLINFOA, 0, (LPARAM)&toolInfo2);
+ ok(lResult, "GetToolInfo failed\n");
+ ok(!(toolInfo2.uFlags & TTF_SUBCLASS), "uFlags has subclass\n");
+ wndProc = (WNDPROC)GetWindowLongPtrA(parent2, GWLP_WNDPROC);
+ ok (wndProc == info_wnd_proc, "Window Proc is wrong\n");
+
+ toolInfo2.uFlags |= TTF_SUBCLASS;
+ SendMessageA(hwndTip, TTM_SETTOOLINFOA, 0, (LPARAM)&toolInfo2);
+ lResult = SendMessageA(hwndTip, TTM_GETTOOLINFOA, 0, (LPARAM)&toolInfo2);
+ ok(lResult, "GetToolInfo failed\n");
+ ok(toolInfo2.uFlags & TTF_SUBCLASS, "uFlags does not have subclass\n");
+ wndProc = (WNDPROC)GetWindowLongPtrA(parent2, GWLP_WNDPROC);
+ ok (wndProc == info_wnd_proc, "Window Proc is wrong\n");
+
+ /* Clean up */
+ DestroyWindow(hwndTip);
+ DestroyWindow(hwndTip2);
+ DestroyWindow(parent);
+ DestroyWindow(parent2);
+}
+
START_TEST(tooltips)
{
InitCommonControls();
@@ -828,4 +1002,5 @@
test_longtextA();
test_longtextW();
test_track();
-}
+ test_setinfo();
+}
Modified: trunk/rostests/winetests/comctl32/treeview.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/comctl32/treevi…
==============================================================================
--- trunk/rostests/winetests/comctl32/treeview.c [iso-8859-1] (original)
+++ trunk/rostests/winetests/comctl32/treeview.c [iso-8859-1] Wed Jul 22 19:30:52 2015
@@ -19,6 +19,7 @@
*/
#include <stdarg.h>
+#include <stdio.h>
#include "windef.h"
#include "winbase.h"
@@ -226,12 +227,91 @@
{ 0 }
};
-static const struct message parent_singleexpand_seq[] = {
+static const struct message parent_singleexpand_seq0[] = {
+ /* alpha expands */
{ WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
{ WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
{ WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
{ WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
{ WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { 0 }
+};
+
+static const struct message parent_singleexpand_seq1[] = {
+ /* bravo expands */
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { 0 }
+};
+
+static const struct message parent_singleexpand_seq2[] = {
+ /* delta expands, bravo collapses */
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { 0 }
+};
+
+static const struct message parent_singleexpand_seq3[] = {
+ /* foxtrot expands, alpha and delta collapse */
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { 0 }
+};
+
+static const struct message parent_singleexpand_seq4[] = {
+ /* alpha expands, foxtrot collapses */
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { 0 }
+};
+
+static const struct message parent_singleexpand_seq5[] = {
+ /* foxtrot expands while golf is selected, then golf expands and alpha collapses */
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA },
+ { 0 }
+};
+
+static const struct message parent_singleexpand_seq6[] = {
+ /* hotel does not expand and india does not collapse because they have no children
*/
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
+ { 0 }
+};
+
+static const struct message parent_singleexpand_seq7[] = {
+ /* india does not expand and hotel does not collapse because they have no children
*/
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA },
+ { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND },
{ 0 }
};
@@ -1637,21 +1717,95 @@
static void test_TVS_SINGLEEXPAND(void)
{
HWND hTree;
+ HTREEITEM alpha, bravo, charlie, delta, echo, foxtrot, golf, hotel, india, juliet;
+ TVINSERTSTRUCTA ins;
+ char foo[] = "foo";
+ char context[32];
+ int i;
BOOL ret;
+
+ /* build a fairly complex tree
+ * - TVI_ROOT
+ * - alpha
+ * - bravo
+ * - charlie
+ * - delta
+ * - echo
+ * - foxtrot
+ * - golf
+ * - hotel
+ * - india
+ * - juliet
+ */
+ struct
+ {
+ HTREEITEM *handle;
+ HTREEITEM *parent;
+ UINT final_state;
+ }
+ items[] =
+ {
+ { &alpha, NULL, TVIS_EXPANDEDONCE },
+ { &bravo, &alpha, TVIS_EXPANDEDONCE },
+ { &charlie, &bravo, 0 },
+ { &delta, &alpha, TVIS_EXPANDEDONCE },
+ { &echo, &delta, 0 },
+ { &foxtrot, NULL, TVIS_EXPANDEDONCE|TVIS_EXPANDED },
+ { &golf, &foxtrot, TVIS_EXPANDEDONCE|TVIS_EXPANDED },
+ { &hotel, &golf, 0 },
+ { &india, &golf, TVIS_SELECTED },
+ { &juliet, &foxtrot, 0 }
+ };
+
+ struct
+ {
+ HTREEITEM *select;
+ const struct message *sequence;
+ }
+ sequence_tests[] =
+ {
+ { &alpha, parent_singleexpand_seq0 },
+ { &bravo, parent_singleexpand_seq1 },
+ { &delta, parent_singleexpand_seq2 },
+ { &foxtrot, parent_singleexpand_seq3 },
+ { &alpha, parent_singleexpand_seq4 },
+ { &golf, parent_singleexpand_seq5 },
+ { &hotel, parent_singleexpand_seq6 },
+ { &india, parent_singleexpand_seq7 },
+ { &india, empty_seq }
+ };
hTree = create_treeview_control(0);
SetWindowLongA(hTree, GWL_STYLE, GetWindowLongA(hTree, GWL_STYLE) |
TVS_SINGLEEXPAND);
/* to avoid painting related notifications */
ShowWindow(hTree, SW_HIDE);
- fill_tree(hTree);
-
- flush_sequences(sequences, NUM_MSG_SEQUENCES);
- ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hRoot);
- ok(ret, "got %d\n", ret);
- ok_sequence(sequences, PARENT_SEQ_INDEX, parent_singleexpand_seq, "singleexpand
notifications", FALSE);
+ for (i = 0; i < sizeof(items)/sizeof(items[0]); i++)
+ {
+ ins.hParent = items[i].parent ? *items[i].parent : TVI_ROOT;
+ ins.hInsertAfter = TVI_FIRST;
+ U(ins).item.mask = TVIF_TEXT;
+ U(ins).item.pszText = foo;
+ *items[i].handle = TreeView_InsertItemA(hTree, &ins);
+ }
+
+ for (i = 0; i < sizeof(sequence_tests)/sizeof(sequence_tests[0]); i++)
+ {
+ flush_sequences(sequences, NUM_MSG_SEQUENCES);
+ ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET,
(LPARAM)(*sequence_tests[i].select));
+ ok(ret, "got %d\n", ret);
+ sprintf(context, "singleexpand notifications %d", i);
+ ok_sequence(sequences, PARENT_SEQ_INDEX, sequence_tests[i].sequence, context,
FALSE);
+ }
+
+ for (i = 0; i < sizeof(items)/sizeof(items[0]); i++)
+ {
+ ret = SendMessageA(hTree, TVM_GETITEMSTATE, (WPARAM)(*items[i].handle), 0xFFFF);
+ ok(ret == items[i].final_state, "singleexpand items[%d]: expected state 0x%x
got 0x%x\n",
+ i, items[i].final_state, ret);
+ }
/* a workaround for NT4 that sends expand notifications when nothing is about to
expand */
- ret = SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)hRoot);
+ ret = SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT);
ok(ret, "got %d\n", ret);
fill_tree(hTree);
ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, 0);