Author: janderwald
Date: Fri Aug 8 15:26:52 2008
New Revision: 35200
URL:
http://svn.reactos.org/svn/reactos?rev=35200&view=rev
Log:
* add missing return
* implement context menu handling of font items for font shell folder
Modified:
trunk/reactos/dll/win32/shell32/shfldr_fonts.c
trunk/reactos/dll/win32/shell32/shv_item_new.c
Modified: trunk/reactos/dll/win32/shell32/shfldr_fonts.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_f…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shfldr_fonts.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shfldr_fonts.c [iso-8859-1] Fri Aug 8 15:26:52 2008
@@ -45,6 +45,7 @@
#include "shfldr.h"
#include "shlwapi.h"
+
WINE_DEFAULT_DEBUG_CHANNEL (shell);
/***********************************************************************
@@ -54,18 +55,22 @@
typedef struct {
const IShellFolder2Vtbl *lpVtbl;
LONG ref;
+ const IContextMenu2Vtbl *lpVtblContextMenuFontItem;
const IPersistFolder2Vtbl *lpVtblPersistFolder2;
/* both paths are parsible from the desktop */
LPITEMIDLIST pidlRoot; /* absolute pidl */
+ LPCITEMIDLIST apidl; /* currently focused font item */
} IGenericSFImpl;
static const IShellFolder2Vtbl vt_ShellFolder2;
static const IPersistFolder2Vtbl vt_NP_PersistFolder2;
-
+static const IContextMenu2Vtbl vt_ContextMenu2FontItem;
#define _IPersistFolder2_Offset
((int)(&(((IGenericSFImpl*)0)->lpVtblPersistFolder2)))
#define _ICOM_THIS_From_IPersistFolder2(class, name) class* This =
(class*)(((char*)name)-_IPersistFolder2_Offset);
+#define _IContextMenuFontItem_Offset
((int)(&(((IGenericSFImpl*)0)->lpVtblContextMenuFontItem)))
+#define _ICOM_THIS_From_IContextMenu2FontItem(class, name) class* This =
(class*)(((char*)name)-_IContextMenuFontItem_Offset);
#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl)
#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl)
@@ -107,6 +112,7 @@
sf->ref = 0;
sf->lpVtbl = &vt_ShellFolder2;
sf->lpVtblPersistFolder2 = &vt_NP_PersistFolder2;
+ sf->lpVtblContextMenuFontItem = &vt_ContextMenu2FontItem;
sf->pidlRoot = _ILCreateFont(); /* my qualified pidl */
if (!SUCCEEDED (IUnknown_QueryInterface (_IUnknown_ (sf), riid, ppv)))
@@ -485,43 +491,45 @@
if (!ppvOut)
return hr;
- *ppvOut = NULL;
-
- if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1))
- {
- pObj = (LPUNKNOWN) ISvItemCm_Constructor ((IShellFolder *) iface, This->pidlRoot,
apidl, cidl);
- hr = S_OK;
- }
+ *ppvOut = NULL;
+
+ if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1))
+ {
+ pObj = (IUnknown*)(&This->lpVtblContextMenuFontItem);
+ This->apidl = apidl[0];
+ IUnknown_AddRef(pObj);
+ hr = S_OK;
+ }
else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1))
{
- pObj = (LPUNKNOWN) IDataObject_Constructor (hwndOwner, This->pidlRoot, apidl,
cidl);
- hr = S_OK;
- }
+ pObj = (LPUNKNOWN) IDataObject_Constructor (hwndOwner, This->pidlRoot, apidl,
cidl);
+ hr = S_OK;
+ }
else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1))
{
- pidl = ILCombine (This->pidlRoot, apidl[0]);
- pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
- SHFree (pidl);
- hr = S_OK;
- }
+ pidl = ILCombine (This->pidlRoot, apidl[0]);
+ pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
+ SHFree (pidl);
+ hr = S_OK;
+ }
else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1))
{
- pidl = ILCombine (This->pidlRoot, apidl[0]);
- pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
- SHFree (pidl);
- hr = S_OK;
- }
+ pidl = ILCombine (This->pidlRoot, apidl[0]);
+ pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
+ SHFree (pidl);
+ hr = S_OK;
+ }
else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1))
{
- hr = IShellFolder_QueryInterface (iface, &IID_IDropTarget, (LPVOID *) &
pObj);
- }
+ hr = IShellFolder_QueryInterface (iface, &IID_IDropTarget, (LPVOID *) &
pObj);
+ }
else
- hr = E_NOINTERFACE;
-
- if (SUCCEEDED(hr) && !pObj)
- hr = E_OUTOFMEMORY;
-
- *ppvOut = pObj;
+ hr = E_NOINTERFACE;
+
+ if (SUCCEEDED(hr) && !pObj)
+ hr = E_OUTOFMEMORY;
+
+ *ppvOut = pObj;
TRACE ("(%p)->hr=0x%08x\n", This, hr);
return hr;
}
@@ -860,3 +868,208 @@
INPFldr_PersistFolder2_Initialize,
INPFldr_PersistFolder2_GetCurFolder
};
+
+/**************************************************************************
+* IContextMenu2 Implementation
+*/
+
+/************************************************************************
+ * ISF_Fonts_IContextMenu_QueryInterface
+ */
+static HRESULT WINAPI ISF_Fonts_IContextMenu2_QueryInterface(IContextMenu2 * iface,
REFIID iid, LPVOID * ppvObject)
+{
+ _ICOM_THIS_From_IContextMenu2FontItem(IGenericSFImpl, iface);
+
+ TRACE("(%p)\n", This);
+
+ return IUnknown_QueryInterface(_IUnknown_(This), iid, ppvObject);
+}
+
+/************************************************************************
+ * ISF_Fonts_IContextMenu_AddRef
+ */
+static ULONG WINAPI ISF_Fonts_IContextMenu2_AddRef(IContextMenu2 * iface)
+{
+ _ICOM_THIS_From_IContextMenu2FontItem(IGenericSFImpl, iface);
+
+ TRACE("(%p)->(count=%u)\n", This, This->ref);
+
+ return IUnknown_AddRef(_IUnknown_(This));
+}
+
+/************************************************************************
+ * ISF_Fonts_IContextMenu_Release
+ */
+static ULONG WINAPI ISF_Fonts_IContextMenu2_Release(IContextMenu2 * iface)
+{
+ _ICOM_THIS_From_IContextMenu2FontItem(IGenericSFImpl, iface);
+
+ TRACE("(%p)->(count=%u)\n", This, This->ref);
+
+ return IUnknown_Release(_IUnknown_(This));
+}
+
+/**************************************************************************
+* ISF_Fonts_IContextMenu_QueryContextMenu()
+*/
+static HRESULT WINAPI ISF_Fonts_IContextMenu2_QueryContextMenu(
+ IContextMenu2 *iface,
+ HMENU hMenu,
+ UINT indexMenu,
+ UINT idCmdFirst,
+ UINT idCmdLast,
+ UINT uFlags)
+{
+ char szBuffer[30] = {0};
+ ULONG Count = 1;
+
+ _ICOM_THIS_From_IContextMenu2FontItem(IGenericSFImpl, iface);
+
+ TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x
)\n",
+ This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
+
+ if (LoadStringA(shell32_hInstance, IDS_OPEN, szBuffer,
sizeof(szBuffer)/sizeof(char)))
+ {
+ szBuffer[(sizeof(szBuffer)/sizeof(char))-1] = L'\0';
+ _InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_STRING,
szBuffer, MFS_DEFAULT);
+ Count++;
+ }
+
+ if (LoadStringA(shell32_hInstance, IDS_PRINT_VERB, szBuffer,
sizeof(szBuffer)/sizeof(char)))
+ {
+ szBuffer[(sizeof(szBuffer)/sizeof(char))-1] = L'\0';
+ _InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count++, MFT_STRING,
szBuffer, MFS_ENABLED);
+ }
+
+ if (LoadStringA(shell32_hInstance, IDS_COPY, szBuffer,
sizeof(szBuffer)/sizeof(char)))
+ {
+ szBuffer[(sizeof(szBuffer)/sizeof(char))-1] = L'\0';
+ _InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count++, MFT_SEPARATOR,
NULL, MFS_ENABLED);
+ _InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count++, MFT_STRING,
szBuffer, MFS_ENABLED);
+ }
+
+ if (LoadStringA(shell32_hInstance, IDS_DELETE, szBuffer,
sizeof(szBuffer)/sizeof(char)))
+ {
+ szBuffer[(sizeof(szBuffer)/sizeof(char))-1] = L'\0';
+ _InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count++, MFT_SEPARATOR,
NULL, MFS_ENABLED);
+ _InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_STRING,
szBuffer, MFS_ENABLED);
+ }
+
+ if (LoadStringA(shell32_hInstance, IDS_PROPERTIES, szBuffer,
sizeof(szBuffer)/sizeof(char)))
+ {
+ szBuffer[(sizeof(szBuffer)/sizeof(char))-1] = L'\0';
+ _InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count++, MFT_SEPARATOR,
NULL, MFS_ENABLED);
+ _InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_STRING,
szBuffer, MFS_ENABLED);
+ }
+
+ return MAKE_HRESULT(SEVERITY_SUCCESS, 0, Count);
+}
+
+
+/**************************************************************************
+* ISF_Fonts_IContextMenu_InvokeCommand()
+*/
+static HRESULT WINAPI ISF_Fonts_IContextMenu2_InvokeCommand(
+ IContextMenu2 *iface,
+ LPCMINVOKECOMMANDINFO lpcmi)
+{
+ _ICOM_THIS_From_IContextMenu2FontItem(IGenericSFImpl, iface);
+ SHELLEXECUTEINFOW sei;
+ PIDLFontStruct * pfont;
+ SHFILEOPSTRUCTW op;
+
+ TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb,
lpcmi->hwnd);
+
+ if (lpcmi->lpVerb == MAKEINTRESOURCE(1) || lpcmi->lpVerb == MAKEINTRESOURCE(2)
|| lpcmi->lpVerb == MAKEINTRESOURCE(7))
+ {
+ ZeroMemory(&sei, sizeof(sei));
+ sei.cbSize = sizeof(sei);
+ sei.hwnd = lpcmi->hwnd;
+ sei.nShow = SW_SHOWNORMAL;
+ if (lpcmi->lpVerb == MAKEINTRESOURCE(1))
+ sei.lpVerb = L"open";
+ else if (lpcmi->lpVerb == MAKEINTRESOURCE(2))
+ sei.lpVerb = L"print";
+ else if (lpcmi->lpVerb == MAKEINTRESOURCE(7))
+ sei.lpVerb = L"properties";
+
+ pfont = _ILGetFontStruct(This->apidl);
+ sei.lpFile = pfont->szName + pfont->offsFile;
+
+ ShellExecuteExW(&sei);
+ if (sei.hInstApp <= (HINSTANCE)32)
+ return E_FAIL;
+ }
+ else if (lpcmi->lpVerb == MAKEINTRESOURCE(4))
+ {
+ FIXME("implement font copying\n");
+ return E_NOTIMPL;
+ }
+ else if (lpcmi->lpVerb == MAKEINTRESOURCE(6))
+ {
+ ZeroMemory(&op, sizeof(op));
+ op.hwnd = lpcmi->hwnd;
+ op.wFunc = FO_DELETE;
+ op.fFlags = FOF_ALLOWUNDO;
+ pfont = _ILGetFontStruct(This->apidl);
+ op.pFrom = pfont->szName + pfont->offsFile;
+ SHFileOperationW(&op);
+ }
+
+ return S_OK;
+}
+
+/**************************************************************************
+ * ISF_Fonts_IContextMenu_GetCommandString()
+ *
+ */
+static HRESULT WINAPI ISF_Fonts_IContextMenu2_GetCommandString(
+ IContextMenu2 *iface,
+ UINT_PTR idCommand,
+ UINT uFlags,
+ UINT* lpReserved,
+ LPSTR lpszName,
+ UINT uMaxNameLen)
+{
+ _ICOM_THIS_From_IContextMenu2FontItem(IGenericSFImpl, iface);
+
+ TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand,
uFlags, lpReserved, lpszName, uMaxNameLen);
+
+
+ return E_FAIL;
+}
+
+
+
+/**************************************************************************
+* ISF_Fonts_IContextMenu_HandleMenuMsg()
+*/
+static HRESULT WINAPI ISF_Fonts_IContextMenu2_HandleMenuMsg(
+ IContextMenu2 *iface,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ _ICOM_THIS_From_IContextMenu2FontItem(IGenericSFImpl, iface);
+
+ TRACE("ISF_Fonts_IContextMenu_HandleMenuMsg (%p)->(msg=%x wp=%lx
lp=%lx)\n",This, uMsg, wParam, lParam);
+
+ return E_NOTIMPL;
+}
+
+static const IContextMenu2Vtbl vt_ContextMenu2FontItem =
+{
+ ISF_Fonts_IContextMenu2_QueryInterface,
+ ISF_Fonts_IContextMenu2_AddRef,
+ ISF_Fonts_IContextMenu2_Release,
+ ISF_Fonts_IContextMenu2_QueryContextMenu,
+ ISF_Fonts_IContextMenu2_InvokeCommand,
+ ISF_Fonts_IContextMenu2_GetCommandString,
+ ISF_Fonts_IContextMenu2_HandleMenuMsg
+};
+
+
+
+
+
+
Modified: trunk/reactos/dll/win32/shell32/shv_item_new.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shv_item…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shv_item_new.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shv_item_new.c [iso-8859-1] Fri Aug 8 15:26:52 2008
@@ -84,7 +84,7 @@
dwError = RegGetValueW(hKey,NULL,NULL, RRF_RT_REG_SZ,NULL,szDesc,&dwDesc);
if(dwError == ERROR_SUCCESS)
{
- if (wcsncmp(szDesc, szKeyName, dwDesc / sizeof(WCHAR)))
+ if (wcsncmp(szKeyName, szDesc, dwDesc / sizeof(WCHAR)))
{
/* recurse for to a linked key */
if (!GetKeyDescription(szDesc, szResult))
@@ -576,7 +576,7 @@
}
#endif
-static inline INewMenuImpl *impl_from_IContextMenu( IContextMenu2 *iface )
+static __inline INewMenuImpl * impl_from_IContextMenu( IContextMenu2 *iface )
{
return (INewMenuImpl *)((char*)iface - FIELD_OFFSET(INewMenuImpl,
lpVtblContextMenu));
}
@@ -717,6 +717,7 @@
if (LOWORD(lpici->lpVerb) == 0)
{
DoNewFolder(This, lpSV);
+ return S_OK;
}
hr = DoShellNewCmd(This, lpici);