diff --git a/dlls/shell32/shlfileop.c b/dlls/shell32/shlfileop.c index fcb91c1f0f2..ff9c5408085 100644 --- a/dlls/shell32/shlfileop.c +++ b/dlls/shell32/shlfileop.c @@ -13,16 +13,39 @@ DEFAULT_DEBUG_CHANNEL(shell); -#define ASK_DELETE_FILE 1 -#define ASK_DELETE_FOLDER 2 -#define ASK_DELETE_MULTIPLE_FILE 3 - -static BOOL SHELL_WarnFolderDelete (int nKindOfDialog, LPCSTR szDir) +BOOL SHELL_WarnItemDelete (int nKindOfDialog, LPCSTR szDir) { char szCaption[255], szText[255], szBuffer[MAX_PATH + 256]; - LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_TEXT, szText, sizeof(szText)); - LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_CAPTION, szCaption, sizeof(szCaption)); + if(nKindOfDialog == ASK_DELETE_FILE) + { + LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText, + sizeof(szText)); + LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION, + szCaption, sizeof(szCaption)); + } + else if(nKindOfDialog == ASK_DELETE_FOLDER) + { + LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText, + sizeof(szText)); + LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_CAPTION, + szCaption, sizeof(szCaption)); + } + else if(nKindOfDialog == ASK_DELETE_MULTIPLE_ITEM) + { + LoadStringA(shell32_hInstance, IDS_DELETEMULTIPLE_TEXT, szText, + sizeof(szText)); + LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION, + szCaption, sizeof(szCaption)); + } + else { + FIXME("Called without a valid nKindOfDialog specified!"); + LoadStringA(shell32_hInstance, IDS_DELETEITEM_TEXT, szText, + sizeof(szText)); + LoadStringA(shell32_hInstance, IDS_DELETEITEM_CAPTION, + szCaption, sizeof(szCaption)); + } + FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir); @@ -46,7 +69,8 @@ BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI) PathAddBackslashA(szTemp); strcat(szTemp, "*.*"); - if (bShowUI && !SHELL_WarnFolderDelete(ASK_DELETE_FOLDER, pszDir)) return FALSE; + if (bShowUI && !SHELL_WarnItemDelete(ASK_DELETE_FOLDER, pszDir)) + return FALSE; if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(szTemp, &wfd))) { @@ -72,6 +96,18 @@ BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI) return ret; } +/************************************************************************** + * SHELL_DeleteFileA() + */ + +BOOL SHELL_DeleteFileA(LPCSTR pszFile, BOOL bShowUI) +{ + if (bShowUI && !SHELL_WarnItemDelete(ASK_DELETE_FILE, pszFile)) + return FALSE; + + return DeleteFileA(pszFile); +} + /************************************************************************* * SHCreateDirectory [SHELL32.165] * diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c index 1f1afb6f856..a73d4899438 100644 --- a/dlls/shell32/shlfolder.c +++ b/dlls/shell32/shlfolder.c @@ -1489,9 +1489,20 @@ static HRESULT WINAPI ISFHelper_fnDeleteItems( _ICOM_THIS_From_ISFHelper(IGenericSFImpl,iface) int i; char szPath[MAX_PATH]; + BOOL bConfirm = TRUE; TRACE("(%p)(%u %p)\n", This, cidl, apidl); + /* deleting multiple items so give a slightly different warning */ + if(cidl != 1) + { + char tmp[8]; + snprintf(tmp, sizeof(tmp), "%d", cidl); + if(!SHELL_WarnItemDelete(ASK_DELETE_MULTIPLE_ITEM, tmp)) + return E_FAIL; + bConfirm = FALSE; + } + for(i=0; i< cidl; i++) { strcpy(szPath, This->sMyPath); @@ -1501,9 +1512,12 @@ static HRESULT WINAPI ISFHelper_fnDeleteItems( if (_ILIsFolder(apidl[i])) { LPITEMIDLIST pidl; - - MESSAGE("delete %s\n", szPath); - if (! SHELL_DeleteDirectoryA(szPath, TRUE)) return E_FAIL; + TRACE("delete %s\n", szPath); + if (! SHELL_DeleteDirectoryA(szPath, bConfirm)) + { + TRACE("delete %s failed, bConfirm=%d", szPath, bConfirm); + return E_FAIL; + } pidl = ILCombine(This->absPidl, apidl[i]); SHChangeNotifyA(SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL); SHFree(pidl); @@ -1512,8 +1526,12 @@ static HRESULT WINAPI ISFHelper_fnDeleteItems( { LPITEMIDLIST pidl; - MESSAGE("delete %s\n", szPath); - if (! DeleteFileA(szPath)) return E_FAIL; + TRACE("delete %s\n", szPath); + if (! SHELL_DeleteFileA(szPath, bConfirm)) + { + TRACE("delete %s failed, bConfirm=%d", szPath, bConfirm); + return E_FAIL; + } pidl = ILCombine(This->absPidl, apidl[i]); SHChangeNotifyA(SHCNE_DELETE, SHCNF_IDLIST, pidl, NULL); SHFree(pidl); diff --git a/dlls/shell32/shres.rc b/dlls/shell32/shres.rc index 7d3bb7075c8..c8993b366eb 100644 --- a/dlls/shell32/shres.rc +++ b/dlls/shell32/shres.rc @@ -133,8 +133,10 @@ STRINGTABLE DISCARDABLE { IDS_CREATEFOLDER_DENIED "Can not create new Folder: Permission denied." IDS_CREATEFOLDER_CAPTION "Error during creating a new folder" - IDS_DELETEFOLDER_TEXT "Are you sure you want to delete %1 and all it's subfolders?" - IDS_DELETEFOLDER_CAPTION "Confirm file delete" + IDS_DELETEITEM_CAPTION "Confirm file delete" + IDS_DELETEFOLDER_CAPTION "Confirm folder delete" + IDS_DELETEITEM_TEXT "Are you sure you want to delete '%1'?" + IDS_DELETEMULTIPLE_TEXT "Are you sure you want to delete these %1 items?" } shv_accel ACCELERATORS diff --git a/dlls/shell32/shresdef.h b/dlls/shell32/shresdef.h index 161ff137a79..b0190e568b4 100644 --- a/dlls/shell32/shresdef.h +++ b/dlls/shell32/shresdef.h @@ -24,8 +24,10 @@ #define IDS_CREATEFOLDER_DENIED 30 #define IDS_CREATEFOLDER_CAPTION 31 -#define IDS_DELETEFOLDER_TEXT 32 +#define IDS_DELETEITEM_CAPTION 32 #define IDS_DELETEFOLDER_CAPTION 33 +#define IDS_DELETEITEM_TEXT 34 +#define IDS_DELETEMULTIPLE_TEXT 35 /* browse for folder dialog box */ #define IDD_STATUS 97