Implement keyboard shortcut F2 to rename files and directories in the
[wine] / dlls / shell32 / shlfileop.c
1 /*
2  * SHFileOperation
3  */
4 #include <string.h>
5 #include "debugtools.h"
6 #include "shellapi.h"
7
8 #include "shlobj.h"
9 #include "shresdef.h"
10 #include "shell32_main.h"
11 #include "wine/undocshell.h"
12 #include "shlwapi.h"
13
14 DEFAULT_DEBUG_CHANNEL(shell);
15
16 #define ASK_DELETE_FILE 1
17 #define ASK_DELETE_FOLDER 2
18 #define ASK_DELETE_MULTIPLE_FILE 3
19
20 static BOOL SHELL_WarnFolderDelete (int nKindOfDialog, LPCSTR szDir)
21 {
22         char szCaption[255], szText[255], szBuffer[MAX_PATH + 256];
23
24         LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_TEXT, szText, sizeof(szText));
25         LoadStringA(shell32_hInstance, IDS_DELETEFOLDER_CAPTION, szCaption, sizeof(szCaption));
26         FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
27             szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir);
28
29         return (IDOK == MessageBoxA(GetActiveWindow(), szBuffer, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION));
30 }
31
32 /**************************************************************************
33  *      SHELL_DeleteDirectoryA()
34  *
35  * like rm -r
36  */
37
38 BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI)
39 {
40         BOOL            ret = FALSE;
41         HANDLE          hFind;
42         WIN32_FIND_DATAA wfd;
43         char            szTemp[MAX_PATH];
44
45         strcpy(szTemp, pszDir);
46         PathAddBackslashA(szTemp);
47         strcat(szTemp, "*.*");
48         
49         if (bShowUI && !SHELL_WarnFolderDelete(ASK_DELETE_FOLDER, pszDir)) return FALSE;
50         
51         if(INVALID_HANDLE_VALUE != (hFind = FindFirstFileA(szTemp, &wfd)))
52         {
53           do
54           {
55             if(strcasecmp(wfd.cFileName, ".") && strcasecmp(wfd.cFileName, ".."))
56             {
57               strcpy(szTemp, pszDir);
58               PathAddBackslashA(szTemp);
59               strcat(szTemp, wfd.cFileName);
60         
61               if(FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes)
62                 SHELL_DeleteDirectoryA(szTemp, FALSE);
63               else
64                 DeleteFileA(szTemp);
65             }
66           } while(FindNextFileA(hFind, &wfd));
67
68           FindClose(hFind);
69           ret = RemoveDirectoryA(pszDir);
70         }
71
72         return ret;
73 }
74
75 /*************************************************************************
76  * SHCreateDirectory                            [SHELL32.165]
77  *
78  * NOTES
79  *  exported by ordinal
80  *  not sure about LPSECURITY_ATTRIBUTES
81  */
82 DWORD WINAPI SHCreateDirectory(LPSECURITY_ATTRIBUTES sec,LPCSTR path)
83 {
84         DWORD ret;
85         TRACE("(%p,%s)\n",sec,path);
86         if ((ret = CreateDirectoryA(path,sec)))
87         {
88           SHChangeNotifyA(SHCNE_MKDIR, SHCNF_PATHA, path, NULL);
89         }
90         return ret;
91 }
92
93 /************************************************************************
94  *      Win32DeleteFile                         [SHELL32.164]  
95  *
96  * Deletes a file.  Also triggers a change notify if one exists.
97  *
98  * FIXME:
99  * Verified on Win98 / IE 5 (SHELL32 4.72, March 1999 build) to be
100  * ANSI.  Is this Unicode on NT?
101  *
102  */ 
103
104 BOOL WINAPI Win32DeleteFile(LPSTR fName)
105 {
106         TRACE("%p(%s)\n", fName, fName);
107
108         DeleteFileA(fName);
109         SHChangeNotifyA(SHCNE_DELETE, SHCNF_PATHA, fName, NULL);
110         return TRUE;
111 }
112
113 /*************************************************************************
114  * SHFileOperationA                             [SHELL32.243]
115  *
116  * NOTES
117  *     exported by name
118  */
119 DWORD WINAPI SHFileOperationA (LPSHFILEOPSTRUCTA lpFileOp)   
120 {
121         FIXME("(%p):stub.\n", lpFileOp);
122         return 1;
123 }
124
125 /*************************************************************************
126  * SHFileOperationW                             [SHELL32.244]
127  *
128  * NOTES
129  *     exported by name
130  */
131 DWORD WINAPI SHFileOperationW (LPSHFILEOPSTRUCTW lpFileOp)   
132 {
133         FIXME("(%p):stub.\n", lpFileOp);
134         return 1;
135 }
136
137 /*************************************************************************
138  * SHFileOperation                              [SHELL32.242]
139  *
140  */
141 DWORD WINAPI SHFileOperationAW(LPVOID lpFileOp)
142 {
143         if (SHELL_OsIsUnicode())
144           return SHFileOperationW(lpFileOp);
145         return SHFileOperationA(lpFileOp);
146 }
147
148 /*************************************************************************
149  * SheGetDirW [SHELL32.281]
150  *
151  */
152 HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v)
153 {       FIXME("%p %p stub\n",u,v);
154         return 0;
155 }
156
157 /*************************************************************************
158  * SheChangeDirW [SHELL32.274]
159  *
160  */
161 HRESULT WINAPI SheChangeDirW(LPWSTR u)
162 {       FIXME("(%s),stub\n",debugstr_w(u));
163         return 0;
164 }
165
166 /*************************************************************************
167  * IsNetDrive                   [SHELL32.66]
168  */
169 BOOL WINAPI IsNetDrive(DWORD drive)
170 {
171         char root[4];
172         strcpy(root, "A:\\");
173         root[0] += drive;
174         return (GetDriveTypeA(root) == DRIVE_REMOTE);
175 }