diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index 9f905a489d3..1296bf2d68e 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -412,4 +412,7 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." + END diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index 574a457470c..b1b760a0268 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index 872d56c1887..6505fd53571 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -413,4 +413,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index 7cd64040a97..43a9813e4f5 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index 81f8064dfbd..7c9c5465cc7 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -413,4 +413,6 @@ BEGIN IDS_DRIVE_FIXED "Lokaler Datenträger" IDS_DRIVE_CDROM "CD-Laufwerk" IDS_DRIVE_NETWORK "Netzlaufwerk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 281e22a2b19..d3709a95a06 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/eo-EO.rc b/reactos/dll/win32/shell32/lang/eo-EO.rc index 07025dbf488..afbb008d550 100644 --- a/reactos/dll/win32/shell32/lang/eo-EO.rc +++ b/reactos/dll/win32/shell32/lang/eo-EO.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index ce93043a0c8..7f820812c20 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -413,4 +413,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index 69a43cbd0c8..cc40376cdff 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 7fe5f0c719a..032f0cf0406 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -415,4 +415,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index b83a0701334..9fd89eedfdd 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -415,4 +415,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 18a7b423f68..7aeba5d2957 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -413,4 +413,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index a9d289bc199..3d8e417e9ea 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/ko-KO.rc b/reactos/dll/win32/shell32/lang/ko-KO.rc index 3a87f170a97..89fe2be9475 100644 --- a/reactos/dll/win32/shell32/lang/ko-KO.rc +++ b/reactos/dll/win32/shell32/lang/ko-KO.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/nb-NO.rc b/reactos/dll/win32/shell32/lang/nb-NO.rc index 58627905b3f..9f406eb3843 100644 --- a/reactos/dll/win32/shell32/lang/nb-NO.rc +++ b/reactos/dll/win32/shell32/lang/nb-NO.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index f5e8fde1c57..02c32fbb0ee 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index 14e4d3ae7e6..f61cbc956f7 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -413,4 +413,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index d4fdda90817..bbc9fe84d36 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -414,4 +414,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index e19f23000db..f10b04b4a63 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -414,4 +414,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index 2f450b652ae..f704d747c1c 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -413,4 +413,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 7f5f9ab703f..0e8320bc260 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." END diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 186bc85b8f3..8a7765bc3fc 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Select Program" END diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index a8c70453c6d..ac0603482c1 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Select Program" END diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index 7c4a956823b..e4f46862f6a 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Select Program" END diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index 9e58998c5a0..645db05f57e 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Select Program" END diff --git a/reactos/dll/win32/shell32/lang/wa-WA.rc b/reactos/dll/win32/shell32/lang/wa-WA.rc index 7513de7c999..ef1d78da174 100644 --- a/reactos/dll/win32/shell32/lang/wa-WA.rc +++ b/reactos/dll/win32/shell32/lang/wa-WA.rc @@ -412,4 +412,6 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Select Program" END diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index cc28a4fde60..d49dfa7f1ce 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -413,6 +413,8 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Select Program" END #pragma code_page(default) diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index 8277527d1cd..3654289f737 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -412,6 +412,8 @@ BEGIN IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" IDS_DRIVE_NETWORK "Network Disk" + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Select Program" END #pragma code_page(default) diff --git a/reactos/dll/win32/shell32/she_ocmenu.c b/reactos/dll/win32/shell32/she_ocmenu.c new file mode 100644 index 00000000000..50234e1eb74 --- /dev/null +++ b/reactos/dll/win32/shell32/she_ocmenu.c @@ -0,0 +1,315 @@ +/* + * IContextMenu for items in the shellview + * + * Copyright 1998, 2000 Juergen Schmied + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#define YDEBUG +#include "winerror.h" +#include "wine/debug.h" + +#include "windef.h" +#include "wingdi.h" +#include "pidl.h" +#include "undocshell.h" +#include "shlobj.h" +#include "objbase.h" + +#include "shell32_main.h" +#include "shellfolder.h" +#include "shresdef.h" + +const GUID CLSID_OpenWith = { 0x09799AFB, 0xAD67, 0x11d1, {0xAB,0xCD,0x00,0xC0,0x4F,0xC3,0x09,0x36} }; + +typedef struct +{ + const IContextMenu2Vtbl *lpVtblContextMenu; + const IShellExtInitVtbl *lpvtblShellExtInit; + LONG wId; + volatile LONG ref; +} SHEOWImpl; + + +static const IShellExtInitVtbl eivt; +static const IContextMenu2Vtbl cmvt; +static HRESULT WINAPI SHEOWCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj); +static ULONG WINAPI SHEOWCm_fnRelease(IContextMenu2 *iface); + +HRESULT WINAPI SHEOW_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv) +{ + SHEOWImpl * ow; + HRESULT res; + + ow = LocalAlloc(LMEM_ZEROINIT, sizeof(SHEOWImpl)); + if (!ow) + { + return E_OUTOFMEMORY; + } + + ow->ref = 1; + ow->lpVtblContextMenu = &cmvt; + ow->lpvtblShellExtInit = &eivt; + + TRACE("(%p)->()\n",ow); + + res = SHEOWCm_fnQueryInterface( (IContextMenu2*)&ow->lpVtblContextMenu, riid, ppv ); + SHEOWCm_fnRelease( (IContextMenu2*)&ow->lpVtblContextMenu ); + return res; +} + +static inline SHEOWImpl *impl_from_IShellExtInit( IShellExtInit *iface ) +{ + return (SHEOWImpl *)((char*)iface - FIELD_OFFSET(SHEOWImpl, lpvtblShellExtInit)); +} + +static inline SHEOWImpl *impl_from_IContextMenu( IContextMenu2 *iface ) +{ + return (SHEOWImpl *)((char*)iface - FIELD_OFFSET(SHEOWImpl, lpVtblContextMenu)); +} + +static HRESULT WINAPI SHEOWCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj) +{ + SHEOWImpl *This = impl_from_IContextMenu(iface); + + TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); + + *ppvObj = NULL; + + if(IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IContextMenu) || + IsEqualIID(riid, &IID_IContextMenu2)) + { + *ppvObj = &This->lpVtblContextMenu; + } + else if(IsEqualIID(riid, &IID_IShellExtInit)) + { + *ppvObj = &This->lpvtblShellExtInit; + } + + if(*ppvObj) + { + IUnknown_AddRef((IUnknown*)*ppvObj); + TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI SHEOWCm_fnAddRef(IContextMenu2 *iface) +{ + SHEOWImpl *This = impl_from_IContextMenu(iface); + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(count=%u)\n", This, refCount - 1); + + return refCount; +} + +static ULONG WINAPI SHEOWCm_fnRelease(IContextMenu2 *iface) +{ + SHEOWImpl *This = impl_from_IContextMenu(iface); + ULONG refCount = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(count=%i)\n", This, refCount + 1); + + if (!refCount) + { + TRACE(" destroying IContextMenu(%p)\n",This); + HeapFree(GetProcessHeap(),0,This); + } + return refCount; +} + +static UINT +AddItems(SHEOWImpl *This, HMENU hMenu, UINT idCmdFirst) +{ + UINT count = 0; + MENUITEMINFOW mii; + WCHAR szBuffer[50]; + static const WCHAR szChoose[] = { 'C','h','o','o','s','e',' ','P','r','o','g','r','a','m','.','.','.',0 }; + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + mii.fType = MFT_STRING; + mii.fState = MFS_ENABLED; + mii.wID = idCmdFirst; + + if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH_CHOOSE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR))) + { + ERR("Failed to load string\n"); + wcscpy(szBuffer, szChoose); + } + + mii.dwItemData = (LPWSTR)szBuffer; + if (InsertMenuItemW(hMenu, 0, TRUE, &mii)) + count++; + + return count; +} + + +static HRESULT WINAPI SHEOWCm_fnQueryContextMenu( + IContextMenu2 *iface, + HMENU hmenu, + UINT indexMenu, + UINT idCmdFirst, + UINT idCmdLast, + UINT uFlags) +{ + MENUITEMINFOW mii; + USHORT items = 0; + WCHAR szBuffer[100]; + + HMENU hSubMenu = NULL; + SHEOWImpl *This = impl_from_IContextMenu(iface); + + if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, 100) < 0) + { + TRACE("failed to load string\n"); + return E_FAIL; + } + + + hSubMenu = CreatePopupMenu(); + if (hSubMenu == NULL) + { + ERR("failed to create submenu"); + return E_FAIL; + } + items = AddItems(This, hSubMenu, idCmdFirst); + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + if (hSubMenu) + { + mii.fMask |= MIIM_SUBMENU; + mii.hSubMenu = hSubMenu; + } + mii.dwTypeData = (LPWSTR) szBuffer; + mii.fState = MFS_ENABLED; + mii.wID = idCmdFirst + items; + mii.fType = MFT_STRING; + if (InsertMenuItemW( hmenu, 0, TRUE, &mii)) + items++; + + TRACE("items %x\n",items); + return MAKE_HRESULT(SEVERITY_SUCCESS, 0, items); +} + +static HRESULT WINAPI +SHEOWCm_fnInvokeCommand( IContextMenu2* iface, LPCMINVOKECOMMANDINFO lpici ) +{ + SHEOWImpl *This = impl_from_IContextMenu(iface); + + TRACE("This %p\n", This); + + return E_FAIL; +} + +static HRESULT WINAPI +SHEOWCm_fnGetCommandString( IContextMenu2* iface, UINT_PTR idCmd, UINT uType, + UINT* pwReserved, LPSTR pszName, UINT cchMax ) +{ + SHEOWImpl *This = impl_from_IContextMenu(iface); + + FIXME("%p %lu %u %p %p %u\n", This, + idCmd, uType, pwReserved, pszName, cchMax ); + + return E_NOTIMPL; +} + +static HRESULT WINAPI SHEOWCm_fnHandleMenuMsg( + IContextMenu2 *iface, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + SHEOWImpl *This = impl_from_IContextMenu(iface); + + TRACE("This %p uMsg %x\n",This, uMsg); + + return E_NOTIMPL; +} + +static const IContextMenu2Vtbl cmvt = +{ + SHEOWCm_fnQueryInterface, + SHEOWCm_fnAddRef, + SHEOWCm_fnRelease, + SHEOWCm_fnQueryContextMenu, + SHEOWCm_fnInvokeCommand, + SHEOWCm_fnGetCommandString, + SHEOWCm_fnHandleMenuMsg +}; + +static HRESULT WINAPI +SHEOW_ExtInit_Initialize( IShellExtInit* iface, LPCITEMIDLIST pidlFolder, + IDataObject *pdtobj, HKEY hkeyProgID ) +{ + SHEOWImpl *This = impl_from_IShellExtInit(iface); + + TRACE("This %p\n", This); + + return S_OK; +} + +static ULONG WINAPI SHEOW_ExtInit_AddRef(IShellExtInit *iface) +{ + SHEOWImpl *This = impl_from_IShellExtInit(iface); + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(count=%u)\n", This, refCount - 1); + + return refCount; +} + +static ULONG WINAPI SHEOW_ExtInit_Release(IShellExtInit *iface) +{ + SHEOWImpl *This = impl_from_IShellExtInit(iface); + ULONG refCount = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(count=%i)\n", This, refCount + 1); + + if (!refCount) + { + HeapFree(GetProcessHeap(),0,This); + } + return refCount; +} + +static HRESULT WINAPI +SHEOW_ExtInit_QueryInterface( IShellExtInit* iface, REFIID riid, void** ppvObject ) +{ + SHEOWImpl *This = impl_from_IShellExtInit(iface); + return SHEOWCm_fnQueryInterface((IContextMenu2*)This, riid, ppvObject); +} + +static const IShellExtInitVtbl eivt = +{ + SHEOW_ExtInit_QueryInterface, + SHEOW_ExtInit_AddRef, + SHEOW_ExtInit_Release, + SHEOW_ExtInit_Initialize +}; diff --git a/reactos/dll/win32/shell32/shell32.rbuild b/reactos/dll/win32/shell32/shell32.rbuild index 139aa091811..5d1d442ff33 100644 --- a/reactos/dll/win32/shell32/shell32.rbuild +++ b/reactos/dll/win32/shell32/shell32.rbuild @@ -69,4 +69,5 @@ fprop.c drive.c recyclebin.c + she_ocmenu.c diff --git a/reactos/dll/win32/shell32/shell32_main.h b/reactos/dll/win32/shell32/shell32_main.h index dbd6865e1ad..252266a6502 100644 --- a/reactos/dll/win32/shell32/shell32_main.h +++ b/reactos/dll/win32/shell32/shell32_main.h @@ -100,6 +100,7 @@ HRESULT WINAPI UnixDosFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVO HRESULT WINAPI FolderShortcut_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); HRESULT WINAPI MyDocuments_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); HRESULT WINAPI RecycleBin_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv); +HRESULT WINAPI SHEOW_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv); HRESULT WINAPI ShellFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); extern HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST, LPWSTR, UINT, int*); HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); diff --git a/reactos/dll/win32/shell32/shellole.c b/reactos/dll/win32/shell32/shellole.c index 4ad43a2c080..38a12960cbb 100644 --- a/reactos/dll/win32/shell32/shellole.c +++ b/reactos/dll/win32/shell32/shellole.c @@ -77,6 +77,7 @@ static const struct { #endif {&CLSID_Printers, &ISF_Printers_Constructor}, {&CLSID_RecycleBin, &RecycleBin_Constructor}, + {&CLSID_OpenWith, &SHEOW_Constructor}, {NULL,NULL} }; diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index e2ea79092f9..295069d4e48 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -96,6 +96,8 @@ #define IDS_TRASHMULTIPLE_TEXT 139 #define IDS_CANTTRASH_TEXT 140 #define IDS_OVERWRITEFOLDER_TEXT 141 +#define IDS_OPEN_WITH 142 +#define IDS_OPEN_WITH_CHOOSE 143 /* Note: this string is referenced from the registry*/ #define IDS_RECYCLEBIN_FOLDER_NAME 8964 diff --git a/reactos/dll/win32/shell32/shv_item_cmenu.c b/reactos/dll/win32/shell32/shv_item_cmenu.c index e4867dfaf23..494268c2056 100644 --- a/reactos/dll/win32/shell32/shv_item_cmenu.c +++ b/reactos/dll/win32/shell32/shv_item_cmenu.c @@ -23,7 +23,7 @@ #define COBJMACROS #define NONAMELESSUNION #define NONAMELESSSTRUCT -//#define YDEBUG +#define YDEBUG #include "winerror.h" #include "wine/debug.h" @@ -378,9 +378,10 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu( if(!(uFlags & CMF_EXPLORE)) _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Select", MFS_ENABLED); + TRACE("rfg %x\n", This->rfg); if (This->rfg & SFGAO_BROWSABLE) { - if(This->bAllValues) + if(This->bAllValues) { _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Open", MFS_ENABLED); _InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_EXPLORE, MFT_STRING, "&Explore", MFS_ENABLED); diff --git a/reactos/dll/win32/shell32/undocshell.h b/reactos/dll/win32/shell32/undocshell.h index 2311b3ac0f8..60a11c3ae3f 100644 --- a/reactos/dll/win32/shell32/undocshell.h +++ b/reactos/dll/win32/shell32/undocshell.h @@ -560,6 +560,8 @@ DWORD WINAPI CheckEscapesW(LPWSTR string, DWORD len); /* policy functions */ BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey); +DEFINE_GUID(CLSID_OpenWith, 0x09799AFB, 0xAD67, 0x11d1, 0xAB,0xCD,0x00,0xC0,0x4F,0xC3,0x09,0x36); + #ifdef __cplusplus } /* extern "C" */ #endif /* defined(__cplusplus) */