comctl32/taskdialog: Add support for navigating page.

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zhiyi Zhang 2018-07-23 20:20:29 +08:00 committed by Alexandre Julliard
parent 065b52a09e
commit 2c1abb2768
2 changed files with 75 additions and 0 deletions

View File

@ -1142,8 +1142,16 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
taskdialog_layout(dialog_info);
}
static BOOL CALLBACK takdialog_destroy_control(HWND hwnd, LPARAM lParam)
{
DestroyWindow(hwnd);
return TRUE;
}
static void taskdialog_destroy(struct taskdialog_info *dialog_info)
{
EnumChildWindows(dialog_info->hwnd, takdialog_destroy_control, 0);
if (dialog_info->taskconfig->dwFlags & TDF_CALLBACK_TIMER) KillTimer(dialog_info->hwnd, ID_TIMER);
if (dialog_info->font) DeleteObject(dialog_info->font);
if (dialog_info->main_instruction_font) DeleteObject(dialog_info->main_instruction_font);
@ -1167,6 +1175,15 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
switch (msg)
{
case TDM_NAVIGATE_PAGE:
dialog_info->taskconfig = (const TASKDIALOGCONFIG *)lParam;
taskdialog_destroy(dialog_info);
taskdialog_init(dialog_info, hwnd);
taskdialog_notify(dialog_info, TDN_DIALOG_CONSTRUCTED, 0, 0);
/* Default radio button click notification is sent before TDN_NAVIGATED */
taskdialog_check_default_radio_buttons(dialog_info);
taskdialog_notify(dialog_info, TDN_NAVIGATED, 0, 0);
break;
case TDM_CLICK_BUTTON:
taskdialog_click_button(dialog_info, wParam);
break;

View File

@ -271,6 +271,25 @@ static const struct message_info msg_return_verification_checked[] =
{ 0 }
};
static TASKDIALOGCONFIG navigated_info = {0};
static const struct message_info msg_send_navigate[] =
{
{ TDM_NAVIGATE_PAGE, 0, (LPARAM)&navigated_info, 0},
{ 0 }
};
static const struct message_info msg_return_navigated_page[] =
{
{ TDN_CREATED, 0, 0, S_OK, NULL },
{ TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, msg_send_navigate },
{ TDN_DIALOG_CONSTRUCTED, 0, 0, S_OK, NULL },
{ TDN_RADIO_BUTTON_CLICKED, ID_START_RADIO_BUTTON, 0, S_OK, NULL },
{ TDN_NAVIGATED, 0, 0, S_OK, msg_send_click_ok },
{ TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
{ 0 }
};
static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct message *msg)
{
msg->message = WM_TD_CALLBACK;
@ -682,6 +701,44 @@ static void test_verification_box(void)
"default verification box: default unchecked and then checked");
}
static void test_navigate_page(void)
{
TASKDIALOGCONFIG info = {0};
static const WCHAR textW[] = {'t', 'e', 'x', 't', 0};
static const WCHAR button_format[] = {'%', '0', '2', 'd', 0};
TASKDIALOG_BUTTON radio_buttons[TEST_NUM_RADIO_BUTTONS];
WCHAR radio_button_titles[TEST_NUM_BUTTONS * 3];
int i;
/* Init radio buttons */
for (i = 0; i < TEST_NUM_RADIO_BUTTONS; i++)
{
WCHAR *text = &radio_button_titles[i * 3];
wsprintfW(text, button_format, i);
radio_buttons[i].pszButtonText = text;
radio_buttons[i].nButtonID = ID_START_RADIO_BUTTON + i;
}
info.cbSize = sizeof(TASKDIALOGCONFIG);
info.pfCallback = taskdialog_callback_proc;
info.lpCallbackData = test_ref_data;
info.dwCommonButtons = TDCBF_OK_BUTTON;
info.cRadioButtons = TEST_NUM_RADIO_BUTTONS;
info.pRadioButtons = radio_buttons;
navigated_info = info;
navigated_info.pszVerificationText = textW;
navigated_info.dwFlags = TDF_VERIFICATION_FLAG_CHECKED;
run_test(&info, IDOK, ID_START_RADIO_BUTTON, TRUE, msg_return_navigated_page, "navigate page: default");
/* TDM_NAVIGATE_PAGE doesn't check cbSize.
* And null taskconfig pointer crash applicatioin, thus doesn't check pointer either */
navigated_info.cbSize = 0;
run_test(&info, IDOK, ID_START_RADIO_BUTTON, TRUE, msg_return_navigated_page, "navigate page: invalid taskconfig cbSize");
}
START_TEST(taskdialog)
{
ULONG_PTR ctx_cookie;
@ -722,6 +779,7 @@ START_TEST(taskdialog)
test_timer();
test_progress_bar();
test_verification_box();
test_navigate_page();
unload_v6_module(ctx_cookie, hCtx);
}