diff --git a/programs/winefile/Cs.rc b/programs/winefile/Cs.rc index 280c2ba4ca3..48997cd8014 100644 --- a/programs/winefile/Cs.rc +++ b/programs/winefile/Cs.rc @@ -31,9 +31,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Soubor" { MENUITEM "&Otevøít\tEnter" , ID_ACTIVATE MENUITEM "Pøe&sunout...\tF7" , ID_FILE_MOVE - MENUITEM "&Kopírovat...\tF8" , 107 + MENUITEM "&Kopírovat...\tF8" , ID_FILE_COPY MENUITEM "&Do schránky...\tF9" , 118 - MENUITEM "&Smazat\tDel" , 108 + MENUITEM "&Smazat\tDel" , ID_FILE_DELETE MENUITEM "Pøejme&novat..." , 109 MENUITEM "Vlastnost&i...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/De.rc b/programs/winefile/De.rc index 4864792ef3d..edb2afa03b8 100644 --- a/programs/winefile/De.rc +++ b/programs/winefile/De.rc @@ -30,9 +30,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Datei" { MENUITEM "Ö&ffnen\tEingabetaste" , ID_ACTIVATE MENUITEM "&Verschieben...\tF7" , ID_FILE_MOVE - MENUITEM "&Kopieren...\tF8" , 107 + MENUITEM "&Kopieren...\tF8" , ID_FILE_COPY MENUITEM "&In Zwischenablage...\tF9" , 118 - MENUITEM "&Löschen\tEntf" , 108 + MENUITEM "&Löschen\tEntf" , ID_FILE_DELETE MENUITEM "&Umbenennen..." , 109 MENUITEM "&Eigenschaften...\tAlt+Eingabetaste" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/En.rc b/programs/winefile/En.rc index 72457f9c8b6..3fa2116e0c2 100644 --- a/programs/winefile/En.rc +++ b/programs/winefile/En.rc @@ -30,9 +30,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&File" { MENUITEM "&Open\tEnter" , ID_ACTIVATE MENUITEM "&Move...\tF7" , ID_FILE_MOVE - MENUITEM "&Copy...\tF8" , 107 + MENUITEM "&Copy...\tF8" , ID_FILE_COPY MENUITEM "&In Clipboard...\tF9" , 118 - MENUITEM "&Delete\tDel" , 108 + MENUITEM "&Delete\tDel" , ID_FILE_DELETE MENUITEM "Re&name..." , 109 MENUITEM "Propert&ies...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Es.rc b/programs/winefile/Es.rc index fb6c70695ef..029e6faf8be 100644 --- a/programs/winefile/Es.rc +++ b/programs/winefile/Es.rc @@ -28,9 +28,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Archivo" { MENUITEM "&Abrir\tEnter" , ID_ACTIVATE MENUITEM "Mo&ver...\tF7" , ID_FILE_MOVE - MENUITEM "&Copiar...\tF8" , 107 + MENUITEM "&Copiar...\tF8" , ID_FILE_COPY MENUITEM "E&n portapapeles...\tF9" , 118 - MENUITEM "&Eliminar\tDel" , 108 + MENUITEM "&Eliminar\tDel" , ID_FILE_DELETE MENUITEM "&Renombrar..." , 109 MENUITEM "&Propiedades...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Fr.rc b/programs/winefile/Fr.rc index b52733227b3..1c3ca055b7b 100644 --- a/programs/winefile/Fr.rc +++ b/programs/winefile/Fr.rc @@ -31,9 +31,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Fichier" { MENUITEM "&Ouvrir\tEntrée" , ID_ACTIVATE MENUITEM "&Déplacer...\tF7" , ID_FILE_MOVE - MENUITEM "&Copier...\tF8" , 107 + MENUITEM "&Copier...\tF8" , ID_FILE_COPY MENUITEM "P&resse-Papiers...\tF9" , 118 - MENUITEM "&Effacer\tDel" , 108 + MENUITEM "&Effacer\tDel" , ID_FILE_DELETE MENUITEM "Re&nommer..." , 109 MENUITEM "&Propriétés...\tAlt+Entree" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Hu.rc b/programs/winefile/Hu.rc index 951f9201e0f..6fc7738172b 100644 --- a/programs/winefile/Hu.rc +++ b/programs/winefile/Hu.rc @@ -31,9 +31,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Fájl" { MENUITEM "&Megynitás\tEnter" , ID_ACTIVATE MENUITEM "Át&helyezés...\tF7" , ID_FILE_MOVE - MENUITEM "&Másolás...\tF8" , 107 + MENUITEM "&Másolás...\tF8" , ID_FILE_COPY MENUITEM "&Vágólapon...\tF9" , 118 - MENUITEM "&Törlés\tDel" , 108 + MENUITEM "&Törlés\tDel" , ID_FILE_DELETE MENUITEM "Át&nevezés..." , 109 MENUITEM "T&ulajdonságok...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/It.rc b/programs/winefile/It.rc index c115ab73ebb..6ea50130f77 100644 --- a/programs/winefile/It.rc +++ b/programs/winefile/It.rc @@ -31,9 +31,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&File" { MENUITEM "&Apri\tInvio" , ID_ACTIVATE MENUITEM "&Sposta...\tF7" , ID_FILE_MOVE - MENUITEM "&Copia...\tF8" , 107 + MENUITEM "&Copia...\tF8" , ID_FILE_COPY MENUITEM "&Negli Appunti...\tF9" , 118 - MENUITEM "&Cancella\tDel" , 108 + MENUITEM "&Cancella\tDel" , ID_FILE_DELETE MENUITEM "Ri&nomina..." , 109 MENUITEM "Propri&età...\tAlt+Invio" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Nl.rc b/programs/winefile/Nl.rc index 4fe8b3b4098..26d24dd6073 100644 --- a/programs/winefile/Nl.rc +++ b/programs/winefile/Nl.rc @@ -27,9 +27,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Bestand" { MENUITEM "&Openen\tEnter" , ID_ACTIVATE MENUITEM "&Verplaatsen...\tF7" , ID_FILE_MOVE - MENUITEM "&Kopiëren...\tF8" , 107 + MENUITEM "&Kopiëren...\tF8" , ID_FILE_COPY MENUITEM "Naar &klembord...\tF9" , 118 - MENUITEM "Ver&wijderen\tDel" , 108 + MENUITEM "Ver&wijderen\tDel" , ID_FILE_DELETE MENUITEM "&Naam wijzigen..." , 109 MENUITEM "&Eigenschappen...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Pl.rc b/programs/winefile/Pl.rc index 8db5aa47e20..9274a9457db 100644 --- a/programs/winefile/Pl.rc +++ b/programs/winefile/Pl.rc @@ -31,9 +31,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Plik" { MENUITEM "&Otwórz\tEnter" , ID_ACTIVATE MENUITEM "&Przenieœ...\tF7" , ID_FILE_MOVE - MENUITEM "&Kopiuj...\tF8" , 107 + MENUITEM "&Kopiuj...\tF8" , ID_FILE_COPY MENUITEM "W s&chowku...\tF9" , 118 - MENUITEM "&Usuñ\tDel" , 108 + MENUITEM "&Usuñ\tDel" , ID_FILE_DELETE MENUITEM "&Zmieñ nazwê..." , 109 MENUITEM "Ustawie&nia...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Pt.rc b/programs/winefile/Pt.rc index 5ed5054326a..bf15f1930d5 100644 --- a/programs/winefile/Pt.rc +++ b/programs/winefile/Pt.rc @@ -30,9 +30,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Arquivo" { MENUITEM "A&brir\tEnter" , ID_ACTIVATE MENUITEM "&Mover...\tF7" , ID_FILE_MOVE - MENUITEM "&Copiar...\tF8" , 107 + MENUITEM "&Copiar...\tF8" , ID_FILE_COPY MENUITEM "&In Clipboard...\tF9" , 118 - MENUITEM "E&xcluir\tDel" , 108 + MENUITEM "E&xcluir\tDel" , ID_FILE_DELETE MENUITEM "Re&nomear..." , 109 MENUITEM "&Propriedades...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR @@ -157,9 +157,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Ficheiro" { MENUITEM "A&brir\tEnter" , ID_ACTIVATE MENUITEM "&Mover...\tF7" , ID_FILE_MOVE - MENUITEM "&Copiar...\tF8" , 107 + MENUITEM "&Copiar...\tF8" , ID_FILE_COPY MENUITEM "&Na Area de Transferencia...\tF9" , 118 - MENUITEM "E&xcluir\tDel" , 108 + MENUITEM "E&xcluir\tDel" , ID_FILE_DELETE MENUITEM "Re&nomear..." , 109 MENUITEM "&Propriedades...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Ru.rc b/programs/winefile/Ru.rc index 0e2cddac65b..0bcbdb699db 100644 --- a/programs/winefile/Ru.rc +++ b/programs/winefile/Ru.rc @@ -27,9 +27,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Ôàéë" { MENUITEM "&Îòêðûòü\tEnter" , ID_ACTIVATE MENUITEM "&Ïåðåìåñòèòü...\tF7" , ID_FILE_MOVE - MENUITEM "&Êîïèðîâàòü...\tF8" , 107 + MENUITEM "&Êîïèðîâàòü...\tF8" , ID_FILE_COPY MENUITEM "& áóôåð îáìåíà...\tF9" , 118 - MENUITEM "&Óäàëèòü\tDel" , 108 + MENUITEM "&Óäàëèòü\tDel" , ID_FILE_DELETE MENUITEM "Ïåðåèìåíîâàòü..." , 109 MENUITEM "Ñâîéñòâà...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Si.rc b/programs/winefile/Si.rc index f8f4a54fe86..c69b46c8ce1 100644 --- a/programs/winefile/Si.rc +++ b/programs/winefile/Si.rc @@ -28,9 +28,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&File" { MENUITEM "&Open\tEnter" , ID_ACTIVATE MENUITEM "&Move...\tF7" , ID_FILE_MOVE - MENUITEM "&Copy...\tF8" , 107 + MENUITEM "&Copy...\tF8" , ID_FILE_COPY MENUITEM "&In Clipboard...\tF9" , 118 - MENUITEM "&Delete\tDel" , 108 + MENUITEM "&Delete\tDel" , ID_FILE_DELETE MENUITEM "Re&name..." , 109 MENUITEM "Propert&ies...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Sv.rc b/programs/winefile/Sv.rc index dfab1d4b8b5..ec22c2027bc 100644 --- a/programs/winefile/Sv.rc +++ b/programs/winefile/Sv.rc @@ -31,9 +31,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Arkiv" { MENUITEM "&Öppna\tEnter", ID_ACTIVATE MENUITEM "&Flytta...\tF7", ID_FILE_MOVE - MENUITEM "&Kopiera...\tF8", 107 + MENUITEM "&Kopiera...\tF8", ID_FILE_COPY MENUITEM "&I urklipp...\tF9", 118 - MENUITEM "&Ta bort\tDel", 108 + MENUITEM "&Ta bort\tDel", ID_FILE_DELETE MENUITEM "&Byt namn...", 109 MENUITEM "&Egenskaper...\tAlt+Enter", ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/Zh.rc b/programs/winefile/Zh.rc index 25dc30e708b..83fb58e89b0 100644 --- a/programs/winefile/Zh.rc +++ b/programs/winefile/Zh.rc @@ -28,9 +28,9 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "Îļþ£¨&F£©" { MENUITEM "´ò¿ª£¨&O£©\tEnter" , ID_ACTIVATE MENUITEM "Òƶ¯£¨&M£©...\tF7" , ID_FILE_MOVE - MENUITEM "¸´ÖÆ£¨&C£©...\tF8" , 107 + MENUITEM "¸´ÖÆ£¨&C£©...\tF8" , ID_FILE_COPY MENUITEM "λÓÚ¼ôÌù°å£¨&I£©...\tF9" , 118 - MENUITEM "ɾ³ý£¨&D£©\tDel" , 108 + MENUITEM "ɾ³ý£¨&D£©\tDel" , ID_FILE_DELETE MENUITEM "¸ÄÃû£¨&N£©..." , 109 MENUITEM "ÊôÐÔ£¨&I£©...\tAlt+Enter" , ID_EDIT_PROPERTIES MENUITEM SEPARATOR diff --git a/programs/winefile/resource.h b/programs/winefile/resource.h index 5faf1e8c148..c8239d2ae60 100644 --- a/programs/winefile/resource.h +++ b/programs/winefile/resource.h @@ -41,6 +41,8 @@ #define ID_ACTIVATE 101 #define ID_EXECUTE 105 #define ID_FILE_MOVE 106 +#define ID_FILE_COPY 107 +#define ID_FILE_DELETE 108 #define ID_FILE_EXIT 115 #define ID_FORMAT_DISK 203 #define ID_CONNECT_NETWORK_DRIVE 252 diff --git a/programs/winefile/resource.rc b/programs/winefile/resource.rc index 674cde22d8f..ae5bc41accc 100644 --- a/programs/winefile/resource.rc +++ b/programs/winefile/resource.rc @@ -21,6 +21,8 @@ IDA_WINEFILE ACCELERATORS DISCARDABLE VK_F1, ID_HELP, VIRTKEY, NOINVERT VK_F5, ID_REFRESH, VIRTKEY, NOINVERT VK_F7, ID_FILE_MOVE, VIRTKEY, NOINVERT + VK_F8, ID_FILE_COPY, VIRTKEY, NOINVERT + VK_DELETE, ID_FILE_DELETE, VIRTKEY, NOINVERT VK_RETURN, ID_ACTIVATE, VIRTKEY, NOINVERT #ifndef _NO_EXTENSIONS "X", ID_FILE_EXIT, VIRTKEY, ALT, NOINVERT diff --git a/programs/winefile/winefile.c b/programs/winefile/winefile.c index 8687f5d9185..3b93796d72d 100644 --- a/programs/winefile/winefile.c +++ b/programs/winefile/winefile.c @@ -3747,6 +3747,55 @@ static void update_view_menu(ChildWnd* child) } +static BOOL is_directory(LPCTSTR target) +{ + /*TODO correctly handle UNIX paths */ + DWORD target_attr = GetFileAttributes(target); + + if (target_attr == INVALID_FILE_ATTRIBUTES) + return FALSE; + + return target_attr&FILE_ATTRIBUTE_DIRECTORY? TRUE: FALSE; +} + +static BOOL prompt_target(Pane* pane, LPTSTR source, LPTSTR target) +{ + TCHAR path[MAX_PATH]; + int len; + + get_path(pane->cur, path); + + if (DialogBoxParam(Globals.hInstance, MAKEINTRESOURCE(IDD_SELECT_DESTINATION), pane->hwnd, DestinationDlgProc, (LPARAM)path) != IDOK) + return FALSE; + + get_path(pane->cur, source); + + /* convert relative targets to absolute paths */ + if (path[0]!='/' && path[1]!=':') { + get_path(pane->cur->up, target); + len = lstrlen(target); + + if (target[len-1]!='\\' && target[len-1]!='/') + target[len++] = '/'; + + lstrcpy(target+len, path); + } else + lstrcpy(target, path); + + /* If the target already exists as directory, create a new target below this. */ + if (is_directory(path)) { + TCHAR fname[_MAX_FNAME], ext[_MAX_EXT]; + const static TCHAR sAppend[] = {'%','s','/','%','s','%','s','\0'}; + + _tsplitpath(source, NULL, NULL, fname, ext); + + wsprintf(target, sAppend, path, fname, ext); + } + + return TRUE; +} + + static IContextMenu2* s_pctxmenu2 = NULL; static IContextMenu3* s_pctxmenu3 = NULL; @@ -4023,39 +4072,43 @@ LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam break; case ID_FILE_MOVE: { - TCHAR new_name[BUFFER_LEN], old_name[BUFFER_LEN]; - int len, ret; + TCHAR source[BUFFER_LEN], target[BUFFER_LEN]; - get_path(pane->cur, new_name); + if (prompt_target(pane, source, target)) { + SHFILEOPSTRUCT shfo = {hwnd, FO_MOVE, source, target}; - ret = DialogBoxParam(Globals.hInstance, MAKEINTRESOURCE(IDD_SELECT_DESTINATION), hwnd, DestinationDlgProc, (LPARAM)new_name); - if (ret != IDOK) - break; + source[lstrlen(source)+1] = '\0'; + target[lstrlen(target)+1] = '\0'; - if (new_name[0]!='/' && new_name[1]!=':') { - get_path(pane->cur->up, old_name); - len = lstrlen(old_name); - - if (old_name[len-1]!='\\' && old_name[len-1]!='/') - old_name[len++] = '/'; - - lstrcpy(old_name+len, new_name); - lstrcpy(new_name, old_name); - } - - get_path(pane->cur, old_name); - - if (MoveFileEx(old_name, new_name, MOVEFILE_COPY_ALLOWED)) { - if (pane->treePane) { - pane->root->scanned = FALSE; - pane->cur = pane->root; - activate_entry(child, pane, hwnd); - } - else + if (!SHFileOperation(&shfo)) refresh_child(child); } - else - display_error(hwnd, GetLastError()); + break;} + + case ID_FILE_COPY: { + TCHAR source[BUFFER_LEN], target[BUFFER_LEN]; + + if (prompt_target(pane, source, target)) { + SHFILEOPSTRUCT shfo = {hwnd, FO_COPY, source, target}; + + source[lstrlen(source)+1] = '\0'; + target[lstrlen(target)+1] = '\0'; + + if (!SHFileOperation(&shfo)) + refresh_child(child); + } + break;} + + case ID_FILE_DELETE: { + TCHAR path[BUFFER_LEN]; + SHFILEOPSTRUCT shfo = {hwnd, FO_DELETE, path}; + + get_path(pane->cur, path); + + path[lstrlen(path)+1] = '\0'; + + if (!SHFileOperation(&shfo)) + refresh_child(child); break;} case ID_VIEW_SORT_NAME: