Author: janderwald
Date: Wed Oct 29 11:00:28 2008
New Revision: 37063
URL: 
http://svn.reactos.org/svn/reactos?rev=37063&view=rev
Log:
* Try to invoke items by executing the default context menu action
* Fixes executing of items like network connections folder whose items are no file system
objects
* Colin's wish list (1/2) :)
Modified:
    trunk/reactos/dll/win32/shell32/shlview.c
Modified: trunk/reactos/dll/win32/shell32/shlview.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shlview.…
==============================================================================
--- trunk/reactos/dll/win32/shell32/shlview.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/shell32/shlview.c [iso-8859-1] Wed Oct 29 11:00:28 2008
@@ -835,6 +835,8 @@
        static UINT CF_IDLIST = 0;
        HRESULT hr;
        IDataObject* selection;
+       IContextMenu * cm;
+       HMENU hmenu;
        FORMATETC fetc;
        STGMEDIUM stgm;
        LPIDA pIDList;
@@ -843,14 +845,68 @@
        LPCWSTR parent_dir = NULL;
        SFGAOF attribs;
        int i;
+       CMINVOKECOMMANDINFOEX ici;
+       MENUITEMINFOW info;
        if (0 == ShellView_GetSelections(This))
        {
          return S_OK;
        }
+
+       hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl,
+                                       (LPCITEMIDLIST*)This->apidl,
&IID_IContextMenu,
+                                       0, (LPVOID *)&cm);
+
+       if (SUCCEEDED(hr))
+       {
+               hmenu = CreatePopupMenu();
+               if (hmenu)
+               {
+                       if (SUCCEEDED(IContextMenu_QueryContextMenu( cm, hmenu, 0, 0x20,
0x7fff, CMF_DEFAULTONLY)))
+                       {
+                               INT def = -1, n = GetMenuItemCount(hmenu);
+
+                               for ( i = 0; i < n; i++ )
+                               {
+                                       memset( &info, 0, sizeof info );
+                                       info.cbSize = sizeof info;
+                                       info.fMask = MIIM_FTYPE | MIIM_STATE | MIIM_ID;
+                                       if (GetMenuItemInfoW( hmenu, i, TRUE, &info))
+                                       {
+                                               if (info.fState & MFS_DEFAULT)
+                                               {
+                                                       def = info.wID;
+                                                       break;
+                                               }
+                                       }
+                               }
+                               if (def != -1)
+                               {
+                                       memset( &ici, 0, sizeof ici );
+                                       ici.cbSize = sizeof ici;
+                                       ici.lpVerb = MAKEINTRESOURCEA( def );
+                                       ici.hwnd = This->hWnd;
+
+                                       IContextMenu_InvokeCommand(cm,
(LPCMINVOKECOMMANDINFO) &ici );
+                                       IContextMenu_Release(cm);
+                                       DestroyMenu( hmenu );
+                                       return S_OK;
+                               }
+
+                       }
+                       DestroyMenu( hmenu );
+               }
+               IContextMenu_Release(cm);
+       }
+
+
+
        hr = IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl,
                                        (LPCITEMIDLIST*)This->apidl,
&IID_IDataObject,
                                        0, (LPVOID *)&selection);
+
+
+
        if (FAILED(hr))
          return hr;