[ros-diffs] [janderwald] 35200: * add missing return * implement context menu handling of font items for font shell folder

janderwald at svn.reactos.org janderwald at svn.reactos.org
Fri Aug 8 22:26:52 CEST 2008


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_fonts.c?rev=35200&r1=35199&r2=35200&view=diff
==============================================================================
--- 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_new.c?rev=35200&r1=35199&r2=35200&view=diff
==============================================================================
--- 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);



More information about the Ros-diffs mailing list