Author: janderwald
Date: Wed Jan 2 02:42:01 2008
New Revision: 31548
URL:
http://svn.reactos.org/svn/reactos?rev=31548&view=rev
Log:
- revert changes which shouldnt be in (yet)
Removed:
trunk/reactos/dll/win32/shell32/shv_default_context_menu.c
Modified:
trunk/reactos/dll/win32/shell32/shv_item_cmenu.c
Removed: trunk/reactos/dll/win32/shell32/shv_default_context_menu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shv_defa…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shv_default_context_menu.c (original)
+++ trunk/reactos/dll/win32/shell32/shv_default_context_menu.c (removed)
@@ -1,1246 +1,0 @@
-/*
- * PROJECT: shell32
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: dll/win32/shell32/shv_item_new.c
- * PURPOSE: provides default context menu implementation
- * PROGRAMMERS: Johannes Anderwald (janderwald(a)reactos.org)
- */
-
-#include <string.h>
-
-#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 "shlwapi.h"
-#include "shell32_main.h"
-#include "shellfolder.h"
-#include "debughlp.h"
-#include "shresdef.h"
-#include "shlguid.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dmenu);
-
-typedef struct _DynamicShellEntry_
-{
- UINT iIdCmdFirst;
- UINT NumIds;
- IContextMenu * CMenu;
- struct _DynamicShellEntry_ * Next;
-}DynamicShellEntry, *PDynamicShellEntry;
-
-typedef struct _StaticShellEntry_
-{
- LPWSTR szVerb;
- LPWSTR szClass;
- struct _StaticShellEntry_ * Next;
-}StaticShellEntry, *PStaticShellEntry;
-
-
-typedef struct
-{
- const IContextMenu2Vtbl *lpVtbl;
- LONG ref;
- DEFCONTEXTMENU dcm;
- IDataObject * pDataObj;
- DWORD bGroupPolicyActive;
- PDynamicShellEntry dhead; /* first dynamic shell extension entry */
- UINT iIdSHEFirst; /* first used id */
- UINT iIdSHELast; /* last used id */
- PStaticShellEntry shead; /* first static shell extension entry */
- UINT iIdSCMFirst; /* first static used id */
- UINT iIdSCMLast; /* last static used id */
-}IDefaultContextMenuImpl;
-
-static inline IDefaultContextMenuImpl *impl_from_IContextMenu( IContextMenu2 *iface )
-{
- return (IDefaultContextMenuImpl *)((char*)iface -
FIELD_OFFSET(IDefaultContextMenuImpl, lpVtbl));
-}
-
-static
-HRESULT
-WINAPI
-IDefaultContextMenu_fnQueryInterface(
- IContextMenu2 *iface,
- REFIID riid,
- LPVOID *ppvObj)
-{
- IDefaultContextMenuImpl *This = (IDefaultContextMenuImpl *)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;
- }
-
- 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
-IDefaultContextMenu_fnAddRef(
- IContextMenu2 *iface)
-{
- IDefaultContextMenuImpl *This = (IDefaultContextMenuImpl *)iface;
- ULONG refCount = InterlockedIncrement(&This->ref);
-
- TRACE("(%p)->(count=%u)\n", This, refCount - 1);
-
- return refCount;
-}
-
-static
-ULONG
-WINAPI
-IDefaultContextMenu_fnRelease(
- IContextMenu2 *iface)
-{
- IDefaultContextMenuImpl *This = (IDefaultContextMenuImpl *)iface;
- ULONG refCount = InterlockedDecrement(&This->ref);
-
- TRACE("(%p)->(count=%u)\n", This, refCount + 1);
- if (!refCount)
- {
- TRACE(" destroying IContextMenu(%p)\n",This);
-
- HeapFree(GetProcessHeap(),0,This);
- }
-
- return refCount;
-}
-
-static
-void
-SH_AddStaticEntry(IDefaultContextMenuImpl * This, HKEY hKey, WCHAR *szVerb, WCHAR *
szClass)
-{
- PStaticShellEntry curEntry;
- PStaticShellEntry lastEntry = NULL;
-
- curEntry = This->shead;
-
- while(curEntry)
- {
- if (!wcsicmp(curEntry->szVerb, szVerb))
- {
- /* entry already exists */
- return;
- }
- lastEntry = curEntry;
- curEntry = curEntry->Next;
- }
-
- TRACE("adding verb %s szClass %s\n", debugstr_w(szVerb),
debugstr_w(szClass));
-
- curEntry = malloc(sizeof(StaticShellEntry));
- if (curEntry)
- {
- curEntry->Next = NULL;
- curEntry->szVerb = wcsdup(szVerb);
- curEntry->szClass = wcsdup(szClass);
- }
-
- if (lastEntry)
- {
- lastEntry->Next = curEntry;
- }
- else
- {
- This->shead = curEntry;
- }
-}
-
-static
-void
-SH_AddStaticEntryForKey(IDefaultContextMenuImpl * This, HKEY hKey, WCHAR * szClass)
-{
- LONG result;
- DWORD dwIndex;
- WCHAR szName[40];
- DWORD dwName;
-
- dwIndex = 0;
- do
- {
- szName[0] = 0;
- dwName = sizeof(szName) / sizeof(WCHAR);
- result = RegEnumKeyExW(hKey, dwIndex, szName, &dwName, NULL, NULL, NULL,
NULL);
- szName[39] = 0;
- if (result == ERROR_SUCCESS)
- {
- SH_AddStaticEntry(This, hKey, szName, szClass);
- }
- dwIndex++;
- }while(result == ERROR_SUCCESS);
-}
-
-static
-void
-SH_AddStaticEntryForFileClass(IDefaultContextMenuImpl * This, WCHAR * szExt)
-{
- WCHAR szBuffer[100];
- HKEY hKey;
- LONG result;
- DWORD dwBuffer;
-
- TRACE("SH_AddStaticEntryForFileClass entered with %s\n",
debugstr_w(szExt));
-
- wcscpy(szBuffer, szExt);
- wcscat(szBuffer, L"\\shell");
- result = RegOpenKeyExW(HKEY_CLASSES_ROOT, szBuffer, 0, KEY_READ | KEY_QUERY_VALUE,
&hKey);
- if (result == ERROR_SUCCESS)
- {
- SH_AddStaticEntryForKey(This, hKey, szExt);
- RegCloseKey(hKey);
- }
-
- dwBuffer = sizeof(szBuffer);
- result = RegGetValueW(HKEY_CLASSES_ROOT, szExt, NULL, RRF_RT_REG_SZ, NULL,
(LPBYTE)szBuffer, &dwBuffer);
- if (result == ERROR_SUCCESS)
- {
- UINT length = strlenW(szBuffer);
- wcscat(szBuffer, L"\\shell");
- TRACE("szBuffer %s\n", debugstr_w(szBuffer));
-
- result = RegOpenKeyExW(HKEY_CLASSES_ROOT, szBuffer, 0, KEY_READ |
KEY_QUERY_VALUE, &hKey);
- if (result == ERROR_SUCCESS)
- {
- szBuffer[length] = 0;
- SH_AddStaticEntryForKey(This, hKey, szBuffer);
- RegCloseKey(hKey);
- }
- }
-
- strcpyW(szBuffer, "SystemFileAssociations\\");
- dwBuffer = sizeof(szBuffer) - strlenW(szBuffer) * sizeof(WCHAR);
- result = RegGetValueW(HKEY_CLASSES_ROOT, szExt, L"PerceivedType",
RRF_RT_REG_SZ, NULL, (LPBYTE)&szBuffer[23], &dwBuffer);
- if (result == ERROR_SUCCESS)
- {
- UINT length = strlenW(szBuffer);
- wcscat(szBuffer, L"\\shell");
- TRACE("szBuffer %s\n", debugstr_w(szBuffer));
-
- result = RegOpenKeyExW(HKEY_CLASSES_ROOT, szBuffer, 0, KEY_READ |
KEY_QUERY_VALUE, &hKey);
- if (result == ERROR_SUCCESS)
- {
- szBuffer[length] = 0;
- SH_AddStaticEntryForKey(This, hKey, szBuffer);
- RegCloseKey(hKey);
- }
- }
- RegCloseKey(hKey);
-}
-
-static
-BOOL
-HasClipboardData()
-{
- BOOL ret = FALSE;
- IDataObject * pda;
-
- if(SUCCEEDED(OleGetClipboard(&pda)))
- {
- STGMEDIUM medium;
- FORMATETC formatetc;
-
- TRACE("pda=%p\n", pda);
-
- /* Set the FORMATETC structure*/
- InitFormatEtc(formatetc, RegisterClipboardFormatA(CFSTR_SHELLIDLIST),
TYMED_HGLOBAL);
- if(SUCCEEDED(IDataObject_GetData(pda,&formatetc,&medium)))
- {
- ret = TRUE;
- }
-
- IDataObject_Release(pda);
- ReleaseStgMedium(&medium);
- }
-
- return ret;
-}
-
-VOID
-DisablePasteOptions(HMENU hMenu)
-{
- MENUITEMINFOW mii;
-
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_STATE;
- mii.fState = MFS_DISABLED;
-
- TRACE("result %d\n", SetMenuItemInfoW(hMenu, FCIDM_SHVIEW_INSERT, FALSE,
&mii));
- TRACE("result %d\n", SetMenuItemInfoW(hMenu, FCIDM_SHVIEW_INSERTLINK,
FALSE, &mii));
-}
-
-static
-HRESULT
-SH_LoadDynamicContextMenuHandler(IDefaultContextMenuImpl * This, HKEY hKey, const CLSID *
szClass, BOOL bExternalInit)
-{
- HRESULT hr;
- IContextMenu * cmobj;
- IShellExtInit *shext;
- PDynamicShellEntry curEntry;
- TRACE("SH_LoadDynamicContextMenuHandler entered with This %p hKey %p szClass %s
bExternalInit %u\n",This, hKey, wine_dbgstr_guid(szClass), bExternalInit);
-
- hr = SHCoCreateInstance(NULL, szClass, NULL, &IID_IContextMenu,
(void**)&cmobj);
- if (hr != S_OK)
- {
- TRACE("SHCoCreateInstance failed %x\n", GetLastError());
- return hr;
- }
-
- if (bExternalInit)
- {
- hr = cmobj->lpVtbl->QueryInterface(cmobj, &IID_IShellExtInit,
(void**)&shext);
- if (hr != S_OK)
- {
- TRACE("Failed to query for interface IID_IShellExtInit\n");
- cmobj->lpVtbl->Release(cmobj);
- return FALSE;
- }
- hr = shext->lpVtbl->Initialize(shext, NULL, This->pDataObj, hKey);
- shext->lpVtbl->Release(shext);
- if (hr != S_OK)
- {
- TRACE("Failed to initialize shell extension error %x\n", hr);
- cmobj->lpVtbl->Release(cmobj);
- return hr;
- }
- }
-
- curEntry = malloc(sizeof(DynamicShellEntry));
- if(!curEntry)
- {
- return E_OUTOFMEMORY;
- }
-
- curEntry->iIdCmdFirst = 0;
- curEntry->Next = NULL;
- curEntry->NumIds = 0;
- curEntry->CMenu = cmobj;
-
- if (This->dhead)
- {
- PDynamicShellEntry pEntry = This->dhead;
-
- while(pEntry->Next)
- {
- pEntry = pEntry->Next;
- }
-
- pEntry->Next = curEntry;
- }
- else
- {
- This->dhead = curEntry;
- }
-
- return hr;
-}
-
-static
-UINT
-EnumerateDynamicContextHandlerForKey(IDefaultContextMenuImpl *This, HKEY hRootKey)
-{
- WCHAR szKey[MAX_PATH] = {0};
- WCHAR szName[MAX_PATH] = {0};
- DWORD dwIndex, dwName;
- LONG res;
- HRESULT hResult;
- UINT index;
- CLSID clsid;
- HKEY hKey;
-
- static const WCHAR szShellEx[] = {
's','h','e','l','l','e','x','\\','C','o','n','t','e','x','t','M','e','n','u','H','a','n','d','l','e','r','s',0
};
-
- if (RegOpenKeyExW(hRootKey, szShellEx, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
- {
- TRACE("RegOpenKeyExW failed for key %s\n", debugstr_w(szKey));
- return 0;
- }
-
- dwIndex = 0;
- index = 0;
- do
- {
- dwName = MAX_PATH;
- res = RegEnumKeyExW(hKey, dwIndex, szName, &dwName, NULL, NULL, NULL, NULL);
- if (res == ERROR_SUCCESS)
- {
- hResult = CLSIDFromString(szName, &clsid);
- if (hResult != S_OK)
- {
- dwName = MAX_PATH;
- if (RegGetValueW(hKey, szName, NULL, RRF_RT_REG_SZ, NULL, szKey,
&dwName) == ERROR_SUCCESS)
- {
- if (CLSIDFromString(szKey, &clsid) == S_OK)
- {
- if (This->bGroupPolicyActive)
- {
- if (RegGetValueW(HKEY_LOCAL_MACHINE,
-
L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
- szKey,
- RRF_RT_REG_SZ,
- NULL,
- NULL,
- &dwName) == ERROR_SUCCESS)
- {
- SH_LoadDynamicContextMenuHandler(This, hKey, &clsid,
TRUE);
- }
-
- }
- else
- {
- SH_LoadDynamicContextMenuHandler(This, hKey, &clsid, TRUE);
- }
- }
- }
- }
- if (hResult == S_OK)
- {
- if (This->bGroupPolicyActive)
- {
- if (RegGetValueW(HKEY_LOCAL_MACHINE,
-
L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
- szKey,
- RRF_RT_REG_SZ,
- NULL,
- NULL,
- &dwName) == ERROR_SUCCESS)
- {
- SH_LoadDynamicContextMenuHandler(This, hKey, &clsid, TRUE);
- }
- }
- else
- {
- SH_LoadDynamicContextMenuHandler(This, hKey, &clsid, TRUE);
- }
- }
- }
- dwIndex++;
- }while(res == ERROR_SUCCESS);
-
- RegCloseKey(hKey);
- return index;
-}
-
-
-static
-UINT
-InsertMenuItemsOfDynamicContextMenuExtension(IDefaultContextMenuImpl * This, HMENU hMenu,
UINT indexMenu, UINT idCmdFirst, UINT idCmdLast)
-{
- PDynamicShellEntry curEntry;
- HRESULT hResult;
- MENUITEMINFOW mii;
- if (!This->dhead)
- {
- This->iIdSHEFirst = 0;
- This->iIdSHELast = 0;
- return indexMenu;
- }
-
- curEntry = This->dhead;
- This->iIdSHEFirst = idCmdFirst;
-
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_FTYPE | MIIM_STATE;
- mii.fType = MFT_SEPARATOR;
- mii.fState = MFS_ENABLED;
- InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii);
-
- do
- {
- hResult = IContextMenu_QueryContextMenu(curEntry->CMenu, hMenu, indexMenu,
idCmdFirst, idCmdLast, CMF_NORMAL);
- if (SUCCEEDED(hResult))
- {
- curEntry->iIdCmdFirst = idCmdFirst;
- curEntry->NumIds = LOWORD(hResult);
- indexMenu += curEntry->NumIds;
- idCmdFirst += curEntry->NumIds + 0x10;
- }
- TRACE("curEntry %p hresult %x contextmenu %p cmdfirst %x num ids %x\n",
curEntry, hResult, curEntry->CMenu, curEntry->iIdCmdFirst, curEntry->NumIds);
- curEntry = curEntry->Next;
- }while(curEntry);
-
- This->iIdSHELast = idCmdFirst;
- TRACE("SH_LoadContextMenuHandlers first %x last %x\n",
This->iIdSHEFirst, This->iIdSHELast);
- return indexMenu;
-}
-
-UINT
-BuildBackgroundContextMenu(
- IDefaultContextMenuImpl * This,
- HMENU hMenu,
- UINT iIdCmdFirst,
- UINT iIdCmdLast,
- UINT uFlags)
-{
- MENUITEMINFOW mii;
- WCHAR szBuffer[MAX_PATH];
- UINT indexMenu = 0;
- HMENU hSubMenu;
- HKEY hKey;
-
- ZeroMemory(&mii, sizeof(mii));
-
- TRACE("BuildBackgroundContextMenu entered\n");
-
- if (!_ILIsDesktop(This->dcm.pidlFolder))
- {
- /* view option is only available in browsing mode */
- hSubMenu = LoadMenuA(shell32_hInstance, "MENU_001");
- if (hSubMenu)
- {
- szBuffer[0] = 0;
- LoadStringW(shell32_hInstance, FCIDM_SHVIEW_VIEW, szBuffer, MAX_PATH);
- szBuffer[MAX_PATH-1] = 0;
-
- TRACE("szBuffer %s\n", debugstr_w(szBuffer));
-
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU | MIIM_ID;
- mii.fType = MFT_STRING;
- mii.wID = iIdCmdFirst++;
- mii.dwTypeData = szBuffer;
- mii.cch = strlenW( mii.dwTypeData );
- mii.fState = MFS_ENABLED;
- mii.hSubMenu = hSubMenu;
- InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii);
- DestroyMenu(hSubMenu);
- }
- }
- hSubMenu = LoadMenuA(shell32_hInstance, "MENU_002");
- if (hSubMenu)
- {
- /* merge general background context menu in */
- iIdCmdFirst = Shell_MergeMenus(hMenu, hSubMenu, indexMenu, 0, iIdCmdLast,
MM_DONTREMOVESEPS | MM_SUBMENUSHAVEIDS) + 1;
- DestroyMenu(hSubMenu);
- }
-
- if (!HasClipboardData())
- {
- TRACE("disabling paste options\n");
- DisablePasteOptions(hMenu);
- }
- /* load extensions from HKCR\* key */
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT,
- L"*",
- 0,
- KEY_READ,
- &hKey) == ERROR_SUCCESS)
- {
- EnumerateDynamicContextHandlerForKey(This, hKey);
- RegCloseKey(hKey);
- }
-
- /* load create new shell extension */
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT,
- L"CLSID\\{D969A300-E7FF-11d0-A93B-00A0C90F2719}",
- 0,
- KEY_READ,
- &hKey) == ERROR_SUCCESS)
- {
- static const GUID dummy1 = {0xD969A300, 0xE7FF, 0x11d0, {0xA9, 0x3B, 0x00, 0xA0,
0xC9, 0x0F, 0x27, 0x19} };
- SH_LoadDynamicContextMenuHandler(This, hKey, &dummy1, FALSE);
- RegCloseKey(hKey);
- }
-
- InsertMenuItemsOfDynamicContextMenuExtension(This, hMenu, GetMenuItemCount(hMenu),
iIdCmdFirst, iIdCmdLast);
- return iIdCmdLast;
-}
-
-static
-UINT
-AddStaticContextMenusToMenu(
- HMENU hMenu,
- UINT indexMenu,
- IDefaultContextMenuImpl * This)
-{
- MENUITEMINFOW mii;
- PStaticShellEntry curEntry;
-
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA;
- mii.fType = MFT_STRING;
- mii.fState = MFS_ENABLED | MFS_DEFAULT;
- mii.wID = 0x4000;
- This->iIdSCMFirst = mii.wID;
-
- curEntry = This->shead;
-
- while(curEntry)
- {
- /* FIXME
- * load localized verbs if its an open edit find print printto openas properties
verb
- */
-
- mii.dwTypeData = curEntry->szVerb;
- mii.cch = strlenW(mii.dwTypeData);
- InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii);
- mii.fState = MFS_ENABLED;
- mii.wID++;
- curEntry = curEntry->Next;
- }
- This->iIdSCMLast = mii.wID - 1;
- return indexMenu;
-}
-
-static
-const char *
-GetLocalizedString(
- HMENU hMenu,
- UINT wID,
- char * sResult)
-{
- MENUITEMINFOA mii;
-
- sResult[0] = 0;
- if (!hMenu)
- {
- return sResult;
- }
-
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_TYPE;
- mii.fType = MFT_STRING;
- mii.dwTypeData = sResult;
- mii.cch = 100;
-
- GetMenuItemInfoA(hMenu, wID, FALSE, &mii);
- return sResult;
-}
-#if 0
-UINT
-BuildControlPanelContextMenu(
- IDefaultContextMenuImpl * This,
- HMENU hMenu,
- UINT iIdCmdFirst,
- UINT iIdCmdLast)
-{
- GUID * guid;
- SFGAOF attributes;
- DWORD dwSize;
- UINT indexMenu = 0;
- LPOLESTR pwszCLSID;
- WCHAR szClass[80];
- UINT length;
- MENUITEMINFOW mii;
-
-
- ZeroMemory(&mii, sizeof(MENUITEMINFOW));
-
- mii.cbSize = sizeof(MENUITEMINFOW);
- mii.fMask = MIIM_FTYPE | MIIM_STATE | MIIM_ID;
- mii.fType = MFT_STRING;
- mii.fState = MFS_ENABLED;
-
- guid = _ILGetGUIDPointer(This->dcm.apidl[0]);
- if (guid)
- {
- /* the cpl is registered as a namespace extension */
- dwSize = sizeof(SFGAOF);
- wcscpy(szClass, L"CLSID\\");
- if (SUCCEEDED(StringFromCLSID(guid, &pwszCLSID)))
- {
- wcscpy(&szClass[6], pwszCLSID);
- length = strlenW(szClass);
-
- CoTaskMemFree(pwszCLSID);
-
- /* check if the CLSID is a folder */
- wcscat(szClass, L"\\ShellFolder");
-
- if (RegGetValueW(HKEY_CLASSES_ROOT, szClass, L"Attributes",
RRF_RT_REG_BINARY, NULL, &attributes, &dwSize) == ERROR_SUCCESS)
- {
- if (attributes & SFGAO_FOLDER)
- {
- WCHAR szBuffer[100];
- /* insert explore string */
- LoadStringW(shell32_hInstance, FCIDM_SHVIEW_EXPLORE, szBuffer,
sizeof(szBuffer) / sizeof(WCHAR));
- szBuffer[99] = 0;
- mii.wID = FCIDM_SHVIEW_EXPLORE;
- mii.dwTypeData = szBuffer;
- mii.fState |= MFS_DEFAULT;
- InsertMenuItem(hMenu, indexMenu++, TRUE, &mii);
- mii.fState = MFS_ENABLED;
- }
- }
-
- /* add static handlers*/
- szClass[length] = 0;
- SH_AddStaticEntryForFileClass(This, szClass);
- indexMenu = AddStaticContextMenusToMenu(hMenu, indexMenu, This);
- }
- }
- else
- {
- /* cpl is registered with full path */
- SH_AddStaticEntryForFileClass(This, L".cpl");
- }
-
- if (AppendMenu(hMenu, MF_SEPARATOR, -1, NULL))
- {
- LoadStringW(shell32_hInstance, FCIDM_SHVIEW_CREATELINK, szClass, sizeof(szClass)
/ sizeof(WCHAR));
- szClass[79] = 0;
- InsertMenuItem(hMenu, indexMenu++, TRUE, &mii);
- }
-}
-#endif
-
-UINT
-BuildShellItemContextMenu(
- IDefaultContextMenuImpl * This,
- HMENU hMenu,
- UINT iIdCmdFirst,
- UINT iIdCmdLast,
- UINT uFlags)
-{
- WCHAR szExt[10];
- char sBuffer[100];
- HKEY hKey;
- UINT indexMenu;
- SFGAOF rfg;
- HRESULT hr;
- BOOL bAddSep;
- HMENU hLocalMenu;
- GUID * guid;
-
- TRACE("BuildShellItemContextMenu entered\n");
-
- if (_ILGetExtension(This->dcm.apidl[0], &sBuffer[1], sizeof(sBuffer)))
- {
- sBuffer[9] = 0;
- sBuffer[0] = '.';
-
- if (MultiByteToWideChar( CP_ACP, 0, sBuffer, -1, (LPWSTR)szExt, 10))
- {
- TRACE("szExt %d\n", debugstr_w(szExt));
- SH_AddStaticEntryForFileClass(This, szExt);
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szExt, 0, KEY_READ, &hKey) ==
ERROR_SUCCESS)
- {
- EnumerateDynamicContextHandlerForKey(This, hKey);
- RegCloseKey(hKey);
- }
- }
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"*", 0, KEY_READ, &hKey) ==
ERROR_SUCCESS)
- {
- /* load default extensions */
- EnumerateDynamicContextHandlerForKey(This, hKey);
- RegCloseKey(hKey);
- }
- }
-
- if (!_ILIsPidlSimple(This->dcm.apidl[0])|| _ILIsFolder(This->dcm.apidl[0]))
- {
- /* add the default verbs open / explore */
- SH_AddStaticEntryForFileClass(This, L"Folder");
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Folder", 0, KEY_READ, &hKey)
== ERROR_SUCCESS)
- {
- EnumerateDynamicContextHandlerForKey(This, hKey);
- RegCloseKey(hKey);
- }
- }
-
- guid = _ILGetGUIDPointer(This->dcm.apidl[0]);
- if (guid)
- {
- LPOLESTR pwszCLSID;
- WCHAR buffer[60];
-
- wcscpy(buffer, L"CLSID\\");
- hr = StringFromCLSID(guid, &pwszCLSID);
- if (hr == S_OK)
- {
- wcscpy(&buffer[6], pwszCLSID);
- TRACE("buffer %s\n", debugstr_w(buffer));
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, buffer, 0, KEY_READ, &hKey) ==
ERROR_SUCCESS)
- {
- EnumerateDynamicContextHandlerForKey(This, hKey);
- SH_AddStaticEntryForFileClass(This, buffer);
- RegCloseKey(hKey);
- }
- CoTaskMemFree(pwszCLSID);
- }
- }
-
-
- if (_ILIsDrive(This->dcm.apidl[0]))
- {
- SH_AddStaticEntryForFileClass(This, L"Drive");
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Drive", 0, KEY_READ, &hKey)
== ERROR_SUCCESS)
- {
- EnumerateDynamicContextHandlerForKey(This, hKey);
- RegCloseKey(hKey);
- }
- }
-
-
- /* add static actions */
- rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE |
SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM;
- hr = IShellFolder_GetAttributesOf(This->dcm.psf, This->dcm.cidl,
This->dcm.apidl, &rfg);
- if (!SUCCEEDED(hr))
- rfg = 0;
-
- if (rfg & SFGAO_FILESYSTEM)
- {
- if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"AllFilesystemObjects", 0,
KEY_READ, &hKey) == ERROR_SUCCESS)
- {
- /* sendto service is registered there */
- EnumerateDynamicContextHandlerForKey(This, hKey);
- RegCloseKey(hKey);
- }
- }
-
- /* add static context menu handlers */
- indexMenu = AddStaticContextMenusToMenu(hMenu, 0, This);
- /* now process dynamic context menu handlers */
- indexMenu = InsertMenuItemsOfDynamicContextMenuExtension(This, hMenu, indexMenu,
iIdCmdFirst, iIdCmdLast);
- TRACE("indexMenu %d\n", indexMenu);
-
- hLocalMenu = LoadMenuW(shell32_hInstance, L"MENU_SHV_FILE");
- if (!hLocalMenu)
- {
- return iIdCmdLast;
- }
-
- if (rfg & (SFGAO_CANCOPY | SFGAO_CANMOVE))
- {
- _InsertMenuItem(hMenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
- if (rfg & SFGAO_CANMOVE)
- _InsertMenuItem(hMenu, indexMenu++, TRUE, FCIDM_SHVIEW_CUT, MFT_STRING,
GetLocalizedString(hLocalMenu, FCIDM_SHVIEW_CUT, sBuffer), MFS_ENABLED);
- if (rfg & SFGAO_CANCOPY)
- _InsertMenuItem(hMenu, indexMenu++, TRUE, FCIDM_SHVIEW_COPY, MFT_STRING,
GetLocalizedString(hLocalMenu, FCIDM_SHVIEW_COPY, sBuffer), MFS_ENABLED);
- }
-
- bAddSep = TRUE;
- if (rfg & SFGAO_CANLINK)
- {
- bAddSep = FALSE;
- _InsertMenuItem(hMenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
- _InsertMenuItem(hMenu, indexMenu++, TRUE, FCIDM_SHVIEW_CREATELINK, MFT_STRING,
GetLocalizedString(hLocalMenu, FCIDM_SHVIEW_CREATELINK, sBuffer), MFS_ENABLED);
- }
-
-
- if (rfg & SFGAO_CANDELETE)
- {
- if (bAddSep)
- {
- bAddSep = FALSE;
- _InsertMenuItem(hMenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
- }
- _InsertMenuItem(hMenu, indexMenu++, TRUE, FCIDM_SHVIEW_DELETE, MFT_STRING,
GetLocalizedString(hLocalMenu, FCIDM_SHVIEW_DELETE, sBuffer), MFS_ENABLED);
- }
-
- if (rfg & SFGAO_CANRENAME)
- {
- if (bAddSep)
- {
- bAddSep = FALSE;
- _InsertMenuItem(hMenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
- }
- _InsertMenuItem(hMenu, indexMenu++, TRUE, FCIDM_SHVIEW_RENAME, MFT_STRING,
GetLocalizedString(hLocalMenu, FCIDM_SHVIEW_RENAME, sBuffer), MFS_ENABLED);
- }
-
- _InsertMenuItem(hMenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
- _InsertMenuItem(hMenu, indexMenu++, TRUE, FCIDM_SHVIEW_PROPERTIES, MFT_STRING,
GetLocalizedString(hLocalMenu, FCIDM_SHVIEW_PROPERTIES, sBuffer), MFS_ENABLED);
-
- DestroyMenu(hLocalMenu);
- return iIdCmdLast;
-}
-
-static
-HRESULT
-WINAPI
-IDefaultContextMenu_fnQueryContextMenu(
- IContextMenu2 *iface,
- HMENU hmenu,
- UINT indexMenu,
- UINT idCmdFirst,
- UINT idCmdLast,
- UINT uFlags)
-{
- IDefaultContextMenuImpl * This = impl_from_IContextMenu(iface);
-
- if (This->dcm.cidl)
- {
- idCmdFirst = BuildShellItemContextMenu(This, hmenu, idCmdFirst, idCmdLast,
uFlags);
- }
- else
- {
- idCmdFirst = BuildBackgroundContextMenu(This, hmenu, idCmdFirst, idCmdLast,
uFlags);
- }
-
- return S_OK;
-}
-
-static
-HRESULT
-NotifyShellViewWindow(LPCMINVOKECOMMANDINFO lpcmi)
-{
- LPSHELLBROWSER lpSB;
- LPSHELLVIEW lpSV = NULL;
- HWND hwndSV = NULL;
-
- if((lpSB = (LPSHELLBROWSER)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0)))
- {
- if(SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV)))
- {
- IShellView_GetWindow(lpSV, &hwndSV);
- }
- }
-
- if (LOWORD(lpcmi->lpVerb) == FCIDM_SHVIEW_REFRESH)
- {
- if (lpSV)
- IShellView_Refresh(lpSV);
-
- return S_OK;
- }
-
- SendMessageW(hwndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0), 0);
-
- return S_OK;
-}
-
-static
-HRESULT
-DoPaste(
- IDefaultContextMenuImpl *iface,
- LPCMINVOKECOMMANDINFO lpcmi)
-{
-
-
- return E_FAIL;
-}
-
-static
-HRESULT
-DoOpenOrExplore(
- IDefaultContextMenuImpl *iface,
- LPCMINVOKECOMMANDINFO lpcmi)
-{
-
-
- return E_FAIL;
-}
-
-static
-HRESULT
-DoCopyOrCut(
- IDefaultContextMenuImpl *iface,
- LPCMINVOKECOMMANDINFO lpcmi)
-{
-
-
- return E_FAIL;
-}
-
-static
-HRESULT
-DoCreateLink(
- IDefaultContextMenuImpl *iface)
-{
-
-
- return E_FAIL;
-}
-
-static
-HRESULT
-DoDelete(
- IDefaultContextMenuImpl *iface)
-{
-
-
- return E_FAIL;
-}
-
-static
-HRESULT
-DoRename(
- IDefaultContextMenuImpl *iface)
-{
-
-
- return E_FAIL;
-}
-
-static
-HRESULT
-DoProperties(
- IDefaultContextMenuImpl *iface,
- LPCMINVOKECOMMANDINFO lpcmi)
-{
-
-
- return E_FAIL;
-}
-
-static
-HRESULT
-DoDynamicShellExtensions(
- IDefaultContextMenuImpl *iface,
- LPCMINVOKECOMMANDINFO lpcmi)
-{
-
-
- return E_FAIL;
-}
-
-
-static
-HRESULT
-DoStaticShellExtensions(
- IDefaultContextMenuImpl *This,
- LPCMINVOKECOMMANDINFO lpcmi)
-{
- SHELLEXECUTEINFOW sei;
- PStaticShellEntry pCurrent = This->shead;
- int verb = LOWORD(lpcmi->lpVerb) - This->iIdSCMFirst;
-
-
- while(pCurrent && verb-- > 0)
- pCurrent = pCurrent->Next;
-
- if (verb > 0)
- return E_FAIL;
-
-
- ZeroMemory(&sei, sizeof(sei));
- sei.cbSize = sizeof(sei);
- sei.fMask = SEE_MASK_CLASSNAME;
- sei.lpClass = pCurrent->szClass;
- sei.hwnd = lpcmi->hwnd;
- sei.nShow = SW_SHOWNORMAL;
- sei.lpVerb = pCurrent->szVerb;
- ShellExecuteExW(&sei);
- return S_OK;
-
-
-}
-
-static
-HRESULT
-WINAPI
-IDefaultContextMenu_fnInvokeCommand(
- IContextMenu2 *iface,
- LPCMINVOKECOMMANDINFO lpcmi)
-{
- IDefaultContextMenuImpl * This = impl_from_IContextMenu(iface);
-
- switch(LOWORD(lpcmi->lpVerb))
- {
- case FCIDM_SHVIEW_BIGICON:
- case FCIDM_SHVIEW_SMALLICON:
- case FCIDM_SHVIEW_LISTVIEW:
- case FCIDM_SHVIEW_REPORTVIEW:
- case 0x30: /* FIX IDS in resource files */
- case 0x31:
- case 0x32:
- case 0x33:
- case FCIDM_SHVIEW_AUTOARRANGE:
- case FCIDM_SHVIEW_SNAPTOGRID:
- case FCIDM_SHVIEW_REFRESH:
- return NotifyShellViewWindow(lpcmi);
- case FCIDM_SHVIEW_INSERT:
- case FCIDM_SHVIEW_INSERTLINK:
- return DoPaste(This, lpcmi);
- case FCIDM_SHVIEW_OPEN:
- case FCIDM_SHVIEW_EXPLORE:
- return DoOpenOrExplore(This, lpcmi);
- case FCIDM_SHVIEW_COPY:
- case FCIDM_SHVIEW_CUT:
- return DoCopyOrCut(This, lpcmi);
- case FCIDM_SHVIEW_CREATELINK:
- return DoCreateLink(This);
- case FCIDM_SHVIEW_DELETE:
- return DoDelete(This);
- case FCIDM_SHVIEW_RENAME:
- return DoRename(This);
- case FCIDM_SHVIEW_PROPERTIES:
- return DoProperties(This, lpcmi);
- }
-
- if (This->iIdSHEFirst && This->iIdSHELast)
- {
- if (LOWORD(lpcmi->lpVerb) >= This->iIdSHEFirst &&
LOWORD(lpcmi->lpVerb) <= This->iIdSHELast)
- {
- return DoDynamicShellExtensions(This, lpcmi);
- }
- }
-
- if (This->iIdSCMFirst && This->iIdSCMLast)
- {
- if (LOWORD(lpcmi->lpVerb) >= This->iIdSCMFirst &&
LOWORD(lpcmi->lpVerb) <= This->iIdSCMLast)
- {
- return DoStaticShellExtensions(This, lpcmi);
- }
- }
-
- FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb));
- return E_UNEXPECTED;
-}
-
-static
-HRESULT
-WINAPI
-IDefaultContextMenu_fnGetCommandString(
- IContextMenu2 *iface,
- UINT_PTR idCommand,
- UINT uFlags,
- UINT* lpReserved,
- LPSTR lpszName,
- UINT uMaxNameLen)
-{
-
- return S_OK;
-}
-
-static
-HRESULT
-WINAPI
-IDefaultContextMenu_fnHandleMenuMsg(
- IContextMenu2 *iface,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam)
-{
-
- return S_OK;
-}
-
-static const IContextMenu2Vtbl cmvt =
-{
- IDefaultContextMenu_fnQueryInterface,
- IDefaultContextMenu_fnAddRef,
- IDefaultContextMenu_fnRelease,
- IDefaultContextMenu_fnQueryContextMenu,
- IDefaultContextMenu_fnInvokeCommand,
- IDefaultContextMenu_fnGetCommandString,
- IDefaultContextMenu_fnHandleMenuMsg
-};
-
-static
-HRESULT
-IDefaultContextMenu_Constructor(
- const DEFCONTEXTMENU *pdcm,
- REFIID riid,
- void **ppv)
-{
- IDefaultContextMenuImpl * This;
- HRESULT hr = E_FAIL;
- IDataObject * pDataObj;
-
- This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(IDefaultContextMenuImpl));
- if (This)
- {
- This->lpVtbl = &cmvt;
- This->ref = 1;
- TRACE("cidl %u\n", This->dcm.cidl);
- if (SUCCEEDED(SHCreateDataObject(pdcm->pidlFolder, pdcm->cidl,
pdcm->apidl, NULL, &IID_IDataObject, (void**)&pDataObj)))
- {
- This->pDataObj = pDataObj;
- }
- CopyMemory(&This->dcm, pdcm, sizeof(DEFCONTEXTMENU));
- hr = IDefaultContextMenu_fnQueryInterface((IContextMenu2*)This, riid, ppv);
- }
-
- TRACE("This(%p)(%x) cidl %u\n",This, hr, This->dcm.cidl);
- return hr;
-}
-
-
-/*************************************************************************
- * SHCreateDefaultContextMenu [SHELL32.325] Vista API
- *
- */
-
-HRESULT
-WINAPI
-SHCreateDefaultContextMenu(
- const DEFCONTEXTMENU *pdcm,
- REFIID riid,
- void **ppv)
-{
-#if 1
- HRESULT hr = E_FAIL;
-
- *ppv = NULL;
- hr = IDefaultContextMenu_Constructor( pdcm, riid, ppv );
-
- TRACE("pcm %p hr %x\n", pdcm, hr);
- return hr;
-#else
- HRESULT hr;
- IContextMenu2 * pcm;
-
- if (pdcm->cidl > 0)
- pcm = ISvItemCm_Constructor( pdcm->psf, pdcm->pidlFolder, pdcm->apidl,
pdcm->cidl );
- else
- pcm = ISvBgCm_Constructor( pdcm->psf, TRUE );
-
- hr = S_OK;
- *ppv = pcm;
-
- return hr;
-#endif
-}
-
-/*************************************************************************
- * CDefFolderMenu_Create2 [SHELL32.701]
- *
- */
-
-INT
-WINAPI
-CDefFolderMenu_Create2(
- LPCITEMIDLIST pidlFolder,
- HWND hwnd,
- UINT cidl,
- LPCITEMIDLIST *apidl,
- IShellFolder *psf,
- LPFNDFMCALLBACK lpfn,
- UINT nKeys,
- HKEY *ahkeyClsKeys,
- IContextMenu **ppcm)
-{
- DEFCONTEXTMENU pdcm;
- HRESULT hr;
-
- pdcm.hwnd = hwnd;
- pdcm.pcmcb = NULL;
- pdcm.pidlFolder = pidlFolder;
- pdcm.psf = psf;
- pdcm.cidl = cidl;
- pdcm.apidl = apidl;
- pdcm.punkAssociationInfo = NULL;
- pdcm.cKeys = nKeys;
- pdcm.aKeys = ahkeyClsKeys;
-
- hr = SHCreateDefaultContextMenu(&pdcm, &IID_IContextMenu, (void**)ppcm);
- return hr;
-}
-
Modified: trunk/reactos/dll/win32/shell32/shv_item_cmenu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shv_item…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shv_item_cmenu.c (original)
+++ trunk/reactos/dll/win32/shell32/shv_item_cmenu.c Wed Jan 2 02:42:01 2008
@@ -1262,3 +1262,62 @@
RegCloseKey(hKey);
return index;
}
+
+/*************************************************************************
+ * SHCreateDefaultContextMenu [SHELL32.325] Vista API
+ *
+ */
+
+HRESULT WINAPI SHCreateDefaultContextMenu(
+ const DEFCONTEXTMENU *pdcm,
+ REFIID riid,
+ void **ppv)
+{
+ HRESULT hr;
+ IContextMenu2 * pcm;
+
+ if (pdcm->cidl > 0)
+ pcm = ISvItemCm_Constructor( pdcm->psf, pdcm->pidlFolder, pdcm->apidl,
pdcm->cidl );
+ else
+ pcm = ISvBgCm_Constructor( pdcm->psf, TRUE );
+
+ hr = S_OK;
+ *ppv = pcm;
+
+ return hr;
+}
+
+/*************************************************************************
+ * CDefFolderMenu_Create2 [SHELL32.701]
+ *
+ */
+
+INT
+WINAPI
+CDefFolderMenu_Create2(
+ LPCITEMIDLIST pidlFolder,
+ HWND hwnd,
+ UINT cidl,
+ LPCITEMIDLIST *apidl,
+ IShellFolder *psf,
+ LPFNDFMCALLBACK lpfn,
+ UINT nKeys,
+ HKEY *ahkeyClsKeys,
+ IContextMenu **ppcm)
+{
+ DEFCONTEXTMENU pdcm;
+ HRESULT hr;
+
+ pdcm.hwnd = hwnd;
+ pdcm.pcmcb = NULL; //FIXME
+ pdcm.pidlFolder = pidlFolder;
+ pdcm.psf = psf;
+ pdcm.cidl = cidl;
+ pdcm.apidl = apidl;
+ pdcm.punkAssociationInfo = NULL;
+ pdcm.cKeys = nKeys;
+ pdcm.aKeys = ahkeyClsKeys;
+
+ hr = SHCreateDefaultContextMenu(&pdcm, &IID_IContextMenu, (void**)ppcm);
+ return hr;
+}