2 * Open With Context Menu extension
4 * Copyright 2007 Johannes Anderwald <johannes.anderwald@reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 WINE_DEFAULT_DEBUG_CHANNEL (fprop
);
25 #define MAX_PROPERTY_SHEET_PAGE (32)
28 /// CLASSKEY = HKEY_CLASSES_ROOT\CLSID\{6DFD7C5C-2451-11d3-A299-00C04F8EF6AF}
29 /// DefaultIcon = %SystemRoot%\system32\SHELL32.dll,-210
30 /// Verbs: Open / RunAs
31 /// Cmd: rundll32.exe shell32.dll,Options_RunDLL 0
33 /// ShellFolder Attributes: 0x0
37 WCHAR FileExtension
[30];
38 WCHAR FileDescription
[100];
39 WCHAR ClassKey
[MAX_PATH
];
40 } FOLDER_FILE_TYPE_ENTRY
, *PFOLDER_FILE_TYPE_ENTRY
;
46 } FOLDER_VIEW_ENTRY
, PFOLDER_VIEW_ENTRY
;
48 static FOLDER_VIEW_ENTRY s_Options[] =
50 { L"AlwaysShowMenus", IDS_ALWAYSSHOWMENUS },
51 { L"AutoCheckSelect", -1 },
52 { L"ClassicViewState", -1 },
53 { L"DontPrettyPath", -1 },
55 { L"FolderContentsInfoTip", IDS_FOLDERCONTENTSTIP },
56 { L"FriendlyTree", -1 },
58 { L"HideFileExt", IDS_HIDEFILEEXT },
61 { L"ListviewAlphaSelect", -1},
62 { L"ListviewShadow", -1},
63 { L"ListviewWatermark", -1},
64 { L"MapNetDrvBtn", -1},
65 { L"PersistBrowsers", -1},
66 { L"SeperateProcess", IDS_SEPERATEPROCESS},
67 { L"ServerAdminUI", -1},
68 { L"SharingWizardOn", IDS_USESHAREWIZARD},
69 { L"ShowCompColor", IDS_COMPCOLOR},
70 { L"ShowInfoTip", IDS_SHOWINFOTIP},
71 { L"ShowPreviewHandlers", -1},
72 { L"ShowSuperHidden", IDS_HIDEOSFILES},
73 { L"ShowTypeOverlay", -1},
74 { L"Start_ShowMyGames", -1},
75 { L"StartMenuInit", -1},
76 { L"SuperHidden", -1},
84 EXTERN_C HPSXA WINAPI
SHCreatePropSheetExtArrayEx(HKEY hKey
, LPCWSTR pszSubKey
, UINT max_iface
, IDataObject
*pDataObj
);
89 FolderOptionsGeneralDlg(
101 InitializeFolderOptionsListCtrl(HWND hwndDlg
)
108 hDlgCtrl
= GetDlgItem(hwndDlg
, 14003);
110 if (!LoadStringW(shell32_hInstance
, IDS_COLUMN_EXTENSION
, szName
, sizeof(szName
) / sizeof(WCHAR
)))
112 szName
[(sizeof(szName
)/sizeof(WCHAR
))-1] = 0;
114 GetClientRect(hDlgCtrl
, &clientRect
);
115 ZeroMemory(&col
, sizeof(LV_COLUMN
));
116 col
.mask
= LVCF_SUBITEM
| LVCF_WIDTH
| LVCF_FMT
;
118 col
.pszText
= szName
;
119 col
.fmt
= LVCFMT_LEFT
;
120 col
.cx
= (clientRect
.right
- clientRect
.left
) - GetSystemMetrics(SM_CXVSCROLL
);
121 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMN
, 0, (LPARAM
)&col
);
130 FolderOptionsViewDlg(
140 InitializeFolderOptionsListCtrl(hwndDlg
);
150 InitializeFileTypesListCtrlColumns(HWND hDlgCtrl
)
156 int columnSize
= 140;
159 if (!LoadStringW(shell32_hInstance
, IDS_COLUMN_EXTENSION
, szName
, sizeof(szName
) / sizeof(WCHAR
)))
161 /* default to english */
162 wcscpy(szName
, L
"Extensions");
165 /* make sure its null terminated */
166 szName
[(sizeof(szName
)/sizeof(WCHAR
))-1] = 0;
168 GetClientRect(hDlgCtrl
, &clientRect
);
169 ZeroMemory(&col
, sizeof(LV_COLUMN
));
170 columnSize
= 140; //FIXME
172 col
.mask
= LVCF_WIDTH
| LVCF_TEXT
| LVCF_SUBITEM
| LVCF_FMT
;
173 col
.fmt
= LVCFMT_FIXED_WIDTH
;
174 col
.cx
= columnSize
| LVCFMT_LEFT
;
175 col
.cchTextMax
= wcslen(szName
);
176 col
.pszText
= szName
;
177 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, 0, (LPARAM
)&col
);
179 if (!LoadStringW(shell32_hInstance
, IDS_FILE_TYPES
, szName
, sizeof(szName
) / sizeof(WCHAR
)))
181 /* default to english */
182 wcscpy(szName
, L
"FileTypes");
186 col
.cx
= clientRect
.right
- clientRect
.left
- columnSize
;
187 col
.cchTextMax
= wcslen(szName
);
188 col
.pszText
= szName
;
189 (void)SendMessageW(hDlgCtrl
, LVM_INSERTCOLUMNW
, 1, (LPARAM
)&col
);
191 /* set full select style */
192 dwStyle
= (DWORD
) SendMessage(hDlgCtrl
, LVM_GETEXTENDEDLISTVIEWSTYLE
, 0, 0);
193 dwStyle
= dwStyle
| LVS_EX_FULLROWSELECT
;
194 SendMessage(hDlgCtrl
, LVM_SETEXTENDEDLISTVIEWSTYLE
, 0, dwStyle
);
198 FindItem(HWND hDlgCtrl
, WCHAR
* ItemName
)
200 LVFINDINFOW findInfo
;
201 ZeroMemory(&findInfo
, sizeof(LVFINDINFOW
));
203 findInfo
.flags
= LVFI_STRING
;
204 findInfo
.psz
= ItemName
;
205 return ListView_FindItem(hDlgCtrl
, 0, &findInfo
);
210 InsertFileType(HWND hDlgCtrl
, WCHAR
* szName
, PINT iItem
, WCHAR
* szFile
)
212 PFOLDER_FILE_TYPE_ENTRY Entry
;
217 if (szName
[0] != L
'.')
219 /* FIXME handle URL protocol handlers */
223 /* allocate file type entry */
224 Entry
= (PFOLDER_FILE_TYPE_ENTRY
)HeapAlloc(GetProcessHeap(), 0, sizeof(FOLDER_FILE_TYPE_ENTRY
));
230 if (RegOpenKeyExW(HKEY_CLASSES_ROOT
, szName
, 0, KEY_READ
, &hKey
) != ERROR_SUCCESS
)
232 HeapFree(GetProcessHeap(), 0, Entry
);
236 /* FIXME check for duplicates */
238 /* query for the default key */
239 dwSize
= sizeof(Entry
->ClassKey
);
240 if (RegQueryValueExW(hKey
, NULL
, NULL
, NULL
, (LPBYTE
)Entry
->ClassKey
, &dwSize
) != ERROR_SUCCESS
)
242 /* no link available */
243 Entry
->ClassKey
[0] = 0;
246 if (Entry
->ClassKey
[0])
249 /* try open linked key */
250 if (RegOpenKeyExW(HKEY_CLASSES_ROOT
, Entry
->ClassKey
, 0, KEY_READ
, &hTemp
) == ERROR_SUCCESS
)
258 /* read friendly type name */
259 if (RegLoadMUIStringW(hKey
, L
"FriendlyTypeName", Entry
->FileDescription
, sizeof(Entry
->FileDescription
), NULL
, 0, NULL
) != ERROR_SUCCESS
)
261 /* read file description */
262 dwSize
= sizeof(Entry
->FileDescription
);
263 Entry
->FileDescription
[0] = 0;
265 /* read default key */
266 RegQueryValueExW(hKey
, NULL
, NULL
, NULL
, (LPBYTE
)Entry
->FileDescription
, &dwSize
);
272 /* convert extension to upper case */
273 wcscpy(Entry
->FileExtension
, szName
);
274 _wcsupr(Entry
->FileExtension
);
276 if (!Entry
->FileDescription
[0])
278 /* construct default 'FileExtensionFile' by formatting the uppercase extension
279 with IDS_FILE_EXT_TYPE, outputting something like a l18n 'INI File' */
281 StringCchPrintf(Entry
->FileDescription
, _countof(Entry
->FileDescription
), szFile
, &Entry
->FileExtension
[1]);
284 ZeroMemory(&lvItem
, sizeof(LVITEMW
));
285 lvItem
.mask
= LVIF_TEXT
| LVIF_PARAM
;
287 lvItem
.pszText
= &Entry
->FileExtension
[1];
288 lvItem
.iItem
= *iItem
;
289 lvItem
.lParam
= (LPARAM
)Entry
;
290 (void)SendMessageW(hDlgCtrl
, LVM_INSERTITEMW
, 0, (LPARAM
)&lvItem
);
292 ZeroMemory(&lvItem
, sizeof(LVITEMW
));
293 lvItem
.mask
= LVIF_TEXT
;
294 lvItem
.pszText
= Entry
->FileDescription
;
295 lvItem
.iItem
= *iItem
;
298 (void)SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&lvItem
);
305 ListViewCompareProc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
307 PFOLDER_FILE_TYPE_ENTRY Entry1
, Entry2
;
309 Entry1
= (PFOLDER_FILE_TYPE_ENTRY
)lParam1
;
310 Entry2
= (PFOLDER_FILE_TYPE_ENTRY
)lParam2
;
312 return wcsicmp(Entry1
->FileExtension
, Entry2
->FileExtension
);
317 InitializeFileTypesListCtrl(HWND hwndDlg
)
327 hDlgCtrl
= GetDlgItem(hwndDlg
, 14000);
328 InitializeFileTypesListCtrlColumns(hDlgCtrl
);
331 if (!LoadStringW(shell32_hInstance
, IDS_FILE_EXT_TYPE
, szFile
, _countof(szFile
)))
333 /* default to english */
334 wcscpy(szFile
, L
"%s File");
336 szFile
[(_countof(szFile
))-1] = 0;
338 dwName
= _countof(szName
);
340 while(RegEnumKeyExW(HKEY_CLASSES_ROOT
, dwIndex
++, szName
, &dwName
, NULL
, NULL
, NULL
, NULL
) == ERROR_SUCCESS
)
342 InsertFileType(hDlgCtrl
, szName
, &iItem
, szFile
);
343 dwName
= _countof(szName
);
347 ListView_SortItems(hDlgCtrl
, ListViewCompareProc
, NULL
);
349 /* select first item */
350 ZeroMemory(&lvItem
, sizeof(LVITEMW
));
351 lvItem
.mask
= LVIF_STATE
;
352 lvItem
.stateMask
= (UINT
) - 1;
353 lvItem
.state
= LVIS_FOCUSED
| LVIS_SELECTED
;
355 (void)SendMessageW(hDlgCtrl
, LVM_SETITEMW
, 0, (LPARAM
)&lvItem
);
361 PFOLDER_FILE_TYPE_ENTRY
368 Count
= ListView_GetItemCount(hDlgCtrl
);
370 for (Index
= 0; Index
< Count
; Index
++)
372 ZeroMemory(&lvItem
, sizeof(LVITEM
));
373 lvItem
.mask
= LVIF_PARAM
| LVIF_STATE
;
374 lvItem
.iItem
= Index
;
375 lvItem
.stateMask
= (UINT
) - 1;
377 if (ListView_GetItem(hDlgCtrl
, &lvItem
))
379 if (lvItem
.state
& LVIS_SELECTED
)
380 return (PFOLDER_FILE_TYPE_ENTRY
)lvItem
.lParam
;
390 FolderOptionsFileTypesDlg(
399 WCHAR Buffer
[255], FormatBuffer
[255];
400 PFOLDER_FILE_TYPE_ENTRY pItem
;
406 InitializeFileTypesListCtrl(hwndDlg
);
409 switch(LOWORD(wParam
))
412 pItem
= FindSelectedItem(GetDlgItem(hwndDlg
, 14000));
415 Info
.oaifInFlags
= OAIF_ALLOW_REGISTRATION
| OAIF_REGISTER_EXT
;
416 Info
.pcszClass
= pItem
->FileExtension
;
417 SHOpenWithDialog(hwndDlg
, &Info
);
424 lppl
= (LPNMLISTVIEW
) lParam
;
426 if (lppl
->hdr
.code
== LVN_ITEMCHANGING
)
428 ZeroMemory(&lvItem
, sizeof(LVITEM
));
429 lvItem
.mask
= LVIF_PARAM
;
430 lvItem
.iItem
= lppl
->iItem
;
431 if (!SendMessageW(lppl
->hdr
.hwndFrom
, LVM_GETITEMW
, 0, (LPARAM
)&lvItem
))
434 pItem
= (PFOLDER_FILE_TYPE_ENTRY
)lvItem
.lParam
;
438 if (!(lppl
->uOldState
& LVIS_FOCUSED
) && (lppl
->uNewState
& LVIS_FOCUSED
))
440 /* new focused item */
441 if (!LoadStringW(shell32_hInstance
, IDS_FILE_DETAILS
, FormatBuffer
, sizeof(FormatBuffer
) / sizeof(WCHAR
)))
443 /* use default english format string */
444 wcscpy(FormatBuffer
, L
"Details for '%s' extension");
448 swprintf(Buffer
, FormatBuffer
, &pItem
->FileExtension
[1]);
450 SetDlgItemTextW(hwndDlg
, 14003, Buffer
);
452 if (!LoadStringW(shell32_hInstance
, IDS_FILE_DETAILSADV
, FormatBuffer
, sizeof(FormatBuffer
) / sizeof(WCHAR
)))
454 /* use default english format string */
455 wcscpy(FormatBuffer
, L
"Files with extension '%s' are of type '%s'. To change settings that affect all '%s' files, click Advanced.");
458 swprintf(Buffer
, FormatBuffer
, &pItem
->FileExtension
[1], &pItem
->FileDescription
[0], &pItem
->FileDescription
[0]);
460 SetDlgItemTextW(hwndDlg
, 14007, Buffer
);
471 ShowFolderOptionsDialog(HWND hWnd
, HINSTANCE hInst
)
473 PROPSHEETHEADERW pinfo
;
474 HPROPSHEETPAGE hppages
[3];
475 HPROPSHEETPAGE hpage
;
477 WCHAR szOptions
[100];
479 hpage
= SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_GENERAL
, FolderOptionsGeneralDlg
, 0, NULL
);
481 hppages
[num_pages
++] = hpage
;
483 hpage
= SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_VIEW
, FolderOptionsViewDlg
, 0, NULL
);
485 hppages
[num_pages
++] = hpage
;
487 hpage
= SH_CreatePropertySheetPage(IDD_FOLDER_OPTIONS_FILETYPES
, FolderOptionsFileTypesDlg
, 0, NULL
);
489 hppages
[num_pages
++] = hpage
;
491 szOptions
[0] = L
'\0';
492 LoadStringW(shell32_hInstance
, IDS_FOLDER_OPTIONS
, szOptions
, sizeof(szOptions
) / sizeof(WCHAR
));
493 szOptions
[(sizeof(szOptions
)/sizeof(WCHAR
))-1] = L
'\0';
495 memset(&pinfo
, 0x0, sizeof(PROPSHEETHEADERW
));
496 pinfo
.dwSize
= sizeof(PROPSHEETHEADERW
);
497 pinfo
.dwFlags
= PSH_NOCONTEXTHELP
;
498 pinfo
.nPages
= num_pages
;
499 pinfo
.phpage
= hppages
;
500 pinfo
.pszCaption
= szOptions
;
502 PropertySheetW(&pinfo
);
507 Options_RunDLLCommon(HWND hWnd
, HINSTANCE hInst
, int fOptions
, DWORD nCmdShow
)
512 ShowFolderOptionsDialog(hWnd
, hInst
);
515 // show taskbar options dialog
516 FIXME("notify explorer to show taskbar options dialog");
517 //PostMessage(GetShellWindow(), WM_USER+22, fOptions, 0);
520 FIXME("unrecognized options id %d\n", fOptions
);
524 /*************************************************************************
525 * Options_RunDLL (SHELL32.@)
527 EXTERN_C VOID WINAPI
Options_RunDLL(HWND hWnd
, HINSTANCE hInst
, LPCSTR cmd
, DWORD nCmdShow
)
529 Options_RunDLLCommon(hWnd
, hInst
, StrToIntA(cmd
), nCmdShow
);
532 /*************************************************************************
533 * Options_RunDLLA (SHELL32.@)
535 EXTERN_C VOID WINAPI
Options_RunDLLA(HWND hWnd
, HINSTANCE hInst
, LPCSTR cmd
, DWORD nCmdShow
)
537 Options_RunDLLCommon(hWnd
, hInst
, StrToIntA(cmd
), nCmdShow
);
540 /*************************************************************************
541 * Options_RunDLLW (SHELL32.@)
543 EXTERN_C VOID WINAPI
Options_RunDLLW(HWND hWnd
, HINSTANCE hInst
, LPCWSTR cmd
, DWORD nCmdShow
)
545 Options_RunDLLCommon(hWnd
, hInst
, StrToIntW(cmd
), nCmdShow
);