[ros-diffs] [janderwald] 29686: - implement loading of shell new items in context menus - these are responsible for showing creating "new file type extension" item

janderwald at svn.reactos.org janderwald at svn.reactos.org
Fri Oct 19 21:32:18 CEST 2007


Author: janderwald
Date: Fri Oct 19 23:32:16 2007
New Revision: 29686

URL: http://svn.reactos.org/svn/reactos?rev=29686&view=rev
Log:
- implement loading of shell new items in context menus
- these are responsible for showing creating "new file type extension" item

Modified:
    trunk/reactos/dll/win32/shell32/shell32_main.h
    trunk/reactos/dll/win32/shell32/shv_bg_cmenu.c

Modified: trunk/reactos/dll/win32/shell32/shell32_main.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shell32_main.h?rev=29686&r1=29685&r2=29686&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shell32_main.h (original)
+++ trunk/reactos/dll/win32/shell32/shell32_main.h Fri Oct 19 23:32:16 2007
@@ -82,6 +82,7 @@
 
 LPCLASSFACTORY	IClassFactory_Constructor(REFCLSID);
 IContextMenu2 *	ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, LPCITEMIDLIST *aPidls, UINT uItemCount);
+IContextMenu2 * ISvStaticItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, LPCITEMIDLIST *apidl, UINT cidl, HKEY hKey);
 IContextMenu2 *	ISvBgCm_Constructor(LPSHELLFOLDER pSFParent, BOOL bDesktop);
 LPSHELLVIEW	IShellView_Constructor(LPSHELLFOLDER);
 

Modified: trunk/reactos/dll/win32/shell32/shv_bg_cmenu.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shv_bg_cmenu.c?rev=29686&r1=29685&r2=29686&view=diff
==============================================================================
--- trunk/reactos/dll/win32/shell32/shv_bg_cmenu.c (original)
+++ trunk/reactos/dll/win32/shell32/shv_bg_cmenu.c Fri Oct 19 23:32:16 2007
@@ -48,8 +48,208 @@
 	BOOL		bDesktop;
 } BgCmImpl;
 
+typedef enum
+{
+   SHELLNEW_TYPE_COMMAND = 1,
+   SHELLNEW_TYPE_DATA = 2,
+   SHELLNEW_TYPE_FILENAME = 4,
+   SHELLNEW_TYPE_NULLFILE = 8
+}SHELLNEW_TYPE;
+
+
+typedef struct __SHELLNEW_ITEM__
+{
+  SHELLNEW_TYPE Type;
+  LPWSTR szTarget;
+  LPWSTR szDesc;
+  LPWSTR szIcon;
+  struct __SHELLNEW_ITEM__ * Next;
+}SHELLNEW_ITEM, *PSHELLNEW_ITEM;
+
 
 static const IContextMenu2Vtbl cmvt;
+
+static PSHELLNEW_ITEM s_SnHead = NULL;
+
+
+PSHELLNEW_ITEM LoadItem(LPWSTR szKeyName)
+{
+  HKEY hKey;
+  DWORD dwIndex;
+  WCHAR szName[MAX_PATH];
+  WCHAR szCommand[MAX_PATH];
+  WCHAR szDesc[MAX_PATH];
+  WCHAR szIcon[MAX_PATH];
+  DWORD dwName, dwCommand, dwDesc;
+  LONG result;
+  PSHELLNEW_ITEM pNewItem;
+  
+  static const WCHAR szShellNew[] = { '\\','S','h','e','l','l','N','e','w',0 };
+  static const WCHAR szCmd[] = { 'C','o','m','m','a','n','d',0 };
+  static const WCHAR szData[] = { 'D','a','t','a',0 };
+  static const WCHAR szFileName[] = { 'F','i','l','e','N','a','m','e', 0 };
+  static const WCHAR szNullFile[] = { 'N','u','l','l','F','i','l','e', 0 };
+  static const WCHAR szDefaultIcon[] ={ '\\','D','e','f','a','u','l','t','I','c','o','n',0 };
+
+  result = RegOpenKeyExW(HKEY_CLASSES_ROOT,szKeyName,0,KEY_READ,&hKey);
+
+  if (result != ERROR_SUCCESS)
+  {
+    return NULL;
+  }
+  
+  dwName = MAX_PATH;
+  result = RegGetValueW(hKey,NULL,NULL,RRF_RT_REG_SZ,NULL,szName, &dwName);
+
+  RegCloseKey(hKey);
+  szDesc[0] = L'\0';
+  szIcon[0] = L'\0';
+  if (result == ERROR_SUCCESS)
+  {
+     dwDesc = MAX_PATH;
+     RegGetValueW(HKEY_CLASSES_ROOT,szName,NULL,RRF_RT_REG_SZ,NULL,szDesc,&dwDesc);
+     dwDesc = MAX_PATH;
+     wcscat(szName, szDefaultIcon);
+     RegGetValueW(HKEY_CLASSES_ROOT,szName,NULL,RRF_RT_REG_SZ,NULL,szIcon,&dwDesc);
+  }
+  
+  wcscpy(szName, szKeyName);
+  wcscat(szName, szShellNew);
+  result = RegOpenKeyExW(HKEY_CLASSES_ROOT,szName,0,KEY_READ,&hKey);
+
+  //TRACE("LoadItem keyname %s szName %s szDesc %s szIcon %s\n", debugstr_w(szKeyName), debugstr_w(szName), debugstr_w(szDesc), debugstr_w(szIcon));
+
+
+  if (result != ERROR_SUCCESS)
+  {
+    return NULL;
+  }
+
+  dwIndex = 0;
+  pNewItem = NULL;
+
+  do
+  {
+     dwName = MAX_PATH;
+     dwCommand = MAX_PATH;
+     result = RegEnumValueW(hKey,dwIndex,szName,&dwName,NULL,NULL,(LPBYTE)szCommand, &dwCommand);
+     if (result == ERROR_SUCCESS)
+     {
+         long type = -1;
+         LPWSTR szTarget = szCommand;
+         //TRACE("szName %s szCommand %s\n", debugstr_w(szName), debugstr_w(szCommand));
+         if (!wcsicmp(szName, szCmd))
+         {
+            type = SHELLNEW_TYPE_COMMAND;
+         }else if (!wcsicmp(szName, szData))
+         {
+             type = SHELLNEW_TYPE_DATA;
+         }
+         else if (!wcsicmp(szName, szFileName))
+         {
+            type = SHELLNEW_TYPE_FILENAME;
+         }
+         else if (!wcsicmp(szName, szNullFile))
+         {
+            type = SHELLNEW_TYPE_NULLFILE;
+            szTarget = NULL;
+         }
+         if (type != -1)
+         {
+            pNewItem = HeapAlloc(GetProcessHeap(), 0, sizeof(SHELLNEW_ITEM));
+            pNewItem->Type = type;
+            if (szTarget)
+                pNewItem->szTarget = wcsdup(szTarget);
+            else
+                pNewItem->szTarget = NULL;
+
+            pNewItem->szDesc = wcsdup(szDesc);
+            pNewItem->szIcon = wcsdup(szIcon);
+            pNewItem->Next = NULL;
+            break;
+         }
+     }
+     dwIndex++;
+  }while(result != ERROR_NO_MORE_ITEMS);
+  RegCloseKey(hKey);
+  return pNewItem;
+}
+
+
+BOOL
+LoadShellNewItems()
+{
+  DWORD dwIndex;
+  WCHAR szName[MAX_PATH];
+  LONG result;
+  PSHELLNEW_ITEM pNewItem;
+  PSHELLNEW_ITEM pCurItem = NULL;
+
+  dwIndex = 0;
+  do
+  {
+     result = RegEnumKeyW(HKEY_CLASSES_ROOT,dwIndex,szName,MAX_PATH);
+     if (result == ERROR_SUCCESS)
+     {
+        pNewItem = LoadItem(szName);
+        if (pNewItem)
+        {
+            if (pCurItem)
+            {
+                pCurItem->Next = pNewItem;
+                pCurItem = pNewItem;
+            }
+            else
+            {
+                pCurItem = s_SnHead = pNewItem;
+            }
+        }
+     }
+     dwIndex++;
+  }while(result != ERROR_NO_MORE_ITEMS);
+
+  if (s_SnHead == NULL)
+      return FALSE;
+  else
+      return TRUE;
+}
+VOID
+InsertShellNewItems(HMENU hMenu, UINT idFirst, UINT idMenu)
+{
+  MENUITEMINFOW mii;
+  PSHELLNEW_ITEM pCurItem;
+
+  if (s_SnHead == NULL)
+  {
+    if (!LoadShellNewItems())
+        return;
+
+  }
+
+  ZeroMemory(&mii, sizeof(mii));
+  mii.cbSize = sizeof(mii);
+
+  mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA; //MIIM_BITMAP;
+  mii.fType = MFT_STRING;
+  mii.fState = MFS_ENABLED;
+
+  pCurItem = s_SnHead;
+
+  while(pCurItem)
+  {
+    mii.dwTypeData = pCurItem->szDesc;
+    mii.cch = strlenW(mii.dwTypeData);
+    mii.wID = idFirst;
+    if (InsertMenuItemW(hMenu, idMenu, TRUE, &mii))
+    {
+        idMenu++;
+        idFirst++;
+    }
+    pCurItem = pCurItem->Next;
+  }
+}
+
+
 
 /**************************************************************************
 *   ISVBgCm_Constructor()
@@ -150,6 +350,7 @@
 {
     HMENU	hMyMenu;
     UINT	idMax;
+    MENUITEMINFOW mii;
     HRESULT hr;
 
     BgCmImpl *This = (BgCmImpl *)iface;
@@ -179,6 +380,13 @@
     }
     DestroyMenu(hMyMenu);
 
+    mii.cbSize = sizeof(mii);
+    mii.fMask = MIIM_SUBMENU;
+    if (GetMenuItemInfoW(hMenu, 10, TRUE, &mii))
+    {
+      InsertShellNewItems(mii.hSubMenu, 0x6000, 0x6000);
+    }
+
     TRACE("(%p)->returning 0x%x\n",This,hr);
     return hr;
 }




More information about the Ros-diffs mailing list