diff --git a/dll/win32/shell32/CDefaultContextMenu.cpp b/dll/win32/shell32/CDefaultContextMenu.cpp index 2ff69ed2e6e..41713d04841 100644 --- a/dll/win32/shell32/CDefaultContextMenu.cpp +++ b/dll/win32/shell32/CDefaultContextMenu.cpp @@ -80,6 +80,16 @@ static const struct _StaticInvokeCommandMap_ { "moveto", FCIDM_SHVIEW_MOVETO }, }; +UINT MapVerbToDfmCmd(_In_ LPCSTR verba) +{ + for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); ++i) + { + if (!lstrcmpiA(g_StaticInvokeCmdMap[i].szStringVerb, verba)) + return (int)g_StaticInvokeCmdMap[i].DfmCmd; + } + return 0; +} + class CDefaultContextMenu : public CComObjectRootEx, public IContextMenu3, diff --git a/dll/win32/shell32/brfolder.cpp b/dll/win32/shell32/brfolder.cpp index a4261cdfa1e..0d3153de4fd 100644 --- a/dll/win32/shell32/brfolder.cpp +++ b/dll/win32/shell32/brfolder.cpp @@ -25,6 +25,7 @@ struct BrFolder LAYOUT_DATA* layout; // Filled by LayoutInit, used by LayoutUpdate SIZE szMin; ULONG hChangeNotify; // Change notification handle + IContextMenu* pContextMenu; // Active context menu }; struct BrItemData @@ -811,6 +812,87 @@ BrFolder_OnCommand(BrFolder *info, UINT id) } } +static void +GetTreeViewItemContextMenuPos(HWND hWnd, HTREEITEM hItem, POINT *ppt) +{ + RECT rc; + if (TreeView_GetItemRect(hWnd, hItem, &rc, TRUE)) + { + ppt->x = (rc.left + rc.right) / 2; + ppt->y = (rc.top + rc.bottom) / 2; + } + ClientToScreen(hWnd, ppt); +} + +static void +BrFolder_OnContextMenu(BrFolder &info, LPARAM lParam) +{ + enum { IDC_TOGGLE = 1, ID_FIRSTCMD, ID_LASTCMD = 0xffff }; + HTREEITEM hSelected = TreeView_GetSelection(info.hwndTreeView); + CMINVOKECOMMANDINFOEX ici = { sizeof(ici), CMIC_MASK_PTINVOKE, info.hWnd }; + ici.fMask |= (GetKeyState(VK_SHIFT) < 0) ? CMIC_MASK_SHIFT_DOWN : 0; + ici.fMask |= (GetKeyState(VK_CONTROL) < 0) ? CMIC_MASK_CONTROL_DOWN : 0; + ici.nShow = SW_SHOW; + ici.ptInvoke.x = GET_X_LPARAM(lParam); + ici.ptInvoke.y = GET_Y_LPARAM(lParam); + if ((int)lParam == -1) // Keyboard + { + GetTreeViewItemContextMenuPos(info.hwndTreeView, hSelected, &ici.ptInvoke); + } + else // Get correct item for right-click on not current item + { + TVHITTESTINFO hti = { ici.ptInvoke }; + ScreenToClient(info.hwndTreeView, &hti.pt); + hSelected = TreeView_HitTest(info.hwndTreeView, &hti); + } + BrItemData *item = BrFolder_GetItemData(&info, hSelected); + if (!item) + return; // Not on an item + + TV_ITEM tvi; + tvi.mask = TVIF_STATE | TVIF_CHILDREN; + tvi.stateMask = TVIS_EXPANDED; + tvi.hItem = hSelected; + TreeView_GetItem(info.hwndTreeView, &tvi); + + CComPtr pcm; + HRESULT hr = item->lpsfParent->GetUIObjectOf(info.hWnd, 1, &item->pidlChild, + IID_IContextMenu, NULL, (void**)&pcm); + if (FAILED(hr)) + return; + + HMENU hMenu = CreatePopupMenu(); + if (!hMenu) + return; + info.pContextMenu = pcm; + UINT cmf = ((ici.fMask & CMIC_MASK_SHIFT_DOWN) ? CMF_EXTENDEDVERBS : 0) | CMF_CANRENAME; + hr = pcm->QueryContextMenu(hMenu, 0, ID_FIRSTCMD, ID_LASTCMD, CMF_NODEFAULT | cmf); + if (hr > 0) + _InsertMenuItemW(hMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, 0); + _InsertMenuItemW(hMenu, 0, TRUE, IDC_TOGGLE, MFT_STRING, + MAKEINTRESOURCEW((tvi.state & TVIS_EXPANDED) ? IDS_COLLAPSE : IDS_EXPAND), + MFS_DEFAULT | (tvi.cChildren ? 0 : MFS_GRAYED)); + + UINT cmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, ici.ptInvoke.x, ici.ptInvoke.y, info.hWnd, NULL); + ici.lpVerb = MAKEINTRESOURCEA(cmd - ID_FIRSTCMD); + if (cmd == IDC_TOGGLE) + { + TreeView_SelectItem(info.hwndTreeView, hSelected); + TreeView_Expand(info.hwndTreeView, hSelected, TVE_TOGGLE); + } + else if (cmd != 0 && GetDfmCmd(pcm, ici.lpVerb) == DFM_CMD_RENAME) + { + TreeView_SelectItem(info.hwndTreeView, hSelected); + TreeView_EditLabel(info.hwndTreeView, hSelected); + } + else if (cmd != 0) + { + pcm->InvokeCommand((CMINVOKECOMMANDINFO*)&ici); + } + info.pContextMenu = NULL; + DestroyMenu(hMenu); +} + static BOOL BrFolder_OnSetExpandedPidl(BrFolder *info, LPITEMIDLIST pidlSelection, HTREEITEM *phItem) { @@ -1040,6 +1122,17 @@ BrFolderDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) if (!info) return 0; + if (info->pContextMenu) + { + LRESULT result; + if (SHForwardContextMenuMsg(info->pContextMenu, uMsg, wParam, + lParam, &result, TRUE) == S_OK) + { + SetWindowLongPtr(hWnd, DWLP_MSGRESULT, result); + return TRUE; + } + } + switch (uMsg) { case WM_NOTIFY: @@ -1050,6 +1143,11 @@ BrFolderDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) BrFolder_OnCommand(info, wParam); break; + case WM_CONTEXTMENU: + if (info->hwndTreeView == (HWND)wParam) + BrFolder_OnContextMenu(*info, lParam); + break; + case WM_GETMINMAXINFO: ((LPMINMAXINFO)lParam)->ptMinTrackSize.x = info->szMin.cx; ((LPMINMAXINFO)lParam)->ptMinTrackSize.y = info->szMin.cy; diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc index 505bba3260b..387bb5a76d5 100644 --- a/dll/win32/shell32/lang/bg-BG.rc +++ b/dll/win32/shell32/lang/bg-BG.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Папка" IDS_BAT_FILE "Пакетен файл на РеактОС" diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc index d35fc0caceb..114d0a182b6 100644 --- a/dll/win32/shell32/lang/ca-ES.rc +++ b/dll/win32/shell32/lang/ca-ES.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc index 190f636390b..47df228a9c6 100644 --- a/dll/win32/shell32/lang/cs-CZ.rc +++ b/dll/win32/shell32/lang/cs-CZ.rc @@ -933,6 +933,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Složka" IDS_BAT_FILE "ReactOS dávkový soubor" diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc index 7028ded7f1a..20f2a3867ea 100644 --- a/dll/win32/shell32/lang/da-DK.rc +++ b/dll/win32/shell32/lang/da-DK.rc @@ -932,6 +932,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc index 91e67e50894..d7f7338fbc9 100644 --- a/dll/win32/shell32/lang/de-DE.rc +++ b/dll/win32/shell32/lang/de-DE.rc @@ -926,6 +926,9 @@ BEGIN IDS_CANTDISCONNECT "Trennen nicht möglich (Fehlercode: %lu)." IDS_NONE "(Leer)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Dateiordner" IDS_BAT_FILE "ReactOS-Stapelverarbeitungsdatei" diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc index 11b21b58cd5..a663c0de293 100644 --- a/dll/win32/shell32/lang/el-GR.rc +++ b/dll/win32/shell32/lang/el-GR.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc index ed70dde70fa..5b9ee76b12a 100644 --- a/dll/win32/shell32/lang/en-GB.rc +++ b/dll/win32/shell32/lang/en-GB.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc index 6880ab57b71..efd300fd5e4 100644 --- a/dll/win32/shell32/lang/en-US.rc +++ b/dll/win32/shell32/lang/en-US.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc index 3c35f26257d..fbba465e7e9 100644 --- a/dll/win32/shell32/lang/es-ES.rc +++ b/dll/win32/shell32/lang/es-ES.rc @@ -934,6 +934,9 @@ BEGIN IDS_CANTDISCONNECT "No se pudo desconectar (Código de Error: %lu)." IDS_NONE "(Nada)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Directorio" IDS_BAT_FILE "Archivo por lotes de ReactOS" diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc index 9a75b9d7a0b..d825c40cdf7 100644 --- a/dll/win32/shell32/lang/et-EE.rc +++ b/dll/win32/shell32/lang/et-EE.rc @@ -932,6 +932,9 @@ BEGIN IDS_CANTDISCONNECT "Ei saa lahti ühendada (Veateade: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Kaust" IDS_BAT_FILE "ReactOS Batch Fail" diff --git a/dll/win32/shell32/lang/eu-ES.rc b/dll/win32/shell32/lang/eu-ES.rc index cb366cfab5c..f34731762f3 100644 --- a/dll/win32/shell32/lang/eu-ES.rc +++ b/dll/win32/shell32/lang/eu-ES.rc @@ -930,6 +930,9 @@ BEGIN IDS_CANTDISCONNECT "Ezin izan da deskonektatu (Error kodea: %lu)." IDS_NONE "(Ezer)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Direktorioa" IDS_BAT_FILE "ReactOS lote fitxaetgiak" diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc index f26da848e18..866ee162ef2 100644 --- a/dll/win32/shell32/lang/fi-FI.rc +++ b/dll/win32/shell32/lang/fi-FI.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc index edd1652a010..f4267dc30fe 100644 --- a/dll/win32/shell32/lang/fr-FR.rc +++ b/dll/win32/shell32/lang/fr-FR.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Impossible de déconnecter (code d'erreur : %lu)." IDS_NONE "(aucun)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Dossier" IDS_BAT_FILE "Fichier Batch ReactOS" diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc index 623a2693c48..45f82ca67fc 100644 --- a/dll/win32/shell32/lang/he-IL.rc +++ b/dll/win32/shell32/lang/he-IL.rc @@ -932,6 +932,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "תיקיה" IDS_BAT_FILE "קובת אצווה של ReactOS" diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc index a5c95cef5fc..90f0d25a342 100644 --- a/dll/win32/shell32/lang/hi-IN.rc +++ b/dll/win32/shell32/lang/hi-IN.rc @@ -927,6 +927,9 @@ BEGIN IDS_CANTDISCONNECT "डिस्कनेक्ट करने में असमर्थ (एरर कोड: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "फोल्डर" IDS_BAT_FILE "रिऐक्ट ओएस बैच फ़ाइल" diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc index 0ded8502b42..25af1574572 100644 --- a/dll/win32/shell32/lang/hu-HU.rc +++ b/dll/win32/shell32/lang/hu-HU.rc @@ -924,6 +924,9 @@ BEGIN IDS_CANTDISCONNECT "Nem sikerült a szétkapcsolódás (hibakód: %lu)." IDS_NONE "(Nincs)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Mappa" IDS_BAT_FILE "ReactOS kötegfájl" diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc index 38728a8473a..507e5eb2e26 100644 --- a/dll/win32/shell32/lang/id-ID.rc +++ b/dll/win32/shell32/lang/id-ID.rc @@ -922,6 +922,9 @@ BEGIN IDS_CANTDISCONNECT "Tidak bisa memutuskan (Kode Kesalahan: %lu)." IDS_NONE "(Tidak ada)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "Berkas Batch ReactOS" diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc index 3b519aba359..6fc9440db70 100644 --- a/dll/win32/shell32/lang/it-IT.rc +++ b/dll/win32/shell32/lang/it-IT.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Cartella" IDS_BAT_FILE "File Batch ReactOS" diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc index bcd43cbab39..9ae28cebd6a 100644 --- a/dll/win32/shell32/lang/ja-JP.rc +++ b/dll/win32/shell32/lang/ja-JP.rc @@ -922,6 +922,9 @@ BEGIN IDS_CANTDISCONNECT "接続を切れませんでした (エラーコード: %lu)." IDS_NONE "(なし)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "フォルダ" IDS_BAT_FILE "ReactOS バッチ ファイル" diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc index abcfde21924..55bc95117c2 100644 --- a/dll/win32/shell32/lang/ko-KR.rc +++ b/dll/win32/shell32/lang/ko-KR.rc @@ -932,6 +932,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "폴더" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc index ac2e0453ec8..45ecddd3e60 100644 --- a/dll/win32/shell32/lang/nl-NL.rc +++ b/dll/win32/shell32/lang/nl-NL.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc index a0385a8a166..6d0434ee5a9 100644 --- a/dll/win32/shell32/lang/no-NO.rc +++ b/dll/win32/shell32/lang/no-NO.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Mappe" IDS_BAT_FILE "ReactOS Batch fil" diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc index 7574e5ead78..75aaabcb711 100644 --- a/dll/win32/shell32/lang/pl-PL.rc +++ b/dll/win32/shell32/lang/pl-PL.rc @@ -934,6 +934,9 @@ BEGIN IDS_CANTDISCONNECT "Nie można odłączyć (kod błędu: %lu)." IDS_NONE "(brak)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "Plik wsadowy ReactOS" diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc index d8a7bbbabf8..11423afaccf 100644 --- a/dll/win32/shell32/lang/pt-BR.rc +++ b/dll/win32/shell32/lang/pt-BR.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Pasta" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc index 9e587567656..d5fe2800bd6 100644 --- a/dll/win32/shell32/lang/pt-PT.rc +++ b/dll/win32/shell32/lang/pt-PT.rc @@ -924,6 +924,9 @@ BEGIN IDS_CANTDISCONNECT "Não foi possível desconectar (Código de erro: %lu)." IDS_NONE "(Nenhum)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Pasta" IDS_BAT_FILE "Ficheiro em lote do ReactOS" diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc index 9859a790d67..a882e4ccc17 100644 --- a/dll/win32/shell32/lang/ro-RO.rc +++ b/dll/win32/shell32/lang/ro-RO.rc @@ -933,6 +933,9 @@ BEGIN IDS_CANTDISCONNECT "Imposibil de deconectat (Cod de eroare: %lu)." IDS_NONE "(Nimic)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "Fişier de comenzi ReactOS" diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc index b26e1485cb6..c227b678238 100644 --- a/dll/win32/shell32/lang/ru-RU.rc +++ b/dll/win32/shell32/lang/ru-RU.rc @@ -934,6 +934,9 @@ BEGIN IDS_CANTDISCONNECT "Не удалось отсоединить сетевой диск (код ошибки: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Папка с файлами" IDS_BAT_FILE "Пакетный файл ReactOS" diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc index 9f54c0ec418..148c67b58d8 100644 --- a/dll/win32/shell32/lang/sk-SK.rc +++ b/dll/win32/shell32/lang/sk-SK.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Priečinok" IDS_BAT_FILE "Dávkový súbor systému ReactOS" diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc index 56e3240ff21..b3fcc4c1d52 100644 --- a/dll/win32/shell32/lang/sl-SI.rc +++ b/dll/win32/shell32/lang/sl-SI.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Folder" IDS_BAT_FILE "ReactOS Batch File" diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc index e4bd48772ed..59952ec4815 100644 --- a/dll/win32/shell32/lang/sq-AL.rc +++ b/dll/win32/shell32/lang/sq-AL.rc @@ -932,6 +932,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Dosje" IDS_BAT_FILE "ReactOS Dokument Batch" diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc index 62008c23d04..b813039a51f 100644 --- a/dll/win32/shell32/lang/sv-SE.rc +++ b/dll/win32/shell32/lang/sv-SE.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Mapp" IDS_BAT_FILE "ReactOS Batch-fil" diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc index b3c5b257bff..b10c4238890 100644 --- a/dll/win32/shell32/lang/tr-TR.rc +++ b/dll/win32/shell32/lang/tr-TR.rc @@ -934,6 +934,9 @@ BEGIN IDS_CANTDISCONNECT "Bağlanılamıyor (Hata Kodu: %lu)." IDS_NONE "(Hiçbir Şey)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Dizin" IDS_BAT_FILE "ReactOS Toplu İş Dosyası" diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc index e468241cc93..5393f02c93f 100644 --- a/dll/win32/shell32/lang/uk-UA.rc +++ b/dll/win32/shell32/lang/uk-UA.rc @@ -925,6 +925,9 @@ BEGIN IDS_CANTDISCONNECT "Не вдалось відключити (код помилки: %lu)." IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "Папка" IDS_BAT_FILE "Пакетний файл ReactOS" diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc index 5f2de02e4b7..056ecf8e0ac 100644 --- a/dll/win32/shell32/lang/zh-CN.rc +++ b/dll/win32/shell32/lang/zh-CN.rc @@ -935,6 +935,9 @@ BEGIN IDS_CANTDISCONNECT "无法断开连接(错误代码:%lu)。" IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "文件夹" IDS_BAT_FILE "ReactOS 批处理文件" diff --git a/dll/win32/shell32/lang/zh-HK.rc b/dll/win32/shell32/lang/zh-HK.rc index 07ef4edf3ff..7aca1595e73 100644 --- a/dll/win32/shell32/lang/zh-HK.rc +++ b/dll/win32/shell32/lang/zh-HK.rc @@ -933,6 +933,9 @@ BEGIN IDS_CANTDISCONNECT "無法中斷(錯誤碼:%lu)。" IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "資料夾" IDS_BAT_FILE "ReactOS 批次文件" diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc index 76324759361..03b6d36765d 100644 --- a/dll/win32/shell32/lang/zh-TW.rc +++ b/dll/win32/shell32/lang/zh-TW.rc @@ -934,6 +934,9 @@ BEGIN IDS_CANTDISCONNECT "無法中斷。(錯誤碼:%lu)" IDS_NONE "(None)" + IDS_EXPAND "Exp&and" + IDS_COLLAPSE "Coll&apse" + /* Friendly File Type Names */ IDS_DIRECTORY "資料夾" IDS_BAT_FILE "ReactOS 批次文件" diff --git a/dll/win32/shell32/precomp.h b/dll/win32/shell32/precomp.h index 2669d3ca6c7..cd53f7f3f58 100644 --- a/dll/win32/shell32/precomp.h +++ b/dll/win32/shell32/precomp.h @@ -146,6 +146,10 @@ HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj); HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg); +UINT +MapVerbToDfmCmd(_In_ LPCSTR verba); +UINT +GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba); #define SHELL_ExecuteControlPanelCPL(hwnd, cpl) SHRunControlPanel((cpl), (hwnd)) // CStubWindow32 --- The owner window of file property sheets. diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index d4ed42192a0..1dd081fcf8e 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -153,6 +153,9 @@ #define IDS_CANTDISCONNECT 160 #define IDS_NONE 161 +#define IDS_EXPAND 170 +#define IDS_COLLAPSE 171 + /* Friendly File Type Names */ #define IDS_DIRECTORY 200 #define IDS_BAT_FILE 201 diff --git a/dll/win32/shell32/utils.cpp b/dll/win32/shell32/utils.cpp index 3ae442789ac..d7238aad86c 100644 --- a/dll/win32/shell32/utils.cpp +++ b/dll/win32/shell32/utils.cpp @@ -1294,3 +1294,30 @@ SHGetRealIDL( return hr; } + +static HRESULT +GetCommandStringA(_In_ IContextMenu *pCM, _In_ UINT_PTR Id, _In_ UINT GCS, _Out_writes_(cchMax) LPSTR Buf, _In_ UINT cchMax) +{ + HRESULT hr = pCM->GetCommandString(Id, GCS & ~GCS_UNICODE, NULL, Buf, cchMax); + if (FAILED(hr)) + { + WCHAR buf[MAX_PATH]; + hr = pCM->GetCommandString(Id, GCS | GCS_UNICODE, NULL, (LPSTR)buf, _countof(buf)); + if (SUCCEEDED(hr)) + hr = SHUnicodeToAnsi(buf, Buf, cchMax) > 0 ? S_OK : E_FAIL; + } + return hr; +} + +UINT +GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba) +{ + CHAR buf[MAX_PATH]; + if (IS_INTRESOURCE(verba)) + { + if (FAILED(GetCommandStringA(pCM, LOWORD(verba), GCS_VERB, buf, _countof(buf)))) + return 0; + verba = buf; + } + return MapVerbToDfmCmd(verba); // Returns DFM_CMD_* or 0 +}