shell32: Call the trashing code from SHFileOperationW.

This commit is contained in:
Mikołaj Zalewski 2006-07-19 18:37:02 +02:00 committed by Alexandre Julliard
parent f2686c7ce9
commit 034c1c4f18
6 changed files with 43 additions and 5 deletions

View File

@ -168,6 +168,7 @@ STRINGTABLE DISCARDABLE
IDS_TRASHITEM_TEXT "Are you sure that you want to send '%1' to the Trash?" IDS_TRASHITEM_TEXT "Are you sure that you want to send '%1' to the Trash?"
IDS_TRASHFOLDER_TEXT "Are you sure that you want to send '%1' and all it's content to the Trash?" IDS_TRASHFOLDER_TEXT "Are you sure that you want to send '%1' and all it's content to the Trash?"
IDS_TRASHMULTIPLE_TEXT "Are you sure that you want to send these %1 items to the Trash?" IDS_TRASHMULTIPLE_TEXT "Are you sure that you want to send these %1 items to the Trash?"
IDS_CANTTRASH_TEXT "The item '%1' can't be sent to Trash. Do you want to delete it instead?"
IDS_OVERWRITEFILE_TEXT "OverWrite File %1?" IDS_OVERWRITEFILE_TEXT "OverWrite File %1?"
IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite" IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite"

View File

@ -151,6 +151,7 @@ void FreeChangeNotifications(void);
#define ASK_TRASH_FILE 7 #define ASK_TRASH_FILE 7
#define ASK_TRASH_FOLDER 8 #define ASK_TRASH_FOLDER 8
#define ASK_TRASH_MULTIPLE_ITEM 9 #define ASK_TRASH_MULTIPLE_ITEM 9
#define ASK_CANT_TRASH_ITEM 10
BOOL SHELL_DeleteDirectoryW(HWND hwnd, LPCWSTR pwszDir, BOOL bShowUI); BOOL SHELL_DeleteDirectoryW(HWND hwnd, LPCWSTR pwszDir, BOOL bShowUI);
BOOL SHELL_ConfirmDialogW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir); BOOL SHELL_ConfirmDialogW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir);

View File

@ -1214,7 +1214,7 @@ ISFHelper_fnDeleteItems (ISFHelper * iface, UINT cidl, LPCITEMIDLIST * apidl)
op.hwnd = GetActiveWindow(); op.hwnd = GetActiveWindow();
op.wFunc = FO_DELETE; op.wFunc = FO_DELETE;
op.pFrom = wszPathsList; op.pFrom = wszPathsList;
op.fFlags = 0; op.fFlags = FOF_ALLOWUNDO;
if (SHFileOperationW(&op)) if (SHFileOperationW(&op))
{ {
WARN("SHFileOperation failed\n"); WARN("SHFileOperation failed\n");

View File

@ -1810,6 +1810,7 @@ static HRESULT UNIXFS_delete_with_shfileop(UnixFolder *This, UINT cidl, LPCITEMI
op.hwnd = GetActiveWindow(); op.hwnd = GetActiveWindow();
op.wFunc = FO_DELETE; op.wFunc = FO_DELETE;
op.pFrom = wszPathsList; op.pFrom = wszPathsList;
op.fFlags = FOF_ALLOWUNDO;
if (!SHFileOperationW(&op)) if (!SHFileOperationW(&op))
{ {
WARN("SHFileOperationW failed\n"); WARN("SHFileOperationW failed\n");

View File

@ -42,6 +42,7 @@
#include "undocshell.h" #include "undocshell.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "xdg.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell); WINE_DEFAULT_DEBUG_CHANNEL(shell);
@ -106,6 +107,11 @@ static BOOL SHELL_ConfirmIDs(int nKindOfDialog, SHELL_ConfirmIDstruc *ids)
ids->caption_resource_id = IDS_DELETEITEM_CAPTION; ids->caption_resource_id = IDS_DELETEITEM_CAPTION;
ids->text_resource_id = IDS_TRASHMULTIPLE_TEXT; ids->text_resource_id = IDS_TRASHMULTIPLE_TEXT;
return TRUE; return TRUE;
case ASK_CANT_TRASH_ITEM:
ids->icon_resource_id = IDI_SHELL_CONFIRM_DELETE;
ids->caption_resource_id = IDS_DELETEITEM_CAPTION;
ids->text_resource_id = IDS_CANTTRASH_TEXT;
return TRUE;
case ASK_DELETE_SELECTED: case ASK_DELETE_SELECTED:
ids->icon_resource_id = IDI_SHELL_CONFIRM_DELETE; ids->icon_resource_id = IDI_SHELL_CONFIRM_DELETE;
ids->caption_resource_id = IDS_DELETEITEM_CAPTION; ids->caption_resource_id = IDS_DELETEITEM_CAPTION;
@ -1104,12 +1110,17 @@ static HRESULT delete_files(LPSHFILEOPSTRUCTW lpFileOp, FILE_LIST *flFrom)
FILE_ENTRY *fileEntry; FILE_ENTRY *fileEntry;
DWORD i; DWORD i;
BOOL bPathExists; BOOL bPathExists;
BOOL bTrash;
if (!flFrom->dwNumFiles) if (!flFrom->dwNumFiles)
return ERROR_SUCCESS; return ERROR_SUCCESS;
if (!(lpFileOp->fFlags & FOF_NOCONFIRMATION) || (lpFileOp->fFlags & FOF_WANTNUKEWARNING)) /* Windows also checks only the first item */
if (!confirm_delete_list(lpFileOp->hwnd, lpFileOp->fFlags, FALSE, flFrom)) bTrash = (lpFileOp->fFlags & FOF_ALLOWUNDO)
&& TRASH_CanTrashFile(flFrom->feFiles[0].szFullPath);
if (!(lpFileOp->fFlags & FOF_NOCONFIRMATION) || (!bTrash && lpFileOp->fFlags & FOF_WANTNUKEWARNING))
if (!confirm_delete_list(lpFileOp->hwnd, lpFileOp->fFlags, bTrash, flFrom))
{ {
lpFileOp->fAnyOperationsAborted = TRUE; lpFileOp->fAnyOperationsAborted = TRUE;
return 0; return 0;
@ -1120,10 +1131,33 @@ static HRESULT delete_files(LPSHFILEOPSTRUCTW lpFileOp, FILE_LIST *flFrom)
bPathExists = TRUE; bPathExists = TRUE;
fileEntry = &flFrom->feFiles[i]; fileEntry = &flFrom->feFiles[i];
if (!IsAttribFile(fileEntry->attributes) &&
(lpFileOp->fFlags & FOF_FILESONLY && fileEntry->bFromWildcard))
continue;
if (bTrash)
{
BOOL bDelete;
if (TRASH_TrashFile(fileEntry->szFullPath))
continue;
/* Note: Windows silently deletes the file in such a situation, we show a dialog */
if (!(lpFileOp->fFlags & FOF_NOCONFIRMATION) || (lpFileOp->fFlags & FOF_WANTNUKEWARNING))
bDelete = SHELL_ConfirmDialogW(lpFileOp->hwnd, ASK_CANT_TRASH_ITEM, fileEntry->szFullPath);
else
bDelete = TRUE;
if (!bDelete)
{
lpFileOp->fAnyOperationsAborted = TRUE;
break;
}
}
/* delete the file or directory */ /* delete the file or directory */
if (IsAttribFile(fileEntry->attributes)) if (IsAttribFile(fileEntry->attributes))
bPathExists = DeleteFileW(fileEntry->szFullPath); bPathExists = DeleteFileW(fileEntry->szFullPath);
else if (!(lpFileOp->fFlags & FOF_FILESONLY && fileEntry->bFromWildcard)) else
bPathExists = SHELL_DeleteDirectoryW(lpFileOp->hwnd, fileEntry->szFullPath, FALSE); bPathExists = SHELL_DeleteDirectoryW(lpFileOp->hwnd, fileEntry->szFullPath, FALSE);
if (!bPathExists) if (!bPathExists)
@ -1252,7 +1286,7 @@ static HRESULT rename_files(LPSHFILEOPSTRUCTW lpFileOp, FILE_LIST *flFrom, FILE_
/* alert the user if an unsupported flag is used */ /* alert the user if an unsupported flag is used */
static void check_flags(FILEOP_FLAGS fFlags) static void check_flags(FILEOP_FLAGS fFlags)
{ {
WORD wUnsupportedFlags = FOF_ALLOWUNDO | FOF_NO_CONNECTED_ELEMENTS | WORD wUnsupportedFlags = FOF_NO_CONNECTED_ELEMENTS |
FOF_NOCOPYSECURITYATTRIBS | FOF_NORECURSEREPARSE | FOF_NOCOPYSECURITYATTRIBS | FOF_NORECURSEREPARSE |
FOF_RENAMEONCOLLISION | FOF_WANTMAPPINGHANDLE; FOF_RENAMEONCOLLISION | FOF_WANTMAPPINGHANDLE;

View File

@ -89,6 +89,7 @@
#define IDS_TRASHFOLDER_TEXT 137 #define IDS_TRASHFOLDER_TEXT 137
#define IDS_TRASHITEM_TEXT 138 #define IDS_TRASHITEM_TEXT 138
#define IDS_TRASHMULTIPLE_TEXT 139 #define IDS_TRASHMULTIPLE_TEXT 139
#define IDS_CANTTRASH_TEXT 140
/* browse for folder dialog box */ /* browse for folder dialog box */
#define IDD_STATUS 0x3743 #define IDD_STATUS 0x3743