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