1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 use ctypes::c_void;
7 use shared::guiddef::{REFGUID, REFIID};
8 use shared::minwindef::{BOOL, DWORD, UINT};
9 use shared::windef::HWND;
10 use um::objidl::IBindCtx;
11 use um::propkeydef::REFPROPERTYKEY;
12 use um::propsys::{GETPROPERTYSTOREFLAGS, IPropertyDescriptionList, IPropertyStore};
13 use um::shobjidl_core::{IModalWindow, IModalWindowVtbl, IShellItem, IShellItemFilter, SFGAOF};
14 use um::shtypes::COMDLG_FILTERSPEC;
15 use um::unknwnbase::{IUnknown, IUnknownVtbl};
16 use um::winnt::{HRESULT, LPCWSTR, LPWSTR, WCHAR};
17 pub type IFileOperationProgressSink = IUnknown; // TODO
18 ENUM!{enum SIATTRIBFLAGS {
19     SIATTRIBFLAGS_AND = 0x1,
20     SIATTRIBFLAGS_OR = 0x2,
21     SIATTRIBFLAGS_APPCOMPAT = 0x3,
22     SIATTRIBFLAGS_MASK = 0x3,
23     SIATTRIBFLAGS_ALLITEMS = 0x4000,
24 }}
25 RIDL!{#[uuid(0xb63ea76d, 0x1f85, 0x456f, 0xa1, 0x9c, 0x48, 0x15, 0x9e, 0xfa, 0x85, 0x8b)]
26 interface IShellItemArray(IShellItemArrayVtbl): IUnknown(IUnknownVtbl) {
27     fn BindToHandler(
28         pbc: *mut IBindCtx,
29         bhid: REFGUID,
30         riid: REFIID,
31         ppvOut: *mut *mut c_void,
32     ) -> HRESULT,
33     fn GetPropertyStore(
34         flags: GETPROPERTYSTOREFLAGS,
35         riid: REFIID,
36         ppv: *mut *mut c_void,
37     ) -> HRESULT,
38     fn GetPropertyDescriptionList(
39         keyType: REFPROPERTYKEY,
40         riid: REFIID,
41         ppv: *mut *mut c_void,
42     ) -> HRESULT,
43     fn GetAttributes(
44         AttribFlags: SIATTRIBFLAGS,
45         sfgaoMask: SFGAOF,
46         psfgaoAttribs: *mut SFGAOF,
47     ) -> HRESULT,
48     fn GetCount(
49         pdwNumItems: *mut DWORD,
50     ) -> HRESULT,
51     fn GetItemAt(
52         dwIndex: DWORD,
53         ppsi: *mut *mut IShellItem,
54     ) -> HRESULT,
55     // TODO: Add IEnumShellItems
56     //fn EnumItems(
57     //    ppenumShellItems: *mut *mut IEnumShellItems,
58     //) -> HRESULT,
59 }}
60 ENUM!{enum FDE_OVERWRITE_RESPONSE {
61     FDEOR_DEFAULT = 0,
62     FDEOR_ACCEPT = 1,
63     FDEOR_REFUSE = 2,
64 }}
65 ENUM!{enum FDE_SHAREVIOLATION_RESPONSE {
66     FDESVR_DEFAULT = 0,
67     FDESVR_ACCEPT = 1,
68     FDESVR_REFUSE = 2,
69 }}
70 ENUM!{enum FDAP {
71     FDAP_BOTTOM = 0,
72     FDAP_TOP = 1,
73 }}
74 RIDL!{#[uuid(0x973510db, 0x7d7f, 0x452b, 0x89, 0x75, 0x74, 0xa8, 0x58, 0x28, 0xd3, 0x54)]
75 interface IFileDialogEvents(IFileDialogEventsVtbl): IUnknown(IUnknownVtbl) {
76     fn OnFileOk(
77         pfd: *mut IFileDialog,
78     ) -> HRESULT,
79     fn OnFolderChanging(
80         pfd: *mut IFileDialog,
81         psiFolder: *mut IShellItem,
82     ) -> HRESULT,
83     fn OnFolderChange(
84         pfd: *mut IFileDialog,
85     ) -> HRESULT,
86     fn OnSelectionChange(
87         pfd: *mut IFileDialog,
88     ) -> HRESULT,
89     fn OnShareViolation(
90         pfd: *mut IFileDialog,
91         psi: *mut IShellItem,
92         pResponse: *mut FDE_SHAREVIOLATION_RESPONSE,
93     ) -> HRESULT,
94     fn OnTypeChange(
95         pfd: *mut IFileDialog,
96     ) -> HRESULT,
97     fn OnOverwrite(
98         pfd: *mut IFileDialog,
99         psi: *mut IShellItem,
100         pResponse: *mut FDE_OVERWRITE_RESPONSE,
101     ) -> HRESULT,
102 }}
103 ENUM!{enum FILEOPENDIALOGOPTIONS {
104     FOS_OVERWRITEPROMPT = 0x2,
105     FOS_STRICTFILETYPES = 0x4,
106     FOS_NOCHANGEDIR = 0x8,
107     FOS_PICKFOLDERS = 0x20,
108     FOS_FORCEFILESYSTEM = 0x40,
109     FOS_ALLNONSTORAGEITEMS = 0x80,
110     FOS_NOVALIDATE = 0x100,
111     FOS_ALLOWMULTISELECT = 0x200,
112     FOS_PATHMUSTEXIST = 0x800,
113     FOS_FILEMUSTEXIST = 0x1000,
114     FOS_CREATEPROMPT = 0x2000,
115     FOS_SHAREAWARE = 0x4000,
116     FOS_NOREADONLYRETURN = 0x8000,
117     FOS_NOTESTFILECREATE = 0x10000,
118     FOS_HIDEMRUPLACES = 0x20000,
119     FOS_HIDEPINNEDPLACES = 0x40000,
120     FOS_NODEREFERENCELINKS = 0x100000,
121     FOS_DONTADDTORECENT = 0x2000000,
122     FOS_FORCESHOWHIDDEN = 0x10000000,
123     FOS_DEFAULTNOMINIMODE = 0x20000000,
124     FOS_FORCEPREVIEWPANEON = 0x40000000,
125     FOS_SUPPORTSTREAMABLEITEMS = 0x80000000,
126 }}
127 RIDL!{#[uuid(0x42f85136, 0xdb7e, 0x439c, 0x85, 0xf1, 0xe4, 0x07, 0x5d, 0x13, 0x5f, 0xc8)]
128 interface IFileDialog(IFileDialogVtbl): IModalWindow(IModalWindowVtbl) {
129     fn SetFileTypes(
130         cFileTypes: UINT,
131         rgFilterSpec: *const COMDLG_FILTERSPEC,
132     ) -> HRESULT,
133     fn SetFileTypeIndex(
134         iFileType: UINT,
135     ) -> HRESULT,
136     fn GetFileTypeIndex(
137         piFileType: *mut UINT,
138     ) -> HRESULT,
139     fn Advise(
140         pfde: *mut IFileDialogEvents,
141         pdwCookie: *mut DWORD,
142     ) -> HRESULT,
143     fn Unadvise(
144         dwCookie: DWORD,
145     ) -> HRESULT,
146     fn SetOptions(
147         fos: FILEOPENDIALOGOPTIONS,
148     ) -> HRESULT,
149     fn GetOptions(
150         pfos: *mut FILEOPENDIALOGOPTIONS,
151     ) -> HRESULT,
152     fn SetDefaultFolder(
153         psi: *mut IShellItem,
154     ) -> HRESULT,
155     fn SetFolder(
156         psi: *mut IShellItem,
157     ) -> HRESULT,
158     fn GetFolder(
159         ppsi: *mut *mut IShellItem,
160     ) -> HRESULT,
161     fn GetCurrentSelection(
162         ppsi: *mut *mut IShellItem,
163     ) -> HRESULT,
164     fn SetFileName(
165         pszName: LPCWSTR,
166     ) -> HRESULT,
167     fn GetFileName(
168         pszName: *mut LPWSTR,
169     ) -> HRESULT,
170     fn SetTitle(
171         pszTitle: LPCWSTR,
172     ) -> HRESULT,
173     fn SetOkButtonLabel(
174         pszText: LPCWSTR,
175     ) -> HRESULT,
176     fn SetFileNameLabel(
177         pszLabel: LPCWSTR,
178     ) -> HRESULT,
179     fn GetResult(
180         ppsi: *mut *mut IShellItem,
181     ) -> HRESULT,
182     fn AddPlace(
183         psi: *mut IShellItem,
184         fdap: FDAP,
185     ) -> HRESULT,
186     fn SetDefaultExtension(
187         pszDefaultExtension: LPCWSTR,
188     ) -> HRESULT,
189     fn Close(
190         hr: HRESULT,
191     ) -> HRESULT,
192     fn SetClientGuid(
193         guid: REFGUID,
194     ) -> HRESULT,
195     fn ClearClientData() -> HRESULT,
196     fn SetFilter(
197         pFilter: *mut IShellItemFilter,
198     ) -> HRESULT,
199 }}
200 RIDL!{#[uuid(0x84bccd23, 0x5fde, 0x4cdb, 0xae, 0xa4, 0xaf, 0x64, 0xb8, 0x3d, 0x78, 0xab)]
201 interface IFileSaveDialog(IFileSaveDialogVtbl): IFileDialog(IFileDialogVtbl) {
202     fn SetSaveAsItem(
203         psi: *mut IShellItem,
204     ) -> HRESULT,
205     fn SetProperties(
206         pStore: *mut IPropertyStore,
207     ) -> HRESULT,
208     fn SetCollectedProperties(
209         pList: *mut IPropertyDescriptionList,
210         fAppendDefault: BOOL,
211     ) -> HRESULT,
212     fn GetProperties(
213         ppStore: *mut *mut IPropertyStore,
214     ) -> HRESULT,
215     fn ApplyProperties(
216         psi: *mut IShellItem,
217         pStore: *mut IPropertyStore,
218         hwnd: HWND,
219         pSink: *mut IFileOperationProgressSink,
220     ) -> HRESULT,
221 }}
222 RIDL!{#[uuid(0xd57c7288, 0xd4ad, 0x4768, 0xbe, 0x02, 0x9d, 0x96, 0x95, 0x32, 0xd9, 0x60)]
223 interface IFileOpenDialog(IFileOpenDialogVtbl): IFileDialog(IFileDialogVtbl) {
224     fn GetResults(
225         ppenum: *mut *mut IShellItemArray,
226     ) -> HRESULT,
227     fn GetSelectedItems(
228         ppsai: *mut *mut IShellItemArray,
229     ) -> HRESULT,
230 }}
231 ENUM!{enum CDCONTROLSTATEF {
232     CDCS_INACTIVE = 0,
233     CDCS_ENABLED = 0x1,
234     CDCS_VISIBLE = 0x2,
235     CDCS_ENABLEDVISIBLE = 0x3,
236 }}
237 RIDL!{#[uuid(0xe6fdd21a, 0x163f, 0x4975, 0x9c, 0x8c, 0xa6, 0x9f, 0x1b, 0xa3, 0x70, 0x34)]
238 interface IFileDialogCustomize(IFileDialogCustomizeVtbl): IUnknown(IUnknownVtbl) {
239     fn EnableOpenDropDown(
240         dwIDCtl: DWORD,
241     ) -> HRESULT,
242     fn AddMenu(
243         dwIDCtl: DWORD,
244         pszLabel: LPCWSTR,
245     ) -> HRESULT,
246     fn AddPushButton(
247         dwIDCtl: DWORD,
248         pszLabel: LPCWSTR,
249     ) -> HRESULT,
250     fn AddComboBox(
251         dwIDCtl: DWORD,
252     ) -> HRESULT,
253     fn AddRadioButtonList(
254         dwIDCtl: DWORD,
255     ) -> HRESULT,
256     fn AddCheckButton(
257         dwIDCtl: DWORD,
258         pszLabel: LPCWSTR,
259         bChecked: BOOL,
260     ) -> HRESULT,
261     fn AddEditBox(
262         dwIDCtl: DWORD,
263         pszText: LPCWSTR,
264     ) -> HRESULT,
265     fn AddSeparator(
266         dwIDCtl: DWORD,
267     ) -> HRESULT,
268     fn AddText(
269         dwIDCtl: DWORD,
270         pszText: LPCWSTR,
271     ) -> HRESULT,
272     fn SetControlLabel(
273         dwIDCtl: DWORD,
274         pszLabel: LPCWSTR,
275     ) -> HRESULT,
276     fn GetControlState(
277         dwIDCtl: DWORD,
278         pdwState: *mut CDCONTROLSTATEF,
279     ) -> HRESULT,
280     fn SetControlState(
281         dwIDCtl: DWORD,
282         dwState: CDCONTROLSTATEF,
283     ) -> HRESULT,
284     fn GetEditBoxText(
285         dwIDCtl: DWORD,
286         ppszText: *mut *mut WCHAR,
287     ) -> HRESULT,
288     fn SetEditBoxText(
289         dwIDCtl: DWORD,
290         pszText: LPCWSTR,
291     ) -> HRESULT,
292     fn GetCheckButtonState(
293         dwIDCtl: DWORD,
294         pbChecked: *mut BOOL,
295     ) -> HRESULT,
296     fn SetCheckButtonState(
297         dwIDCtl: DWORD,
298         bChecked: BOOL,
299     ) -> HRESULT,
300     fn AddControlItem(
301         dwIDCtl: DWORD,
302         dwIDItem: DWORD,
303         pszLabel: LPCWSTR,
304     ) -> HRESULT,
305     fn RemoveControlItem(
306         dwIDCtl: DWORD,
307         dwIDItem: DWORD,
308     ) -> HRESULT,
309     fn RemoveAllControlItems(
310         dwIDCtl: DWORD,
311     ) -> HRESULT,
312     fn GetControlItemState(
313         dwIDCtl: DWORD,
314         dwIDItem: DWORD,
315         pdwState: *mut CDCONTROLSTATEF,
316     ) -> HRESULT,
317     fn SetControlItemState(
318         dwIDCtl: DWORD,
319         dwIDItem: DWORD,
320         dwState: CDCONTROLSTATEF,
321     ) -> HRESULT,
322     fn GetSelectedControlItem(
323         dwIDCtl: DWORD,
324         pdwIDItem: *mut DWORD,
325     ) -> HRESULT,
326     fn SetSelectedControlItem(
327         dwIDCtl: DWORD,
328         dwIDItem: DWORD,
329     ) -> HRESULT,
330     fn StartVisualGroup(
331         dwIDCtl: DWORD,
332         pszLabel: LPCWSTR,
333     ) -> HRESULT,
334     fn EndVisualGroup() -> HRESULT,
335     fn MakeProminent(
336         dwIDCtl: DWORD,
337     ) -> HRESULT,
338     fn SetControlItemText(
339         dwIDCtl: DWORD,
340         dwIDItem: DWORD,
341         pszLabel: LPCWSTR,
342     ) -> HRESULT,
343 }}
344 RIDL!{#[uuid(0x36116642, 0xd713, 0x4b97, 0x9b, 0x83, 0x74, 0x84, 0xa9, 0xd0, 0x04, 0x33)]
345 interface IFileDialogControlEvents(IFileDialogControlEventsVtbl): IUnknown(IUnknownVtbl) {
346     fn OnItemSelected(
347         pfdc: *mut IFileDialogCustomize,
348         dwIDCtl: DWORD,
349         dwIDItem: DWORD,
350     ) -> HRESULT,
351     fn OnButtonClicked(
352         pfdc: *mut IFileDialogCustomize,
353         dwIDCtl: DWORD,
354     ) -> HRESULT,
355     fn OnCheckButtonToggled(
356         pfdc: *mut IFileDialogCustomize,
357         dwIDCtl: DWORD,
358         bChecked: BOOL,
359     ) -> HRESULT,
360     fn OnControlActivating(
361         pfdc: *mut IFileDialogCustomize,
362         dwIDCtl: DWORD,
363     ) -> HRESULT,
364 }}
365 RIDL!{#[uuid(0x61744fc7, 0x85b5, 0x4791, 0xa9, 0xb0, 0x27, 0x22, 0x76, 0x30, 0x9b, 0x13)]
366 interface IFileDialog2(IFileDialog2Vtbl): IFileDialog(IFileDialogVtbl) {
367     fn SetCancelButtonLabel(
368         pszLabel: LPCWSTR,
369     ) -> HRESULT,
370     fn SetNavigationRoot(
371         psi: IShellItem,
372     ) -> HRESULT,
373 }}
374