From: Fabian Maurer Subject: [16/18] comctl32: Taskdialog - Implement TDM_ENABLE_BUTTON and add tests Message-Id: <20170224200412.12968-16-dark.shadow4@web.de> Date: Fri, 24 Feb 2017 21:04:10 +0100 In-Reply-To: <20170224200412.12968-1-dark.shadow4@web.de> References: <20170224200412.12968-1-dark.shadow4@web.de> Signed-off-by: Fabian Maurer # Conflicts: # dlls/comctl32/tests/taskdialog.c --- dlls/comctl32/taskdialog.c | 31 ++++++++++++----- dlls/comctl32/tests/taskdialog.c | 75 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 8 deletions(-) diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c index fcfc1fb243..cf90d9a233 100644 --- a/dlls/comctl32/taskdialog.c +++ b/dlls/comctl32/taskdialog.c @@ -314,9 +314,19 @@ static HRESULT callback(taskdialog_info *dialog, UINT uNotification, WPARAM wPar return S_OK; } +static void click_button(HWND hwndDlg, taskdialog_info *dialog, WORD command_id) +{ + HRESULT ret_callback = callback(dialog, TDN_BUTTON_CLICKED, command_id, 0); + if(ret_callback == S_OK) + { + EndDialog(hwndDlg, command_id); + + callback(dialog, TDN_DESTROYED, 0, 0); + } +} + static INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - HRESULT ret_callback; taskdialog_info *dialog; const TASKDIALOGCONFIG *task_config; @@ -377,14 +387,11 @@ static INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA if(HIWORD(wParam) == BN_CLICKED) { WORD command_id = LOWORD(wParam); + HWND hwnd_control = GetDlgItem(hwndDlg, command_id); - ret_callback = callback(dialog, TDN_BUTTON_CLICKED, command_id, 0); - if(ret_callback == S_OK) - { - EndDialog(hwndDlg, command_id); + if(IsWindowEnabled(hwnd_control)) + click_button(hwndDlg, dialog, command_id); - callback(dialog, TDN_DESTROYED, 0, 0); - } return TRUE; } break; @@ -392,7 +399,15 @@ static INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA /* Custom messages*/ case TDM_CLICK_BUTTON: - SendMessageA(hwndDlg, WM_COMMAND, MAKEWORD(wParam, BN_CLICKED), 0); + click_button(hwndDlg, dialog, wParam); + break; + case TDM_ENABLE_BUTTON: + { + HWND hwnd_control = GetDlgItem(hwndDlg, wParam); + if(!hwnd_control) + break; + EnableWindow(hwnd_control, !!lParam); + } break; } return FALSE; diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c index 725bcd1b9a..fc27f91ae8 100644 --- a/dlls/comctl32/tests/taskdialog.c +++ b/dlls/comctl32/tests/taskdialog.c @@ -112,6 +112,14 @@ static const message_data mes_button_clicked_retry[] = { { TDN_NO_MORE_MESSAGES } }; +static const message_data mes_button_clicked_cancel[] = { + { TDN_DIALOG_CONSTRUCTED, 0, 0 }, + { TDN_CREATED, 0, 0 }, + { TDN_BUTTON_CLICKED, IDCANCEL, 0 }, + { TDN_DESTROYED, 0, 0 }, + { TDN_NO_MORE_MESSAGES } +}; + static const message_data mes_button_clicked_custom4[] = { { TDN_DIALOG_CONSTRUCTED, 0, 0 }, { TDN_CREATED, 0, 0 }, @@ -134,6 +142,50 @@ static const message_send_data mes_send_3_click_button_ok[] = { { 0 } }; +static const message_send_data mes_send_click_cancel_retry[] = { + { TDM_CLICK_BUTTON, IDCANCEL, 0 }, + { TDM_CLICK_BUTTON, IDRETRY, 0 }, + { 0 } +}; + +static const message_send_data mes_send_disable_cancel_click_cancel_retry[] = { + { TDM_ENABLE_BUTTON, IDCANCEL, 0 }, + { TDM_CLICK_BUTTON, IDCANCEL, 0 }, + { TDM_CLICK_BUTTON, IDRETRY, 0 }, + { 0 } +}; + +static const message_send_data mes_send_disable_test2[] = { + { TDM_ENABLE_BUTTON, ID_START_BUTTON, 0 }, + { WM_LBUTTONDOWN, MK_LBUTTON, 0, "0" }, + { WM_LBUTTONUP, 0, 0, "0" }, + { WM_LBUTTONDOWN, MK_LBUTTON, 0, "4" }, + { WM_LBUTTONUP, 0, 0, "4" }, + { 0 } +}; + +static const message_send_data mes_send_disable_single1[] = { + { TDM_ENABLE_BUTTON, IDOK, 0 }, + { WM_KEYDOWN, VK_RETURN, 0 }, + { TDM_ENABLE_BUTTON, IDOK, 1 }, + { WM_KEYDOWN, VK_RETURN, 0 }, + { 0 } +}; + +static const message_send_data mes_send_disable_single2[] = { + { TDM_ENABLE_BUTTON, 0xff, 0 }, + { WM_KEYDOWN, VK_RETURN, 0 }, + { 0 } +}; + +static const message_send_data mes_send_disable_single3[] = { + { TDM_ENABLE_BUTTON, IDOK, 0 }, + { WM_KEYDOWN, VK_RETURN, 0 }, + { TDM_ENABLE_BUTTON, IDOK, 0xff }, + { WM_KEYDOWN, VK_RETURN, 0 }, + { 0 } +}; + /* Our only way to get a button handle, since GetDlgItem and FindWindowEx don't work for the official taskdialog */ static HWND taskdialog_child; @@ -435,8 +487,31 @@ static void test_TaskDialogIndirect(void) info.nDefaultButton = ID_START_BUTTON + 4; run_test(&info, ID_START_BUTTON + 4, 0, 0, mes_button_clicked_custom4, mes_send_return); + info.nDefaultButton = 0; /* Not needed aynmore, reset it for future tests */ + + /* Test TDM_ENABLE_BUTTON */ + + /* Send click message to two active buttons too test if second is ignored */ + run_test(&info, IDCANCEL, 0, 0, mes_button_clicked_cancel, mes_send_click_cancel_retry); + + /* Send taskdialog click message for inactive button, then active */ + run_test(&info, IDCANCEL, 0, 0, mes_button_clicked_cancel, mes_send_disable_cancel_click_cancel_retry); + /* Send mouse-down message to inactive button, then active */ + run_test(&info, ID_START_BUTTON + 4, 0, 0, mes_button_clicked_custom4, mes_send_disable_test2); + + info.cButtons = 0; buttons_destroy(info.cButtons, info.pButtons); + info.dwCommonButtons = TDCBF_OK_BUTTON; + + /* Test with only OK button: disable, send return, enable, send return */ + run_test(&info, IDOK, 0, 0, mes_button_clicked_ok, mes_send_disable_single1); + + /* Send message to invalid control, see if our button gets disabled */ + run_test(&info, IDOK, 0, 0, mes_button_clicked_ok, mes_send_disable_single2); + + /* Send disable message that's not true or false */ + run_test(&info, IDOK, 0, 0, mes_button_clicked_ok, mes_send_disable_single3); } START_TEST(taskdialog) -- 2.11.1