21#if (DLL_EXPORT_VERSION >= 0x600) && defined(__REACTOS__)
40#define IDC_NAV_TOOLBAR 200
41#define IDC_NAVBACK 201
42#define IDC_NAVFORWARD 202
48DEFINE_GUID(IID_IFileDialogCustomizeAlt, 0x8016B7B3, 0x3D49, 0x4504, 0xA0,0xAA, 0x2A,0x37,0x49,0x4E,0x60,0x6F);
57enum ITEMDLG_CCTRL_TYPE {
59 IDLG_CCTRL_PUSHBUTTON,
61 IDLG_CCTRL_RADIOBUTTONLIST,
62 IDLG_CCTRL_CHECKBUTTON,
66 IDLG_CCTRL_OPENDROPDOWN,
67 IDLG_CCTRL_VISUALGROUP
70typedef struct cctrl_item {
73 CDCONTROLSTATEF cdcstate;
81 enum ITEMDLG_CCTRL_TYPE
type;
82 CDCONTROLSTATEF cdcstate;
85 struct list sub_cctrls;
86 struct list sub_cctrls_entry;
87 struct list sub_items;
96typedef struct FileDialogImpl {
99 IFileOpenDialog IFileOpenDialog_iface;
102 enum ITEMDLG_TYPE dlg_type;
103 IExplorerBrowserEvents IExplorerBrowserEvents_iface;
107 IFileDialogCustomize IFileDialogCustomize_iface;
112 UINT filterspec_count;
115 struct list events_clients;
116 DWORD events_next_cookie;
118 IShellItemArray *psia_selection;
119 IShellItemArray *psia_results;
126 DWORD ebevents_cookie;
132 LPWSTR custom_cancelbutton;
133 LPWSTR custom_filenamelabel;
136 UINT cctrl_width, cctrl_def_height, cctrls_cols;
137 UINT cctrl_indent, dpi_x, dpi_y;
141 customctrl *cctrl_active_vg;
143 HMENU hmenu_opendropdown;
144 customctrl cctrl_opendropdown;
145 HFONT hfont_opendropdown;
146 BOOL opendropdown_has_selection;
147 DWORD opendropdown_selection;
157static HRESULT events_OnFileOk(FileDialogImpl *
This)
211static void events_OnFolderChange(FileDialogImpl *
This)
230static void events_OnSelectionChange(FileDialogImpl *
This)
249static void events_OnTypeChange(FileDialogImpl *
This)
282 hr = IFileDialogEvents_OnOverwrite(
cursor->pfde, (
IFileDialog*)&
This->IFileDialog2_iface, shellitem, &response);
283 TRACE(
"<-- hr=%lx response=%u\n",
hr, response);
318 return IFileDialogEvents_QueryInterface(pfde, &IID_IFileDialogControlEvents, (
void**)pfdce);
321static HRESULT cctrl_event_OnButtonClicked(FileDialogImpl *
This,
DWORD ctl_id)
332 IFileDialogControlEvents *pfdce;
336 IFileDialogControlEvents_OnButtonClicked(pfdce, &
This->IFileDialogCustomize_iface, ctl_id);
337 IFileDialogControlEvents_Release(pfdce);
351 TRACE(
"%p %li %li\n",
This, ctl_id, item_id);
358 IFileDialogControlEvents *pfdce;
362 IFileDialogControlEvents_OnItemSelected(pfdce, &
This->IFileDialogCustomize_iface, ctl_id, item_id);
363 IFileDialogControlEvents_Release(pfdce);
373static HRESULT cctrl_event_OnCheckButtonToggled(FileDialogImpl *
This,
DWORD ctl_id,
BOOL checked)
384 IFileDialogControlEvents *pfdce;
388 IFileDialogControlEvents_OnCheckButtonToggled(pfdce, &
This->IFileDialogCustomize_iface, ctl_id, checked);
389 IFileDialogControlEvents_Release(pfdce);
399static HRESULT cctrl_event_OnControlActivating(FileDialogImpl *
This,
411 IFileDialogControlEvents *pfdce;
415 IFileDialogControlEvents_OnControlActivating(pfdce, &
This->IFileDialogCustomize_iface, ctl_id);
416 IFileDialogControlEvents_Release(pfdce);
436 if(
This->set_filename)
462 if(
This->current_filter)
467 if (
This->peb &&
SUCCEEDED(IExplorerBrowser_GetCurrentView(
This->peb, &IID_IShellView, (
void**)&psv)))
469 IShellView_Refresh(psv);
470 IShellView_Release(psv);
476 if(
This->set_filename)
487static void fill_filename_from_selection(FileDialogImpl *
This)
496 if(!
This->psia_selection)
499 hr = IShellItemArray_GetCount(
This->psia_selection, &item_count);
506 valid_count = 0; len_total = 0;
507 for(
i = 0;
i < item_count;
i++)
509 hr = IShellItemArray_GetItemAt(
This->psia_selection,
i, &psi);
514 hr = IShellItem_GetAttributes(psi, SFGAO_FOLDER, &
attr);
516 (( (
This->options & FOS_PICKFOLDERS) && !(
attr & SFGAO_FOLDER)) ||
517 (!(
This->options & FOS_PICKFOLDERS) && (
attr & SFGAO_FOLDER))))
520 hr = IShellItem_GetDisplayName(psi, (
This->options & FOS_PICKFOLDERS) ? SIGDN_FILESYSPATH : SIGDN_PARENTRELATIVEPARSING, &
names[valid_count]);
526 IShellItem_Release(psi);
535 else if(valid_count > 1)
540 for(
i = 0;
i < valid_count;
i++)
550 *(cur_point-1) =
'\0';
552 set_file_name(
This,
string);
565 if( (endpos =
StrChrW(spec,
';')) )
588 hr = IShellItem_GetDisplayName(shellitem, SIGDN_FILESYSPATH, &
filename);
604static HRESULT on_default_action(FileDialogImpl *
This)
621 if(!file_count)
return E_FAIL;
626 ERR(
"Failed to get pidl for current directory.\n");
631 TRACE(
"Acting on %d file(s).\n", file_count);
644 if( (
This->options & FOS_NOVALIDATE) &&
645 !(
This->options & FOS_FILEMUSTEXIST) )
655 This->options & ~FOS_FILEMUSTEXIST,
656 (
This->dlg_type == ITEMDLG_TYPE_SAVE),
662 WCHAR extbuf[MAX_PATH], *newext = NULL;
664 if(This->current_filter)
666 newext = get_first_ext_from_spec(extbuf, This->current_filter);
669 if(!newext &&
This->default_ext)
671 lstrcpyW(extbuf, L
".");
672 lstrcatW(extbuf, This->default_ext);
676 if(
This->dlg_type == ITEMDLG_TYPE_SAVE)
680 WCHAR *ext = PathFindExtensionW(canon_filename);
681 if(lstrcmpiW(ext, newext))
682 lstrcatW(canon_filename, newext);
687 if( !(
This->options & FOS_NOVALIDATE) && (
This->options & FOS_FILEMUSTEXIST) &&
714 IShellFolder_Release(psf_parent);
730 hr = IExplorerBrowser_BrowseToObject(
This->peb, (
IUnknown*)psf_parent, SBSP_DEFBROWSER);
732 ERR(
"Failed to browse to directory: %08lx\n",
hr);
734 IShellFolder_Release(psf_parent);
741 if(
This->psia_results)
743 IShellItemArray_Release(
This->psia_results);
748 &
This->psia_results);
750 IShellFolder_Release(psf_desktop);
755 if(
This->options & FOS_PICKFOLDERS)
758 hr = IShellItemArray_GetAttributes(
This->psia_results, SIATTRIBFLAGS_AND, SFGAO_FOLDER, &
attributes);
766 IShellItemArray_Release(
This->psia_results);
772 if((
This->options & FOS_OVERWRITEPROMPT) &&
This->dlg_type == ITEMDLG_TYPE_SAVE)
778 hr = IShellItemArray_GetItemAt(
This->psia_results,
i, &shellitem);
781 if (shell_item_exists(shellitem))
782 hr = events_OnOverwrite(
This, shellitem);
784 IShellItem_Release(shellitem);
805 for(
i = 0;
i < file_count;
i++)
813static void show_opendropdown(FileDialogImpl *
This)
828 This->opendropdown_has_selection =
TRUE;
833 This->opendropdown_selection = mii.
wID;
838 This->opendropdown_has_selection =
FALSE;
846static void item_free(cctrl_item *
item)
853static cctrl_item* get_item(customctrl*
parent,
DWORD itemid, CDCONTROLSTATEF visible_flags,
DWORD* position)
858 if (!position) position = &
dummy;
864 if (
item->id == itemid)
867 if ((
item->cdcstate & visible_flags) == visible_flags)
898 if (!
item || !label_copy)
908 item->label = label_copy;
921static inline customctrl *get_cctrl_from_dlgid(FileDialogImpl *
This,
DWORD dlgid)
923 customctrl *
ctrl, *sub_ctrl;
927 if(
ctrl->dlgid == dlgid)
931 if(sub_ctrl->dlgid == dlgid)
935 ERR(
"Failed to find control with dialog id %ld\n", dlgid);
939static inline customctrl *get_cctrl(FileDialogImpl *
This,
DWORD ctlid)
941 customctrl *
ctrl, *sub_ctrl;
945 if(
ctrl->id == ctlid)
949 if(sub_ctrl->id == ctlid)
953 if (
This->hmenu_opendropdown &&
This->cctrl_opendropdown.id == ctlid)
954 return &
This->cctrl_opendropdown;
956 TRACE(
"No existing control with control id %ld\n", ctlid);
960static void ctrl_resize(
HWND hctrl,
UINT min_width,
UINT max_width,
BOOL multiline)
999 final_width =
min(
max(
size.cx, min_width) + 4, max_width);
1006static UINT ctrl_get_height(customctrl *
ctrl) {
1012static void ctrl_free(customctrl *
ctrl)
1014 customctrl *sub_cur1, *sub_cur2;
1015 cctrl_item *item_cur1, *item_cur2;
1018 if(
ctrl->type == IDLG_CCTRL_MENU)
1028 ctrl_free(sub_cur1);
1034 item_free(item_cur1);
1041static void customctrl_resize(FileDialogImpl *
This, customctrl *
ctrl)
1046 customctrl *sub_ctrl;
1050 case IDLG_CCTRL_PUSHBUTTON:
1051 case IDLG_CCTRL_COMBOBOX:
1052 case IDLG_CCTRL_CHECKBUTTON:
1053 case IDLG_CCTRL_TEXT:
1060 case IDLG_CCTRL_VISUALGROUP:
1066 customctrl_resize(
This, sub_ctrl);
1070 total_height += ctrl_get_height(sub_ctrl);
1088 case IDLG_CCTRL_RADIOBUTTONLIST:
1116 case IDLG_CCTRL_EDITBOX:
1117 case IDLG_CCTRL_SEPARATOR:
1118 case IDLG_CCTRL_MENU:
1119 case IDLG_CCTRL_OPENDROPDOWN:
1142 if(
ctrl->type == IDLG_CCTRL_CHECKBUTTON)
1145 cctrl_event_OnCheckButtonToggled(
This,
ctrl->id, checked);
1148 cctrl_event_OnButtonClicked(
This,
ctrl->id);
1164 cctrl_event_OnItemSelected(
This,
ctrl->id, selid);
1181 cctrl_event_OnControlActivating(
This,
ctrl->id);
1187 cctrl_event_OnItemSelected(
This,
ctrl->id, idcmd);
1231 if(
ctrl &&
ctrl->type != IDLG_CCTRL_VISUALGROUP)
1246 HWND ns_hwnd, control_hwnd, parent_hwnd;
1250 if(get_cctrl(
This,
id))
1253 if(
This->cctrl_active_vg)
1254 parent_hwnd =
This->cctrl_active_vg->wrapper_hwnd;
1256 parent_hwnd =
This->cctrls_hwnd;
1259 0, 0,
This->cctrl_width,
height, parent_hwnd,
1265 if(!ns_hwnd || !control_hwnd)
1267 ERR(
"Failed to create wrapper (%p) or control (%p)\n", ns_hwnd, control_hwnd);
1274 SetPropW(ns_hwnd,
L"nfs_child", control_hwnd);
1280 ctrl->hwnd = control_hwnd;
1281 ctrl->wrapper_hwnd = ns_hwnd;
1283 ctrl->dlgid =
This->cctrl_next_dlgid;
1288 if(
This->cctrl_active_vg)
1295 if(ppctrl) *ppctrl =
ctrl;
1297 This->cctrl_next_dlgid++;
1304static UINT ctrl_container_resize(FileDialogImpl *
This,
UINT container_width)
1306 UINT container_height;
1309 UINT max_control_height, total_height = 0;
1310 UINT cur_col_pos, cur_row_pos;
1323 column_width =
This->cctrl_width + cspacing;
1324 nr_of_cols = (container_width -
This->cctrl_indent + cspacing) / column_width;
1327 if(nr_of_cols ==
This->cctrls_cols)
1334 This->cctrls_cols = nr_of_cols;
1339 max_control_height = 0;
1344 UINT control_height = ctrl_get_height(
ctrl);
1345 max_control_height =
max(max_control_height, control_height);
1347 total_height += control_height + rspacing;
1354 container_height =
max(total_height / nr_of_cols, max_control_height + rspacing);
1355 TRACE(
"Guess: container_height: %d\n",container_height);
1361 UINT columns_needed = 1;
1369 UINT control_height = ctrl_get_height(
ctrl);
1371 if(cur_row_pos + control_height > container_height)
1373 if(++columns_needed > nr_of_cols)
1375 container_height += 1;
1376 fits_height =
FALSE;
1382 cur_row_pos += control_height + rspacing;
1385 }
while(!fits_height);
1387 TRACE(
"Final container height: %d\n", container_height);
1391 cur_col_pos = 0; cur_row_pos = 0;
1397 UINT control_height, control_indent;
1401 if(cur_row_pos + control_height > container_height)
1404 cur_col_pos +=
This->cctrl_width + cspacing;
1408 if(
ctrl->type == IDLG_CCTRL_VISUALGROUP)
1411 control_indent =
This->cctrl_indent;
1416 cur_row_pos += control_height + rspacing;
1421 if(cur_row_pos +
This->cctrl_width > container_width)
1422 ERR(
"-- Failed to place controls properly.\n");
1424 return container_height;
1427static void ctrl_set_font(customctrl *
ctrl, HFONT
font)
1429 customctrl *sub_ctrl;
1436 ctrl_set_font(sub_ctrl,
font);
1439 if (
ctrl->type == IDLG_CCTRL_RADIOBUTTONLIST)
1448static void ctrl_container_reparent(FileDialogImpl *
This,
HWND parent)
1468 ERR(
"Failed to get font handle from dialog.\n");
1498static LRESULT ctrl_container_on_wm_destroy(FileDialogImpl *
This)
1500 customctrl *cur1, *cur2;
1526static void radiobuttonlist_set_selected_item(FileDialogImpl *
This, customctrl *
ctrl, cctrl_item *
item)
1543 ctrl = get_cctrl_from_dlgid(
This, ctrl_id);
1547 ERR(
"Can't find this control\n");
1562 ERR(
"Can't find control item\n");
1595static HRESULT init_custom_controls(FileDialogImpl *
This)
1599 static const WCHAR ctrl_container_classname[] =
L"idlg_container_pane";
1621 0, 0, 0, 0,
NULL, 0,
1623 if(!
This->cctrls_hwnd)
1634 This->cctrls_cols = 0;
1636 This->cctrl_next_dlgid = 0x2000;
1658 ERR(
"Failed to register FloatNotifySink window class.\n");
1676 ERR(
"Failed to register RadioButtonList window class.\n");
1685static BOOL update_open_dropdown(FileDialogImpl *
This)
1689 HWND open_hwnd, dropdown_hwnd;
1691 if (
This->hmenu_opendropdown)
1693 INT num_visible_items=0;
1700 num_visible_items++;
1701 if (num_visible_items >= 2)
1715 if (showing != show)
1717 RECT open_rc, dropdown_rc;
1743static void update_layout(FileDialogImpl *
This)
1748 RECT cancel_rc, dropdown_rc, open_rc;
1749 RECT filetype_rc, filename_rc, filenamelabel_rc;
1750 RECT toolbar_rc, ebrowser_rc, customctrls_rc;
1751 static const UINT vspacing = 4, hspacing = 4;
1752 static const UINT min_width = 320, min_height = 200;
1757 TRACE(
"Invalid dialog window, not updating layout\n");
1761 if(dialog_rc.
right < min_width || dialog_rc.
bottom < min_height)
1763 TRACE(
"Dialog size (%ld, %ld) too small, not updating layout\n", dialog_rc.
right, dialog_rc.
bottom);
1775 int cancel_width, cancel_height;
1777 cancel_width = cancel_rc.
right - cancel_rc.
left;
1778 cancel_height = cancel_rc.
bottom - cancel_rc.
top;
1780 cancel_rc.
left = dialog_rc.
right - cancel_width - hspacing;
1781 cancel_rc.
top = dialog_rc.
bottom - cancel_height - vspacing;
1782 cancel_rc.
right = cancel_rc.
left + cancel_width;
1783 cancel_rc.
bottom = cancel_rc.
top + cancel_height;
1787 show_dropdown = update_open_dropdown(
This);
1791 int dropdown_width, dropdown_height;
1795 dropdown_width = dropdown_rc.
right - dropdown_rc.
left;
1796 dropdown_height = dropdown_rc.
bottom - dropdown_rc.
top;
1798 dropdown_rc.
left = cancel_rc.
left - dropdown_width - hspacing;
1799 dropdown_rc.
top = cancel_rc.
top;
1800 dropdown_rc.
right = dropdown_rc.
left + dropdown_width;
1801 dropdown_rc.
bottom = dropdown_rc.
top + dropdown_height;
1805 dropdown_rc.
left = dropdown_rc.
right = cancel_rc.
left - hspacing;
1806 dropdown_rc.
top = cancel_rc.
top;
1814 int open_width, open_height;
1816 open_width = open_rc.
right - open_rc.
left;
1817 open_height = open_rc.
bottom - open_rc.
top;
1819 open_rc.
left = dropdown_rc.
left - open_width;
1820 open_rc.
top = dropdown_rc.
top;
1821 open_rc.
right = open_rc.
left + open_width;
1822 open_rc.
bottom = open_rc.
top + open_height;
1829 int filetype_width, filetype_height;
1832 filetype_width = filetype_rc.
right - filetype_rc.
left;
1833 filetype_height = filetype_rc.
bottom - filetype_rc.
top;
1837 filetype_rc.
left = filetype_rc.
right - filetype_width;
1838 filetype_rc.
top = cancel_rc.
top - filetype_height - vspacing;
1839 filetype_rc.
bottom = filetype_rc.
top + filetype_height;
1841 if(!
This->filterspec_count)
1849 int filetypelabel_width, filetypelabel_height;
1852 filetypelabel_width = filenamelabel_rc.
right - filenamelabel_rc.
left;
1853 filetypelabel_height = filenamelabel_rc.
bottom - filenamelabel_rc.
top;
1855 filenamelabel_rc.
left = 160;
1856 filenamelabel_rc.
top = filetype_rc.
top;
1857 filenamelabel_rc.
right = filenamelabel_rc.
left + filetypelabel_width;
1858 filenamelabel_rc.
bottom = filenamelabel_rc.
top + filetypelabel_height;
1865 int filename_width, filename_height;
1868 filename_width = filetype_rc.
left - filenamelabel_rc.
right - hspacing*2;
1869 filename_height = filename_rc.
bottom - filename_rc.
top;
1871 filename_rc.
left = filenamelabel_rc.
right + hspacing;
1872 filename_rc.
top = filetype_rc.
top;
1873 filename_rc.
right = filename_rc.
left + filename_width;
1874 filename_rc.
bottom = filename_rc.
top + filename_height;
1885 customctrls_rc.
left = dialog_rc.
left + hspacing;
1886 customctrls_rc.
right = dialog_rc.
right - hspacing;
1887 customctrls_rc.
bottom = filename_rc.
top - vspacing;
1888 customctrls_rc.
top = customctrls_rc.
bottom -
1889 ctrl_container_resize(
This, customctrls_rc.
right - customctrls_rc.
left);
1892 ebrowser_rc.
left = dialog_rc.
left + hspacing;
1893 ebrowser_rc.
top = toolbar_rc.
bottom + vspacing;
1894 ebrowser_rc.
right = dialog_rc.
right - hspacing;
1895 ebrowser_rc.
bottom = customctrls_rc.
top - vspacing;
1904 if(hdwp &&
This->peb)
1905 IExplorerBrowser_SetRect(
This->peb, &hdwp, ebrowser_rc);
1907 if(hdwp &&
This->cctrls_hwnd)
1909 customctrls_rc.
left, customctrls_rc.
top,
1910 customctrls_rc.
right - customctrls_rc.
left, customctrls_rc.
bottom - customctrls_rc.
top,
1942 ERR(
"Failed to position dialog controls.\n");
1947static HRESULT init_explorerbrowser(FileDialogImpl *
This)
1959 &IID_IExplorerBrowser, (
void**)&
This->peb);
1962 ERR(
"Failed to instantiate ExplorerBrowser control.\n");
1968 hr = IExplorerBrowser_Initialize(
This->peb,
This->dlg_hwnd, &rc,
NULL);
1971 ERR(
"Failed to initialize the ExplorerBrowser control.\n");
1972 IExplorerBrowser_Release(
This->peb);
1976 hr = IExplorerBrowser_Advise(
This->peb, &
This->IExplorerBrowserEvents_iface, &
This->ebevents_cookie);
1978 ERR(
"Advise (ExplorerBrowser) failed.\n");
1982 if(!(
This->options & FOS_ALLOWMULTISELECT))
1985 IExplorerBrowser_SetFolderSettings(
This->peb, &fos);
1991 IObjectWithSite_Release(
client);
1993 ERR(
"SetSite failed, 0x%08lx\n",
hr);
1997 psi_folder =
This->psi_setfolder ?
This->psi_setfolder :
This->psi_defaultfolder;
1998 IExplorerBrowser_BrowseToObject(
This->peb, (
IUnknown*)psi_folder, SBSP_DEFBROWSER);
2003static void init_toolbar(FileDialogImpl *
This,
HWND hwnd)
2023 button[0].idCommand = IDC_NAVBACK;
2030 button[1].idCommand = IDC_NAVFORWARD;
2036 button[2].iBitmap = navUpImgIndex;
2037 button[2].idCommand = IDC_NAVUP;
2049static void update_control_text(FileDialogImpl *
This)
2057 if(
This->custom_title)
2061 custom_okbutton =
item->label;
2063 custom_okbutton =
This->custom_okbutton;
2065 if(custom_okbutton &&
2069 ctrl_resize(hitem, min_width, max_width,
FALSE);
2072 if(
This->custom_cancelbutton &&
2076 ctrl_resize(hitem, min_width, max_width,
FALSE);
2079 if(
This->custom_filenamelabel &&
2083 ctrl_resize(hitem, min_width, max_width,
FALSE);
2094 show_opendropdown(
This);
2105 FileDialogImpl *
This = (FileDialogImpl*)
lParam;
2121 if(
This->filterspec_count)
2126 UINT i, maxwidth = 0;
2132 for(
i = 0;
i <
This->filterspec_count;
i++)
2137 maxwidth =
max(maxwidth,
size.cx);
2147 ERR(
"Failed to calculate width of filetype dropdown\n");
2154 if(
This->set_filename &&
2158 if(
This->hmenu_opendropdown)
2171 memset(&lfw_marlett, 0,
sizeof(lfw_marlett));
2182 SetPropW(dropdown_hwnd,
L"itemdlg_oldwndproc",
2186 ctrl_container_reparent(
This,
This->dlg_hwnd);
2187 init_explorerbrowser(
This);
2189 update_control_text(
This);
2190 update_layout(
This);
2192 if(
This->filterspec_count)
2193 events_OnTypeChange(
This);
2203 update_layout(
This);
2225 IExplorerBrowser_Destroy(
This->peb);
2226 IExplorerBrowser_Release(
This->peb);
2230 ctrl_container_reparent(
This,
NULL);
2264 show_opendropdown(
This);
2271static LRESULT on_browse_back(FileDialogImpl *
This)
2274 IExplorerBrowser_BrowseToIDList(
This->peb,
NULL, SBSP_NAVIGATEBACK);
2278static LRESULT on_browse_forward(FileDialogImpl *
This)
2281 IExplorerBrowser_BrowseToIDList(
This->peb,
NULL, SBSP_NAVIGATEFORWARD);
2290 UINT prev_index =
This->filetypeindex;
2293 TRACE(
"File type selection changed to %d.\n",
This->filetypeindex);
2295 if(prev_index ==
This->filetypeindex)
2298 set_current_filter(
This,
This->filterspecs[
This->filetypeindex].pszSpec);
2304 set_file_name(
This,
L"");
2306 else if(
filename &&
This->dlg_type == ITEMDLG_TYPE_SAVE)
2310 ext = get_first_ext_from_spec(extbuf,
This->filterspecs[
This->filetypeindex].pszSpec);
2328 events_OnTypeChange(
This);
2337 IExplorerBrowser_BrowseToIDList(
This->peb,
NULL, SBSP_PARENT);
2348 case IDC_NAVBACK:
return on_browse_back(
This);
2349 case IDC_NAVFORWARD:
return on_browse_forward(
This);
2351 case IDC_NAVUP:
return on_browse_up(
This);
2352 default:
TRACE(
"Unknown command.\n");
2415static inline FileDialogImpl *impl_from_IFileDialog2(
IFileDialog2 *iface)
2424 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2436 *ppvObject = &
This->u.IFileOpenDialog_iface;
2440 *ppvObject = &
This->u.IFileSaveDialog_iface;
2444 *ppvObject = &
This->IExplorerBrowserEvents_iface;
2448 *ppvObject = &
This->IServiceProvider_iface;
2454 *ppvObject = &
This->ICommDlgBrowser3_iface;
2458 *ppvObject = &
This->IOleWindow_iface;
2463 *ppvObject = &
This->IFileDialogCustomize_iface;
2470 IUnknown_AddRef((
IUnknown*)*ppvObject);
2479 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2488 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2495 for(
i = 0;
i <
This->filterspec_count;
i++)
2504 if(
This->psi_defaultfolder) IShellItem_Release(
This->psi_defaultfolder);
2505 if(
This->psi_setfolder) IShellItem_Release(
This->psi_setfolder);
2506 if(
This->psi_folder) IShellItem_Release(
This->psi_folder);
2507 if(
This->psia_selection) IShellItemArray_Release(
This->psia_selection);
2508 if(
This->psia_results) IShellItemArray_Release(
This->psia_results);
2529 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2530 TRACE(
"%p (%p)\n", iface, hwndOwner);
2532 This->opendropdown_has_selection =
FALSE;
2534 return create_dialog(
This, hwndOwner);
2540 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2542 TRACE(
"%p (%d, %p)\n",
This, cFileTypes, rgFilterSpec);
2547 if(
This->filterspecs)
2554 for(
i = 0;
i < cFileTypes;
i++)
2556 This->filterspecs[
i].pszName =
StrDupW(rgFilterSpec[
i].pszName);
2559 This->filterspec_count = cFileTypes;
2561 set_current_filter(
This,
This->filterspecs[
This->filetypeindex].pszSpec);
2568 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2571 if(!
This->filterspecs)
2574 iFileType =
max(iFileType, 1);
2575 iFileType =
min(iFileType,
This->filterspec_count);
2576 This->filetypeindex = iFileType-1;
2578 set_current_filter(
This,
This->filterspecs[
This->filetypeindex].pszSpec);
2585 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2591 if(
This->filterspec_count == 0)
2594 *piFileType =
This->filetypeindex + 1;
2601 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2603 TRACE(
"%p (%p, %p)\n",
This, pfde, pdwCookie);
2605 if(!pfde || !pdwCookie)
2612 IFileDialogEvents_AddRef(pfde);
2613 *pdwCookie =
client->cookie;
2622 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2628 if(
client->cookie == dwCookie)
2638 IFileDialogEvents_Release(found->pfde);
2648 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2651 if (fos & ~(FOS_OVERWRITEPROMPT | FOS_STRICTFILETYPES | FOS_NOCHANGEDIR | FOS_PICKFOLDERS | FOS_FORCEFILESYSTEM
2652 | FOS_ALLNONSTORAGEITEMS | FOS_NOVALIDATE | FOS_ALLOWMULTISELECT | FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST
2653 | FOS_CREATEPROMPT | FOS_SHAREAWARE | FOS_NOREADONLYRETURN | FOS_NOTESTFILECREATE | FOS_HIDEMRUPLACES
2654 | FOS_HIDEPINNEDPLACES | FOS_NODEREFERENCELINKS | FOS_DONTADDTORECENT | FOS_FORCESHOWHIDDEN
2655 | FOS_DEFAULTNOMINIMODE | FOS_FORCEPREVIEWPANEON | FOS_SUPPORTSTREAMABLEITEMS))
2657 WARN(
"Invalid option %#lx\n", fos);
2661 if( !(
This->options & FOS_PICKFOLDERS) && (fos & FOS_PICKFOLDERS) )
2665 IFileDialog2_SetTitle(iface,
buf);
2668 This->options = fos;
2675 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2681 *pfos =
This->options;
2688 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2690 if(
This->psi_defaultfolder)
2691 IShellItem_Release(
This->psi_defaultfolder);
2693 This->psi_defaultfolder = psi;
2695 if(
This->psi_defaultfolder)
2696 IShellItem_AddRef(
This->psi_defaultfolder);
2703 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2705 if(
This->psi_setfolder)
2706 IShellItem_Release(
This->psi_setfolder);
2708 This->psi_setfolder = psi;
2710 if(
This->psi_setfolder)
2711 IShellItem_AddRef(
This->psi_setfolder);
2718 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2727 if(
This->psi_folder)
2728 *ppsi =
This->psi_folder;
2729 else if(
This->psi_setfolder)
2730 *ppsi =
This->psi_setfolder;
2731 else if(
This->psi_defaultfolder)
2732 *ppsi =
This->psi_defaultfolder;
2736 IShellItem_AddRef(*ppsi);
2745 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2752 if(
This->psia_selection)
2755 hr = IShellItemArray_GetItemAt(
This->psia_selection, 0, ppsi);
2764 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2767 set_file_name(
This, pszName);
2774 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2775 TRACE(
"%p (%p)\n", iface, pszName);
2787 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2792 update_control_text(
This);
2799 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2804 update_control_text(
This);
2805 update_layout(
This);
2812 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2817 update_control_text(
This);
2818 update_layout(
This);
2825 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2832 if(
This->psia_results)
2835 hr = IShellItemArray_GetCount(
This->psia_results, &item_count);
2842 hr = IShellItemArray_GetItemAt(
This->psia_results, 0, ppsi);
2853 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2854 FIXME(
"stub - %p (%p, %d)\n",
This, psi, fdap);
2860 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2871 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2882 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2890 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2897 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2898 FIXME(
"stub - %p (%p)\n",
This, pFilter);
2904 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2909 update_control_text(
This);
2910 update_layout(
This);
2917 FileDialogImpl *
This = impl_from_IFileDialog2(iface);
2922static const IFileDialog2Vtbl vt_IFileDialog2 = {
2923 IFileDialog2_fnQueryInterface,
2924 IFileDialog2_fnAddRef,
2925 IFileDialog2_fnRelease,
2926 IFileDialog2_fnShow,
2927 IFileDialog2_fnSetFileTypes,
2928 IFileDialog2_fnSetFileTypeIndex,
2929 IFileDialog2_fnGetFileTypeIndex,
2930 IFileDialog2_fnAdvise,
2931 IFileDialog2_fnUnadvise,
2932 IFileDialog2_fnSetOptions,
2933 IFileDialog2_fnGetOptions,
2934 IFileDialog2_fnSetDefaultFolder,
2935 IFileDialog2_fnSetFolder,
2936 IFileDialog2_fnGetFolder,
2937 IFileDialog2_fnGetCurrentSelection,
2938 IFileDialog2_fnSetFileName,
2939 IFileDialog2_fnGetFileName,
2940 IFileDialog2_fnSetTitle,
2941 IFileDialog2_fnSetOkButtonLabel,
2942 IFileDialog2_fnSetFileNameLabel,
2943 IFileDialog2_fnGetResult,
2944 IFileDialog2_fnAddPlace,
2945 IFileDialog2_fnSetDefaultExtension,
2946 IFileDialog2_fnClose,
2947 IFileDialog2_fnSetClientGuid,
2948 IFileDialog2_fnClearClientData,
2949 IFileDialog2_fnSetFilter,
2950 IFileDialog2_fnSetCancelButtonLabel,
2951 IFileDialog2_fnSetNavigationRoot
2957static inline FileDialogImpl *impl_from_IFileOpenDialog(IFileOpenDialog *iface)
2962static HRESULT WINAPI IFileOpenDialog_fnQueryInterface(IFileOpenDialog *iface,
2965 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
2966 return IFileDialog2_QueryInterface(&
This->IFileDialog2_iface,
riid, ppvObject);
2969static ULONG WINAPI IFileOpenDialog_fnAddRef(IFileOpenDialog *iface)
2971 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
2972 return IFileDialog2_AddRef(&
This->IFileDialog2_iface);
2975static ULONG WINAPI IFileOpenDialog_fnRelease(IFileOpenDialog *iface)
2977 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
2978 return IFileDialog2_Release(&
This->IFileDialog2_iface);
2981static HRESULT WINAPI IFileOpenDialog_fnShow(IFileOpenDialog *iface,
HWND hwndOwner)
2983 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
2984 return IFileDialog2_Show(&
This->IFileDialog2_iface, hwndOwner);
2987static HRESULT WINAPI IFileOpenDialog_fnSetFileTypes(IFileOpenDialog *iface,
UINT cFileTypes,
2990 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
2991 return IFileDialog2_SetFileTypes(&
This->IFileDialog2_iface, cFileTypes, rgFilterSpec);
2994static HRESULT WINAPI IFileOpenDialog_fnSetFileTypeIndex(IFileOpenDialog *iface,
UINT iFileType)
2996 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
2997 return IFileDialog2_SetFileTypeIndex(&
This->IFileDialog2_iface, iFileType);
3000static HRESULT WINAPI IFileOpenDialog_fnGetFileTypeIndex(IFileOpenDialog *iface,
UINT *piFileType)
3002 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3003 return IFileDialog2_GetFileTypeIndex(&
This->IFileDialog2_iface, piFileType);
3009 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3010 return IFileDialog2_Advise(&
This->IFileDialog2_iface, pfde, pdwCookie);
3013static HRESULT WINAPI IFileOpenDialog_fnUnadvise(IFileOpenDialog *iface,
DWORD dwCookie)
3015 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3016 return IFileDialog2_Unadvise(&
This->IFileDialog2_iface, dwCookie);
3019static HRESULT WINAPI IFileOpenDialog_fnSetOptions(IFileOpenDialog *iface, FILEOPENDIALOGOPTIONS fos)
3021 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3022 return IFileDialog2_SetOptions(&
This->IFileDialog2_iface, fos);
3025static HRESULT WINAPI IFileOpenDialog_fnGetOptions(IFileOpenDialog *iface, FILEOPENDIALOGOPTIONS *pfos)
3027 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3028 return IFileDialog2_GetOptions(&
This->IFileDialog2_iface, pfos);
3033 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3034 return IFileDialog2_SetDefaultFolder(&
This->IFileDialog2_iface, psi);
3039 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3040 return IFileDialog2_SetFolder(&
This->IFileDialog2_iface, psi);
3045 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3046 return IFileDialog2_GetFolder(&
This->IFileDialog2_iface, ppsi);
3051 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3052 return IFileDialog2_GetCurrentSelection(&
This->IFileDialog2_iface, ppsi);
3057 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3058 return IFileDialog2_SetFileName(&
This->IFileDialog2_iface, pszName);
3061static HRESULT WINAPI IFileOpenDialog_fnGetFileName(IFileOpenDialog *iface,
LPWSTR *pszName)
3063 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3064 return IFileDialog2_GetFileName(&
This->IFileDialog2_iface, pszName);
3069 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3070 return IFileDialog2_SetTitle(&
This->IFileDialog2_iface, pszTitle);
3073static HRESULT WINAPI IFileOpenDialog_fnSetOkButtonLabel(IFileOpenDialog *iface,
LPCWSTR pszText)
3075 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3076 return IFileDialog2_SetOkButtonLabel(&
This->IFileDialog2_iface, pszText);
3079static HRESULT WINAPI IFileOpenDialog_fnSetFileNameLabel(IFileOpenDialog *iface,
LPCWSTR pszLabel)
3081 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3082 return IFileDialog2_SetFileNameLabel(&
This->IFileDialog2_iface, pszLabel);
3087 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3088 return IFileDialog2_GetResult(&
This->IFileDialog2_iface, ppsi);
3093 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3094 return IFileDialog2_AddPlace(&
This->IFileDialog2_iface, psi, fdap);
3097static HRESULT WINAPI IFileOpenDialog_fnSetDefaultExtension(IFileOpenDialog *iface,
3100 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3101 return IFileDialog2_SetDefaultExtension(&
This->IFileDialog2_iface, pszDefaultExtension);
3106 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3107 return IFileDialog2_Close(&
This->IFileDialog2_iface,
hr);
3112 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3113 return IFileDialog2_SetClientGuid(&
This->IFileDialog2_iface,
guid);
3116static HRESULT WINAPI IFileOpenDialog_fnClearClientData(IFileOpenDialog *iface)
3118 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3119 return IFileDialog2_ClearClientData(&
This->IFileDialog2_iface);
3124 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3125 return IFileDialog2_SetFilter(&
This->IFileDialog2_iface, pFilter);
3128static HRESULT WINAPI IFileOpenDialog_fnGetResults(IFileOpenDialog *iface, IShellItemArray **ppenum)
3130 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3133 *ppenum =
This->psia_results;
3137 IShellItemArray_AddRef(*ppenum);
3144static HRESULT WINAPI IFileOpenDialog_fnGetSelectedItems(IFileOpenDialog *iface, IShellItemArray **ppsai)
3146 FileDialogImpl *
This = impl_from_IFileOpenDialog(iface);
3149 if(
This->psia_selection)
3151 *ppsai =
This->psia_selection;
3152 IShellItemArray_AddRef(*ppsai);
3159static const IFileOpenDialogVtbl vt_IFileOpenDialog = {
3160 IFileOpenDialog_fnQueryInterface,
3161 IFileOpenDialog_fnAddRef,
3162 IFileOpenDialog_fnRelease,
3163 IFileOpenDialog_fnShow,
3164 IFileOpenDialog_fnSetFileTypes,
3165 IFileOpenDialog_fnSetFileTypeIndex,
3166 IFileOpenDialog_fnGetFileTypeIndex,
3167 IFileOpenDialog_fnAdvise,
3168 IFileOpenDialog_fnUnadvise,
3169 IFileOpenDialog_fnSetOptions,
3170 IFileOpenDialog_fnGetOptions,
3171 IFileOpenDialog_fnSetDefaultFolder,
3172 IFileOpenDialog_fnSetFolder,
3173 IFileOpenDialog_fnGetFolder,
3174 IFileOpenDialog_fnGetCurrentSelection,
3175 IFileOpenDialog_fnSetFileName,
3176 IFileOpenDialog_fnGetFileName,
3177 IFileOpenDialog_fnSetTitle,
3178 IFileOpenDialog_fnSetOkButtonLabel,
3179 IFileOpenDialog_fnSetFileNameLabel,
3180 IFileOpenDialog_fnGetResult,
3181 IFileOpenDialog_fnAddPlace,
3182 IFileOpenDialog_fnSetDefaultExtension,
3183 IFileOpenDialog_fnClose,
3184 IFileOpenDialog_fnSetClientGuid,
3185 IFileOpenDialog_fnClearClientData,
3186 IFileOpenDialog_fnSetFilter,
3187 IFileOpenDialog_fnGetResults,
3188 IFileOpenDialog_fnGetSelectedItems
3194static inline FileDialogImpl *impl_from_IFileSaveDialog(
IFileSaveDialog *iface)
3203 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3204 return IFileDialog2_QueryInterface(&
This->IFileDialog2_iface,
riid, ppvObject);
3209 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3210 return IFileDialog2_AddRef(&
This->IFileDialog2_iface);
3215 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3216 return IFileDialog2_Release(&
This->IFileDialog2_iface);
3221 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3222 return IFileDialog2_Show(&
This->IFileDialog2_iface, hwndOwner);
3228 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3229 return IFileDialog2_SetFileTypes(&
This->IFileDialog2_iface, cFileTypes, rgFilterSpec);
3234 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3235 return IFileDialog2_SetFileTypeIndex(&
This->IFileDialog2_iface, iFileType);
3240 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3241 return IFileDialog2_GetFileTypeIndex(&
This->IFileDialog2_iface, piFileType);
3247 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3248 return IFileDialog2_Advise(&
This->IFileDialog2_iface, pfde, pdwCookie);
3253 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3254 return IFileDialog2_Unadvise(&
This->IFileDialog2_iface, dwCookie);
3259 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3260 return IFileDialog2_SetOptions(&
This->IFileDialog2_iface, fos);
3265 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3266 return IFileDialog2_GetOptions(&
This->IFileDialog2_iface, pfos);
3271 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3272 return IFileDialog2_SetDefaultFolder(&
This->IFileDialog2_iface, psi);
3277 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3278 return IFileDialog2_SetFolder(&
This->IFileDialog2_iface, psi);
3283 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3284 return IFileDialog2_GetFolder(&
This->IFileDialog2_iface, ppsi);
3289 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3290 return IFileDialog2_GetCurrentSelection(&
This->IFileDialog2_iface, ppsi);
3295 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3296 return IFileDialog2_SetFileName(&
This->IFileDialog2_iface, pszName);
3301 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3302 return IFileDialog2_GetFileName(&
This->IFileDialog2_iface, pszName);
3307 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3308 return IFileDialog2_SetTitle(&
This->IFileDialog2_iface, pszTitle);
3313 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3314 return IFileDialog2_SetOkButtonLabel(&
This->IFileDialog2_iface, pszText);
3319 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3320 return IFileDialog2_SetFileNameLabel(&
This->IFileDialog2_iface, pszLabel);
3325 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3326 return IFileDialog2_GetResult(&
This->IFileDialog2_iface, ppsi);
3331 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3332 return IFileDialog2_AddPlace(&
This->IFileDialog2_iface, psi, fdap);
3338 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3339 return IFileDialog2_SetDefaultExtension(&
This->IFileDialog2_iface, pszDefaultExtension);
3344 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3345 return IFileDialog2_Close(&
This->IFileDialog2_iface,
hr);
3350 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3351 return IFileDialog2_SetClientGuid(&
This->IFileDialog2_iface,
guid);
3356 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3357 return IFileDialog2_ClearClientData(&
This->IFileDialog2_iface);
3362 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3363 return IFileDialog2_SetFilter(&
This->IFileDialog2_iface, pFilter);
3368 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3375 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3376 FIXME(
"stub - %p (%p)\n",
This, pStore);
3382 BOOL fAppendDefault)
3384 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3391 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3392 FIXME(
"stub - %p (%p)\n",
This, ppStore);
3402 FileDialogImpl *
This = impl_from_IFileSaveDialog(iface);
3403 FIXME(
"%p (%p, %p, %p, %p)\n",
This, psi, pStore,
hwnd, pSink);
3407static const IFileSaveDialogVtbl vt_IFileSaveDialog = {
3408 IFileSaveDialog_fnQueryInterface,
3409 IFileSaveDialog_fnAddRef,
3410 IFileSaveDialog_fnRelease,
3411 IFileSaveDialog_fnShow,
3412 IFileSaveDialog_fnSetFileTypes,
3413 IFileSaveDialog_fnSetFileTypeIndex,
3414 IFileSaveDialog_fnGetFileTypeIndex,
3415 IFileSaveDialog_fnAdvise,
3416 IFileSaveDialog_fnUnadvise,
3417 IFileSaveDialog_fnSetOptions,
3418 IFileSaveDialog_fnGetOptions,
3419 IFileSaveDialog_fnSetDefaultFolder,
3420 IFileSaveDialog_fnSetFolder,
3421 IFileSaveDialog_fnGetFolder,
3422 IFileSaveDialog_fnGetCurrentSelection,
3423 IFileSaveDialog_fnSetFileName,
3424 IFileSaveDialog_fnGetFileName,
3425 IFileSaveDialog_fnSetTitle,
3426 IFileSaveDialog_fnSetOkButtonLabel,
3427 IFileSaveDialog_fnSetFileNameLabel,
3428 IFileSaveDialog_fnGetResult,
3429 IFileSaveDialog_fnAddPlace,
3430 IFileSaveDialog_fnSetDefaultExtension,
3431 IFileSaveDialog_fnClose,
3432 IFileSaveDialog_fnSetClientGuid,
3433 IFileSaveDialog_fnClearClientData,
3434 IFileSaveDialog_fnSetFilter,
3435 IFileSaveDialog_fnSetSaveAsItem,
3436 IFileSaveDialog_fnSetProperties,
3437 IFileSaveDialog_fnSetCollectedProperties,
3438 IFileSaveDialog_fnGetProperties,
3439 IFileSaveDialog_fnApplyProperties
3456 return IFileDialog2_QueryInterface(&
This->IFileDialog2_iface,
riid, ppvObject);
3463 return IFileDialog2_AddRef(&
This->IFileDialog2_iface);
3470 return IFileDialog2_Release(&
This->IFileDialog2_iface);
3484 hr = events_OnFolderChanging(
This, psi);
3485 IShellItem_Release(psi);
3494 ERR(
"Failed to convert pidl (%p) to a shellitem.\n", pidlFolder);
3514 if(
This->psi_folder)
3515 IShellItem_Release(
This->psi_folder);
3520 ERR(
"Failed to get the current folder.\n");
3524 events_OnFolderChange(
This);
3537static const IExplorerBrowserEventsVtbl vt_IExplorerBrowserEvents = {
3560 return IFileDialog2_QueryInterface(&
This->IFileDialog2_iface,
riid, ppvObject);
3567 return IFileDialog2_AddRef(&
This->IFileDialog2_iface);
3574 return IFileDialog2_Release(&
This->IFileDialog2_iface);
3588 else if(
IsEqualGUID(guidService, &SID_SExplorerBrowserFrame))
3589 hr = IFileDialog2_QueryInterface(&
This->IFileDialog2_iface,
riid,
ppv);
3591 FIXME(
"Interface %s requested from unknown service %s\n",
3597static const IServiceProviderVtbl vt_IServiceProvider = {
3617 return IFileDialog2_QueryInterface(&
This->IFileDialog2_iface,
riid, ppvObject);
3624 return IFileDialog2_AddRef(&
This->IFileDialog2_iface);
3631 return IFileDialog2_Release(&
This->IFileDialog2_iface);
3641 hr = on_default_action(
This);
3655 TRACE(
"%p (%p, %lx)\n",
This, shv, uChange);
3659 case CDBOSC_SELCHANGE:
3660 if(
This->psia_selection)
3662 IShellItemArray_Release(
This->psia_selection);
3666 hr = IShellView_GetItemObject(shv, SVGIO_SELECTION, &
IID_IDataObject, (
void**)&new_selection);
3670 (
void**)&
This->psia_selection);
3673 fill_filename_from_selection(
This);
3674 events_OnSelectionChange(
This);
3677 IDataObject_Release(new_selection);
3681 TRACE(
"Unhandled state change\n");
3695 TRACE(
"%p (%p, %p)\n",
This, shv, pidl);
3697 if(!
This->current_filter && !(
This->options & FOS_PICKFOLDERS))
3710 ERR(
"Failed to get shellitem (%08lx).\n",
hr);
3714 hr = IShellItem_GetAttributes(psi, SFGAO_FOLDER|SFGAO_LINK, &
attr);
3717 IShellItem_Release(psi);
3721 if((
This->options & FOS_PICKFOLDERS) && !(
attr & (SFGAO_FOLDER | SFGAO_LINK)))
3723 IShellItem_Release(psi);
3728 if(
SUCCEEDED(IShellItem_GetDisplayName(psi, SIGDN_PARENTRELATIVEPARSING, &
filename)))
3735 IShellItem_Release(psi);
3743 FIXME(
"Stub: %p (%p, 0x%lx)\n",
This, ppshv, dwNotifyType);
3759 FIXME(
"Stub: %p (%p)\n",
This, pdwFlags);
3767 FIXME(
"Stub: %p (%p, %d)\n",
This, pshv, iColumn);
3772 LPWSTR pszFileSpec,
int cchFileSpec)
3775 FIXME(
"Stub: %p (%p, %d)\n",
This, pszFileSpec, cchFileSpec);
3787static const ICommDlgBrowser3Vtbl vt_ICommDlgBrowser3 = {
3805static inline FileDialogImpl *impl_from_IOleWindow(
IOleWindow *iface)
3812 FileDialogImpl *
This = impl_from_IOleWindow(iface);
3813 return IFileDialog2_QueryInterface(&
This->IFileDialog2_iface,
riid, ppvObject);
3818 FileDialogImpl *
This = impl_from_IOleWindow(iface);
3819 return IFileDialog2_AddRef(&
This->IFileDialog2_iface);
3824 FileDialogImpl *
This = impl_from_IOleWindow(iface);
3825 return IFileDialog2_Release(&
This->IFileDialog2_iface);
3830 FileDialogImpl *
This = impl_from_IOleWindow(iface);
3831 FIXME(
"Stub: %p (%d)\n",
This, fEnterMOde);
3837 FileDialogImpl *
This = impl_from_IOleWindow(iface);
3839 *phwnd =
This->dlg_hwnd;
3843static const IOleWindowVtbl vt_IOleWindow = {
3844 IOleWindow_fnQueryInterface,
3845 IOleWindow_fnAddRef,
3846 IOleWindow_fnRelease,
3847 IOleWindow_fnGetWindow,
3848 IOleWindow_fnContextSensitiveHelp
3854static inline FileDialogImpl *impl_from_IFileDialogCustomize(IFileDialogCustomize *iface)
3859static HRESULT WINAPI IFileDialogCustomize_fnQueryInterface(IFileDialogCustomize *iface,
3862 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
3863 return IFileDialog2_QueryInterface(&
This->IFileDialog2_iface,
riid, ppvObject);
3866static ULONG WINAPI IFileDialogCustomize_fnAddRef(IFileDialogCustomize *iface)
3868 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
3869 return IFileDialog2_AddRef(&
This->IFileDialog2_iface);
3872static ULONG WINAPI IFileDialogCustomize_fnRelease(IFileDialogCustomize *iface)
3874 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
3875 return IFileDialog2_Release(&
This->IFileDialog2_iface);
3878static HRESULT WINAPI IFileDialogCustomize_fnEnableOpenDropDown(IFileDialogCustomize *iface,
3881 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
3885 if (
This->hmenu_opendropdown || get_cctrl(
This, dwIDCtl))
3890 if (!
This->hmenu_opendropdown)
3894 mi.fMask = MIM_STYLE;
3898 This->cctrl_opendropdown.hwnd =
NULL;
3899 This->cctrl_opendropdown.wrapper_hwnd =
NULL;
3900 This->cctrl_opendropdown.id = dwIDCtl;
3901 This->cctrl_opendropdown.dlgid = 0;
3902 This->cctrl_opendropdown.type = IDLG_CCTRL_OPENDROPDOWN;
3910static HRESULT WINAPI IFileDialogCustomize_fnAddMenu(IFileDialogCustomize *iface,
3914 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
3918 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, pszLabel);
3926 ctrl->type = IDLG_CCTRL_MENU;
3942static HRESULT WINAPI IFileDialogCustomize_fnAddPushButton(IFileDialogCustomize *iface,
3946 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
3949 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, pszLabel);
3954 ctrl->type = IDLG_CCTRL_PUSHBUTTON;
3959static HRESULT WINAPI IFileDialogCustomize_fnAddComboBox(IFileDialogCustomize *iface,
3962 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
3970 ctrl->type = IDLG_CCTRL_COMBOBOX;
3975static HRESULT WINAPI IFileDialogCustomize_fnAddRadioButtonList(IFileDialogCustomize *iface,
3978 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
3983 hr = cctrl_create_new(
This, dwIDCtl,
NULL,
L"RadioButtonList", 0, 0, 0, &
ctrl);
3986 ctrl->type = IDLG_CCTRL_RADIOBUTTONLIST;
3993static HRESULT WINAPI IFileDialogCustomize_fnAddCheckButton(IFileDialogCustomize *iface,
3998 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4001 TRACE(
"%p (%ld, %p, %d)\n",
This, dwIDCtl, pszLabel, bChecked);
4007 ctrl->type = IDLG_CCTRL_CHECKBUTTON;
4014static HRESULT WINAPI IFileDialogCustomize_fnAddEditBox(IFileDialogCustomize *iface,
4018 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4021 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, pszText);
4026 ctrl->type = IDLG_CCTRL_EDITBOX;
4031static HRESULT WINAPI IFileDialogCustomize_fnAddSeparator(IFileDialogCustomize *iface,
4034 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4042 ctrl->type = IDLG_CCTRL_SEPARATOR;
4047static HRESULT WINAPI IFileDialogCustomize_fnAddText(IFileDialogCustomize *iface,
4051 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4054 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, pszText);
4059 ctrl->type = IDLG_CCTRL_TEXT;
4064static HRESULT WINAPI IFileDialogCustomize_fnSetControlLabel(IFileDialogCustomize *iface,
4068 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4069 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4070 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, pszLabel);
4076 case IDLG_CCTRL_MENU:
4077 case IDLG_CCTRL_PUSHBUTTON:
4078 case IDLG_CCTRL_CHECKBUTTON:
4079 case IDLG_CCTRL_TEXT:
4080 case IDLG_CCTRL_VISUALGROUP:
4083 case IDLG_CCTRL_OPENDROPDOWN:
4092static HRESULT WINAPI IFileDialogCustomize_fnGetControlState(IFileDialogCustomize *iface,
4094 CDCONTROLSTATEF *pdwState)
4096 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4097 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4098 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, pdwState);
4102 *pdwState =
ctrl->cdcstate;
4106static HRESULT WINAPI IFileDialogCustomize_fnSetControlState(IFileDialogCustomize *iface,
4108 CDCONTROLSTATEF dwState)
4110 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4111 customctrl *
ctrl = get_cctrl(
This,dwIDCtl);
4112 TRACE(
"%p (%ld, %x)\n",
This, dwIDCtl, dwState);
4132 ctrl->cdcstate = dwState;
4138static HRESULT WINAPI IFileDialogCustomize_fnGetEditBoxText(IFileDialogCustomize *iface,
4142 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4143 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4145 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, ppszText);
4158static HRESULT WINAPI IFileDialogCustomize_fnSetEditBoxText(IFileDialogCustomize *iface,
4162 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4163 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4166 if(!
ctrl ||
ctrl->type != IDLG_CCTRL_EDITBOX)
4173static HRESULT WINAPI IFileDialogCustomize_fnGetCheckButtonState(IFileDialogCustomize *iface,
4177 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4178 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4179 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, pbChecked);
4187static HRESULT WINAPI IFileDialogCustomize_fnSetCheckButtonState(IFileDialogCustomize *iface,
4191 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4192 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4193 TRACE(
"%p (%ld, %d)\n",
This, dwIDCtl, bChecked);
4201static UINT get_combobox_index_from_id(
HWND cb_hwnd,
DWORD dwIDItem)
4212 TRACE(
"Item with id %ld not found in combobox %p (item count: %d)\n", dwIDItem, cb_hwnd,
count);
4216static HRESULT WINAPI IFileDialogCustomize_fnAddControlItem(IFileDialogCustomize *iface,
4221 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4222 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4230 case IDLG_CCTRL_COMBOBOX:
4244 case IDLG_CCTRL_MENU:
4245 case IDLG_CCTRL_OPENDROPDOWN:
4254 if (
ctrl->type == IDLG_CCTRL_MENU)
4266 case IDLG_CCTRL_RADIOBUTTONLIST:
4280 ERR(
"Failed to create radio button\n");
4296static HRESULT WINAPI IFileDialogCustomize_fnRemoveControlItem(IFileDialogCustomize *iface,
4300 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4301 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4302 TRACE(
"%p (%ld, %ld)\n",
This, dwIDCtl, dwIDItem);
4308 case IDLG_CCTRL_COMBOBOX:
4329 case IDLG_CCTRL_MENU:
4330 case IDLG_CCTRL_OPENDROPDOWN:
4342 if (
ctrl->type == IDLG_CCTRL_MENU)
4360 case IDLG_CCTRL_RADIOBUTTONLIST:
4381static HRESULT WINAPI IFileDialogCustomize_fnRemoveAllControlItems(IFileDialogCustomize *iface,
4384 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4391static HRESULT WINAPI IFileDialogCustomize_fnGetControlItemState(IFileDialogCustomize *iface,
4394 CDCONTROLSTATEF *pdwState)
4396 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4397 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4398 TRACE(
"%p (%ld, %ld, %p)\n",
This, dwIDCtl, dwIDItem, pdwState);
4404 case IDLG_CCTRL_COMBOBOX:
4405 case IDLG_CCTRL_MENU:
4406 case IDLG_CCTRL_OPENDROPDOWN:
4407 case IDLG_CCTRL_RADIOBUTTONLIST:
4416 *pdwState =
item->cdcstate;
4427static HRESULT WINAPI IFileDialogCustomize_fnSetControlItemState(IFileDialogCustomize *iface,
4430 CDCONTROLSTATEF dwState)
4432 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4433 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4434 TRACE(
"%p (%ld, %ld, %x)\n",
This, dwIDCtl, dwIDItem, dwState);
4440 case IDLG_CCTRL_COMBOBOX:
4443 BOOL visible, was_visible;
4454 if (visible && !was_visible)
4459 else if (!visible && was_visible)
4464 item->cdcstate = dwState;
4468 case IDLG_CCTRL_MENU:
4469 case IDLG_CCTRL_OPENDROPDOWN:
4473 CDCONTROLSTATEF prev_state;
4481 prev_state =
item->cdcstate;
4483 if (
ctrl->type == IDLG_CCTRL_MENU)
4505 mii.
cbSize =
sizeof(mii);
4520 item->cdcstate = dwState;
4522 if (
ctrl->type == IDLG_CCTRL_OPENDROPDOWN)
4524 update_control_text(
This);
4525 update_layout(
This);
4530 case IDLG_CCTRL_RADIOBUTTONLIST:
4540 item->cdcstate = dwState;
4551static HRESULT WINAPI IFileDialogCustomize_fnGetSelectedControlItem(IFileDialogCustomize *iface,
4555 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4556 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4557 TRACE(
"%p (%ld, %p)\n",
This, dwIDCtl, pdwIDItem);
4563 case IDLG_CCTRL_COMBOBOX:
4572 case IDLG_CCTRL_OPENDROPDOWN:
4573 if (
This->opendropdown_has_selection)
4575 *pdwIDItem =
This->opendropdown_selection;
4585 *pdwIDItem =
item->id;
4589 WARN(
"no enabled items in open dropdown\n");
4592 case IDLG_CCTRL_RADIOBUTTONLIST:
4600 *pdwIDItem =
item->id;
4605 WARN(
"no checked items in radio button list\n");
4609 FIXME(
"Unsupported control type %d\n",
ctrl->type);
4615static HRESULT WINAPI IFileDialogCustomize_fnSetSelectedControlItem(IFileDialogCustomize *iface,
4619 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4620 customctrl *
ctrl = get_cctrl(
This, dwIDCtl);
4621 TRACE(
"%p (%ld, %ld)\n",
This, dwIDCtl, dwIDItem);
4627 case IDLG_CCTRL_COMBOBOX:
4629 UINT index = get_combobox_index_from_id(
ctrl->hwnd, dwIDItem);
4639 case IDLG_CCTRL_RADIOBUTTONLIST:
4654 FIXME(
"Unsupported control type %d\n",
ctrl->type);
4660static HRESULT WINAPI IFileDialogCustomize_fnStartVisualGroup(IFileDialogCustomize *iface,
4664 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4669 if(
This->cctrl_active_vg)
4673 This->cctrl_def_height, &vg);
4676 vg->type = IDLG_CCTRL_VISUALGROUP;
4677 This->cctrl_active_vg = vg;
4683static HRESULT WINAPI IFileDialogCustomize_fnEndVisualGroup(IFileDialogCustomize *iface)
4685 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4693static HRESULT WINAPI IFileDialogCustomize_fnMakeProminent(IFileDialogCustomize *iface,
4696 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4697 FIXME(
"stub - %p (%ld)\n",
This, dwIDCtl);
4701static HRESULT WINAPI IFileDialogCustomize_fnSetControlItemText(IFileDialogCustomize *iface,
4706 FileDialogImpl *
This = impl_from_IFileDialogCustomize(iface);
4711static const IFileDialogCustomizeVtbl vt_IFileDialogCustomize = {
4712 IFileDialogCustomize_fnQueryInterface,
4713 IFileDialogCustomize_fnAddRef,
4714 IFileDialogCustomize_fnRelease,
4715 IFileDialogCustomize_fnEnableOpenDropDown,
4716 IFileDialogCustomize_fnAddMenu,
4717 IFileDialogCustomize_fnAddPushButton,
4718 IFileDialogCustomize_fnAddComboBox,
4719 IFileDialogCustomize_fnAddRadioButtonList,
4720 IFileDialogCustomize_fnAddCheckButton,
4721 IFileDialogCustomize_fnAddEditBox,
4722 IFileDialogCustomize_fnAddSeparator,
4723 IFileDialogCustomize_fnAddText,
4724 IFileDialogCustomize_fnSetControlLabel,
4725 IFileDialogCustomize_fnGetControlState,
4726 IFileDialogCustomize_fnSetControlState,
4727 IFileDialogCustomize_fnGetEditBoxText,
4728 IFileDialogCustomize_fnSetEditBoxText,
4729 IFileDialogCustomize_fnGetCheckButtonState,
4730 IFileDialogCustomize_fnSetCheckButtonState,
4731 IFileDialogCustomize_fnAddControlItem,
4732 IFileDialogCustomize_fnRemoveControlItem,
4733 IFileDialogCustomize_fnRemoveAllControlItems,
4734 IFileDialogCustomize_fnGetControlItemState,
4735 IFileDialogCustomize_fnSetControlItemState,
4736 IFileDialogCustomize_fnGetSelectedControlItem,
4737 IFileDialogCustomize_fnSetSelectedControlItem,
4738 IFileDialogCustomize_fnStartVisualGroup,
4739 IFileDialogCustomize_fnEndVisualGroup,
4740 IFileDialogCustomize_fnMakeProminent,
4741 IFileDialogCustomize_fnSetControlItemText
4744#if (DLL_EXPORT_VERSION <= _WIN32_WINNT_VISTA)
4764 FileDialogImpl *fdimpl;
4779 fdimpl->IFileDialog2_iface.lpVtbl = &vt_IFileDialog2;
4780 fdimpl->IExplorerBrowserEvents_iface.lpVtbl = &vt_IExplorerBrowserEvents;
4781 fdimpl->IServiceProvider_iface.lpVtbl = &vt_IServiceProvider;
4782 fdimpl->ICommDlgBrowser3_iface.lpVtbl = &vt_ICommDlgBrowser3;
4783 fdimpl->IOleWindow_iface.lpVtbl = &vt_IOleWindow;
4784 fdimpl->IFileDialogCustomize_iface.lpVtbl = &vt_IFileDialogCustomize;
4786 if(
type == ITEMDLG_TYPE_OPEN)
4788 fdimpl->dlg_type = ITEMDLG_TYPE_OPEN;
4789 fdimpl->u.IFileOpenDialog_iface.lpVtbl = &vt_IFileOpenDialog;
4790 fdimpl->options = FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST | FOS_NOCHANGEDIR;
4791 fdimpl->custom_title = fdimpl->custom_okbutton =
NULL;
4796 fdimpl->dlg_type = ITEMDLG_TYPE_SAVE;
4797 fdimpl->u.IFileSaveDialog_iface.lpVtbl = &vt_IFileSaveDialog;
4798 fdimpl->options = FOS_OVERWRITEPROMPT | FOS_NOREADONLYRETURN | FOS_PATHMUSTEXIST | FOS_NOCHANGEDIR;
4811 IShellFolder_Release(psf);
4813 hr = init_custom_controls(fdimpl);
4816 ERR(
"Failed to initialize custom controls (0x%08lx).\n",
hr);
4817 IFileDialog2_Release(&fdimpl->IFileDialog2_iface);
4823 hr = IFileDialog2_QueryInterface(&fdimpl->IFileDialog2_iface,
riid,
ppv);
4824 IFileDialog2_Release(&fdimpl->IFileDialog2_iface);
4830 return FileDialog_constructor(pUnkOuter,
riid,
ppv, ITEMDLG_TYPE_OPEN);
4835 return FileDialog_constructor(pUnkOuter,
riid,
ppv, ITEMDLG_TYPE_SAVE);
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
EXTERN_C HRESULT WINAPI SHCreateShellItemArrayFromDataObject(_In_ IDataObject *pdo, _In_ REFIID riid, _Out_ void **ppv)
EXTERN_C HRESULT WINAPI SHCreateShellItemArray(_In_opt_ PCIDLIST_ABSOLUTE pidlParent, _In_opt_ IShellFolder *psf, _In_ UINT cidl, _In_reads_opt_(cidl) PCUITEMID_CHILD_ARRAY ppidl, _Out_ IShellItemArray **ppsiItemArray)
static struct local_server * impl_from_IServiceProvider(IServiceProvider *iface)
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_remove(struct list_entry *entry)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
static void list_init(struct list_entry *head)
static void add_item(btrfs_root *r, uint64_t obj_id, uint8_t obj_type, uint64_t offset, void *data, uint16_t size)
int COMDLG32_SplitFileNames(LPWSTR lpstrEdit, UINT nStrLen, LPWSTR *lpstrFileList, UINT *sizeUsed)
void COMDLG32_GetCanonicalPath(PCIDLIST_ABSOLUTE pidlAbsCurrent, LPWSTR lpstrFile, LPWSTR lpstrPathAndFile)
HRESULT FileOpenDialog_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv)
int FILEDLG95_ValidatePathAction(LPWSTR lpstrPathAndFile, IShellFolder **ppsf, HWND hwnd, DWORD flags, BOOL isSaveDlg, int defAction)
void FILEDLG95_OnOpenMessage(HWND hwnd, int idCaption, int idText)
HINSTANCE COMDLG32_hInstance
HRESULT FileSaveDialog_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv)
#define IDS_SELECT_FOLDER
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
void *WINAPI CoTaskMemAlloc(SIZE_T size)
void WINAPI CoTaskMemFree(void *ptr)
LPWSTR WINAPI StrChrW(LPCWSTR lpszStr, WCHAR ch)
#define INVALID_HANDLE_VALUE
#define HeapFree(x, y, z)
static const WCHAR *const ext[]
VOID WINAPI ReleaseActCtx(IN HANDLE hActCtx)
BOOL WINAPI DeactivateActCtx(IN DWORD dwFlags, IN ULONG_PTR ulCookie)
BOOL WINAPI GetCurrentActCtx(OUT PHANDLE phActCtx)
BOOL WINAPI ActivateActCtx(IN HANDLE hActCtx, OUT PULONG_PTR ulCookie)
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
void WINAPI PathRemoveExtensionW(WCHAR *path)
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
BOOL WINAPI PathMatchSpecW(const WCHAR *path, const WCHAR *mask)
BOOL WINAPI PathFileExistsW(const WCHAR *path)
WCHAR *WINAPI StrDupW(const WCHAR *str)
_ACRTIMP wchar_t *__cdecl wcspbrk(const wchar_t *, const wchar_t *)
HRESULT WINAPI DECLSPEC_HOTPATCH OleInitialize(LPVOID reserved)
EXTERN_C HRESULT WINAPI SHGetItemFromObject(_In_ IUnknown *punk, _In_ REFIID riid, _Out_ void **ppv)
EXTERN_C HRESULT WINAPI SHCreateItemFromIDList(_In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppv)
static ULONG WINAPI IServiceProvider_fnRelease(IServiceProvider *iface)
static HRESULT WINAPI ICommDlgBrowser3_fnOnColumnClicked(ICommDlgBrowser3 *iface, IShellView *ppshv, int iColumn)
static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationComplete(IExplorerBrowserEvents *iface, PCIDLIST_ABSOLUTE pidlFolder)
static HRESULT WINAPI ICommDlgBrowser3_fnGetDefaultMenuText(ICommDlgBrowser3 *iface, IShellView *ppshv, LPWSTR pszText, int cchMax)
static ULONG WINAPI IExplorerBrowserEvents_fnRelease(IExplorerBrowserEvents *iface)
static HRESULT WINAPI IServiceProvider_fnQueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
static HRESULT WINAPI ICommDlgBrowser3_fnGetCurrentFilter(ICommDlgBrowser3 *iface, LPWSTR pszFileSpec, int cchFileSpec)
static ULONG WINAPI IExplorerBrowserEvents_fnAddRef(IExplorerBrowserEvents *iface)
static HRESULT WINAPI ICommDlgBrowser3_fnQueryInterface(ICommDlgBrowser3 *iface, REFIID riid, LPVOID *ppvObj)
static ULONG WINAPI ICommDlgBrowser3_fnAddRef(ICommDlgBrowser3 *iface)
static HRESULT WINAPI IServiceProvider_fnQueryInterface(IServiceProvider *iface, REFIID riid, LPVOID *ppvObj)
static HRESULT WINAPI ICommDlgBrowser3_fnOnDefaultCommand(ICommDlgBrowser3 *iface, IShellView *shv)
static HRESULT WINAPI ICommDlgBrowser3_fnOnPreviewCreated(ICommDlgBrowser3 *iface, IShellView *ppshv)
static ULONG WINAPI IServiceProvider_fnAddRef(IServiceProvider *iface)
static HRESULT WINAPI ICommDlgBrowser3_fnNotify(ICommDlgBrowser3 *iface, IShellView *ppshv, DWORD dwNotifyType)
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
static HRESULT WINAPI IExplorerBrowserEvents_fnQueryInterface(IExplorerBrowserEvents *iface, REFIID riid, void **ppvObj)
static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationPending(IExplorerBrowserEvents *iface, PCIDLIST_ABSOLUTE pidlFolder)
static HRESULT WINAPI IExplorerBrowserEvents_fnOnViewCreated(IExplorerBrowserEvents *iface, IShellView *psv)
static IExplorerBrowserEventsImpl * impl_from_IExplorerBrowserEvents(IExplorerBrowserEvents *iface)
static HRESULT WINAPI ICommDlgBrowser3_fnIncludeObject(ICommDlgBrowser3 *iface, IShellView *shv, LPCITEMIDLIST pidl)
static HRESULT WINAPI ICommDlgBrowser3_fnGetViewFlags(ICommDlgBrowser3 *iface, DWORD *pdwFlags)
static ICommDlgBrowser3Impl * impl_from_ICommDlgBrowser3(ICommDlgBrowser3 *iface)
static HRESULT WINAPI IExplorerBrowserEvents_fnOnNavigationFailed(IExplorerBrowserEvents *iface, PCIDLIST_ABSOLUTE pidlFolder)
static HRESULT WINAPI ICommDlgBrowser3_fnOnStateChange(ICommDlgBrowser3 *iface, IShellView *shv, ULONG uChange)
static ULONG WINAPI ICommDlgBrowser3_fnRelease(ICommDlgBrowser3 *iface)
#define IDS_FILENOTEXISTING
#define IDS_INVALID_FOLDERNAME
#define IDC_FILETYPESTATIC
#define IDC_FILENAMESTATIC
#define IDS_OVERWRITEFILE
static void get_first_item(tree *t, KEY *key)
GLuint GLuint GLsizei count
GLint GLint GLsizei GLsizei height
GLuint GLuint GLsizei GLenum type
GLint GLint GLsizei width
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
HLOCAL NTAPI LocalFree(HLOCAL hMem)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
static const WCHAR label[]
const IID IID_IObjectWithSite
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
unsigned __int3264 UINT_PTR
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
const GUID IID_IOleWindow
const GUID IID_IDataObject
static HANDLE ACCESS_MASK ULONG attributes
void WINAPI ILFree(LPITEMIDLIST pidl)
HRESULT WINAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
#define IDB_VIEW_LARGE_COLOR
#define VIEW_PARENTFOLDER
#define IDB_HIST_LARGE_COLOR
#define TB_BUTTONSTRUCTSIZE
#define TOOLBARCLASSNAMEW
#define BTNS_WHOLEDROPDOWN
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
#define IsEqualGUID(rguid1, rguid2)
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
HMENU WINAPI CreatePopupMenu(void)
#define CB_SETDROPPEDWIDTH
#define GetWindowLongPtrW
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
LONG WINAPI SetWindowLongW(_In_ HWND, _In_ int, _In_ LONG)
LONG WINAPI GetWindowLongW(_In_ HWND, _In_ int)
ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW *)
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
BOOL WINAPI EndDeferWindowPos(_In_ HDWP)
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
HWND WINAPI SetFocus(_In_opt_ HWND)
BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
BOOL WINAPI SetMenuInfo(_In_ HMENU, _In_ LPCMENUINFO)
HDC WINAPI GetDC(_In_opt_ HWND)
#define MB_ICONEXCLAMATION
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
BOOL WINAPI DestroyMenu(_In_ HMENU)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
int WINAPI GetDlgCtrlID(_In_ HWND)
HDWP WINAPI DeferWindowPos(_In_ HDWP, _In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
#define MAKEINTRESOURCEW(i)
LRESULT(CALLBACK * WNDPROC)(HWND, UINT, WPARAM, LPARAM)
#define USER_DEFAULT_SCREEN_DPI
BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW)
#define SetWindowLongPtrW
LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI DestroyWindow(_In_ HWND)
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
int WINAPI GetSystemMetrics(_In_ int)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
HDWP WINAPI BeginDeferWindowPos(_In_ int)
BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
PIDLIST_ABSOLUTE WINAPI SHSimpleIDListFromPath(PCWSTR)
ITEMIDLIST UNALIGNED * LPITEMIDLIST
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
WCHAR lfFaceName[LF_FACESIZE]
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define CONTAINING_RECORD(address, type, field)
#define INVALID_FILE_ATTRIBUTES
DWORD WINAPI GetLastError(void)
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
#define CLASS_E_NOAGGREGATION
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
BOOL WINAPI GetTextExtentPoint32W(_In_ HDC hdc, _In_reads_(c) LPCWSTR lpString, _In_ int c, _Out_ LPSIZE psizl)