- dont show Open With shell extension when a selected item is a folder or a shortcut

- add the "explore" verb only if folder has a subfolder
- always add open verb

svn path=/trunk/; revision=30037
This commit is contained in:
Johannes Anderwald 2007-11-01 13:33:18 +00:00
parent 1308d46688
commit a2e44a6af1
2 changed files with 33 additions and 17 deletions

View file

@ -23,7 +23,7 @@
#define COBJMACROS
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
//#define YDEBUG
#define YDEBUG
#include "winerror.h"
#include "wine/debug.h"
@ -588,6 +588,7 @@ SHEOW_LoadOpenWithItems(SHEOWImpl *This, IDataObject *pdtobj)
LPCITEMIDLIST pidl;
WCHAR szPath[MAX_PATH];
LPWSTR szPtr;
static const WCHAR szShortCut[] = { '.','l','n','k', 0 };
fmt.cfFormat = RegisterClipboardFormatA(CFSTR_SHELLIDLIST);
fmt.ptd = NULL;
@ -619,11 +620,18 @@ SHEOW_LoadOpenWithItems(SHEOWImpl *This, IDataObject *pdtobj)
ERR("no mem\n");
return E_OUTOFMEMORY;
}
if (_ILIsFolder(pidl_child))
{
TRACE("pidl is a folder\n");
SHFree(pidl);
return E_FAIL;
}
if (!SHGetPathFromIDListW(pidl, szPath))
{
SHFree(pidl);
ERR("SHGetPathFromIDListW failed\n");
return FALSE;
return E_FAIL;
}
SHFree(pidl);
@ -632,6 +640,12 @@ SHEOW_LoadOpenWithItems(SHEOWImpl *This, IDataObject *pdtobj)
szPtr = wcschr(szPath, '.');
if (szPtr)
{
if (!_wcsicmp(szPtr, szShortCut))
{
TRACE("pidl is a shortcut\n");
return E_FAIL;
}
SHEOW_LoadItemFromHKCU(This, szPtr);
SHEOW_LoadItemFromHKCR(This, szPtr);
}

View file

@ -382,20 +382,19 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
_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->rfg & SFGAO_HASSUBFOLDER)
{
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);
}
else
{
_InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_EXPLORE, MFT_STRING, "&Explore", MFS_ENABLED);
_InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Open", MFS_ENABLED);
}
/* FIXME
* check if folder hasnt already been extended
* use reduce verb then
*/
_InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_EXPLORE, MFT_STRING, "&Explore", MFS_ENABLED);
}
_InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Open", MFS_ENABLED);
SetMenuDefaultItem(hmenu, 0, MF_BYPOSITION);
if (This->rfg & (SFGAO_CANCOPY | SFGAO_CANMOVE))
@ -669,7 +668,7 @@ static void DoProperties(
HRESULT
DoShellExtensions(ItemCmImpl *This, LPCMINVOKECOMMANDINFO lpcmi)
{
HRESULT hResult;
HRESULT hResult = NOERROR;
UINT i;
TRACE("DoShellExtensions %p verb %x count %u\n",This, LOWORD(lpcmi->lpVerb), This->ecount);
@ -679,9 +678,12 @@ DoShellExtensions(ItemCmImpl *This, LPCMINVOKECOMMANDINFO lpcmi)
hResult = cmenu->lpVtbl->InvokeCommand(cmenu, lpcmi);
if (SUCCEEDED(hResult))
return hResult;
{
break;
}
}
return NOERROR;
TRACE("DoShellExtensions result %x\n", hResult);
return hResult;
}
@ -873,7 +875,7 @@ SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID * szClass, IContextMenu*
cmobj->lpVtbl->Release(cmobj);
return FALSE;
}
hr = shext->lpVtbl->Initialize(shext, pidlFolder, pDataObj, hKey);
hr = shext->lpVtbl->Initialize(shext, NULL, pDataObj, hKey);
if (hr != S_OK)
{
TRACE("Failed to initialize shell extension\n");