Skip to content

Commit c7a7376

Browse files
authored
[SHELL32] Implement basic SHMultiFileProperties (reactos#7956)
CORE-12510 CORE-20217
1 parent bec50f6 commit c7a7376

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+607
-268
lines changed

dll/win32/shell32/dialogs/filedefext.cpp

Lines changed: 382 additions & 200 deletions
Large diffs are not rendered by default.

dll/win32/shell32/dialogs/filedefext.h

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class CFileDefExt :
5959
public IShellExtInit,
6060
public IContextMenu,
6161
public IShellPropSheetExt,
62-
public IObjectWithSite
62+
public CObjectWithSiteBase
6363
{
6464
private:
6565
VOID InitOpensWithField(HWND hwndDlg);
@@ -72,21 +72,37 @@ class CFileDefExt :
7272
BOOL AddVersionString(HWND hwndDlg, LPCWSTR pwszName);
7373
BOOL InitVersionPage(HWND hwndDlg);
7474
BOOL InitFolderCustomizePage(HWND hwndDlg);
75+
void InitMultifilePage(HWND hwndDlg);
76+
void InitMultifilePageThread();
77+
void CountFolderAndFiles();
7578
static INT_PTR CALLBACK GeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
7679
static INT_PTR CALLBACK VersionPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
7780
static INT_PTR CALLBACK FolderCustomizePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
78-
BOOL CountFolderAndFiles(HWND hwndDlg, LPCWSTR pwszBuf, LPDWORD ticks);
81+
static INT_PTR CALLBACK MultifilePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
7982

8083
WCHAR m_wszPath[MAX_PATH];
8184
CFileVersionInfo m_VerInfo;
82-
BOOL m_bDir;
85+
BOOL m_bDir;
86+
BOOL m_bMultifile;
8387

84-
DWORD m_cFiles;
88+
LPITEMIDLIST m_pidlFolder = NULL;
89+
LPITEMIDLIST *m_pidls = NULL;
90+
UINT m_cidl = 0;
91+
DWORD m_cFiles;
8592
DWORD m_cFolders;
8693
ULARGE_INTEGER m_DirSize;
8794
ULARGE_INTEGER m_DirSizeOnDisc;
95+
enum { WM_UPDATEDIRSTATS = WM_APP };
96+
HWND m_hWndDirStatsDlg;
97+
void InitDirStats(struct DIRTREESTATS *pStats);
98+
BOOL WalkDirTree(PCWSTR pszPath, struct DIRTREESTATS *pStats, WIN32_FIND_DATAW *pWFD);
99+
void UpdateDirStatsResults();
100+
101+
LONG volatile m_Destroyed = 0;
102+
BOOL IsDestroyed() const { return m_Destroyed; }
88103

89104
static DWORD WINAPI _CountFolderAndFilesThreadProc(LPVOID lpParameter);
105+
static DWORD WINAPI _InitializeMultifileThreadProc(LPVOID lpParameter);
90106

91107
// FolderCustomize
92108
WCHAR m_szFolderIconPath[MAX_PATH];
@@ -116,10 +132,6 @@ class CFileDefExt :
116132
STDMETHOD(AddPages)(LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam) override;
117133
STDMETHOD(ReplacePage)(UINT uPageID, LPFNADDPROPSHEETPAGE pfnReplacePage, LPARAM lParam) override;
118134

119-
// IObjectWithSite
120-
STDMETHOD(SetSite)(IUnknown *punk) override;
121-
STDMETHOD(GetSite)(REFIID iid, void **ppvSite) override;
122-
123135
DECLARE_REGISTRY_RESOURCEID(IDR_FILEDEFEXT)
124136
DECLARE_NOT_AGGREGATABLE(CFileDefExt)
125137

dll/win32/shell32/dialogs/item_prop.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,29 +176,23 @@ SHELL32_ShowFilesystemItemPropertiesDialogAsync(IDataObject *pDO)
176176
pClsid = &CLSID_ShellFileDefExt;
177177
InitFunc = FSFolderItemPropDialogInitCallback;
178178
}
179-
ShellPropSheetDialog Dialog;
180-
return Dialog.ShowAsync(pClsid, pDO, InitFunc, InitString);
179+
return ShellPropSheetDialog().ShowAsync(pClsid, pDO, InitFunc, InitString);
181180
}
182181

183182
HRESULT
184183
SHELL32_ShowFilesystemItemsPropertiesDialogAsync(HWND hOwner, IDataObject *pDO)
185184
{
186185
if (DataObject_GetHIDACount(pDO) == 1)
187186
return SHELL32_ShowFilesystemItemPropertiesDialogAsync(pDO);
188-
189-
ERR("SHMultiFileProperties is not implemented yet\n");
190-
HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
191-
SHELL_ErrorBox(hOwner, hr);
192-
return hr; // TODO: return SHMultiFileProperties(pDO, 0);
187+
return SHMultiFileProperties(pDO, 0);
193188
}
194189

195190
HRESULT
196191
SHELL32_ShowShellExtensionProperties(const CLSID *pClsid, IDataObject *pDO)
197192
{
198193
WCHAR ClassBuf[6 + 38 + 1] = L"CLSID\\";
199194
StringFromGUID2(*pClsid, ClassBuf + 6, 38 + 1);
200-
ShellPropSheetDialog Dialog;
201-
return Dialog.ShowAsync(NULL, pDO, ClassPropDialogInitCallback, ClassBuf);
195+
return ShellPropSheetDialog().ShowAsync(NULL, pDO, ClassPropDialogInitCallback, ClassBuf);
202196
}
203197

204198
HRESULT
@@ -220,3 +214,16 @@ SHELL_ShowItemIDListProperties(LPCITEMIDLIST pidl)
220214
};
221215
return ShellExecuteExA(&sei) ? S_OK : HResultFromWin32(GetLastError());
222216
}
217+
218+
/*
219+
* SHMultiFileProperties [SHELL32.716]
220+
*/
221+
EXTERN_C HRESULT
222+
WINAPI
223+
SHMultiFileProperties(IDataObject *pDataObject, DWORD dwFlags)
224+
{
225+
if (DataObject_GetHIDACount(pDataObject) == 1)
226+
return SHELL32_ShowFilesystemItemPropertiesDialogAsync(pDataObject);
227+
228+
return ShellPropSheetDialog().ShowAsync(&CLSID_ShellFileDefExt, pDataObject, NULL, NULL);
229+
}

dll/win32/shell32/folders/CDesktopFolder.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,15 @@ HRESULT WINAPI CDesktopFolder::CallBack(IShellFolder *psf, HWND hwndOwner, IData
10491049
enum { IDC_PROPERTIES };
10501050
if (uMsg == DFM_INVOKECOMMAND && wParam == (pdtobj ? DFM_CMD_PROPERTIES : IDC_PROPERTIES))
10511051
{
1052-
return SHELL_ExecuteControlPanelCPL(hwndOwner, L"desk.cpl") ? S_OK : E_FAIL;
1052+
if (pdtobj)
1053+
{
1054+
PIDLIST_ABSOLUTE pidl = SHELL_DataObject_ILCloneFullItem(pdtobj, 0);
1055+
BOOL bIsSelf = _ILIsDesktop(pidl); // Context menu on Desktop item in the shell tree?
1056+
ILFree(pidl);
1057+
if (!bIsSelf)
1058+
return SHELL32_ShowPropertiesDialog(pdtobj); // File selection
1059+
}
1060+
return SHELL_ExecuteControlPanelCPL(hwndOwner, L"desk.cpl") ? S_OK : E_FAIL; // Background
10531061
}
10541062
else if (uMsg == DFM_MERGECONTEXTMENU && !pdtobj) // Add Properties item when called for directory background
10551063
{

dll/win32/shell32/lang/bg-BG.rc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,10 @@ BEGIN
976976
IDS_PRINT_VERB "Разпечатване"
977977
IDS_CMD_VERB "Command Prompt here"
978978

979+
IDS_MULTIPLETYPES "Multiple Types"
980+
IDS_VARIOUSFOLDERS "Various Folders"
979981
IDS_FILE_FOLDER "%u файла, %u папки"
982+
980983
IDS_PRINTERS "Печатачи"
981984
IDS_FONTS "Шрифтове"
982985
IDS_INSTALLNEWFONT "Слагане на нов шрифт..."

dll/win32/shell32/lang/ca-ES.rc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
228228
BEGIN
229229
ICON "", 14000, 16, 7, 32, 32, WS_VISIBLE
230230
EDITTEXT 14001, 58, 9, 170, 14, ES_LEFT
231-
LTEXT "Type of file:", 14004, 8, 40, 55, 10
231+
LTEXT "Type:", 14004, 8, 40, 55, 10
232232
CONTROL "Folder", 14005, "edit", ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL, 58, 40, 170, 10
233233
LTEXT "", -1, 8, 31, 221, 1, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE
234234
LTEXT "Location:", 14008, 8, 56, 55, 10
@@ -976,7 +976,10 @@ BEGIN
976976
IDS_PRINT_VERB "Print"
977977
IDS_CMD_VERB "Command Prompt here"
978978

979+
IDS_MULTIPLETYPES "Multiple Types"
980+
IDS_VARIOUSFOLDERS "Various Folders"
979981
IDS_FILE_FOLDER "%u Files, %u Folders"
982+
980983
IDS_PRINTERS "Printers"
981984
IDS_FONTS "Fonts"
982985
IDS_INSTALLNEWFONT "Install New Font..."

dll/win32/shell32/lang/cs-CZ.rc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,7 +984,10 @@ BEGIN
984984
IDS_PRINT_VERB "Tisknout"
985985
IDS_CMD_VERB "Command Prompt here"
986986

987+
IDS_MULTIPLETYPES "Multiple Types"
988+
IDS_VARIOUSFOLDERS "Various Folders"
987989
IDS_FILE_FOLDER "%u souborů, %u složek"
990+
988991
IDS_PRINTERS "Tiskárny"
989992
IDS_FONTS "Písma"
990993
IDS_INSTALLNEWFONT "Nainstalovat nové písmo..."

dll/win32/shell32/lang/da-DK.rc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
235235
BEGIN
236236
ICON "", 14000, 16, 7, 32, 32, WS_VISIBLE
237237
EDITTEXT 14001, 58, 9, 170, 14, ES_LEFT
238-
LTEXT "Type of file:", 14004, 8, 40, 55, 10
238+
LTEXT "Type:", 14004, 8, 40, 55, 10
239239
CONTROL "Folder", 14005, "edit", ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL, 58, 40, 170, 10
240240
LTEXT "", -1, 8, 31, 221, 1, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE
241241
LTEXT "Location:", 14008, 8, 56, 55, 10
@@ -983,7 +983,10 @@ BEGIN
983983
IDS_PRINT_VERB "Print"
984984
IDS_CMD_VERB "Command Prompt here"
985985

986+
IDS_MULTIPLETYPES "Multiple Types"
987+
IDS_VARIOUSFOLDERS "Various Folders"
986988
IDS_FILE_FOLDER "%u Files, %u Folders"
989+
987990
IDS_PRINTERS "Printers"
988991
IDS_FONTS "Fonts"
989992
IDS_INSTALLNEWFONT "Install New Font..."

dll/win32/shell32/lang/de-DE.rc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,7 +977,10 @@ BEGIN
977977
IDS_PRINT_VERB "Drucken"
978978
IDS_CMD_VERB "Cmd hier"
979979

980+
IDS_MULTIPLETYPES "Multiple Types"
981+
IDS_VARIOUSFOLDERS "Various Folders"
980982
IDS_FILE_FOLDER "%u Dateien, %u Ordner"
983+
981984
IDS_PRINTERS "Drucker"
982985
IDS_FONTS "Schriftarten"
983986
IDS_INSTALLNEWFONT "Neue Schriftart installieren..."

dll/win32/shell32/lang/el-GR.rc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0
228228
BEGIN
229229
ICON "", 14000, 16, 7, 32, 32, WS_VISIBLE
230230
EDITTEXT 14001, 58, 9, 170, 14, ES_LEFT
231-
LTEXT "Type of file:", 14004, 8, 40, 55, 10
231+
LTEXT "Type:", 14004, 8, 40, 55, 10
232232
CONTROL "Folder", 14005, "edit", ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL, 58, 40, 170, 10
233233
LTEXT "", -1, 8, 31, 221, 1, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE
234234
LTEXT "Location:", 14008, 8, 56, 55, 10
@@ -976,7 +976,10 @@ BEGIN
976976
IDS_PRINT_VERB "Print"
977977
IDS_CMD_VERB "Command Prompt here"
978978

979+
IDS_MULTIPLETYPES "Multiple Types"
980+
IDS_VARIOUSFOLDERS "Various Folders"
979981
IDS_FILE_FOLDER "%u Files, %u Folders"
982+
980983
IDS_PRINTERS "Printers"
981984
IDS_FONTS "Fonts"
982985
IDS_INSTALLNEWFONT "Install New Font..."

0 commit comments

Comments
 (0)