From ad14fa367a7f569cb7b5a9cc6e2234d31f6e4347 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 6 Jul 2008 08:29:28 +0000 Subject: [PATCH] - implement _ILIsNetHood - don't show OpenWith dialog on network neighbourhoud shell folder - use translatable "open" verb for shelllink's context menu - deactivate shelllink property dialog, it should be implemented using IShellPropSheetExt interface - enumerate context menu handlers also in the progid key - shortcut items now show again the "open" item svn path=/trunk/; revision=34320 --- reactos/dll/win32/shell32/pidl.c | 12 +++++++++ reactos/dll/win32/shell32/pidl.h | 8 +++--- reactos/dll/win32/shell32/she_ocmenu.c | 2 +- reactos/dll/win32/shell32/shelllink.c | 29 ++++++---------------- reactos/dll/win32/shell32/shv_item_cmenu.c | 11 ++++++-- 5 files changed, 33 insertions(+), 29 deletions(-) diff --git a/reactos/dll/win32/shell32/pidl.c b/reactos/dll/win32/shell32/pidl.c index c04127428cd..9cf62ce0d94 100644 --- a/reactos/dll/win32/shell32/pidl.c +++ b/reactos/dll/win32/shell32/pidl.c @@ -1626,6 +1626,18 @@ BOOL _ILIsControlPanel(LPCITEMIDLIST pidl) return FALSE; } +BOOL _ILIsNetHood(LPCITEMIDLIST pidl) +{ + REFIID iid = _ILGetGUIDPointer(pidl); + + TRACE("(%p)\n",pidl); + + if (iid) + return IsEqualIID(iid, &CLSID_NetworkPlaces); + return FALSE; +} + + LPITEMIDLIST _ILCreateNetHood(void) { return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces); diff --git a/reactos/dll/win32/shell32/pidl.h b/reactos/dll/win32/shell32/pidl.h index 61ab80d301d..148d901859d 100644 --- a/reactos/dll/win32/shell32/pidl.h +++ b/reactos/dll/win32/shell32/pidl.h @@ -207,20 +207,20 @@ BOOL _ILIsMyComputer (LPCITEMIDLIST pidl); BOOL _ILIsMyDocuments (LPCITEMIDLIST pidl); BOOL _ILIsControlPanel (LPCITEMIDLIST pidl); BOOL _ILIsBitBucket (LPCITEMIDLIST pidl); +BOOL _ILIsNetHood (LPCITEMIDLIST pidl); BOOL _ILIsDrive (LPCITEMIDLIST pidl); BOOL _ILIsFolder (LPCITEMIDLIST pidl); BOOL _ILIsValue (LPCITEMIDLIST pidl); BOOL _ILIsSpecialFolder (LPCITEMIDLIST pidl); BOOL _ILIsPidlSimple (LPCITEMIDLIST pidl); BOOL _ILIsCPanelStruct (LPCITEMIDLIST pidl); -static inline -BOOL _ILIsEqualSimple (LPCITEMIDLIST pidlA, LPCITEMIDLIST pidlB) +static BOOL __inline _ILIsEqualSimple (LPCITEMIDLIST pidlA, LPCITEMIDLIST pidlB) { return (pidlA->mkid.cb > 0 && !memcmp(pidlA, pidlB, pidlA->mkid.cb)) || (!pidlA->mkid.cb && !pidlB->mkid.cb); } -static inline -BOOL _ILIsEmpty (LPCITEMIDLIST pidl) { return _ILIsDesktop(pidl); } +static +BOOL __inline _ILIsEmpty (LPCITEMIDLIST pidl) { return _ILIsDesktop(pidl); } /* * simple pidls diff --git a/reactos/dll/win32/shell32/she_ocmenu.c b/reactos/dll/win32/shell32/she_ocmenu.c index f9e4d1bc2c6..ec57da1ba77 100644 --- a/reactos/dll/win32/shell32/she_ocmenu.c +++ b/reactos/dll/win32/shell32/she_ocmenu.c @@ -1230,7 +1230,7 @@ SHEOW_LoadOpenWithItems(SHEOWImpl *This, IDataObject *pdtobj) ERR("no mem\n"); return E_OUTOFMEMORY; } - if (_ILIsDesktop(pidl_child) || _ILIsMyDocuments(pidl_child) || _ILIsControlPanel(pidl_child) || + if (_ILIsDesktop(pidl_child) || _ILIsMyDocuments(pidl_child) || _ILIsControlPanel(pidl_child) || _ILIsNetHood(pidl_child) || _ILIsBitBucket(pidl_child) || _ILIsDrive(pidl_child) || _ILIsCPanelStruct(pidl_child) || _ILIsFolder(pidl_child)) { TRACE("pidl is a folder\n"); diff --git a/reactos/dll/win32/shell32/shelllink.c b/reactos/dll/win32/shell32/shelllink.c index 5729ad8c220..28f33869d92 100644 --- a/reactos/dll/win32/shell32/shelllink.c +++ b/reactos/dll/win32/shell32/shelllink.c @@ -163,7 +163,6 @@ typedef struct BOOL bRunAs; BOOL bDirty; INT iIdOpen; /* id of the "Open" entry in the context menu */ - INT iIdProperties; /* id of the "Properties" entry in the context menu */ IUnknown *site; } IShellLinkImpl; @@ -2475,8 +2474,7 @@ ShellLink_QueryContextMenu( IContextMenu* iface, HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags ) { IShellLinkImpl *This = impl_from_IContextMenu(iface); - static WCHAR szOpen[] = { 'O','p','e','n',0 }; - static WCHAR szProperties[] = { 'P','r','o','p','e','r','t','i','e','s',0 }; + WCHAR szOpen[20]; MENUITEMINFOW mii; int id = 1; @@ -2486,6 +2484,11 @@ ShellLink_QueryContextMenu( IContextMenu* iface, HMENU hmenu, UINT indexMenu, if ( !hmenu ) return E_INVALIDARG; + if (!LoadStringW(shell32_hInstance, IDS_OPEN_VERB, szOpen, sizeof(szOpen)/sizeof(WCHAR))) + szOpen[0] = L'\0'; + else + szOpen[(sizeof(szOpen)/sizeof(WCHAR))-1] = L'\0'; + memset( &mii, 0, sizeof(mii) ); mii.cbSize = sizeof (mii); mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; @@ -2498,18 +2501,6 @@ ShellLink_QueryContextMenu( IContextMenu* iface, HMENU hmenu, UINT indexMenu, return E_FAIL; This->iIdOpen = 0; - mii.fState = MFS_ENABLED; - mii.dwTypeData = (LPWSTR)szProperties; - mii.cch = strlenW( mii.dwTypeData ); - mii.wID = idCmdFirst + id++; - if (!InsertMenuItemW( hmenu, idCmdLast, TRUE, &mii )) - { - TRACE("ShellLink_QueryContextMenu failed to insert item properties"); - return E_FAIL; - } - This->iIdProperties = 1; - id++; - return MAKE_HRESULT( SEVERITY_SUCCESS, 0, id ); } @@ -2723,7 +2714,7 @@ SH_ShellLinkDlgProc( * creates a shortcut property dialog */ -static HRESULT WINAPI +HRESULT WINAPI ShellLink_ShowProperties( IShellLinkImpl *This ) { PROPSHEETHEADERW pinfo; @@ -2783,12 +2774,6 @@ ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici ) if ( lpici->cbSize < sizeof (CMINVOKECOMMANDINFO) ) return E_INVALIDARG; - if ( lpici->lpVerb == MAKEINTRESOURCEA(This->iIdProperties)) - { - ShellLink_ShowProperties(This); - return S_OK; - } - if ( lpici->lpVerb != MAKEINTRESOURCEA(This->iIdOpen) ) { ERR("Unknown id %d != %d\n", (INT)lpici->lpVerb, This->iIdOpen ); diff --git a/reactos/dll/win32/shell32/shv_item_cmenu.c b/reactos/dll/win32/shell32/shv_item_cmenu.c index d823fa77a0d..ecabf764aae 100644 --- a/reactos/dll/win32/shell32/shv_item_cmenu.c +++ b/reactos/dll/win32/shell32/shv_item_cmenu.c @@ -304,6 +304,7 @@ SH_LoadContextMenuHandlers(ItemCmImpl *This, IDataObject * pDataObj, HMENU hMenu { UINT i; WCHAR buffer[111]; + WCHAR szProgKey[20]; char ebuf[10]; HRESULT hr; HRESULT hResult; @@ -322,8 +323,6 @@ SH_LoadContextMenuHandlers(ItemCmImpl *This, IDataObject * pDataObj, HMENU hMenu NULL, &bGroupPolicyActive, &dwSize); - - SH_EnumerateDynamicContextHandlerForKey(szAny, This, pDataObj, bGroupPolicyActive); @@ -349,7 +348,15 @@ SH_LoadContextMenuHandlers(ItemCmImpl *This, IDataObject * pDataObj, HMENU hMenu ebuf[0] = L'.'; buffer[0] = L'\0'; if (MultiByteToWideChar(CP_ACP, 0, ebuf, -1, buffer, 111)) + { SH_EnumerateDynamicContextHandlerForKey(buffer, This, pDataObj, bGroupPolicyActive); + dwSize = sizeof(szProgKey); + if (RegGetValueW(HKEY_CLASSES_ROOT, buffer, NULL, RRF_RT_REG_SZ, NULL, szProgKey, &dwSize) == ERROR_SUCCESS) + { + szProgKey[(sizeof(szProgKey)/sizeof(WCHAR))-1] = L'\0'; + SH_EnumerateDynamicContextHandlerForKey(szProgKey, This, pDataObj, bGroupPolicyActive); + } + } } } TRACE("-- done loading\n");