[PATCH v2 2/8] comctl32/taskdialog: Add support for navigating page.
Zhiyi Zhang
zzhang at codeweavers.com
Mon Jul 23 07:20:29 CDT 2018
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
dlls/comctl32/taskdialog.c | 17 ++++++++++
dlls/comctl32/tests/taskdialog.c | 58 ++++++++++++++++++++++++++++++++
2 files changed, 75 insertions(+)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index c6a3aa7ae5..efe159f891 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -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;
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index 8d60fb2eb8..093671c30f 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -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);
}
--
2.18.0
More information about the wine-devel
mailing list