ReactOS 0.4.15-dev-7924-g5949c20
filetypes.cpp File Reference
#include "precomp.h"
Include dependency graph for filetypes.cpp:

Go to the source code of this file.

Classes

struct  FILE_TYPE_ENTRY
 
struct  EDITTYPE_DIALOG
 
struct  NEWEXT_DIALOG
 
struct  ACTION_DIALOG
 

Macros

#define LISTBOX_MARGIN   2
 

Typedefs

typedef struct FILE_TYPE_ENTRY FILE_TYPE_ENTRY
 
typedef struct FILE_TYPE_ENTRYPFILE_TYPE_ENTRY
 
typedef struct EDITTYPE_DIALOG EDITTYPE_DIALOG
 
typedef struct EDITTYPE_DIALOGPEDITTYPE_DIALOG
 
typedef struct NEWEXT_DIALOG NEWEXT_DIALOG
 
typedef struct NEWEXT_DIALOGPNEWEXT_DIALOG
 
typedef struct ACTION_DIALOG ACTION_DIALOG
 
typedef struct ACTION_DIALOGPACTION_DIALOG
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (fprop)
 
static BOOL DeleteExt (HWND hwndDlg, LPCWSTR pszExt)
 
static HICON DoExtractIcon (PFILE_TYPE_ENTRY Entry, LPCWSTR IconPath, INT iIndex=0, BOOL bSmall=FALSE)
 
static void DoFileTypeIconLocation (PFILE_TYPE_ENTRY Entry, LPCWSTR IconLocation)
 
static BOOL GetFileTypeIconsEx (PFILE_TYPE_ENTRY Entry, LPCWSTR IconLocation)
 
static BOOL GetFileTypeIconsByKey (HKEY hKey, PFILE_TYPE_ENTRY Entry)
 
static BOOL QueryFileDescription (LPCWSTR ProgramPath, LPWSTR pszName, INT cchName)
 
static void SetFileTypeEntryDefaultIcon (PFILE_TYPE_ENTRY Entry)
 
static void EditTypeDlg_OnChangeIcon (HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
 
static BOOL EditTypeDlg_OnDrawItem (HWND hwndDlg, LPDRAWITEMSTRUCT pDraw, PEDITTYPE_DIALOG pEditType)
 
static BOOL EditTypeDlg_OnMeasureItem (HWND hwndDlg, LPMEASUREITEMSTRUCT pMeasure, PEDITTYPE_DIALOG pEditType)
 
static VOID NewExtDlg_OnAdvanced (HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
 
static BOOL NewExtDlg_OnInitDialog (HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
 
static BOOL NewExtDlg_OnOK (HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
 
static INT_PTR CALLBACK NewExtDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static BOOL FileTypesDlg_InsertToLV (HWND hListView, LPCWSTR szName, INT iItem, LPCWSTR szFile)
 
static BOOL FileTypesDlg_AddExt (HWND hwndDlg, LPCWSTR pszExt, LPCWSTR pszFileType)
 
static BOOL FileTypesDlg_RemoveExt (HWND hwndDlg)
 
static void ActionDlg_OnBrowse (HWND hwndDlg, PACTION_DIALOG pNewAct, BOOL bEdit=FALSE)
 
static void NewActionDlg_OnOK (HWND hwndDlg, PACTION_DIALOG pNewAct)
 
static INT_PTR CALLBACK NewActionDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static void EditActionDlg_OnOK (HWND hwndDlg, PACTION_DIALOG pEditAct)
 
static INT_PTR CALLBACK EditActionDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static BOOL EditTypeDlg_UpdateEntryIcon (HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR IconPath, INT IconIndex)
 
static BOOL EditTypeDlg_WriteClass (HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR ClassKey, LPCWSTR ClassName, INT cchName)
 
static BOOL EditTypeDlg_ReadClass (HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR ClassKey)
 
static void EditTypeDlg_OnOK (HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
 
static BOOL EditTypeDlg_OnRemove (HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
 
static void EditTypeDlg_OnCommand (HWND hwndDlg, UINT id, UINT code, PEDITTYPE_DIALOG pEditType)
 
static BOOL EditTypeDlg_OnInitDialog (HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
 
static INT_PTR CALLBACK EditTypeDlgProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
static INT CALLBACK FileTypesDlg_CompareItems (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
 
static VOID FileTypesDlg_InitListView (HWND hwndDlg, HWND hListView)
 
static PFILE_TYPE_ENTRY FileTypesDlg_DoList (HWND hwndDlg)
 
static PFILE_TYPE_ENTRY FileTypesDlg_GetEntry (HWND hListView, INT iItem=-1)
 
static void FileTypesDlg_OnDelete (HWND hwndDlg)
 
static void FileTypesDlg_OnItemChanging (HWND hwndDlg, PFILE_TYPE_ENTRY pEntry)
 
INT_PTR CALLBACK FolderOptionsFileTypesDlg (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 

Macro Definition Documentation

◆ LISTBOX_MARGIN

#define LISTBOX_MARGIN   2

Definition at line 205 of file filetypes.cpp.

Typedef Documentation

◆ ACTION_DIALOG

◆ EDITTYPE_DIALOG

◆ FILE_TYPE_ENTRY

◆ NEWEXT_DIALOG

◆ PACTION_DIALOG

◆ PEDITTYPE_DIALOG

◆ PFILE_TYPE_ENTRY

◆ PNEWEXT_DIALOG

Function Documentation

◆ ActionDlg_OnBrowse()

static void ActionDlg_OnBrowse ( HWND  hwndDlg,
PACTION_DIALOG  pNewAct,
BOOL  bEdit = FALSE 
)
static

Definition at line 820 of file filetypes.cpp.

821{
822 WCHAR szFile[MAX_PATH];
823 szFile[0] = 0;
824
827
829
831 ZeroMemory(&ofn, sizeof(ofn));
833 ofn.hwndOwner = hwndDlg;
835 ofn.lpstrFile = szFile;
836 ofn.nMaxFile = _countof(szFile);
837 ofn.lpstrTitle = strTitle;
839 ofn.lpstrDefExt = L"exe";
840 if (GetOpenFileNameW(&ofn))
841 {
842 if (bEdit)
843 {
844 CStringW str = szFile;
845 str += L" \"%1\"";
847 }
848 else
849 {
850 SetDlgItemTextW(hwndDlg, IDC_ACTION_APP, szFile);
851 }
852 }
853}
#define shell32_hInstance
#define OFN_EXPLORER
Definition: commdlg.h:104
#define OPENFILENAME_SIZE_VERSION_400W
Definition: commdlg.h:397
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
#define OFN_ENABLESIZING
Definition: commdlg.h:101
#define OFN_FILEMUSTEXIST
Definition: commdlg.h:106
#define OFN_PATHMUSTEXIST
Definition: commdlg.h:117
BOOL WINAPI GetOpenFileNameW(OPENFILENAMEW *ofn)
Definition: filedlg.c:4736
#define MAX_PATH
Definition: compat.h:34
LPTSTR szFilter
Definition: mplay32.c:30
CAtlStringW CStringW
Definition: atlstr.h:130
#define L(x)
Definition: ntvdm.h:50
const WCHAR * str
#define IDS_EXE_FILTER
Definition: shresdef.h:333
#define IDC_ACTION_APP
Definition: shresdef.h:497
#define IDS_OPEN_WITH
Definition: shresdef.h:136
OPENFILENAME ofn
Definition: sndrec32.cpp:56
#define _countof(array)
Definition: sndvol32.h:68
LPCSTR lpstrDefExt
Definition: commdlg.h:345
HWND hwndOwner
Definition: commdlg.h:330
LPCSTR lpstrTitle
Definition: commdlg.h:341
LPSTR lpstrFile
Definition: commdlg.h:336
DWORD Flags
Definition: commdlg.h:342
DWORD lStructSize
Definition: commdlg.h:329
LPCSTR lpstrFilter
Definition: commdlg.h:332
DWORD nMaxFile
Definition: commdlg.h:337
#define ZeroMemory
Definition: winbase.h:1712
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by EditActionDlgProc(), and NewActionDlgProc().

◆ DeleteExt()

static BOOL DeleteExt ( HWND  hwndDlg,
LPCWSTR  pszExt 
)
static

Definition at line 48 of file filetypes.cpp.

49{
50 if (*pszExt != L'.')
51 return FALSE;
52
53 // open ".ext" key
54 HKEY hKey;
56 return FALSE;
57
58 // query "extfile" key name
59 WCHAR szValue[64] = { 0 };
60 DWORD cbValue = sizeof(szValue);
61 RegQueryValueExW(hKey, NULL, NULL, NULL, LPBYTE(szValue), &cbValue);
63
64 // delete "extfile" key (if any)
65 if (szValue[0])
67
68 // delete ".ext" key
70}
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
DWORD WINAPI SHDeleteKeyW(HKEY hKey, LPCWSTR lpszSubKey)
Definition: reg.c:1546
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
#define KEY_READ
Definition: nt_native.h:1023
unsigned char * LPBYTE
Definition: typedefs.h:53
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10

Referenced by FileTypesDlg_RemoveExt(), and NewExtDlg_OnOK().

◆ DoExtractIcon()

static HICON DoExtractIcon ( PFILE_TYPE_ENTRY  Entry,
LPCWSTR  IconPath,
INT  iIndex = 0,
BOOL  bSmall = FALSE 
)
inlinestatic

Definition at line 73 of file filetypes.cpp.

75{
77
78 if (iIndex < 0)
79 {
80 // A negative value will be interpreted as a negated resource ID.
81 iIndex = -iIndex;
82
83 INT cx, cy;
85 if (bSmall)
86 {
89 }
90 else
91 {
94 }
96 cx, cy, 0));
97 FreeLibrary(hDLL);
98 }
99 else
100 {
101 // A positive value is icon index.
102 if (bSmall)
103 ExtractIconExW(IconPath, iIndex, NULL, &hIcon, 1);
104 else
105 ExtractIconExW(IconPath, iIndex, &hIcon, NULL, 1);
106 }
107 return hIcon;
108}
#define FreeLibrary(x)
Definition: compat.h:748
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
static const WCHAR IconPath[]
Definition: install.c:51
UINT WINAPI ExtractIconExW(LPCWSTR lpszFile, INT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons)
Definition: iconcache.cpp:849
static HICON
Definition: imagelist.c:84
HICON hIcon
Definition: msconfig.c:44
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
int32_t INT
Definition: typedefs.h:58
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:342
#define IMAGE_ICON
Definition: winuser.h:212
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2203
#define SM_CYSMICON
Definition: winuser.h:1013
#define SM_CXSMICON
Definition: winuser.h:1012
#define SM_CYICON
Definition: winuser.h:973
#define SM_CXICON
Definition: winuser.h:972
int WINAPI GetSystemMetrics(_In_ int)

Referenced by DoFileTypeIconLocation(), EditTypeDlg_OnChangeIcon(), and EditTypeDlg_UpdateEntryIcon().

◆ DoFileTypeIconLocation()

static void DoFileTypeIconLocation ( PFILE_TYPE_ENTRY  Entry,
LPCWSTR  IconLocation 
)
static

Definition at line 111 of file filetypes.cpp.

112{
113 // Expand the REG_EXPAND_SZ string by environment variables
114 WCHAR szLocation[MAX_PATH + 32];
115 if (!ExpandEnvironmentStringsW(IconLocation, szLocation, _countof(szLocation)))
116 return;
117
118 Entry->nIconIndex = PathParseIconLocationW(szLocation);
119 StringCbCopyW(Entry->IconPath, sizeof(Entry->IconPath), szLocation);
120 Entry->hIconLarge = DoExtractIcon(Entry, szLocation, Entry->nIconIndex, FALSE);
121 Entry->hIconSmall = DoExtractIcon(Entry, szLocation, Entry->nIconIndex, TRUE);
122}
#define TRUE
Definition: types.h:120
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
int WINAPI PathParseIconLocationW(LPWSTR lpszPath)
Definition: path.c:1092
static HICON DoExtractIcon(PFILE_TYPE_ENTRY Entry, LPCWSTR IconPath, INT iIndex=0, BOOL bSmall=FALSE)
Definition: filetypes.cpp:73
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
base of all file and directory entries
Definition: entries.h:83

Referenced by GetFileTypeIconsEx().

◆ EditActionDlg_OnOK()

static void EditActionDlg_OnOK ( HWND  hwndDlg,
PACTION_DIALOG  pEditAct 
)
static

Definition at line 933 of file filetypes.cpp.

934{
935 // check action
936 GetDlgItemTextW(hwndDlg, IDC_ACTION_ACTION, pEditAct->szAction, _countof(pEditAct->szAction));
937 StrTrimW(pEditAct->szAction, g_pszSpace);
938 if (pEditAct->szAction[0] == 0)
939 {
940 // action was empty. show error
941 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_ACTION);
942 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
943 SetFocus(hwndCtrl);
946 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
947 }
948
949 // check app
950 GetDlgItemTextW(hwndDlg, IDC_ACTION_APP, pEditAct->szApp, _countof(pEditAct->szApp));
951 StrTrimW(pEditAct->szApp, g_pszSpace);
952 if (pEditAct->szApp[0] == 0)
953 {
954 // app was empty. show error
955 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_APP);
956 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
957 SetFocus(hwndCtrl);
960 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
961 }
962
963 EndDialog(hwndDlg, IDOK);
964}
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1877
LPCWSTR g_pszSpace
#define IDS_SPECIFY_ACTION
Definition: shresdef.h:329
#define IDS_INVALID_PROGRAM
Definition: shresdef.h:330
#define IDS_FILE_TYPES
Definition: shresdef.h:187
#define IDC_ACTION_ACTION
Definition: shresdef.h:496
WCHAR szAction[64]
Definition: filetypes.cpp:814
WCHAR szApp[MAX_PATH]
Definition: filetypes.cpp:815
UINT WINAPI GetDlgItemTextW(HWND hDlg, int nIDDlgItem, LPWSTR lpString, int nMaxCount)
Definition: dialog.c:2263
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:830
#define MB_ICONERROR
Definition: winuser.h:787
HWND WINAPI SetFocus(_In_opt_ HWND)
#define EM_SETSEL
Definition: winuser.h:2018
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)

Referenced by EditActionDlgProc().

◆ EditActionDlgProc()

static INT_PTR CALLBACK EditActionDlgProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 968 of file filetypes.cpp.

969{
970 static PACTION_DIALOG s_pEditAct = NULL;
971
972 switch (uMsg)
973 {
974 case WM_INITDIALOG:
975 s_pEditAct = (PACTION_DIALOG)lParam;
976 s_pEditAct->bUseDDE = FALSE;
977 SetDlgItemTextW(hwndDlg, IDC_ACTION_ACTION, s_pEditAct->szAction);
978 SetDlgItemTextW(hwndDlg, IDC_ACTION_APP, s_pEditAct->szApp);
981 {
982 // set title
984 str += s_pEditAct->ClassName;
985 SetWindowTextW(hwndDlg, str);
986 }
987 return TRUE;
988
989 case WM_COMMAND:
990 switch (LOWORD(wParam))
991 {
992 case IDOK:
993 EditActionDlg_OnOK(hwndDlg, s_pEditAct);
994 break;
995
996 case IDCANCEL:
997 EndDialog(hwndDlg, IDCANCEL);
998 break;
999
1000 case IDC_ACTION_BROWSE:
1001 ActionDlg_OnBrowse(hwndDlg, s_pEditAct, TRUE);
1002 break;
1003 }
1004 break;
1005 }
1006 return 0;
1007}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static void EditActionDlg_OnOK(HWND hwndDlg, PACTION_DIALOG pEditAct)
Definition: filetypes.cpp:933
struct ACTION_DIALOG * PACTION_DIALOG
static void ActionDlg_OnBrowse(HWND hwndDlg, PACTION_DIALOG pNewAct, BOOL bEdit=FALSE)
Definition: filetypes.cpp:820
#define LOWORD(l)
Definition: pedump.c:82
#define IDC_ACTION_BROWSE
Definition: shresdef.h:498
#define IDC_ACTION_USE_DDE
Definition: shresdef.h:499
#define IDS_EDITING_ACTION
Definition: shresdef.h:334
WCHAR ClassName[64]
Definition: filetypes.cpp:813
#define IDCANCEL
Definition: winuser.h:831
#define WM_COMMAND
Definition: winuser.h:1740
#define WM_INITDIALOG
Definition: winuser.h:1739
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)

Referenced by EditTypeDlg_OnCommand().

◆ EditTypeDlg_OnChangeIcon()

static void EditTypeDlg_OnChangeIcon ( HWND  hwndDlg,
PEDITTYPE_DIALOG  pEditType 
)
static

Definition at line 218 of file filetypes.cpp.

219{
222
224 IconIndex = pEditType->nIconIndex;
225 if (PickIconDlg(hwndDlg, szPath, _countof(szPath), &IconIndex))
226 {
227 // replace Windows directory with "%SystemRoot%" (for portability)
228 WCHAR szWinDir[MAX_PATH];
229 GetWindowsDirectoryW(szWinDir, _countof(szWinDir));
230 if (wcsstr(szPath, szWinDir) == 0)
231 {
232 CStringW str(L"%SystemRoot%");
233 str += &szPath[wcslen(szWinDir)];
235 }
236
237 // update FILE_TYPE_ENTRY
238 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
239 DestroyIcon(pEntry->hIconLarge);
240 DestroyIcon(pEntry->hIconSmall);
243
244 // update EDITTYPE_DIALOG
245 StringCbCopyW(pEditType->szIconPath, sizeof(pEditType->szIconPath), szPath);
246 pEditType->nIconIndex = IconIndex;
247
248 // set icon to dialog
250 }
251}
UINT WINAPI GetWindowsDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2352
static const WCHAR IconIndex[]
Definition: install.c:52
BOOL WINAPI PickIconDlg(HWND hWndOwner, LPWSTR lpstrFile, UINT nMaxFile, INT *lpdwIconIndex)
Definition: dialogs.cpp:362
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
LPCWSTR szPath
Definition: env.c:37
#define IDC_EDITTYPE_ICON
Definition: shresdef.h:483
WCHAR szIconPath[MAX_PATH]
Definition: filetypes.cpp:212
PFILE_TYPE_ENTRY pEntry
Definition: filetypes.cpp:210
Definition: filetypes.cpp:33
UINT_PTR WPARAM
Definition: windef.h:207
#define STM_SETICON
Definition: winuser.h:2092
LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2053
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by EditTypeDlg_OnCommand().

◆ EditTypeDlg_OnCommand()

static void EditTypeDlg_OnCommand ( HWND  hwndDlg,
UINT  id,
UINT  code,
PEDITTYPE_DIALOG  pEditType 
)
static

Definition at line 1275 of file filetypes.cpp.

1276{
1277 INT iItem, iIndex;
1279 switch (id)
1280 {
1281 case IDOK:
1282 EditTypeDlg_OnOK(hwndDlg, pEditType);
1283 break;
1284
1285 case IDCANCEL:
1286 EndDialog(hwndDlg, IDCANCEL);
1287 break;
1288
1290 EditTypeDlg_OnChangeIcon(hwndDlg, pEditType);
1291 break;
1292
1293 case IDC_EDITTYPE_NEW:
1294 action.bUseDDE = FALSE;
1295 action.hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
1296 StringCbPrintfW(action.ClassName, sizeof(action.ClassName), pEditType->pEntry->ClassName);
1297 // open 'New Action' dialog
1300 {
1301 if (SendMessageW(action.hwndLB, LB_FINDSTRING, -1, (LPARAM)action.szAction) != LB_ERR)
1302 {
1303 // already exists, error
1304 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_ACTION);
1305 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
1306 SetFocus(hwndCtrl);
1307
1308 CStringW strText, strTitle(MAKEINTRESOURCEW(IDS_FILE_TYPES));
1309 strText.Format(IDS_ACTION_EXISTS, action.szAction);
1310 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
1311 }
1312 else
1313 {
1314 // add it
1315 CStringW strCommandLine = action.szApp;
1316 strCommandLine += L" \"%1\"";
1317 pEditType->CommandLineMap.SetAt(action.szAction, strCommandLine);
1318 SendMessageW(action.hwndLB, LB_ADDSTRING, 0, LPARAM(action.szAction));
1319 if (SendMessageW(action.hwndLB, LB_GETCOUNT, 0, 0) == 1)
1320 {
1321 // set default
1322 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), action.szAction);
1323 InvalidateRect(action.hwndLB, NULL, TRUE);
1324 }
1325 }
1326 }
1327 break;
1328
1330 if (code == LBN_SELCHANGE)
1331 {
1332 action.hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
1333 INT iItem = SendMessageW(action.hwndLB, LB_GETCURSEL, 0, 0);
1334 SendMessageW(action.hwndLB, LB_GETTEXT, iItem, LPARAM(action.szAction));
1335 if (lstrcmpiW(action.szAction, pEditType->szDefaultVerb) == 0)
1336 {
1338 }
1339 else
1340 {
1342 }
1343 break;
1344 }
1345 else if (code != LBN_DBLCLK)
1346 {
1347 break;
1348 }
1349 // FALL THROUGH
1350
1352 action.bUseDDE = FALSE;
1353 action.hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
1354 StringCbPrintfW(action.ClassName, sizeof(action.ClassName), pEditType->pEntry->ClassName);
1355 iItem = SendMessageW(action.hwndLB, LB_GETCURSEL, 0, 0);
1356 if (iItem == LB_ERR)
1357 break;
1358
1359 // get action
1360 SendMessageW(action.hwndLB, LB_GETTEXT, iItem, LPARAM(action.szAction));
1361
1362 // get app
1363 {
1364 iIndex = pEditType->CommandLineMap.FindKey(action.szAction);
1365 CStringW str = pEditType->CommandLineMap.GetValueAt(iIndex);
1366 StringCbCopyW(action.szApp, sizeof(action.szApp), LPCWSTR(str));
1367 }
1368
1369 // open dialog
1372 {
1373 SendMessageW(action.hwndLB, LB_DELETESTRING, iItem, 0);
1374 SendMessageW(action.hwndLB, LB_INSERTSTRING, iItem, LPARAM(action.szAction));
1375 pEditType->CommandLineMap.SetAt(action.szAction, action.szApp);
1376 }
1377 break;
1378
1380 EditTypeDlg_OnRemove(hwndDlg, pEditType);
1381 break;
1382
1384 action.hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
1385 iItem = SendMessageW(action.hwndLB, LB_GETCURSEL, 0, 0);
1386 if (iItem == LB_ERR)
1387 break;
1388
1389 SendMessageW(action.hwndLB, LB_GETTEXT, iItem, LPARAM(action.szAction));
1390
1391 // set default
1392 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), action.szAction);
1394 InvalidateRect(action.hwndLB, NULL, TRUE);
1395 break;
1396 }
1397}
TVal & GetValueAt(int nIndex)
Definition: atlsimpcoll.h:358
BOOL SetAt(const TKey &key, const TVal &val)
Definition: atlsimpcoll.h:402
int FindKey(const TKey &key) const
Definition: atlsimpcoll.h:315
const WCHAR * action
Definition: action.c:7479
static INT_PTR CALLBACK NewActionDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:897
static BOOL EditTypeDlg_OnRemove(HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:1249
static void EditTypeDlg_OnChangeIcon(HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:218
static INT_PTR CALLBACK EditActionDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:968
static void EditTypeDlg_OnOK(HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:1227
int WINAPI lstrcmpiW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:194
#define IDD_ACTION
Definition: shresdef.h:522
#define IDC_EDITTYPE_SET_DEFAULT
Definition: shresdef.h:490
#define IDC_EDITTYPE_EDIT_BUTTON
Definition: shresdef.h:488
#define IDC_EDITTYPE_LISTBOX
Definition: shresdef.h:486
#define IDS_ACTION_EXISTS
Definition: shresdef.h:332
#define IDC_EDITTYPE_NEW
Definition: shresdef.h:487
#define IDC_EDITTYPE_CHANGE_ICON
Definition: shresdef.h:485
#define IDC_EDITTYPE_REMOVE
Definition: shresdef.h:489
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
CSimpleMap< CStringW, CStringW > CommandLineMap
Definition: filetypes.cpp:211
WCHAR szDefaultVerb[64]
Definition: filetypes.cpp:214
WCHAR ClassName[64]
Definition: filetypes.cpp:37
Definition: inflate.c:139
LONG_PTR LPARAM
Definition: windef.h:208
#define LB_ERR
Definition: winuser.h:2432
#define LB_GETCOUNT
Definition: winuser.h:2038
#define LB_GETTEXT
Definition: winuser.h:2049
#define LBN_DBLCLK
Definition: winuser.h:2071
#define LB_ADDSTRING
Definition: winuser.h:2031
#define LB_DELETESTRING
Definition: winuser.h:2032
#define LB_FINDSTRING
Definition: winuser.h:2034
#define LB_INSERTSTRING
Definition: winuser.h:2053
#define LBN_SELCHANGE
Definition: winuser.h:2075
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define LB_GETCURSEL
Definition: winuser.h:2039
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)

Referenced by EditTypeDlgProc().

◆ EditTypeDlg_OnDrawItem()

static BOOL EditTypeDlg_OnDrawItem ( HWND  hwndDlg,
LPDRAWITEMSTRUCT  pDraw,
PEDITTYPE_DIALOG  pEditType 
)
static

Definition at line 254 of file filetypes.cpp.

255{
256 WCHAR szText[64];
257 HFONT hFont, hFont2;
258
259 if (!pDraw)
260 return FALSE;
261
262 // fill rect and set colors
263 if (pDraw->itemState & ODS_SELECTED)
264 {
265 FillRect(pDraw->hDC, &pDraw->rcItem, HBRUSH(COLOR_HIGHLIGHT + 1));
268 }
269 else
270 {
271 FillRect(pDraw->hDC, &pDraw->rcItem, HBRUSH(COLOR_WINDOW + 1));
274 }
275
276 // get listbox text
277 HWND hwndListBox = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
278 SendMessageW(hwndListBox, LB_GETTEXT, pDraw->itemID, (LPARAM)szText);
279
280 // is it default?
281 hFont = (HFONT)SendMessageW(hwndListBox, WM_GETFONT, 0, 0);
282 if (lstrcmpiW(pEditType->szDefaultVerb, szText) == 0)
283 {
284 // default. set bold
285 LOGFONTW lf;
286 GetObject(hFont, sizeof(lf), &lf);
287 lf.lfWeight = FW_BOLD;
288 hFont2 = CreateFontIndirectW(&lf);
289 if (hFont2)
290 {
291 HGDIOBJ hFontOld = SelectObject(pDraw->hDC, hFont2);
293 DrawTextW(pDraw->hDC, szText, -1, &pDraw->rcItem,
296 SelectObject(pDraw->hDC, hFontOld);
297 DeleteObject(hFont2);
298 }
299 }
300 else
301 {
302 // non-default
304 DrawTextW(pDraw->hDC, szText, -1, &pDraw->rcItem,
307 }
308
309 // draw focus rect
310 if (pDraw->itemState & ODS_FOCUS)
311 {
312 DrawFocusRect(pDraw->hDC, &pDraw->rcItem);
313 }
314 return TRUE;
315}
HFONT hFont
Definition: main.c:53
#define LISTBOX_MARGIN
Definition: filetypes.cpp:205
pKey DeleteObject()
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
INT WINAPI DrawTextW(HDC hdc, LPCWSTR str, INT count, LPRECT rect, UINT flags)
Definition: defwnd.c:16
LONG lfWeight
Definition: dimm.idl:63
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
Definition: dc.c:999
#define FW_BOLD
Definition: wingdi.h:378
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1539
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:918
#define GetObject
Definition: wingdi.h:4468
DWORD WINAPI GetSysColor(_In_ int)
#define ODS_SELECTED
Definition: winuser.h:2545
#define DT_NOPREFIX
Definition: winuser.h:537
#define COLOR_WINDOW
Definition: winuser.h:918
#define COLOR_WINDOWTEXT
Definition: winuser.h:921
#define COLOR_HIGHLIGHT
Definition: winuser.h:926
#define DT_SINGLELINE
Definition: winuser.h:540
#define WM_GETFONT
Definition: winuser.h:1651
#define DT_LEFT
Definition: winuser.h:534
#define COLOR_HIGHLIGHTTEXT
Definition: winuser.h:927
#define DT_VCENTER
Definition: winuser.h:543
BOOL WINAPI DrawFocusRect(_In_ HDC, _In_ LPCRECT)
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define ODS_FOCUS
Definition: winuser.h:2549

Referenced by EditTypeDlgProc().

◆ EditTypeDlg_OnInitDialog()

static BOOL EditTypeDlg_OnInitDialog ( HWND  hwndDlg,
PEDITTYPE_DIALOG  pEditType 
)
static

Definition at line 1400 of file filetypes.cpp.

1401{
1402 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
1403 StringCbCopyW(pEditType->szIconPath, sizeof(pEditType->szIconPath), pEntry->IconPath);
1404 pEditType->nIconIndex = pEntry->nIconIndex;
1405 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), L"open");
1406
1407 // set info
1409 SetDlgItemTextW(hwndDlg, IDC_EDITTYPE_TEXT, pEntry->ClassName);
1410 EditTypeDlg_ReadClass(hwndDlg, pEditType, pEntry->ClassKey);
1412
1413 // is listbox empty?
1414 if (SendDlgItemMessageW(hwndDlg, IDC_EDITTYPE_LISTBOX, LB_GETCOUNT, 0, 0) == 0)
1415 {
1419 }
1420 else
1421 {
1422 // select first item
1424 }
1425
1427
1428 return TRUE;
1429}
static BOOL EditTypeDlg_ReadClass(HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR ClassKey)
Definition: filetypes.cpp:1160
#define IDC_EDITTYPE_TEXT
Definition: shresdef.h:484
#define IDC_EDITTYPE_SAME_WINDOW
Definition: shresdef.h:493
#define LB_SETCURSEL
Definition: winuser.h:2063

Referenced by EditTypeDlgProc().

◆ EditTypeDlg_OnMeasureItem()

static BOOL EditTypeDlg_OnMeasureItem ( HWND  hwndDlg,
LPMEASUREITEMSTRUCT  pMeasure,
PEDITTYPE_DIALOG  pEditType 
)
static

Definition at line 318 of file filetypes.cpp.

319{
320 if (!pMeasure)
321 return FALSE;
322
323 HWND hwndLB = GetDlgItem(hwndDlg, IDC_EDITTYPE_LISTBOX);
324
325 HDC hDC = GetDC(hwndLB);
326 if (hDC)
327 {
330 pMeasure->itemHeight = tm.tmHeight + LISTBOX_MARGIN * 2;
331 ReleaseDC(hwndLB, hDC);
332 return TRUE;
333 }
334 return FALSE;
335}
static HDC hDC
Definition: 3dtext.c:33
static HDC
Definition: imagelist.c:92
Definition: time.h:68
BOOL WINAPI GetTextMetricsW(_In_ HDC, _Out_ LPTEXTMETRICW)
Definition: text.c:221
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
HDC WINAPI GetDC(_In_opt_ HWND)

Referenced by EditTypeDlgProc().

◆ EditTypeDlg_OnOK()

static void EditTypeDlg_OnOK ( HWND  hwndDlg,
PEDITTYPE_DIALOG  pEditType 
)
static

Definition at line 1227 of file filetypes.cpp.

1228{
1229 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
1230
1231 // get class name
1232 GetDlgItemTextW(hwndDlg, IDC_EDITTYPE_TEXT, pEntry->ClassName, _countof(pEntry->ClassName));
1233 StrTrimW(pEntry->ClassName, g_pszSpace);
1234
1235 // update entry icon
1236 EditTypeDlg_UpdateEntryIcon(hwndDlg, pEditType, pEditType->szIconPath, pEditType->nIconIndex);
1237
1238 // write registry
1239 EditTypeDlg_WriteClass(hwndDlg, pEditType, pEntry->ClassKey, pEntry->ClassName,
1240 _countof(pEntry->ClassName));
1241
1242 // update the icon cache
1244
1245 EndDialog(hwndDlg, IDOK);
1246}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
static BOOL EditTypeDlg_UpdateEntryIcon(HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR IconPath, INT IconIndex)
Definition: filetypes.cpp:1013
static BOOL EditTypeDlg_WriteClass(HWND hwndDlg, PEDITTYPE_DIALOG pEditType, LPCWSTR ClassKey, LPCWSTR ClassName, INT cchName)
Definition: filetypes.cpp:1058
#define SHCNE_ASSOCCHANGED
Definition: shlobj.h:1896
#define SHCNF_FLUSHNOWAIT
Definition: shlobj.h:1914

Referenced by EditTypeDlg_OnCommand().

◆ EditTypeDlg_OnRemove()

static BOOL EditTypeDlg_OnRemove ( HWND  hwndDlg,
PEDITTYPE_DIALOG  pEditType 
)
static

Definition at line 1249 of file filetypes.cpp.

1250{
1251 // get current selection
1253 if (iItem == LB_ERR)
1254 return FALSE;
1255
1256 // ask user for removal
1259 if (MessageBoxW(hwndDlg, strText, strTitle, MB_ICONINFORMATION | MB_YESNO) == IDNO)
1260 return FALSE;
1261
1262 // get text
1263 WCHAR szText[64];
1264 szText[0] = 0;
1265 SendDlgItemMessageW(hwndDlg, IDC_EDITTYPE_LISTBOX, LB_GETTEXT, iItem, (LPARAM)szText);
1266 StrTrimW(szText, g_pszSpace);
1267
1268 // remove it
1269 pEditType->CommandLineMap.Remove(szText);
1271 return TRUE;
1272}
BOOL Remove(const TKey &key)
Definition: atlsimpcoll.h:378
#define IDS_REMOVE_ACTION
Definition: shresdef.h:331
#define MB_YESNO
Definition: winuser.h:817
#define IDNO
Definition: winuser.h:836
#define MB_ICONINFORMATION
Definition: winuser.h:802

Referenced by EditTypeDlg_OnCommand().

◆ EditTypeDlg_ReadClass()

static BOOL EditTypeDlg_ReadClass ( HWND  hwndDlg,
PEDITTYPE_DIALOG  pEditType,
LPCWSTR  ClassKey 
)
static

Definition at line 1160 of file filetypes.cpp.

1161{
1162 // open class key
1165 return FALSE;
1166
1167 // open "shell" key
1168 HKEY hShellKey;
1169 if (RegOpenKeyExW(hClassKey, L"shell", 0, KEY_READ, &hShellKey) != ERROR_SUCCESS)
1170 {
1172 return FALSE;
1173 }
1174
1175 WCHAR DefaultVerb[64];
1176 DWORD dwSize = sizeof(DefaultVerb);
1177 if (RegQueryValueExW(hShellKey, NULL, NULL, NULL,
1178 LPBYTE(DefaultVerb), &dwSize) == ERROR_SUCCESS)
1179 {
1180 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), DefaultVerb);
1181 }
1182 else
1183 {
1184 StringCbCopyW(pEditType->szDefaultVerb, sizeof(pEditType->szDefaultVerb), L"open");
1185 }
1186
1187 // enumerate shell verbs
1188 WCHAR szVerbName[64];
1189 DWORD dwIndex = 0;
1190 while (RegEnumKeyW(hShellKey, dwIndex, szVerbName, _countof(szVerbName)) == ERROR_SUCCESS)
1191 {
1192 // open verb key
1193 HKEY hVerbKey;
1194 LONG nResult = RegOpenKeyExW(hShellKey, szVerbName, 0, KEY_READ, &hVerbKey);
1195 if (nResult == ERROR_SUCCESS)
1196 {
1197 // open command key
1198 HKEY hCommandKey;
1199 nResult = RegOpenKeyExW(hVerbKey, L"command", 0, KEY_READ, &hCommandKey);
1200 if (nResult == ERROR_SUCCESS)
1201 {
1202 // get command line
1203 WCHAR szValue[MAX_PATH + 32];
1204 dwSize = sizeof(szValue);
1205 nResult = RegQueryValueExW(hCommandKey, NULL, NULL, NULL, LPBYTE(szValue), &dwSize);
1206 if (nResult == ERROR_SUCCESS)
1207 {
1208 pEditType->CommandLineMap.SetAt(szVerbName, szValue);
1209 }
1210
1211 RegCloseKey(hCommandKey);
1212 }
1213
1214 RegCloseKey(hVerbKey);
1215 }
1217 ++dwIndex;
1218 }
1219
1220 RegCloseKey(hShellKey);
1222
1223 return TRUE;
1224}
HKEY hClassKey
Definition: umpnpmgr.c:45
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2393
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
long LONG
Definition: pedump.c:60

Referenced by EditTypeDlg_OnInitDialog().

◆ EditTypeDlg_UpdateEntryIcon()

static BOOL EditTypeDlg_UpdateEntryIcon ( HWND  hwndDlg,
PEDITTYPE_DIALOG  pEditType,
LPCWSTR  IconPath,
INT  IconIndex 
)
static

Definition at line 1013 of file filetypes.cpp.

1015{
1016 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
1017
1018 BOOL bIconSet = FALSE;
1019 if (IconPath && IconPath[0])
1020 {
1021 DestroyIcon(pEntry->hIconLarge);
1022 DestroyIcon(pEntry->hIconSmall);
1025
1026 bIconSet = (pEntry->hIconLarge && pEntry->hIconSmall);
1027 }
1028 if (bIconSet)
1029 {
1030 StringCbCopyW(pEntry->IconPath, sizeof(pEntry->IconPath), IconPath);
1031 pEntry->nIconIndex = IconIndex;
1032 }
1033 else
1034 {
1036 }
1037
1038 HWND hListView = pEditType->hwndLV;
1039 HIMAGELIST himlLarge = ListView_GetImageList(hListView, LVSIL_NORMAL);
1040 HIMAGELIST himlSmall = ListView_GetImageList(hListView, LVSIL_SMALL);
1041
1042 INT iLargeImage = ImageList_AddIcon(himlLarge, pEntry->hIconLarge);
1043 INT iSmallImage = ImageList_AddIcon(himlSmall, pEntry->hIconSmall);
1044 ASSERT(iLargeImage == iSmallImage);
1046
1047 INT iItem = ListView_GetNextItem(hListView, -1, LVNI_SELECTED);
1048 if (iItem != -1)
1049 {
1050 LV_ITEMW Item = { LVIF_IMAGE, iItem };
1051 Item.iImage = iSmallImage;
1052 ListView_SetItem(hListView, &Item);
1053 }
1054 return TRUE;
1055}
unsigned int BOOL
Definition: ntddk_ex.h:94
static void SetFileTypeEntryDefaultIcon(PFILE_TYPE_ENTRY Entry)
Definition: filetypes.cpp:191
#define ASSERT(a)
Definition: mode.c:44
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
Definition: ntbasedef.h:319
#define LVSIL_SMALL
Definition: commctrl.h:2299
#define LVNI_SELECTED
Definition: commctrl.h:2424
#define ListView_GetImageList(hwnd, iImageList)
Definition: commctrl.h:2296
#define ListView_GetNextItem(hwnd, i, flags)
Definition: commctrl.h:2434
#define ListView_SetItem(hwnd, pitem)
Definition: commctrl.h:2401
#define ImageList_AddIcon(himl, hicon)
Definition: commctrl.h:415
#define LV_ITEMW
Definition: commctrl.h:2332
#define LVIF_IMAGE
Definition: commctrl.h:2310
#define LVSIL_NORMAL
Definition: commctrl.h:2298
_In_ WDFCOLLECTION _In_ WDFOBJECT Item

Referenced by EditTypeDlg_OnOK().

◆ EditTypeDlg_WriteClass()

static BOOL EditTypeDlg_WriteClass ( HWND  hwndDlg,
PEDITTYPE_DIALOG  pEditType,
LPCWSTR  ClassKey,
LPCWSTR  ClassName,
INT  cchName 
)
static

Definition at line 1058 of file filetypes.cpp.

1060{
1061 PFILE_TYPE_ENTRY pEntry = pEditType->pEntry;
1062
1063 if (ClassKey[0] == 0)
1064 return FALSE;
1065
1066 // create or open class key
1068 if (RegCreateKeyExW(HKEY_CLASSES_ROOT, ClassKey, 0, NULL, 0, KEY_WRITE, NULL,
1070 {
1071 return FALSE;
1072 }
1073
1074 // create "DefaultIcon" key
1075 if (pEntry->IconPath[0])
1076 {
1077 HKEY hDefaultIconKey;
1078 if (RegCreateKeyExW(hClassKey, L"DefaultIcon", 0, NULL, 0, KEY_WRITE, NULL,
1079 &hDefaultIconKey, NULL) == ERROR_SUCCESS)
1080 {
1081 WCHAR szText[MAX_PATH];
1082 StringCbPrintfW(szText, sizeof(szText), L"%s,%d",
1083 pEntry->IconPath, pEntry->nIconIndex);
1084
1085 // set icon location
1086 DWORD dwSize = (lstrlenW(szText) + 1) * sizeof(WCHAR);
1087 RegSetValueExW(hDefaultIconKey, NULL, 0, REG_EXPAND_SZ, LPBYTE(szText), dwSize);
1088
1089 RegCloseKey(hDefaultIconKey);
1090 }
1091 }
1092
1093 // create "shell" key
1094 HKEY hShellKey;
1095 if (RegCreateKeyExW(hClassKey, L"shell", 0, NULL, 0, KEY_WRITE, NULL,
1096 &hShellKey, NULL) != ERROR_SUCCESS)
1097 {
1099 return FALSE;
1100 }
1101
1102 // delete shell commands
1103 WCHAR szVerbName[64];
1104 DWORD dwIndex = 0;
1105 while (RegEnumKeyW(hShellKey, dwIndex, szVerbName, _countof(szVerbName)) == ERROR_SUCCESS)
1106 {
1107 if (pEditType->CommandLineMap.FindKey(szVerbName) == -1)
1108 {
1109 // doesn't exist in CommandLineMap, then delete it
1110 if (SHDeleteKeyW(hShellKey, szVerbName) == ERROR_SUCCESS)
1111 {
1112 --dwIndex;
1113 }
1114 }
1115 ++dwIndex;
1116 }
1117
1118 // set default action
1119 RegSetValueExW(hShellKey, NULL, 0, REG_SZ,
1120 LPBYTE(pEditType->szDefaultVerb), sizeof(pEditType->szDefaultVerb));
1121
1122 // write shell commands
1123 const INT nCount = pEditType->CommandLineMap.GetSize();
1124 for (INT i = 0; i < nCount; ++i)
1125 {
1126 CStringW& key = pEditType->CommandLineMap.GetKeyAt(i);
1127 CStringW& value = pEditType->CommandLineMap.GetValueAt(i);
1128
1129 // create verb key
1130 HKEY hVerbKey;
1131 if (RegCreateKeyExW(hShellKey, key, 0, NULL, 0, KEY_WRITE, NULL,
1132 &hVerbKey, NULL) == ERROR_SUCCESS)
1133 {
1134 // create command key
1135 HKEY hCommandKey;
1136 if (RegCreateKeyExW(hVerbKey, L"command", 0, NULL, 0, KEY_WRITE, NULL,
1137 &hCommandKey, NULL) == ERROR_SUCCESS)
1138 {
1139 // write the default value
1140 DWORD dwSize = (value.GetLength() + 1) * sizeof(WCHAR);
1142
1143 RegCloseKey(hCommandKey);
1144 }
1145
1146 RegCloseKey(hVerbKey);
1147 }
1148 }
1149
1150 // set class name to class key
1151 RegSetValueExW(hClassKey, NULL, 0, REG_SZ, LPBYTE(ClassName), cchName);
1152
1153 RegCloseKey(hShellKey);
1155
1156 return TRUE;
1157}
TKey & GetKeyAt(int nIndex)
Definition: atlsimpcoll.h:341
int GetSize() const
Definition: atlsimpcoll.h:353
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
#define lstrlenW
Definition: compat.h:750
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
Definition: glfuncs.h:248
#define REG_SZ
Definition: layer.c:22
#define KEY_WRITE
Definition: nt_native.h:1031
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
Definition: copy.c:22
Definition: pdh_main.c:94
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2767

Referenced by EditTypeDlg_OnOK().

◆ EditTypeDlgProc()

static INT_PTR CALLBACK EditTypeDlgProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 1433 of file filetypes.cpp.

1434{
1435 static PEDITTYPE_DIALOG s_pEditType = NULL;
1436 LPDRAWITEMSTRUCT pDraw;
1437 LPMEASUREITEMSTRUCT pMeasure;
1438
1439 switch (uMsg)
1440 {
1441 case WM_INITDIALOG:
1442 s_pEditType = (PEDITTYPE_DIALOG)lParam;
1443 return EditTypeDlg_OnInitDialog(hwndDlg, s_pEditType);
1444
1445 case WM_DRAWITEM:
1446 pDraw = LPDRAWITEMSTRUCT(lParam);
1447 return EditTypeDlg_OnDrawItem(hwndDlg, pDraw, s_pEditType);
1448
1449 case WM_MEASUREITEM:
1450 pMeasure = LPMEASUREITEMSTRUCT(lParam);
1451 return EditTypeDlg_OnMeasureItem(hwndDlg, pMeasure, s_pEditType);
1452
1453 case WM_COMMAND:
1454 EditTypeDlg_OnCommand(hwndDlg, LOWORD(wParam), HIWORD(wParam), s_pEditType);
1455 break;
1456 }
1457
1458 return 0;
1459}
struct EDITTYPE_DIALOG * PEDITTYPE_DIALOG
static BOOL EditTypeDlg_OnDrawItem(HWND hwndDlg, LPDRAWITEMSTRUCT pDraw, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:254
static BOOL EditTypeDlg_OnMeasureItem(HWND hwndDlg, LPMEASUREITEMSTRUCT pMeasure, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:318
static BOOL EditTypeDlg_OnInitDialog(HWND hwndDlg, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:1400
static void EditTypeDlg_OnCommand(HWND hwndDlg, UINT id, UINT code, PEDITTYPE_DIALOG pEditType)
Definition: filetypes.cpp:1275
#define HIWORD(l)
Definition: typedefs.h:247
struct tagDRAWITEMSTRUCT * LPDRAWITEMSTRUCT
struct tagMEASUREITEMSTRUCT * LPMEASUREITEMSTRUCT
#define WM_DRAWITEM
Definition: winuser.h:1645
#define WM_MEASUREITEM
Definition: winuser.h:1646

Referenced by FolderOptionsFileTypesDlg().

◆ FileTypesDlg_AddExt()

static BOOL FileTypesDlg_AddExt ( HWND  hwndDlg,
LPCWSTR  pszExt,
LPCWSTR  pszFileType 
)
static

Definition at line 710 of file filetypes.cpp.

711{
712 DWORD dwValue = 1;
713 HKEY hKey;
714 WCHAR szKey[13]; // max. "ft4294967295" + "\0"
715 LONG nResult;
716
717 // Search the next "ft%06u" key name
718 do
719 {
720 StringCbPrintfW(szKey, sizeof(szKey), L"ft%06u", dwValue);
721
722 nResult = RegOpenKeyEx(HKEY_CLASSES_ROOT, szKey, 0, KEY_READ, &hKey);
723 if (nResult != ERROR_SUCCESS)
724 break;
725
727 ++dwValue;
728 } while (dwValue != 0);
729
731
732 if (dwValue == 0)
733 return FALSE;
734
735 // Create new "ft%06u" key
736 nResult = RegCreateKeyEx(HKEY_CLASSES_ROOT, szKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL);
737 if (ERROR_SUCCESS != nResult)
738 return FALSE;
739
741
742 // Create the ".ext" key
743 WCHAR szExt[16];
744 if (*pszExt == L'.')
745 ++pszExt;
746 StringCbPrintfW(szExt, sizeof(szExt), L".%s", pszExt);
747 _wcslwr(szExt);
748 nResult = RegCreateKeyEx(HKEY_CLASSES_ROOT, szExt, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL);
749 _wcsupr(szExt);
750 if (ERROR_SUCCESS != nResult)
751 return FALSE;
752
753 // Set the default value of ".ext" to "ft%06u"
754 DWORD dwSize = (lstrlen(szKey) + 1) * sizeof(WCHAR);
756
758
759 // Make up the file type name
760 WCHAR szFile[100];
762 StringCbPrintfW(szFile, sizeof(szFile), strFormat, &szExt[1]);
763
764 // Insert an item to the listview
765 HWND hListView = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
766 INT iItem = ListView_GetItemCount(hListView);
767 if (!FileTypesDlg_InsertToLV(hListView, szExt, iItem, szFile))
768 return FALSE;
769
771 ZeroMemory(&item, sizeof(item));
772 item.mask = LVIF_STATE | LVIF_TEXT;
773 item.iItem = iItem;
775 item.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
776 item.pszText = &szExt[1];
777 ListView_SetItem(hListView, &item);
778
779 item.pszText = szFile;
780 item.iSubItem = 1;
781 ListView_SetItem(hListView, &item);
782
783 ListView_EnsureVisible(hListView, iItem, FALSE);
784
785 return TRUE;
786}
static BOOL FileTypesDlg_InsertToLV(HWND hListView, LPCWSTR szName, INT iItem, LPCWSTR szFile)
Definition: filetypes.cpp:560
static ATOM item
Definition: dde.c:856
#define LVIF_STATE
Definition: commctrl.h:2312
#define ListView_GetItemCount(hwnd)
Definition: commctrl.h:2307
#define LVIS_SELECTED
Definition: commctrl.h:2319
#define LV_ITEM
Definition: commctrl.h:2337
#define LVIF_TEXT
Definition: commctrl.h:2309
#define LVIS_FOCUSED
Definition: commctrl.h:2318
#define ListView_EnsureVisible(hwndLV, i, fPartialOK)
Definition: commctrl.h:2519
_CRTIMP wchar_t *__cdecl _wcsupr(_Inout_z_ wchar_t *_String)
_CRTIMP wchar_t *__cdecl _wcslwr(_Inout_z_ wchar_t *_String)
#define IDC_FILETYPES_LISTVIEW
Definition: shresdef.h:441
#define IDS_FILE_EXT_TYPE
Definition: shresdef.h:190
#define lstrlen
Definition: winbase.h:3876
#define RegOpenKeyEx
Definition: winreg.h:520
#define RegCreateKeyEx
Definition: winreg.h:501

Referenced by FolderOptionsFileTypesDlg().

◆ FileTypesDlg_CompareItems()

static INT CALLBACK FileTypesDlg_CompareItems ( LPARAM  lParam1,
LPARAM  lParam2,
LPARAM  lParamSort 
)
static

Definition at line 1465 of file filetypes.cpp.

1466{
1467 PFILE_TYPE_ENTRY Entry1, Entry2;
1468 int x;
1469
1470 Entry1 = (PFILE_TYPE_ENTRY)lParam1;
1471 Entry2 = (PFILE_TYPE_ENTRY)lParam2;
1472
1473 x = wcsicmp(Entry1->FileExtension, Entry2->FileExtension);
1474 if (x != 0)
1475 return x;
1476
1477 return wcsicmp(Entry1->FileDescription, Entry2->FileDescription);
1478}
#define wcsicmp
Definition: compat.h:15
struct FILE_TYPE_ENTRY * PFILE_TYPE_ENTRY
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
WCHAR FileExtension[30]
Definition: filetypes.cpp:34
WCHAR FileDescription[100]
Definition: filetypes.cpp:35

Referenced by FileTypesDlg_DoList().

◆ FileTypesDlg_DoList()

static PFILE_TYPE_ENTRY FileTypesDlg_DoList ( HWND  hwndDlg)
static

Definition at line 1529 of file filetypes.cpp.

1530{
1531 HWND hListView;
1532 DWORD dwIndex = 0;
1533 WCHAR szName[50];
1534 WCHAR szFile[100];
1535 DWORD dwName;
1536 LVITEMW lvItem;
1537 INT iItem = 0;
1538 HIMAGELIST himlLarge, himlSmall;
1539
1540 // create imagelists
1542 ILC_COLOR32 | ILC_MASK, 256, 20);
1544 ILC_COLOR32 | ILC_MASK, 256, 20);
1545
1546 // set imagelists to listview.
1547 hListView = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
1548 ListView_SetImageList(hListView, himlLarge, LVSIL_NORMAL);
1549 ListView_SetImageList(hListView, himlSmall, LVSIL_SMALL);
1550
1551 FileTypesDlg_InitListView(hwndDlg, hListView);
1552
1553 szFile[0] = 0;
1555 {
1556 // default to english
1557 wcscpy(szFile, L"%s File");
1558 }
1559 szFile[(_countof(szFile)) - 1] = 0;
1560
1561 dwName = _countof(szName);
1562
1563 while (RegEnumKeyExW(HKEY_CLASSES_ROOT, dwIndex++, szName, &dwName,
1565 {
1566 if (FileTypesDlg_InsertToLV(hListView, szName, iItem, szFile))
1567 ++iItem;
1568 dwName = _countof(szName);
1569 }
1570
1571 // Leave if the list is empty
1572 if (iItem == 0)
1573 return NULL;
1574
1575 // sort list
1577
1578 // select first item
1579 ZeroMemory(&lvItem, sizeof(LVITEMW));
1580 lvItem.mask = LVIF_STATE;
1581 lvItem.stateMask = (UINT)-1;
1582 lvItem.state = LVIS_FOCUSED | LVIS_SELECTED;
1583 lvItem.iItem = 0;
1584 ListView_SetItem(hListView, &lvItem);
1585
1586 lvItem.mask = LVIF_PARAM;
1587 ListView_GetItem(hListView, &lvItem);
1588
1589 return (PFILE_TYPE_ENTRY)lvItem.lParam;
1590}
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:804
static VOID FileTypesDlg_InitListView(HWND hwndDlg, HWND hListView)
Definition: filetypes.cpp:1481
static INT CALLBACK FileTypesDlg_CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
Definition: filetypes.cpp:1465
unsigned int UINT
Definition: ndis.h:50
static const WCHAR szName[]
Definition: powrprof.c:45
#define ListView_SetImageList(hwnd, himl, iImageList)
Definition: commctrl.h:2304
#define ILC_COLOR32
Definition: commctrl.h:358
#define ListView_SortItems(hwndLV, _pfnCompare, _lPrm)
Definition: commctrl.h:2703
#define LVIF_PARAM
Definition: commctrl.h:2311
#define ILC_MASK
Definition: commctrl.h:351
#define ListView_GetItem(hwnd, pitem)
Definition: commctrl.h:2394
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
UINT state
Definition: commctrl.h:2363
UINT mask
Definition: commctrl.h:2360
LPARAM lParam
Definition: commctrl.h:2368
UINT stateMask
Definition: commctrl.h:2364

Referenced by FolderOptionsFileTypesDlg().

◆ FileTypesDlg_GetEntry()

static PFILE_TYPE_ENTRY FileTypesDlg_GetEntry ( HWND  hListView,
INT  iItem = -1 
)
inlinestatic

Definition at line 1593 of file filetypes.cpp.

1594{
1595 if (iItem == -1)
1596 {
1597 iItem = ListView_GetNextItem(hListView, -1, LVNI_SELECTED);
1598 if (iItem == -1)
1599 return NULL;
1600 }
1601
1602 LV_ITEMW lvItem = { LVIF_PARAM, iItem };
1603 if (ListView_GetItem(hListView, &lvItem))
1604 return (PFILE_TYPE_ENTRY)lvItem.lParam;
1605
1606 return NULL;
1607}

Referenced by FolderOptionsFileTypesDlg().

◆ FileTypesDlg_InitListView()

static VOID FileTypesDlg_InitListView ( HWND  hwndDlg,
HWND  hListView 
)
static

Definition at line 1481 of file filetypes.cpp.

1482{
1483 RECT clientRect;
1484 LVCOLUMNW col;
1485 WCHAR szName[50];
1486 DWORD dwStyle;
1487 INT columnSize;
1488
1490 {
1491 // default to english
1492 wcscpy(szName, L"Extensions");
1493 }
1494
1495 // make sure its null terminated
1496 szName[_countof(szName) - 1] = 0;
1497
1498 GetClientRect(hListView, &clientRect);
1499 ZeroMemory(&col, sizeof(LV_COLUMN));
1500 columnSize = (clientRect.right - clientRect.left) / 4;
1501 col.iSubItem = 0;
1503 col.fmt = LVCFMT_FIXED_WIDTH;
1504 col.cx = columnSize | LVCFMT_LEFT;
1505 col.cchTextMax = wcslen(szName);
1506 col.pszText = szName;
1507 SendMessageW(hListView, LVM_INSERTCOLUMNW, 0, (LPARAM)&col);
1508
1510 {
1511 // default to english
1512 wcscpy(szName, L"File Types");
1513 ERR("Failed to load localized string!\n");
1514 }
1515
1516 col.iSubItem = 1;
1517 col.cx = clientRect.right - clientRect.left - columnSize - GetSystemMetrics(SM_CYVSCROLL);
1518 col.cchTextMax = wcslen(szName);
1519 col.pszText = szName;
1520 SendMessageW(hListView, LVM_INSERTCOLUMNW, 1, (LPARAM)&col);
1521
1522 // set full select style
1523 dwStyle = (DWORD)SendMessage(hListView, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
1524 dwStyle = dwStyle | LVS_EX_FULLROWSELECT;
1525 SendMessage(hListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
1526}
#define ERR(fmt,...)
Definition: debug.h:110
#define DWORD
Definition: nt_native.h:44
#define LVCF_WIDTH
Definition: commctrl.h:2587
#define LVS_EX_FULLROWSELECT
Definition: commctrl.h:2734
#define LVM_INSERTCOLUMNW
Definition: commctrl.h:2632
#define LVM_GETEXTENDEDLISTVIEWSTYLE
Definition: commctrl.h:2727
#define LVCF_FMT
Definition: commctrl.h:2586
#define LVCF_SUBITEM
Definition: commctrl.h:2589
#define LVCFMT_LEFT
Definition: commctrl.h:2598
#define LVCF_TEXT
Definition: commctrl.h:2588
#define LVM_SETEXTENDEDLISTVIEWSTYLE
Definition: commctrl.h:2724
#define LV_COLUMN
Definition: commctrl.h:2547
#define IDS_COLUMN_EXTENSION
Definition: shresdef.h:144
int cchTextMax
Definition: commctrl.h:2568
LPWSTR pszText
Definition: commctrl.h:2567
LONG right
Definition: windef.h:308
LONG left
Definition: windef.h:306
#define SM_CYVSCROLL
Definition: winuser.h:981
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define SendMessage
Definition: winuser.h:5843

Referenced by FileTypesDlg_DoList().

◆ FileTypesDlg_InsertToLV()

static BOOL FileTypesDlg_InsertToLV ( HWND  hListView,
LPCWSTR  szName,
INT  iItem,
LPCWSTR  szFile 
)
static

Definition at line 560 of file filetypes.cpp.

561{
563 HKEY hKey;
564 LVITEMW lvItem;
566 DWORD dwType;
567
568 if (szName[0] != L'.')
569 {
570 // FIXME handle URL protocol handlers
571 return FALSE;
572 }
573
574 // get imagelists of listview
575 HIMAGELIST himlLarge = ListView_GetImageList(hListView, LVSIL_NORMAL);
576 HIMAGELIST himlSmall = ListView_GetImageList(hListView, LVSIL_SMALL);
577
578 // allocate file type entry
580 if (!Entry)
581 return FALSE;
582
583 // open key
585 {
587 return FALSE;
588 }
589
590 // FIXME check for duplicates
591
592 // query for the default key
593 dwSize = sizeof(Entry->ClassKey);
595 {
596 // no link available
597 Entry->ClassKey[0] = 0;
598 }
599
600 Entry->ClassName[0] = 0;
601 if (Entry->ClassKey[0])
602 {
603 HKEY hTemp;
604 // try open linked key
605 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, Entry->ClassKey, 0, KEY_READ, &hTemp) == ERROR_SUCCESS)
606 {
607 DWORD dwSize = sizeof(Entry->ClassName);
608 RegQueryValueExW(hTemp, NULL, NULL, NULL, LPBYTE(Entry->ClassName), &dwSize);
609
610 // use linked key
612 hKey = hTemp;
613 }
614 }
615
616 // read friendly type name
617 if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", Entry->FileDescription,
618 sizeof(Entry->FileDescription), NULL, 0, NULL) != ERROR_SUCCESS)
619 {
620 // read file description
621 dwSize = sizeof(Entry->FileDescription);
622 Entry->FileDescription[0] = 0;
623
624 // read default key
625 RegQueryValueExW(hKey, NULL, NULL, NULL, LPBYTE(Entry->FileDescription), &dwSize);
626 }
627
628 // Read the EditFlags value
629 Entry->EditFlags = 0;
630 if (!RegQueryValueExW(hKey, L"EditFlags", NULL, &dwType, NULL, &dwSize))
631 {
632 if ((dwType == REG_DWORD || dwType == REG_BINARY) && dwSize == sizeof(DWORD))
633 RegQueryValueExW(hKey, L"EditFlags", NULL, NULL, (LPBYTE)&Entry->EditFlags, &dwSize);
634 }
635
636 // convert extension to upper case
637 wcscpy(Entry->FileExtension, szName);
638 _wcsupr(Entry->FileExtension);
639
640 // get icon
642 {
643 // set default icon
645 }
646
647 // close key
649
650 // get program path and app name
651 DWORD cch = _countof(Entry->ProgramPath);
653 Entry->FileExtension, NULL, Entry->ProgramPath, &cch))
654 {
655 QueryFileDescription(Entry->ProgramPath, Entry->AppName, _countof(Entry->AppName));
656 }
657 else
658 {
659 Entry->ProgramPath[0] = Entry->AppName[0] = 0;
660 }
661
662 // add icon to imagelist
663 INT iLargeImage = -1, iSmallImage = -1;
664 if (Entry->hIconLarge && Entry->hIconSmall)
665 {
666 iLargeImage = ImageList_AddIcon(himlLarge, Entry->hIconLarge);
667 iSmallImage = ImageList_AddIcon(himlSmall, Entry->hIconSmall);
668 ASSERT(iLargeImage == iSmallImage);
670 }
671
672 // Do not add excluded entries
673 if (Entry->EditFlags & 0x00000001) //FTA_Exclude
674 {
675 DestroyIcon(Entry->hIconLarge);
676 DestroyIcon(Entry->hIconSmall);
678 return FALSE;
679 }
680
681 if (!Entry->FileDescription[0])
682 {
683 // construct default 'FileExtensionFile' by formatting the uppercase extension
684 // with IDS_FILE_EXT_TYPE, outputting something like a l18n 'INI File'
685
686 StringCbPrintfW(Entry->FileDescription, sizeof(Entry->FileDescription),
687 szFile, &Entry->FileExtension[1]);
688 }
689
690 ZeroMemory(&lvItem, sizeof(LVITEMW));
691 lvItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE;
692 lvItem.iSubItem = 0;
693 lvItem.pszText = &Entry->FileExtension[1];
694 lvItem.iItem = iItem;
695 lvItem.lParam = (LPARAM)Entry;
696 lvItem.iImage = iSmallImage;
697 SendMessageW(hListView, LVM_INSERTITEMW, 0, (LPARAM)&lvItem);
698
699 ZeroMemory(&lvItem, sizeof(LVITEMW));
700 lvItem.mask = LVIF_TEXT;
701 lvItem.pszText = Entry->FileDescription;
702 lvItem.iItem = iItem;
703 lvItem.iSubItem = 1;
704 ListView_SetItem(hListView, &lvItem);
705
706 return TRUE;
707}
LONG RegLoadMUIStringW(IN HKEY hKey, IN LPCWSTR pszValue OPTIONAL, OUT LPWSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCWSTR pszDirectory OPTIONAL)
Definition: muireg.c:53
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
HRESULT WINAPI AssocQueryStringW(ASSOCF cfFlags, ASSOCSTR str, LPCWSTR pszAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut)
Definition: assoc.c:436
static BOOL QueryFileDescription(LPCWSTR ProgramPath, LPWSTR pszName, INT cchName)
Definition: filetypes.cpp:178
static BOOL GetFileTypeIconsByKey(HKEY hKey, PFILE_TYPE_ENTRY Entry)
Definition: filetypes.cpp:154
#define S_OK
Definition: intsafe.h:52
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
#define REG_BINARY
Definition: nt_native.h:1496
#define LVM_INSERTITEMW
Definition: commctrl.h:2404
#define REG_DWORD
Definition: sdbapi.c:596
@ ASSOCSTR_EXECUTABLE
Definition: shlwapi.h:604
@ ASSOCF_INIT_IGNOREUNKNOWN
Definition: shlwapi.h:593
LPWSTR pszText
Definition: commctrl.h:2365
int iSubItem
Definition: commctrl.h:2362
int iImage
Definition: commctrl.h:2367

Referenced by FileTypesDlg_AddExt(), and FileTypesDlg_DoList().

◆ FileTypesDlg_OnDelete()

static void FileTypesDlg_OnDelete ( HWND  hwndDlg)
static

Definition at line 1610 of file filetypes.cpp.

1611{
1614 if (MessageBoxW(hwndDlg, strRemoveExt, strTitle, MB_ICONQUESTION | MB_YESNO) == IDYES)
1615 {
1616 FileTypesDlg_RemoveExt(hwndDlg);
1617
1618 // Select first item (Win2k3 does it)
1619 LV_ITEMW item = { LVIF_STATE };
1620 item.stateMask = item.state = LVIS_FOCUSED | LVIS_SELECTED;
1621 item.iItem = 0;
1623 }
1624}
static BOOL FileTypesDlg_RemoveExt(HWND hwndDlg)
Definition: filetypes.cpp:789
#define IDS_REMOVE_EXT
Definition: shresdef.h:336
#define MB_ICONQUESTION
Definition: winuser.h:789
#define IDYES
Definition: winuser.h:835

Referenced by FolderOptionsFileTypesDlg().

◆ FileTypesDlg_OnItemChanging()

static void FileTypesDlg_OnItemChanging ( HWND  hwndDlg,
PFILE_TYPE_ENTRY  pEntry 
)
static

Definition at line 1627 of file filetypes.cpp.

1628{
1629 WCHAR Buffer[255];
1630 static HBITMAP s_hbmProgram = NULL;
1631
1632 // format buffer and set groupbox text
1634 StringCbPrintfW(Buffer, sizeof(Buffer), strFormat, &pEntry->FileExtension[1]);
1636
1637 // format buffer and set description
1638 strFormat.LoadString(IDS_FILE_DETAILSADV);
1639 StringCbPrintfW(Buffer, sizeof(Buffer), strFormat,
1640 &pEntry->FileExtension[1], pEntry->FileDescription,
1641 pEntry->FileDescription);
1643
1644 // delete previous program image
1645 if (s_hbmProgram)
1646 {
1647 DeleteObject(s_hbmProgram);
1648 s_hbmProgram = NULL;
1649 }
1650
1651 // set program image
1652 HICON hIconSm = NULL;
1653 ExtractIconExW(pEntry->ProgramPath, 0, NULL, &hIconSm, 1);
1654 s_hbmProgram = BitmapFromIcon(hIconSm, 16, 16);
1657
1658 // set program name
1659 if (pEntry->AppName[0])
1660 SetDlgItemTextW(hwndDlg, IDC_FILETYPES_APPNAME, pEntry->AppName);
1661 else
1662 SetDlgItemTextW(hwndDlg, IDC_FILETYPES_APPNAME, L"ReactOS");
1663
1664 // Enable the Delete button
1665 if (pEntry->EditFlags & 0x00000010) // FTA_NoRemove
1667 else
1669}
Definition: bufpool.h:45
static HBITMAP BitmapFromIcon(HICON hIcon)
Definition: kbswitch.c:300
static HBITMAP
Definition: button.c:44
HICON hIconSm
Definition: msconfig.c:44
#define IDC_FILETYPES_DESCRIPTION
Definition: shresdef.h:447
#define IDS_FILE_DETAILS
Definition: shresdef.h:188
#define IDC_FILETYPES_DETAILS_GROUPBOX
Definition: shresdef.h:444
#define IDC_FILETYPES_ICON
Definition: shresdef.h:449
#define IDC_FILETYPES_APPNAME
Definition: shresdef.h:445
#define IDC_FILETYPES_DELETE
Definition: shresdef.h:443
#define IDS_FILE_DETAILSADV
Definition: shresdef.h:189
#define IMAGE_BITMAP
Definition: winuser.h:211
#define STM_SETIMAGE
Definition: winuser.h:2093

Referenced by FolderOptionsFileTypesDlg().

◆ FileTypesDlg_RemoveExt()

static BOOL FileTypesDlg_RemoveExt ( HWND  hwndDlg)
static

Definition at line 789 of file filetypes.cpp.

790{
791 HWND hListView = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
792
793 INT iItem = ListView_GetNextItem(hListView, -1, LVNI_SELECTED);
794 if (iItem == -1)
795 return FALSE;
796
797 WCHAR szExt[20];
798 szExt[0] = L'.';
799 ListView_GetItemText(hListView, iItem, 0, &szExt[1], _countof(szExt) - 1);
800 _wcslwr(szExt);
801
802 DeleteExt(hwndDlg, szExt);
803 ListView_DeleteItem(hListView, iItem);
804 return TRUE;
805}
static BOOL DeleteExt(HWND hwndDlg, LPCWSTR pszExt)
Definition: filetypes.cpp:48
#define ListView_GetItemText(hwndLV, i, iSubItem_, pszText_, cchTextMax_)
Definition: commctrl.h:2684
#define ListView_DeleteItem(hwnd, i)
Definition: commctrl.h:2411

Referenced by FileTypesDlg_OnDelete().

◆ FolderOptionsFileTypesDlg()

INT_PTR CALLBACK FolderOptionsFileTypesDlg ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1673 of file filetypes.cpp.

1678{
1679 LPNMLISTVIEW lppl;
1682 NEWEXT_DIALOG newext;
1683 EDITTYPE_DIALOG edittype;
1684
1685 switch (uMsg)
1686 {
1687 case WM_INITDIALOG:
1688 pEntry = FileTypesDlg_DoList(hwndDlg);
1689
1690 // Disable the Delete button if the listview is empty
1691 // the selected item should not be deleted by the user
1692 if (pEntry == NULL || (pEntry->EditFlags & 0x00000010)) // FTA_NoRemove
1694 return TRUE;
1695
1696 case WM_COMMAND:
1697 switch (LOWORD(wParam))
1698 {
1699 case IDC_FILETYPES_NEW:
1700 newext.hwndLV = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
1702 hwndDlg, NewExtDlgProc, (LPARAM)&newext))
1703 {
1704 FileTypesDlg_AddExt(hwndDlg, newext.szExt, newext.szFileType);
1705 }
1706 break;
1707
1709 FileTypesDlg_OnDelete(hwndDlg);
1710 break;
1711
1714 if (pEntry)
1715 {
1716 ZeroMemory(&Info, sizeof(Info));
1718 Info.pcszFile = pEntry->FileExtension;
1719 Info.pcszClass = NULL;
1720 SHOpenWithDialog(hwndDlg, &Info);
1721 }
1722 break;
1723
1725 edittype.hwndLV = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
1726 edittype.pEntry = FileTypesDlg_GetEntry(edittype.hwndLV);
1727 if (edittype.pEntry)
1728 {
1730 hwndDlg, EditTypeDlgProc, (LPARAM)&edittype);
1731 }
1732 break;
1733 }
1734 break;
1735
1736 case WM_NOTIFY:
1737 lppl = (LPNMLISTVIEW) lParam;
1738 switch (lppl->hdr.code)
1739 {
1740 case LVN_KEYDOWN:
1741 {
1742 LV_KEYDOWN *pKeyDown = (LV_KEYDOWN *)lParam;
1743 if (pKeyDown->wVKey == VK_DELETE)
1744 {
1745 FileTypesDlg_OnDelete(hwndDlg);
1746 }
1747 break;
1748 }
1749
1750 case NM_DBLCLK:
1751 edittype.hwndLV = GetDlgItem(hwndDlg, IDC_FILETYPES_LISTVIEW);
1752 edittype.pEntry = FileTypesDlg_GetEntry(edittype.hwndLV);
1753 if (edittype.pEntry)
1754 {
1756 hwndDlg, EditTypeDlgProc, (LPARAM)&edittype);
1757 }
1758 break;
1759
1760 case LVN_DELETEALLITEMS:
1761 return FALSE; // send LVN_DELETEITEM
1762
1763 case LVN_DELETEITEM:
1765 if (pEntry)
1766 {
1767 DestroyIcon(pEntry->hIconLarge);
1768 DestroyIcon(pEntry->hIconSmall);
1770 }
1771 return FALSE;
1772
1773 case LVN_ITEMCHANGING:
1775 if (!pEntry)
1776 {
1777 return TRUE;
1778 }
1779
1780 if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED))
1781 {
1783 }
1784 break;
1785
1786 case PSN_SETACTIVE:
1787 // On page activation, set the focus to the listview
1789 break;
1790 }
1791 break;
1792 }
1793
1794 return FALSE;
1795}
HRESULT WINAPI SHOpenWithDialog(HWND hwndParent, const OPENASINFO *poainfo)
static void FileTypesDlg_OnItemChanging(HWND hwndDlg, PFILE_TYPE_ENTRY pEntry)
Definition: filetypes.cpp:1627
static void FileTypesDlg_OnDelete(HWND hwndDlg)
Definition: filetypes.cpp:1610
static INT_PTR CALLBACK NewExtDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:523
static INT_PTR CALLBACK EditTypeDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: filetypes.cpp:1433
static PFILE_TYPE_ENTRY FileTypesDlg_GetEntry(HWND hListView, INT iItem=-1)
Definition: filetypes.cpp:1593
static PFILE_TYPE_ENTRY FileTypesDlg_DoList(HWND hwndDlg)
Definition: filetypes.cpp:1529
static BOOL FileTypesDlg_AddExt(HWND hwndDlg, LPCWSTR pszExt, LPCWSTR pszFileType)
Definition: filetypes.cpp:710
#define PSN_SETACTIVE
Definition: prsht.h:115
#define NM_DBLCLK
Definition: commctrl.h:131
#define LVN_DELETEALLITEMS
Definition: commctrl.h:3134
#define LVN_ITEMCHANGING
Definition: commctrl.h:3130
struct tagNMLISTVIEW * LPNMLISTVIEW
#define LVN_KEYDOWN
Definition: commctrl.h:3184
#define LV_KEYDOWN
Definition: commctrl.h:3186
#define LVN_DELETEITEM
Definition: commctrl.h:3133
#define WM_NOTIFY
Definition: richedit.h:61
@ OAIF_REGISTER_EXT
Definition: shlobj.h:2666
@ OAIF_ALLOW_REGISTRATION
Definition: shlobj.h:2665
#define IDD_NEWEXTENSION
Definition: shresdef.h:520
#define IDD_EDITTYPE
Definition: shresdef.h:521
#define IDC_FILETYPES_ADVANCED
Definition: shresdef.h:448
#define IDC_FILETYPES_CHANGE
Definition: shresdef.h:446
#define IDC_FILETYPES_NEW
Definition: shresdef.h:442
UINT code
Definition: winuser.h:3159
HWND hwndFrom
Definition: winuser.h:3157
UINT uNewState
Definition: commctrl.h:3036
UINT uOldState
Definition: commctrl.h:3037
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
#define VK_DELETE
Definition: winuser.h:2233

Referenced by CFolderOptions::AddPages(), and ShowFolderOptionsDialogThreadProc().

◆ GetFileTypeIconsByKey()

static BOOL GetFileTypeIconsByKey ( HKEY  hKey,
PFILE_TYPE_ENTRY  Entry 
)
static

Definition at line 154 of file filetypes.cpp.

155{
156 Entry->hIconLarge = Entry->hIconSmall = NULL;
157
158 // Open the "DefaultIcon" registry key
159 HKEY hDefIconKey;
160 LONG nResult = RegOpenKeyExW(hKey, L"DefaultIcon", 0, KEY_READ, &hDefIconKey);
161 if (nResult != ERROR_SUCCESS)
162 return FALSE;
163
164 // Get the icon location
165 WCHAR szLocation[MAX_PATH + 32] = { 0 };
166 DWORD dwSize = sizeof(szLocation);
167 nResult = RegQueryValueExW(hDefIconKey, NULL, NULL, NULL, LPBYTE(szLocation), &dwSize);
168
169 RegCloseKey(hDefIconKey);
170
171 if (nResult != ERROR_SUCCESS || szLocation[0] == 0)
172 return FALSE;
173
174 return GetFileTypeIconsEx(Entry, szLocation);
175}
static BOOL GetFileTypeIconsEx(PFILE_TYPE_ENTRY Entry, LPCWSTR IconLocation)
Definition: filetypes.cpp:125

Referenced by FileTypesDlg_InsertToLV().

◆ GetFileTypeIconsEx()

static BOOL GetFileTypeIconsEx ( PFILE_TYPE_ENTRY  Entry,
LPCWSTR  IconLocation 
)
static

Definition at line 125 of file filetypes.cpp.

126{
127 Entry->hIconLarge = Entry->hIconSmall = NULL;
128
129 if (lstrcmpiW(Entry->FileExtension, L".exe") == 0 ||
130 lstrcmpiW(Entry->FileExtension, L".scr") == 0)
131 {
132 // It's an executable
137 IMAGE_ICON, cx, cy, 0));
138 StringCbCopyW(Entry->IconPath, sizeof(Entry->IconPath), g_pszShell32);
139 Entry->nIconIndex = -IDI_SHELL_EXE;
140 }
141 else if (lstrcmpW(IconLocation, L"%1") == 0)
142 {
143 return FALSE; // self icon
144 }
145 else
146 {
148 }
149
150 return Entry->hIconLarge && Entry->hIconSmall;
151}
static void DoFileTypeIconLocation(PFILE_TYPE_ENTRY Entry, LPCWSTR IconLocation)
Definition: filetypes.cpp:111
LPCWSTR g_pszShell32
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
#define IDI_SHELL_EXE
Definition: shresdef.h:553
HICON WINAPI LoadIconW(_In_opt_ HINSTANCE hInstance, _In_ LPCWSTR lpIconName)
Definition: cursoricon.c:2075

Referenced by GetFileTypeIconsByKey().

◆ NewActionDlg_OnOK()

static void NewActionDlg_OnOK ( HWND  hwndDlg,
PACTION_DIALOG  pNewAct 
)
static

Definition at line 859 of file filetypes.cpp.

860{
861 // check action
862 GetDlgItemTextW(hwndDlg, IDC_ACTION_ACTION, pNewAct->szAction, _countof(pNewAct->szAction));
863 StrTrimW(pNewAct->szAction, g_pszSpace);
864 if (pNewAct->szAction[0] == 0)
865 {
866 // action was empty, error
867 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_ACTION);
868 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
869 SetFocus(hwndCtrl);
872 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
873 return;
874 }
875
876 // check app
877 GetDlgItemTextW(hwndDlg, IDC_ACTION_APP, pNewAct->szApp, _countof(pNewAct->szApp));
878 StrTrimW(pNewAct->szApp, g_pszSpace);
879 if (pNewAct->szApp[0] == 0 ||
881 {
882 // app was empty or invalid
883 HWND hwndCtrl = GetDlgItem(hwndDlg, IDC_ACTION_APP);
884 SendMessageW(hwndCtrl, EM_SETSEL, 0, -1);
885 SetFocus(hwndCtrl);
888 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
889 return;
890 }
891
892 EndDialog(hwndDlg, IDOK);
893}
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:652
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23

Referenced by NewActionDlgProc().

◆ NewActionDlgProc()

static INT_PTR CALLBACK NewActionDlgProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 897 of file filetypes.cpp.

898{
899 static PACTION_DIALOG s_pNewAct = NULL;
900
901 switch (uMsg)
902 {
903 case WM_INITDIALOG:
904 s_pNewAct = (PACTION_DIALOG)lParam;
905 s_pNewAct->bUseDDE = FALSE;
907 return TRUE;
908
909 case WM_COMMAND:
910 switch (LOWORD(wParam))
911 {
912 case IDOK:
913 NewActionDlg_OnOK(hwndDlg, s_pNewAct);
914 break;
915
916 case IDCANCEL:
917 EndDialog(hwndDlg, IDCANCEL);
918 break;
919
921 ActionDlg_OnBrowse(hwndDlg, s_pNewAct, FALSE);
922 break;
923 }
924 break;
925 }
926 return 0;
927}
static void NewActionDlg_OnOK(HWND hwndDlg, PACTION_DIALOG pNewAct)
Definition: filetypes.cpp:859

Referenced by EditTypeDlg_OnCommand().

◆ NewExtDlg_OnAdvanced()

static VOID NewExtDlg_OnAdvanced ( HWND  hwndDlg,
PNEWEXT_DIALOG  pNewExt 
)
static

Definition at line 351 of file filetypes.cpp.

352{
353 // If "Advanced" button was clicked, then we shrink or expand the dialog.
354 RECT rc, rc1, rc2;
355
356 GetWindowRect(hwndDlg, &rc);
357 rc.bottom = rc.top + (pNewExt->rcDlg.bottom - pNewExt->rcDlg.top);
358
359 GetWindowRect(GetDlgItem(hwndDlg, IDOK), &rc1);
360 MapWindowPoints(NULL, hwndDlg, (LPPOINT)&rc1, 2);
361
363 MapWindowPoints(NULL, hwndDlg, (LPPOINT)&rc2, 2);
364
365 if (pNewExt->bAdvanced)
366 {
367 rc1.top += pNewExt->dy;
368 rc1.bottom += pNewExt->dy;
369
370 rc2.top += pNewExt->dy;
371 rc2.bottom += pNewExt->dy;
372
375
377 SetDlgItemTextW(hwndDlg, IDC_NEWEXT_ADVANCED, strLeft);
378
380 }
381 else
382 {
383 rc1.top -= pNewExt->dy;
384 rc1.bottom -= pNewExt->dy;
385
386 rc2.top -= pNewExt->dy;
387 rc2.bottom -= pNewExt->dy;
388
391
393 SetDlgItemTextW(hwndDlg, IDC_NEWEXT_ADVANCED, strRight);
394
395 rc.bottom -= pNewExt->dy;
396
398 SetDlgItemTextW(hwndDlg, IDC_NEWEXT_COMBOBOX, strText);
399 }
400
401 HDWP hDWP = BeginDeferWindowPos(3);
402
403 if (hDWP)
404 hDWP = DeferWindowPos(hDWP, GetDlgItem(hwndDlg, IDOK), NULL,
405 rc1.left, rc1.top, rc1.right - rc1.left, rc1.bottom - rc1.top,
407 if (hDWP)
408 hDWP = DeferWindowPos(hDWP, GetDlgItem(hwndDlg, IDCANCEL), NULL,
409 rc2.left, rc2.top, rc2.right - rc2.left, rc2.bottom - rc2.top,
411 if (hDWP)
412 hDWP = DeferWindowPos(hDWP, hwndDlg, NULL,
413 rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
415
416 if (hDWP)
417 EndDeferWindowPos(hDWP);
418}
static const WCHAR rc2[]
Definition: oid.c:1216
#define IDC_NEWEXT_ADVANCED
Definition: shresdef.h:453
#define IDC_NEWEXT_COMBOBOX
Definition: shresdef.h:454
#define IDS_NEWEXT_ADVANCED_RIGHT
Definition: shresdef.h:323
#define IDS_NEWEXT_ADVANCED_LEFT
Definition: shresdef.h:322
#define IDS_NEWEXT_NEW
Definition: shresdef.h:324
#define IDC_NEWEXT_ASSOC
Definition: shresdef.h:455
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
#define SW_HIDE
Definition: winuser.h:768
#define SWP_NOACTIVATE
Definition: winuser.h:1242
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define SW_SHOWNOACTIVATE
Definition: winuser.h:774
BOOL WINAPI EndDeferWindowPos(_In_ HDWP)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
HDWP WINAPI DeferWindowPos(_In_ HDWP, _In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define SWP_NOZORDER
Definition: winuser.h:1247
HDWP WINAPI BeginDeferWindowPos(_In_ int)

Referenced by NewExtDlg_OnInitDialog(), and NewExtDlgProc().

◆ NewExtDlg_OnInitDialog()

static BOOL NewExtDlg_OnInitDialog ( HWND  hwndDlg,
PNEWEXT_DIALOG  pNewExt 
)
static

Definition at line 421 of file filetypes.cpp.

422{
423 pNewExt->bAdvanced = FALSE;
424
425 // get window rectangle
426 GetWindowRect(hwndDlg, &pNewExt->rcDlg);
427
428 // get delta Y
429 RECT rc1, rc2;
432 pNewExt->dy = rc2.top - rc1.top;
433
434 // initialize
439
440 // shrink it first time
441 NewExtDlg_OnAdvanced(hwndDlg, pNewExt);
442
443 return TRUE;
444}
static VOID NewExtDlg_OnAdvanced(HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
Definition: filetypes.cpp:351
#define IDC_NEWEXT_EDIT
Definition: shresdef.h:452
WCHAR szExt[16]
Definition: filetypes.cpp:346
#define CB_SETCURSEL
Definition: winuser.h:1961
#define EM_SETLIMITTEXT
Definition: winuser.h:2011
#define CB_ADDSTRING
Definition: winuser.h:1936

Referenced by NewExtDlgProc().

◆ NewExtDlg_OnOK()

static BOOL NewExtDlg_OnOK ( HWND  hwndDlg,
PNEWEXT_DIALOG  pNewExt 
)
static

Definition at line 447 of file filetypes.cpp.

448{
450 INT iItem;
451
452 GetDlgItemTextW(hwndDlg, IDC_NEWEXT_EDIT, pNewExt->szExt, _countof(pNewExt->szExt));
453 StrTrimW(pNewExt->szExt, g_pszSpace);
454 _wcsupr(pNewExt->szExt);
455
457 StrTrimW(pNewExt->szFileType, g_pszSpace);
458
459 if (pNewExt->szExt[0] == 0)
460 {
463 MessageBoxW(hwndDlg, strText, strTitle, MB_ICONERROR);
464 return FALSE;
465 }
466
467 ZeroMemory(&find, sizeof(find));
468 find.flags = LVFI_STRING;
469 if (pNewExt->szExt[0] == L'.')
470 {
471 find.psz = &pNewExt->szExt[1];
472 }
473 else
474 {
475 find.psz = pNewExt->szExt;
476 }
477
478 iItem = ListView_FindItem(pNewExt->hwndLV, -1, &find);
479 if (iItem >= 0)
480 {
481 // already exists
482
483 // get file type
484 WCHAR szFileType[64];
486 ZeroMemory(&item, sizeof(item));
487 item.mask = LVIF_TEXT;
488 item.pszText = szFileType;
489 item.cchTextMax = _countof(szFileType);
490 item.iItem = iItem;
491 item.iSubItem = 1;
492 ListView_GetItem(pNewExt->hwndLV, &item);
493
494 // get text
495 CStringW strText;
496 strText.Format(IDS_NEWEXT_ALREADY_ASSOC, find.psz, szFileType, find.psz, szFileType);
497
498 // get title
499 CStringW strTitle;
501
502 if (MessageBoxW(hwndDlg, strText, strTitle, MB_ICONWARNING | MB_YESNO) == IDNO)
503 {
504 return FALSE;
505 }
506
507 // Delete the extension
508 CStringW strExt(L".");
509 strExt += find.psz;
510 strExt.MakeLower();
511 DeleteExt(hwndDlg, strExt);
512
513 // Delete the item
514 ListView_DeleteItem(pNewExt->hwndLV, iItem);
515 }
516
517 EndDialog(hwndDlg, IDOK);
518 return TRUE;
519}
BOOL LoadString(_In_ UINT nID)
Definition: cstringt.h:639
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
static TAGID TAGID find
Definition: db.cpp:155
#define LVFI_STRING
Definition: commctrl.h:2437
#define LV_FINDINFO
Definition: commctrl.h:2445
#define ListView_FindItem(hwnd, iStart, plvfi)
Definition: commctrl.h:2470
#define IDS_NEWEXT_SPECIFY_EXT
Definition: shresdef.h:325
#define IDS_NEWEXT_EXT_IN_USE
Definition: shresdef.h:327
#define IDS_NEWEXT_ALREADY_ASSOC
Definition: shresdef.h:326
WCHAR szFileType[64]
Definition: filetypes.cpp:347
#define MB_ICONWARNING
Definition: winuser.h:786

Referenced by NewExtDlgProc().

◆ NewExtDlgProc()

static INT_PTR CALLBACK NewExtDlgProc ( HWND  hwndDlg,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
static

Definition at line 523 of file filetypes.cpp.

528{
529 static PNEWEXT_DIALOG s_pNewExt = NULL;
530
531 switch (uMsg)
532 {
533 case WM_INITDIALOG:
534 s_pNewExt = (PNEWEXT_DIALOG)lParam;
535 NewExtDlg_OnInitDialog(hwndDlg, s_pNewExt);
536 return TRUE;
537
538 case WM_COMMAND:
539 switch (LOWORD(wParam))
540 {
541 case IDOK:
542 NewExtDlg_OnOK(hwndDlg, s_pNewExt);
543 break;
544
545 case IDCANCEL:
546 EndDialog(hwndDlg, IDCANCEL);
547 break;
548
550 s_pNewExt->bAdvanced = !s_pNewExt->bAdvanced;
551 NewExtDlg_OnAdvanced(hwndDlg, s_pNewExt);
552 break;
553 }
554 break;
555 }
556 return 0;
557}
static BOOL NewExtDlg_OnInitDialog(HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
Definition: filetypes.cpp:421
static BOOL NewExtDlg_OnOK(HWND hwndDlg, PNEWEXT_DIALOG pNewExt)
Definition: filetypes.cpp:447
struct NEWEXT_DIALOG * PNEWEXT_DIALOG

Referenced by FolderOptionsFileTypesDlg().

◆ QueryFileDescription()

static BOOL QueryFileDescription ( LPCWSTR  ProgramPath,
LPWSTR  pszName,
INT  cchName 
)
static

Definition at line 178 of file filetypes.cpp.

179{
180 SHFILEINFOW FileInfo = { 0 };
181 if (SHGetFileInfoW(ProgramPath, 0, &FileInfo, sizeof(FileInfo), SHGFI_DISPLAYNAME))
182 {
183 StringCchCopyW(pszName, cchName, FileInfo.szDisplayName);
184 return TRUE;
185 }
186
187 return !!GetFileTitleW(ProgramPath, pszName, cchName);
188}
short WINAPI GetFileTitleW(LPCWSTR lpFile, LPWSTR lpTitle, WORD cbBuf)
Definition: filedlg.c:4856
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:415
#define SHGFI_DISPLAYNAME
Definition: shellapi.h:166
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149

Referenced by FileTypesDlg_InsertToLV().

◆ SetFileTypeEntryDefaultIcon()

static void SetFileTypeEntryDefaultIcon ( PFILE_TYPE_ENTRY  Entry)
static

Definition at line 191 of file filetypes.cpp.

192{
197 IMAGE_ICON, cxSmall, cySmall, 0));
198 StringCbCopyW(Entry->IconPath, sizeof(Entry->IconPath), g_pszShell32);
199 Entry->nIconIndex = -IDI_SHELL_FOLDER_OPTIONS;
200}
#define IDI_SHELL_FOLDER_OPTIONS
Definition: shresdef.h:664

Referenced by EditTypeDlg_UpdateEntryIcon(), and FileTypesDlg_InsertToLV().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( fprop  )