Commit aac6255d authored by David Hedberg's avatar David Hedberg Committed by Alexandre Julliard

comdlg32: Implement IFileDialogCustomize::StartVisualGroup() and ::EndVisualGroup().

parent 4c81231e
...@@ -65,7 +65,8 @@ enum ITEMDLG_CCTRL_TYPE { ...@@ -65,7 +65,8 @@ enum ITEMDLG_CCTRL_TYPE {
IDLG_CCTRL_CHECKBUTTON, IDLG_CCTRL_CHECKBUTTON,
IDLG_CCTRL_EDITBOX, IDLG_CCTRL_EDITBOX,
IDLG_CCTRL_SEPARATOR, IDLG_CCTRL_SEPARATOR,
IDLG_CCTRL_TEXT IDLG_CCTRL_TEXT,
IDLG_CCTRL_VISUALGROUP
}; };
typedef struct { typedef struct {
...@@ -74,6 +75,9 @@ typedef struct { ...@@ -74,6 +75,9 @@ typedef struct {
enum ITEMDLG_CCTRL_TYPE type; enum ITEMDLG_CCTRL_TYPE type;
CDCONTROLSTATEF cdcstate; CDCONTROLSTATEF cdcstate;
struct list entry; struct list entry;
struct list sub_cctrls;
struct list sub_cctrls_entry;
} customctrl; } customctrl;
typedef struct { typedef struct {
...@@ -122,9 +126,11 @@ typedef struct FileDialogImpl { ...@@ -122,9 +126,11 @@ typedef struct FileDialogImpl {
LPWSTR custom_filenamelabel; LPWSTR custom_filenamelabel;
UINT cctrl_width, cctrl_def_height, cctrls_cols; UINT cctrl_width, cctrl_def_height, cctrls_cols;
UINT cctrl_indent;
HWND cctrls_hwnd; HWND cctrls_hwnd;
struct list cctrls; struct list cctrls;
UINT_PTR cctrl_next_dlgid; UINT_PTR cctrl_next_dlgid;
customctrl *cctrl_active_vg;
GUID client_guid; GUID client_guid;
} FileDialogImpl; } FileDialogImpl;
...@@ -596,25 +602,38 @@ static HRESULT on_default_action(FileDialogImpl *This) ...@@ -596,25 +602,38 @@ static HRESULT on_default_action(FileDialogImpl *This)
*/ */
static inline customctrl *get_cctrl_from_dlgid(FileDialogImpl *This, DWORD dlgid) static inline customctrl *get_cctrl_from_dlgid(FileDialogImpl *This, DWORD dlgid)
{ {
customctrl *ctrl; customctrl *ctrl, *sub_ctrl;
LIST_FOR_EACH_ENTRY(ctrl, &This->cctrls, customctrl, entry) LIST_FOR_EACH_ENTRY(ctrl, &This->cctrls, customctrl, entry)
{
if(ctrl->dlgid == dlgid) if(ctrl->dlgid == dlgid)
return ctrl; return ctrl;
LIST_FOR_EACH_ENTRY(sub_ctrl, &ctrl->sub_cctrls, customctrl, sub_cctrls_entry)
if(sub_ctrl->dlgid == dlgid)
return sub_ctrl;
}
ERR("Failed to find control with dialog id %d\n", dlgid); ERR("Failed to find control with dialog id %d\n", dlgid);
return NULL; return NULL;
} }
static inline customctrl *get_cctrl(FileDialogImpl *This, DWORD ctlid) static inline customctrl *get_cctrl(FileDialogImpl *This, DWORD ctlid)
{ {
customctrl *ctrl; customctrl *ctrl, *sub_ctrl;
LIST_FOR_EACH_ENTRY(ctrl, &This->cctrls, customctrl, entry) LIST_FOR_EACH_ENTRY(ctrl, &This->cctrls, customctrl, entry)
{
if(ctrl->id == ctlid) if(ctrl->id == ctlid)
return ctrl; return ctrl;
ERR("Failed to find control with control id %d\n", ctlid); LIST_FOR_EACH_ENTRY(sub_ctrl, &ctrl->sub_cctrls, customctrl, sub_cctrls_entry)
if(sub_ctrl->id == ctlid)
return sub_ctrl;
}
TRACE("No existing control with control id %d\n", ctlid);
return NULL; return NULL;
} }
...@@ -660,9 +679,39 @@ static void ctrl_resize(HWND hctrl, UINT min_width, UINT max_width, BOOL multili ...@@ -660,9 +679,39 @@ static void ctrl_resize(HWND hctrl, UINT min_width, UINT max_width, BOOL multili
HeapFree(GetProcessHeap(), 0, text); HeapFree(GetProcessHeap(), 0, text);
} }
static UINT ctrl_get_height(customctrl *ctrl) {
RECT rc;
GetWindowRect(ctrl->wrapper_hwnd, &rc);
return rc.bottom - rc.top;
}
static void ctrl_free(customctrl *ctrl)
{
customctrl *sub_cur1, *sub_cur2;
TRACE("Freeing control %p\n", ctrl);
if(ctrl->type == IDLG_CCTRL_MENU)
{
TBBUTTON tbb;
SendMessageW(ctrl->hwnd, TB_GETBUTTON, 0, (LPARAM)&tbb);
DestroyMenu((HMENU)tbb.dwData);
}
LIST_FOR_EACH_ENTRY_SAFE(sub_cur1, sub_cur2, &ctrl->sub_cctrls, customctrl, sub_cctrls_entry)
{
list_remove(&sub_cur1->sub_cctrls_entry);
ctrl_free(sub_cur1);
}
DestroyWindow(ctrl->hwnd);
HeapFree(GetProcessHeap(), 0, ctrl);
}
static void customctrl_resize(FileDialogImpl *This, customctrl *ctrl) static void customctrl_resize(FileDialogImpl *This, customctrl *ctrl)
{ {
RECT rc; RECT rc;
UINT total_height;
customctrl *sub_ctrl;
switch(ctrl->type) switch(ctrl->type)
{ {
...@@ -673,7 +722,35 @@ static void customctrl_resize(FileDialogImpl *This, customctrl *ctrl) ...@@ -673,7 +722,35 @@ static void customctrl_resize(FileDialogImpl *This, customctrl *ctrl)
ctrl_resize(ctrl->hwnd, 160, 160, TRUE); ctrl_resize(ctrl->hwnd, 160, 160, TRUE);
GetWindowRect(ctrl->hwnd, &rc); GetWindowRect(ctrl->hwnd, &rc);
SetWindowPos(ctrl->wrapper_hwnd, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top, SetWindowPos(ctrl->wrapper_hwnd, NULL, 0, 0, rc.right-rc.left, rc.bottom-rc.top,
SWP_NOZORDER|SWP_NOMOVE|SWP_NOZORDER); SWP_NOZORDER|SWP_NOMOVE);
break;
case IDLG_CCTRL_VISUALGROUP:
total_height = 0;
ctrl_resize(ctrl->hwnd, 0, This->cctrl_indent, TRUE);
LIST_FOR_EACH_ENTRY(sub_ctrl, &ctrl->sub_cctrls, customctrl, sub_cctrls_entry)
{
customctrl_resize(This, sub_ctrl);
SetWindowPos(sub_ctrl->wrapper_hwnd, NULL, This->cctrl_indent, total_height, 0, 0,
SWP_NOZORDER|SWP_NOSIZE);
total_height += ctrl_get_height(sub_ctrl);
}
/* The label should be right adjusted */
{
UINT width, height;
GetWindowRect(ctrl->hwnd, &rc);
width = rc.right - rc.left;
height = rc.bottom - rc.top;
SetWindowPos(ctrl->hwnd, NULL, This->cctrl_indent - width, 0, width, height, SWP_NOZORDER);
}
/* Resize the wrapper window to fit all the sub controls */
SetWindowPos(ctrl->wrapper_hwnd, NULL, 0, 0, This->cctrl_width + This->cctrl_indent, total_height,
SWP_NOZORDER|SWP_NOMOVE);
break; break;
case IDLG_CCTRL_RADIOBUTTONLIST: case IDLG_CCTRL_RADIOBUTTONLIST:
case IDLG_CCTRL_EDITBOX: case IDLG_CCTRL_EDITBOX:
...@@ -778,6 +855,7 @@ static LRESULT notifysink_on_wm_notify(FileDialogImpl *This, HWND hwnd, WPARAM w ...@@ -778,6 +855,7 @@ static LRESULT notifysink_on_wm_notify(FileDialogImpl *This, HWND hwnd, WPARAM w
static LRESULT CALLBACK notifysink_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) static LRESULT CALLBACK notifysink_proc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{ {
FileDialogImpl *This = (FileDialogImpl*)GetWindowLongPtrW(hwnd, GWLP_USERDATA); FileDialogImpl *This = (FileDialogImpl*)GetWindowLongPtrW(hwnd, GWLP_USERDATA);
customctrl *ctrl;
HWND hwnd_child; HWND hwnd_child;
RECT rc; RECT rc;
...@@ -788,8 +866,12 @@ static LRESULT CALLBACK notifysink_proc(HWND hwnd, UINT message, WPARAM wparam, ...@@ -788,8 +866,12 @@ static LRESULT CALLBACK notifysink_proc(HWND hwnd, UINT message, WPARAM wparam,
case WM_NOTIFY: return notifysink_on_wm_notify(This, hwnd, wparam, lparam); case WM_NOTIFY: return notifysink_on_wm_notify(This, hwnd, wparam, lparam);
case WM_SIZE: case WM_SIZE:
hwnd_child = GetPropW(hwnd, notifysink_childW); hwnd_child = GetPropW(hwnd, notifysink_childW);
GetClientRect(hwnd, &rc); ctrl = (customctrl*)GetWindowLongPtrW(hwnd_child, GWLP_USERDATA);
SetWindowPos(hwnd_child, NULL, 0, 0, rc.right, rc.bottom, SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER); if(ctrl && ctrl->type != IDLG_CCTRL_VISUALGROUP)
{
GetClientRect(hwnd, &rc);
SetWindowPos(hwnd_child, NULL, 0, 0, rc.right, rc.bottom, SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
}
return TRUE; return TRUE;
} }
...@@ -800,15 +882,20 @@ static HRESULT cctrl_create_new(FileDialogImpl *This, DWORD id, ...@@ -800,15 +882,20 @@ static HRESULT cctrl_create_new(FileDialogImpl *This, DWORD id,
LPCWSTR text, LPCWSTR wndclass, DWORD ctrl_wsflags, LPCWSTR text, LPCWSTR wndclass, DWORD ctrl_wsflags,
DWORD ctrl_exflags, UINT height, customctrl **ppctrl) DWORD ctrl_exflags, UINT height, customctrl **ppctrl)
{ {
HWND ns_hwnd, control_hwnd; HWND ns_hwnd, control_hwnd, parent_hwnd;
DWORD wsflags = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS; DWORD wsflags = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS;
customctrl *ctrl; customctrl *ctrl;
if(get_cctrl(This, id)) if(get_cctrl(This, id))
return E_UNEXPECTED; /* Duplicate id */ return E_UNEXPECTED; /* Duplicate id */
if(This->cctrl_active_vg)
parent_hwnd = This->cctrl_active_vg->wrapper_hwnd;
else
parent_hwnd = This->cctrls_hwnd;
ns_hwnd = CreateWindowExW(0, floatnotifysinkW, NULL, wsflags, ns_hwnd = CreateWindowExW(0, floatnotifysinkW, NULL, wsflags,
0, 0, This->cctrl_width, height, This->cctrls_hwnd, 0, 0, This->cctrl_width, height, parent_hwnd,
(HMENU)This->cctrl_next_dlgid, COMDLG32_hInstance, This); (HMENU)This->cctrl_next_dlgid, COMDLG32_hInstance, This);
control_hwnd = CreateWindowExW(ctrl_exflags, wndclass, text, wsflags | ctrl_wsflags, control_hwnd = CreateWindowExW(ctrl_exflags, wndclass, text, wsflags | ctrl_wsflags,
0, 0, This->cctrl_width, height, ns_hwnd, 0, 0, This->cctrl_width, height, ns_hwnd,
...@@ -834,7 +921,15 @@ static HRESULT cctrl_create_new(FileDialogImpl *This, DWORD id, ...@@ -834,7 +921,15 @@ static HRESULT cctrl_create_new(FileDialogImpl *This, DWORD id,
ctrl->id = id; ctrl->id = id;
ctrl->dlgid = This->cctrl_next_dlgid; ctrl->dlgid = This->cctrl_next_dlgid;
ctrl->cdcstate = CDCS_ENABLED | CDCS_VISIBLE; ctrl->cdcstate = CDCS_ENABLED | CDCS_VISIBLE;
list_add_tail(&This->cctrls, &ctrl->entry); list_init(&ctrl->sub_cctrls);
if(This->cctrl_active_vg)
list_add_tail(&This->cctrl_active_vg->sub_cctrls, &ctrl->sub_cctrls_entry);
else
list_add_tail(&This->cctrls, &ctrl->entry);
SetWindowLongPtrW(ctrl->hwnd, GWLP_USERDATA, (LPARAM)ctrl);
if(ppctrl) *ppctrl = ctrl; if(ppctrl) *ppctrl = ctrl;
This->cctrl_next_dlgid++; This->cctrl_next_dlgid++;
...@@ -853,7 +948,6 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width) ...@@ -853,7 +948,6 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width)
UINT cur_col_pos, cur_row_pos; UINT cur_col_pos, cur_row_pos;
customctrl *ctrl; customctrl *ctrl;
BOOL fits_height; BOOL fits_height;
static const UINT col_indent = 100; /* The first column is indented 100px */
static const UINT cspacing = 90; /* Columns are spaced with 90px */ static const UINT cspacing = 90; /* Columns are spaced with 90px */
static const UINT rspacing = 4; /* Rows are spaced with 4 px. */ static const UINT rspacing = 4; /* Rows are spaced with 4 px. */
...@@ -865,7 +959,7 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width) ...@@ -865,7 +959,7 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width)
TRACE("%p\n", This); TRACE("%p\n", This);
column_width = This->cctrl_width + cspacing; column_width = This->cctrl_width + cspacing;
nr_of_cols = (container_width - col_indent + cspacing) / column_width; nr_of_cols = (container_width - This->cctrl_indent + cspacing) / column_width;
/* We don't need to do anything unless the number of visible columns has changed. */ /* We don't need to do anything unless the number of visible columns has changed. */
if(nr_of_cols == This->cctrls_cols) if(nr_of_cols == This->cctrls_cols)
...@@ -875,7 +969,7 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width) ...@@ -875,7 +969,7 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width)
return rc.bottom - rc.top; return rc.bottom - rc.top;
} }
This->cctrls_cols = nr_of_cols; This->cctrls_cols = nr_of_cols;
/* Get the size of the tallest control, and the total size of /* Get the size of the tallest control, and the total size of
* all the controls to figure out the number of slots we need. * all the controls to figure out the number of slots we need.
...@@ -885,10 +979,7 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width) ...@@ -885,10 +979,7 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width)
{ {
if(ctrl->cdcstate & CDCS_VISIBLE) if(ctrl->cdcstate & CDCS_VISIBLE)
{ {
RECT rc; UINT control_height = ctrl_get_height(ctrl);
UINT control_height;
GetWindowRect(ctrl->wrapper_hwnd, &rc);
control_height = rc.bottom - rc.top;
max_control_height = max(max_control_height, control_height); max_control_height = max(max_control_height, control_height);
total_height += control_height + rspacing; total_height += control_height + rspacing;
...@@ -913,10 +1004,7 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width) ...@@ -913,10 +1004,7 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width)
{ {
if(ctrl->cdcstate & CDCS_VISIBLE) if(ctrl->cdcstate & CDCS_VISIBLE)
{ {
RECT rc; UINT control_height = ctrl_get_height(ctrl);
UINT control_height;
GetWindowRect(ctrl->wrapper_hwnd, &rc);
control_height = rc.bottom - rc.top;
if(cur_row_pos + control_height > container_height) if(cur_row_pos + control_height > container_height)
{ {
...@@ -938,13 +1026,13 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width) ...@@ -938,13 +1026,13 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width)
/* Move the controls to their final destination /* Move the controls to their final destination
*/ */
cur_col_pos = col_indent, cur_row_pos = 0; cur_col_pos = 0, cur_row_pos = 0;
LIST_FOR_EACH_ENTRY(ctrl, &This->cctrls, customctrl, entry) LIST_FOR_EACH_ENTRY(ctrl, &This->cctrls, customctrl, entry)
{ {
if(ctrl->cdcstate & CDCS_VISIBLE) if(ctrl->cdcstate & CDCS_VISIBLE)
{ {
RECT rc; RECT rc;
UINT control_height; UINT control_height, control_indent;
GetWindowRect(ctrl->wrapper_hwnd, &rc); GetWindowRect(ctrl->wrapper_hwnd, &rc);
control_height = rc.bottom - rc.top; control_height = rc.bottom - rc.top;
...@@ -954,7 +1042,13 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width) ...@@ -954,7 +1042,13 @@ static UINT ctrl_container_resize(FileDialogImpl *This, UINT container_width)
cur_col_pos += This->cctrl_width + cspacing; cur_col_pos += This->cctrl_width + cspacing;
} }
SetWindowPos(ctrl->wrapper_hwnd, NULL, cur_col_pos, cur_row_pos, 0, 0,
if(ctrl->type == IDLG_CCTRL_VISUALGROUP)
control_indent = 0;
else
control_indent = This->cctrl_indent;
SetWindowPos(ctrl->wrapper_hwnd, NULL, cur_col_pos + control_indent, cur_row_pos, 0, 0,
SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER); SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER);
cur_row_pos += control_height + rspacing; cur_row_pos += control_height + rspacing;
...@@ -974,7 +1068,7 @@ static void ctrl_container_reparent(FileDialogImpl *This, HWND parent) ...@@ -974,7 +1068,7 @@ static void ctrl_container_reparent(FileDialogImpl *This, HWND parent)
if(parent) if(parent)
{ {
customctrl *ctrl; customctrl *ctrl, *sub_ctrl;
HFONT font; HFONT font;
wndstyle = GetWindowLongW(This->cctrls_hwnd, GWL_STYLE); wndstyle = GetWindowLongW(This->cctrls_hwnd, GWL_STYLE);
...@@ -993,6 +1087,13 @@ static void ctrl_container_reparent(FileDialogImpl *This, HWND parent) ...@@ -993,6 +1087,13 @@ static void ctrl_container_reparent(FileDialogImpl *This, HWND parent)
LIST_FOR_EACH_ENTRY(ctrl, &This->cctrls, customctrl, entry) LIST_FOR_EACH_ENTRY(ctrl, &This->cctrls, customctrl, entry)
{ {
if(font) SendMessageW(ctrl->hwnd, WM_SETFONT, (WPARAM)font, TRUE); if(font) SendMessageW(ctrl->hwnd, WM_SETFONT, (WPARAM)font, TRUE);
/* If this is a VisualGroup */
LIST_FOR_EACH_ENTRY(sub_ctrl, &ctrl->sub_cctrls, customctrl, sub_cctrls_entry)
{
if(font) SendMessageW(sub_ctrl->hwnd, WM_SETFONT, (WPARAM)font, TRUE);
}
customctrl_resize(This, ctrl); customctrl_resize(This, ctrl);
} }
} }
...@@ -1025,18 +1126,8 @@ static LRESULT ctrl_container_on_wm_destroy(FileDialogImpl *This) ...@@ -1025,18 +1126,8 @@ static LRESULT ctrl_container_on_wm_destroy(FileDialogImpl *This)
LIST_FOR_EACH_ENTRY_SAFE(cur1, cur2, &This->cctrls, customctrl, entry) LIST_FOR_EACH_ENTRY_SAFE(cur1, cur2, &This->cctrls, customctrl, entry)
{ {
TRACE("Freeing control %p\n", cur1);
list_remove(&cur1->entry); list_remove(&cur1->entry);
ctrl_free(cur1);
if(cur1->type == IDLG_CCTRL_MENU)
{
TBBUTTON tbb;
SendMessageW(cur1->hwnd, TB_GETBUTTON, 0, (LPARAM)&tbb);
DestroyMenu((HMENU)tbb.dwData);
}
DestroyWindow(cur1->hwnd);
HeapFree(GetProcessHeap(), 0, cur1);
} }
return TRUE; return TRUE;
...@@ -1065,11 +1156,13 @@ static HRESULT init_custom_controls(FileDialogImpl *This) ...@@ -1065,11 +1156,13 @@ static HRESULT init_custom_controls(FileDialogImpl *This)
InitCommonControlsEx(NULL); InitCommonControlsEx(NULL);
This->cctrl_width = 160; /* Controls have a fixed width */ This->cctrl_width = 160; /* Controls have a fixed width */
This->cctrl_indent = 100;
This->cctrl_def_height = 23; This->cctrl_def_height = 23;
This->cctrls_cols = 0; This->cctrls_cols = 0;
This->cctrl_next_dlgid = 0x2000; This->cctrl_next_dlgid = 0x2000;
list_init(&This->cctrls); list_init(&This->cctrls);
This->cctrl_active_vg = NULL;
if( !GetClassInfoW(COMDLG32_hInstance, ctrl_container_classname, &wc) ) if( !GetClassInfoW(COMDLG32_hInstance, ctrl_container_classname, &wc) )
{ {
...@@ -3227,6 +3320,7 @@ static HRESULT WINAPI IFileDialogCustomize_fnSetControlLabel(IFileDialogCustomiz ...@@ -3227,6 +3320,7 @@ static HRESULT WINAPI IFileDialogCustomize_fnSetControlLabel(IFileDialogCustomiz
case IDLG_CCTRL_PUSHBUTTON: case IDLG_CCTRL_PUSHBUTTON:
case IDLG_CCTRL_CHECKBUTTON: case IDLG_CCTRL_CHECKBUTTON:
case IDLG_CCTRL_TEXT: case IDLG_CCTRL_TEXT:
case IDLG_CCTRL_VISUALGROUP:
SendMessageW(ctrl->hwnd, WM_SETTEXT, 0, (LPARAM)pszLabel); SendMessageW(ctrl->hwnd, WM_SETTEXT, 0, (LPARAM)pszLabel);
break; break;
default: default:
...@@ -3544,15 +3638,32 @@ static HRESULT WINAPI IFileDialogCustomize_fnStartVisualGroup(IFileDialogCustomi ...@@ -3544,15 +3638,32 @@ static HRESULT WINAPI IFileDialogCustomize_fnStartVisualGroup(IFileDialogCustomi
LPCWSTR pszLabel) LPCWSTR pszLabel)
{ {
FileDialogImpl *This = impl_from_IFileDialogCustomize(iface); FileDialogImpl *This = impl_from_IFileDialogCustomize(iface);
FIXME("stub - %p (%d, %s)\n", This, dwIDCtl, debugstr_w(pszLabel)); customctrl *vg;
return E_NOTIMPL; HRESULT hr;
TRACE("%p (%d, %s)\n", This, dwIDCtl, debugstr_w(pszLabel));
if(This->cctrl_active_vg)
return E_UNEXPECTED;
hr = cctrl_create_new(This, dwIDCtl, pszLabel, WC_STATICW, 0, 0,
This->cctrl_def_height, &vg);
if(SUCCEEDED(hr))
{
vg->type = IDLG_CCTRL_VISUALGROUP;
This->cctrl_active_vg = vg;
}
return hr;
} }
static HRESULT WINAPI IFileDialogCustomize_fnEndVisualGroup(IFileDialogCustomize *iface) static HRESULT WINAPI IFileDialogCustomize_fnEndVisualGroup(IFileDialogCustomize *iface)
{ {
FileDialogImpl *This = impl_from_IFileDialogCustomize(iface); FileDialogImpl *This = impl_from_IFileDialogCustomize(iface);
FIXME("stub - %p\n", This); TRACE("%p\n", This);
return E_NOTIMPL;
This->cctrl_active_vg = NULL;
return S_OK;
} }
static HRESULT WINAPI IFileDialogCustomize_fnMakeProminent(IFileDialogCustomize *iface, static HRESULT WINAPI IFileDialogCustomize_fnMakeProminent(IFileDialogCustomize *iface,
......
...@@ -1363,7 +1363,7 @@ static void test_customize_onfolderchange(IFileDialog *pfd) ...@@ -1363,7 +1363,7 @@ static void test_customize_onfolderchange(IFileDialog *pfd)
item = find_window(dlg_hwnd, NULL, visualgroup1W); item = find_window(dlg_hwnd, NULL, visualgroup1W);
ok(item == NULL, "Found item: %p\n", item); ok(item == NULL, "Found item: %p\n", item);
item = find_window(dlg_hwnd, NULL, visualgroup2W); item = find_window(dlg_hwnd, NULL, visualgroup2W);
ok(item == NULL, "Found item: %p\n", item); todo_wine ok(item == NULL, "Found item: %p\n", item);
br = PostMessageW(dlg_hwnd, WM_COMMAND, IDCANCEL, 0); br = PostMessageW(dlg_hwnd, WM_COMMAND, IDCANCEL, 0);
ok(br, "Failed\n"); ok(br, "Failed\n");
...@@ -1380,6 +1380,7 @@ static void test_customize(void) ...@@ -1380,6 +1380,7 @@ static void test_customize(void)
DWORD cookie; DWORD cookie;
LPWSTR tmpstr; LPWSTR tmpstr;
UINT i; UINT i;
UINT id_vgroup1, id_text, id_editbox1;
LONG ref; LONG ref;
HWND dlg_hwnd; HWND dlg_hwnd;
HRESULT hr; HRESULT hr;
...@@ -1632,25 +1633,25 @@ static void test_customize(void) ...@@ -1632,25 +1633,25 @@ static void test_customize(void)
ok(hr == S_OK, "got 0x%08x (control: %d).\n", hr, i); ok(hr == S_OK, "got 0x%08x (control: %d).\n", hr, i);
hr = IFileDialogCustomize_StartVisualGroup(pfdc, i, label); hr = IFileDialogCustomize_StartVisualGroup(pfdc, i, label);
todo_wine ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr); ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
hr = IFileDialogCustomize_StartVisualGroup(pfdc, ++i, visualgroup1W); hr = IFileDialogCustomize_StartVisualGroup(pfdc, ++i, visualgroup1W);
todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr); ok(hr == S_OK, "got 0x%08x.\n", hr);
hr = IFileDialogCustomize_AddControlItem(pfdc, i, 0, label); hr = IFileDialogCustomize_AddControlItem(pfdc, i, 0, label);
todo_wine ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr); ok(hr == E_NOINTERFACE, "got 0x%08x.\n", hr);
hr = IFileDialogCustomize_SetControlLabel(pfdc, i, visualgroup2W); hr = IFileDialogCustomize_SetControlLabel(pfdc, i, visualgroup2W);
todo_wine ok(hr == S_OK, "got 0x%08x (control: %d).\n", hr, i); ok(hr == S_OK, "got 0x%08x (control: %d).\n", hr, i);
cdstate = 0xdeadbeef; cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, i, &cdstate); hr = IFileDialogCustomize_GetControlState(pfdc, i, &cdstate);
todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr); ok(hr == S_OK, "got 0x%08x.\n", hr);
todo_wine ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate); ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
hr = IFileDialogCustomize_StartVisualGroup(pfdc, ++i, label); hr = IFileDialogCustomize_StartVisualGroup(pfdc, ++i, label);
todo_wine ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr); ok(hr == E_UNEXPECTED, "got 0x%08x.\n", hr);
hr = IFileDialogCustomize_EndVisualGroup(pfdc); hr = IFileDialogCustomize_EndVisualGroup(pfdc);
todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr); ok(hr == S_OK, "got 0x%08x.\n", hr);
i++; /* Nonexisting control */ i++; /* Nonexisting control */
hr = IFileDialogCustomize_AddControlItem(pfdc, i, 0, label); hr = IFileDialogCustomize_AddControlItem(pfdc, i, 0, label);
...@@ -1896,6 +1897,127 @@ static void test_customize(void) ...@@ -1896,6 +1897,127 @@ static void test_customize(void)
IFileDialogCustomize_Release(pfdc); IFileDialogCustomize_Release(pfdc);
ref = IFileDialog_Release(pfod); ref = IFileDialog_Release(pfod);
ok(!ref, "Refcount not zero (%d).\n", ref); ok(!ref, "Refcount not zero (%d).\n", ref);
/* Some more tests for VisualGroup behavior */
hr = CoCreateInstance(&CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
&IID_IFileDialog, (void**)&pfod);
ok(hr == S_OK, "got 0x%08x.\n", hr);
hr = IFileDialog_QueryInterface(pfod, &IID_IFileDialogCustomize, (void**)&pfdc);
ok(hr == S_OK, "got 0x%08x.\n", hr);
i = -1;
id_vgroup1 = ++i;
hr = IFileDialogCustomize_StartVisualGroup(pfdc, id_vgroup1, visualgroup1W);
ok(hr == S_OK, "got 0x%08x.\n", hr);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_vgroup1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
id_text = ++i;
hr = IFileDialogCustomize_AddText(pfdc, id_text, label);
ok(hr == S_OK, "got 0x%08x.\n", hr);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_text, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
id_editbox1 = ++i;
hr = IFileDialogCustomize_AddEditBox(pfdc, id_editbox1, editbox1W);
ok(hr == S_OK, "got 0x%08x.\n", hr);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_editbox1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
/* Set all Visible but not Enabled */
hr = IFileDialogCustomize_SetControlState(pfdc, id_vgroup1, CDCS_VISIBLE);
ok(hr == S_OK, "got 0x%08x.\n", hr);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_vgroup1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_VISIBLE, "got 0x%08x.\n", cdstate);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_text, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_editbox1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
/* Set text to Visible but not Enabled */
hr = IFileDialogCustomize_SetControlState(pfdc, id_text, CDCS_VISIBLE);
ok(hr == S_OK, "got 0x%08x.\n", hr);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_vgroup1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_VISIBLE, "got 0x%08x.\n", cdstate);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_text, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_VISIBLE, "got 0x%08x.\n", cdstate);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_editbox1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
/* Set vgroup to inactive */
hr = IFileDialogCustomize_SetControlState(pfdc, id_vgroup1, CDCS_INACTIVE);
ok(hr == S_OK, "got 0x%08x.\n", hr);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_vgroup1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_INACTIVE, "got 0x%08x.\n", cdstate);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_text, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_VISIBLE, "got 0x%08x.\n", cdstate);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_editbox1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
/* Set vgroup to Enabled and Visible again */
hr = IFileDialogCustomize_SetControlState(pfdc, id_vgroup1, CDCS_ENABLEDVISIBLE);
ok(hr == S_OK, "got 0x%08x.\n", hr);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_vgroup1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_text, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_VISIBLE, "got 0x%08x.\n", cdstate);
cdstate = 0xdeadbeef;
hr = IFileDialogCustomize_GetControlState(pfdc, id_editbox1, &cdstate);
ok(hr == S_OK, "got 0x%08x.\n", hr);
ok(cdstate == CDCS_ENABLEDVISIBLE, "got 0x%08x.\n", cdstate);
hr = IFileDialogCustomize_MakeProminent(pfdc, id_vgroup1);
todo_wine ok(hr == S_OK, "got 0x%08x.\n", hr);
IFileDialogCustomize_Release(pfdc);
ref = IFileDialog_Release(pfod);
ok(!ref, "Refcount not zero (%d).\n", ref);
} }
static void test_persistent_state(void) static void test_persistent_state(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment