Skip to content

Commit ac3ecb2

Browse files
authored
[SHELL32] Add SHFileOp error UI and use it for CFSFolder renaming (reactos#7858)
1 parent 774b3a6 commit ac3ecb2

File tree

10 files changed

+225
-84
lines changed

10 files changed

+225
-84
lines changed

dll/win32/shell32/CDefView.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2821,8 +2821,8 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
28212821
}
28222822

28232823
WCHAR szName[MAX_PATH], *pszText = lpdi->item.pszText;
2824-
if (SUCCEEDED(Shell_DisplayNameOf(m_pSFParent, pidl, SHGDN_FOREDITING | SHGDN_INFOLDER,
2825-
szName, _countof(szName))))
2824+
if (SUCCEEDED(DisplayNameOfW(m_pSFParent, pidl, SHGDN_FOREDITING | SHGDN_INFOLDER,
2825+
szName, _countof(szName))))
28262826
{
28272827
pszText = szName;
28282828
::SetWindowText(hEdit, pszText);
@@ -2875,6 +2875,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
28752875
ILFree(pidlNew);// A SHCNE has updated the item already
28762876
else if (!LV_UpdateItem(lpdi->item.iItem, pidlNew))
28772877
ILFree(pidlNew);
2878+
OnStateChange(CDBOSC_RENAME);
28782879
}
28792880
else
28802881
{

dll/win32/shell32/droptargets/CFSDropTarget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ HRESULT CFSDropTarget::_DoDrop(IDataObject *pDataObject,
622622
// If the target is a virtual item, we ask for the friendly name because SHGDN_FORPARSING will return a GUID.
623623
BOOL UseParsing = (att & (SFGAO_FILESYSTEM | SFGAO_FOLDER)) == SFGAO_FILESYSTEM;
624624
DWORD ShgdnFor = UseParsing ? SHGDN_FORPARSING : SHGDN_FOREDITING;
625-
hr = Shell_DisplayNameOf(psfFrom, apidl[i], ShgdnFor | SHGDN_INFOLDER, targetName, _countof(targetName));
625+
hr = DisplayNameOfW(psfFrom, apidl[i], ShgdnFor | SHGDN_INFOLDER, targetName, _countof(targetName));
626626
}
627627
if (FAILED_UNEXPECTEDLY(hr))
628628
{

dll/win32/shell32/folders/CFSFolder.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,11 +1558,14 @@ HRESULT WINAPI CFSFolder::SetNameOf(
15581558
PITEMID_CHILD *pPidlOut)
15591559
{
15601560
WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1], szNameBuf[MAX_PATH];
1561-
BOOL bIsFolder = _ILIsFolder (ILFindLastID (pidl));
1561+
BOOL bIsFolder = ItemIsFolder(ILFindLastID(pidl));
15621562

15631563
TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl,
15641564
debugstr_w (lpName), dwFlags, pPidlOut);
15651565

1566+
if (pPidlOut)
1567+
*pPidlOut = NULL;
1568+
15661569
LPCWSTR pszName = GetItemFileName(pidl, szNameBuf, _countof(szNameBuf));
15671570
if (!pszName)
15681571
{
@@ -1595,16 +1598,11 @@ HRESULT WINAPI CFSFolder::SetNameOf(
15951598
if (pPidlOut)
15961599
hr = SHILClone(pidl, pPidlOut);
15971600
}
1598-
else if (MoveFileW(szSrc, szDest))
1599-
{
1600-
if (pPidlOut)
1601-
hr = ParseDisplayName(hwndOwner, NULL, PathFindFileNameW(szDest), NULL, pPidlOut, NULL);
1602-
1603-
SHChangeNotify(bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM, SHCNF_PATHW, szSrc, szDest);
1604-
}
16051601
else
16061602
{
1607-
hr = HResultFromWin32(GetLastError());
1603+
hr = SHELL_SingleFileOperation(hwndOwner, FO_RENAME, szSrc, szDest, FOF_SILENT | FOF_ALLOWUNDO, NULL);
1604+
if (SUCCEEDED(hr) && pPidlOut)
1605+
hr = ParseDisplayName(hwndOwner, NULL, PathFindFileNameW(szDest), NULL, pPidlOut, NULL);
16081606
}
16091607
return hr;
16101608
}

dll/win32/shell32/folders/CRecycleBin.cpp

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -510,34 +510,26 @@ static LPWSTR CreateFileOpStrings(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, BOOL R
510510
typedef struct _FILEOPDATA
511511
{
512512
PCUITEMID_CHILD_ARRAY apidl;
513-
UINT cidl, index;
514-
BBITEMDATA *pItem;
513+
UINT cidl;
515514
} FILEOPDATA;
516515

517516
static HRESULT CALLBACK FileOpCallback(FILEOPCALLBACKEVENT Event, LPCWSTR Src, LPCWSTR Dst, UINT Attrib, HRESULT hrOp, void *CallerData)
518517
{
519518
FILEOPDATA &data = *(FILEOPDATA*)CallerData;
520-
if (Event == FOCE_PREMOVEITEM || Event == FOCE_PREDELETEITEM)
519+
if ((Event == FOCE_POSTDELETEITEM || Event == FOCE_POSTMOVEITEM) && SUCCEEDED(hrOp))
521520
{
522-
data.pItem = NULL;
523521
for (UINT i = 0; i < data.cidl; ++i)
524522
{
525523
BBITEMDATA *pItem = ValidateItem(data.apidl[i]);
526524
if (pItem && !_wcsicmp(Src, GetItemRecycledFullPath(*pItem)))
527525
{
528-
data.pItem = pItem;
529-
data.index = i;
526+
RECYCLEBINFILEIDENTITY identity = { pItem->DeletionTime, GetItemRecycledFullPath(*pItem) };
527+
RemoveFromRecycleBinDatabase(&identity);
528+
CRecycleBin_NotifyRemovedFromRecycleBin(data.apidl[i]);
530529
break;
531530
}
532531
}
533532
}
534-
else if ((Event == FOCE_POSTDELETEITEM || Event == FOCE_POSTMOVEITEM) && SUCCEEDED(hrOp) && data.pItem)
535-
{
536-
RECYCLEBINFILEIDENTITY identity = { data.pItem->DeletionTime, GetItemRecycledFullPath(*data.pItem) };
537-
RemoveFromRecycleBinDatabase(&identity);
538-
CRecycleBin_NotifyRemovedFromRecycleBin(data.apidl[data.index]);
539-
data.pItem = NULL;
540-
}
541533
else if (Event == FOCE_FINISHOPERATIONS)
542534
{
543535
CComHeapPtr<ITEMIDLIST> pidlBB(SHCloneSpecialIDList(NULL, CSIDL_BITBUCKET, FALSE));

dll/win32/shell32/precomp.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -242,14 +242,6 @@ BOOL Shell_FailForceReturn(_In_ HRESULT hr);
242242
EXTERN_C INT
243243
Shell_ParseSpecialFolder(_In_ LPCWSTR pszStart, _Out_ LPWSTR *ppch, _Out_ INT *pcch);
244244

245-
HRESULT
246-
Shell_DisplayNameOf(
247-
_In_ IShellFolder *psf,
248-
_In_ LPCITEMIDLIST pidl,
249-
_In_ DWORD dwFlags,
250-
_Out_ LPWSTR pszBuf,
251-
_In_ UINT cchBuf);
252-
253245
EXTERN_C
254246
HRESULT SHBindToObject(
255247
_In_opt_ IShellFolder *psf,
@@ -331,11 +323,18 @@ typedef enum _FILEOPCALLBACKEVENT {
331323
FOCE_FINISHOPERATIONS,
332324
FOCE_PREMOVEITEM,
333325
FOCE_POSTMOVEITEM,
326+
FOCE_PRECOPYITEM,
327+
FOCE_POSTCOPYITEM,
334328
FOCE_PREDELETEITEM,
335-
FOCE_POSTDELETEITEM
329+
FOCE_POSTDELETEITEM,
330+
FOCE_PRERENAMEITEM,
331+
FOCE_POSTRENAMEITEM,
332+
FOCE_PRENEWITEM,
333+
FOCE_POSTNEWITEM
336334
} FILEOPCALLBACKEVENT;
337335
typedef HRESULT (CALLBACK *FILEOPCALLBACK)(FILEOPCALLBACKEVENT Event, LPCWSTR Source, LPCWSTR Destination,
338336
UINT Attributes, HRESULT hr, void *CallerData);
339337
int SHELL32_FileOperation(LPSHFILEOPSTRUCTW lpFileOp, FILEOPCALLBACK Callback, void *CallerData);
338+
HRESULT SHELL_SingleFileOperation(HWND hWnd, UINT Op, PCWSTR Src, PCWSTR Dest, UINT Flags, PWSTR *ppNewName);
340339

341340
#endif /* _PRECOMP_H__ */

dll/win32/shell32/shell32.spec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,4 @@
466466
754 stub -noname SHLimitInputEditWithFlags
467467
755 stdcall -noname PathIsEqualOrSubFolder(wstr wstr)
468468
756 stub -noname DeleteFileThumbnail
469+
757 stdcall -version=0x600+ DisplayNameOfW(ptr ptr long ptr long)

0 commit comments

Comments
 (0)