31a513e2ee1bc589c223291969447c39c1f4b99b
[reactos.git] / dll / win32 / shell32 / dialogs / filedefext.h
1 /*
2 * Provides default file shell extension
3 *
4 * Copyright 2012 Rafal Harabien
5 *
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.
10 *
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.
15 *
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
19 */
20
21 #ifndef _FILE_DEF_EXT_H_
22 #define _FILE_DEF_EXT_H_
23
24 class CFileVersionInfo
25 {
26 private:
27 PVOID m_pInfo;
28 WORD m_wLang, m_wCode;
29 WCHAR m_wszLang[64];
30
31 typedef struct _LANGANDCODEPAGE_
32 {
33 WORD wLang;
34 WORD wCode;
35 } LANGANDCODEPAGE, *LPLANGANDCODEPAGE;
36
37 public:
38 inline CFileVersionInfo():
39 m_pInfo(NULL), m_wLang(0), m_wCode(0)
40 {
41 m_wszLang[0] = L'\0';
42 }
43
44 inline ~CFileVersionInfo()
45 {
46 if (m_pInfo)
47 HeapFree(GetProcessHeap(), 0, m_pInfo);
48 }
49
50 BOOL Load(LPCWSTR pwszPath);
51 LPCWSTR GetString(LPCWSTR pwszName);
52 VS_FIXEDFILEINFO *GetFixedInfo();
53 LPCWSTR GetLangName();
54 };
55
56 class CFileDefExt :
57 public CComCoClass<CFileDefExt, &CLSID_ShellFileDefExt>,
58 public CComObjectRootEx<CComMultiThreadModelNoCS>,
59 public IShellExtInit,
60 public IContextMenu,
61 public IShellPropSheetExt,
62 public IObjectWithSite
63 {
64 private:
65 VOID InitOpensWithField(HWND hwndDlg);
66 BOOL InitFileType(HWND hwndDlg);
67 BOOL InitFilePath(HWND hwndDlg);
68 static BOOL GetFileTimeString(LPFILETIME lpFileTime, LPWSTR pwszResult, UINT cchResult);
69 BOOL InitFileAttr(HWND hwndDlg);
70 BOOL InitGeneralPage(HWND hwndDlg);
71 BOOL SetVersionLabel(HWND hwndDlg, DWORD idCtrl, LPCWSTR pwszName);
72 BOOL AddVersionString(HWND hwndDlg, LPCWSTR pwszName);
73 BOOL InitVersionPage(HWND hwndDlg);
74 BOOL InitFolderCustomizePage(HWND hwndDlg);
75 static INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
76 static INT_PTR CALLBACK VersionPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
77 static INT_PTR CALLBACK FolderCustomizePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
78 BOOL CountFolderAndFiles(HWND hwndDlg, LPWSTR pwszBuf, UINT cchBufMax, LPDWORD ticks);
79
80 WCHAR m_wszPath[MAX_PATH];
81 CFileVersionInfo m_VerInfo;
82 BOOL m_bDir;
83
84 DWORD m_cFiles;
85 DWORD m_cFolders;
86 ULARGE_INTEGER m_DirSize;
87
88 static DWORD WINAPI _CountFolderAndFilesThreadProc(LPVOID lpParameter);
89
90 // FolderCustomize
91 WCHAR m_szFolderIconPath[MAX_PATH];
92 INT m_nFolderIconIndex;
93 HICON m_hFolderIcon;
94 BOOL m_bFolderIconIsSet;
95
96 public:
97 CFileDefExt();
98 ~CFileDefExt();
99
100 // FolderCustomize
101 BOOL OnFolderCustApply(HWND hwndDlg);
102 void OnFolderCustChangeIcon(HWND hwndDlg);
103 void OnFolderCustDestroy(HWND hwndDlg);
104 void UpdateFolderIcon(HWND hwndDlg);
105
106 // IShellExtInit
107 virtual HRESULT STDMETHODCALLTYPE Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
108
109 // IContextMenu
110 virtual HRESULT WINAPI QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
111 virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpici);
112 virtual HRESULT WINAPI GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax);
113
114 // IShellPropSheetExt
115 virtual HRESULT WINAPI AddPages(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam);
116 virtual HRESULT WINAPI ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam);
117
118 // IObjectWithSite
119 virtual HRESULT WINAPI SetSite(IUnknown *punk);
120 virtual HRESULT WINAPI GetSite(REFIID iid, void **ppvSite);
121
122 DECLARE_REGISTRY_RESOURCEID(IDR_FILEDEFEXT)
123 DECLARE_NOT_AGGREGATABLE(CFileDefExt)
124
125 DECLARE_PROTECT_FINAL_CONSTRUCT()
126
127 BEGIN_COM_MAP(CFileDefExt)
128 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
129 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
130 COM_INTERFACE_ENTRY_IID(IID_IShellPropSheetExt, IShellPropSheetExt)
131 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
132 END_COM_MAP()
133 };
134
135 struct _CountFolderAndFilesData {
136 CFileDefExt *This;
137 HWND hwndDlg;
138 LPWSTR pwszBuf;
139 UINT cchBufMax;
140 };
141
142 #endif /* _FILE_DEF_EXT_H_ */