Author: gadamopoulos
Date: Sun Jul  9 20:57:01 2017
New Revision: 75313

URL: http://svn.reactos.org/svn/reactos?rev=75313&view=rev
Log:
[EXPLORER]
- CTrayWindow: Implement the IContextMenu interface. This will be used by the 
CBandSite to query the context menu of its site (the CTrayWindow) and add it in 
its context menu. 
- CTrayWindowCtxMenu: Use Shell_MergeMenus in QueryContextMenu and respect its 
parameters.

Modified:
    trunk/reactos/base/shell/explorer/resource.h
    trunk/reactos/base/shell/explorer/traywnd.cpp

Modified: trunk/reactos/base/shell/explorer/resource.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/resource.h?rev=75313&r1=75312&r2=75313&view=diff
==============================================================================
--- trunk/reactos/base/shell/explorer/resource.h        [iso-8859-1] (original)
+++ trunk/reactos/base/shell/explorer/resource.h        [iso-8859-1] Sun Jul  9 
20:57:01 2017
@@ -177,15 +177,15 @@
 
 #define ID_SHELL_CMD_FIRST              0xF
 #define ID_SHELL_CMD_LAST               0x7FEF
-#define ID_SHELL_CMD_PROPERTIES         (ID_SHELL_CMD_LAST + 1)
-#define ID_SHELL_CMD_OPEN_ALL_USERS     (ID_SHELL_CMD_LAST + 2)
-#define ID_SHELL_CMD_EXPLORE_ALL_USERS  (ID_SHELL_CMD_LAST + 3)
-#define ID_LOCKTASKBAR                  (ID_SHELL_CMD_LAST + 4)
-#define ID_SHELL_CMD_OPEN_TASKMGR       (ID_SHELL_CMD_LAST + 5)
-#define ID_SHELL_CMD_UNDO_ACTION        (ID_SHELL_CMD_LAST + 6)
-#define ID_SHELL_CMD_SHOW_DESKTOP       (ID_SHELL_CMD_LAST + 7)
-#define ID_SHELL_CMD_TILE_WND_V         (ID_SHELL_CMD_LAST + 8)
-#define ID_SHELL_CMD_TILE_WND_H         (ID_SHELL_CMD_LAST + 9)
-#define ID_SHELL_CMD_CASCADE_WND        (ID_SHELL_CMD_LAST + 10)
-#define ID_SHELL_CMD_CUST_NOTIF         (ID_SHELL_CMD_LAST + 11)
-#define ID_SHELL_CMD_ADJUST_DAT         (ID_SHELL_CMD_LAST + 12)
+#define ID_SHELL_CMD_PROPERTIES         (401)
+#define ID_SHELL_CMD_OPEN_ALL_USERS     (402)
+#define ID_SHELL_CMD_EXPLORE_ALL_USERS  (403)
+#define ID_LOCKTASKBAR                  (404)
+#define ID_SHELL_CMD_OPEN_TASKMGR       (405)
+#define ID_SHELL_CMD_UNDO_ACTION        (406)
+#define ID_SHELL_CMD_SHOW_DESKTOP       (407)
+#define ID_SHELL_CMD_TILE_WND_V         (408)
+#define ID_SHELL_CMD_TILE_WND_H         (409)
+#define ID_SHELL_CMD_CASCADE_WND        (410)
+#define ID_SHELL_CMD_CUST_NOTIF         (411)
+#define ID_SHELL_CMD_ADJUST_DAT         (412)

Modified: trunk/reactos/base/shell/explorer/traywnd.cpp
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/explorer/traywnd.cpp?rev=75313&r1=75312&r2=75313&view=diff
==============================================================================
--- trunk/reactos/base/shell/explorer/traywnd.cpp       [iso-8859-1] (original)
+++ trunk/reactos/base/shell/explorer/traywnd.cpp       [iso-8859-1] Sun Jul  9 
20:57:01 2017
@@ -190,7 +190,8 @@
     public CWindowImpl < CTrayWindow, CWindow, CControlWinTraits >,
     public ITrayWindow,
     public IShellDesktopTray,
-    public IOleWindow
+    public IOleWindow,
+    public IContextMenu
 {
     CStartButton m_StartButton;
 
@@ -198,6 +199,7 @@
     CComPtr<IMenuPopup> m_StartMenuPopup;
 
     CComPtr<IDeskBand> m_TaskBand;
+    CComPtr<IContextMenu> m_ContextMenu;
     HTHEME m_Theme;
 
     HFONT m_Font;
@@ -2078,8 +2080,44 @@
     }
 
 
-
-
+    /*
+     *  IContextMenu
+     */
+    HRESULT STDMETHODCALLTYPE QueryContextMenu(HMENU hPopup,
+                                               UINT indexMenu,
+                                               UINT idCmdFirst,
+                                               UINT idCmdLast,
+                                               UINT uFlags)
+    {
+        if (!m_ContextMenu)
+        {
+            HRESULT hr = TrayWindowCtxMenuCreator(this, m_hWnd, 
&m_ContextMenu);
+            if (FAILED_UNEXPECTEDLY(hr))
+                return hr;
+        }
+
+        return m_ContextMenu->QueryContextMenu(hPopup, indexMenu, idCmdFirst, 
idCmdLast, uFlags);
+    }
+
+    HRESULT STDMETHODCALLTYPE InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
+    {
+        if (!m_ContextMenu)
+            return E_INVALIDARG;
+
+        return m_ContextMenu->InvokeCommand(lpici);
+    }
+
+    HRESULT STDMETHODCALLTYPE GetCommandString(UINT_PTR idCmd,
+                                               UINT uType,
+                                               UINT *pwReserved,
+                                               LPSTR pszName,
+                                               UINT cchMax)
+    {
+        if (!m_ContextMenu)
+            return E_INVALIDARG;
+
+        return m_ContextMenu->GetCommandString(idCmd, uType, pwReserved, 
pszName, cchMax);        
+    }
 
 
     /**********************************************************
@@ -2590,9 +2628,7 @@
             {
 HandleTrayContextMenu:
                 /* Tray the default tray window context menu */
-                CComPtr<IContextMenu> ctxMenu;
-                TrayWindowCtxMenuCreator(this, m_hWnd, &ctxMenu);
-                TrackCtxMenu(ctxMenu, ppt, NULL, FALSE, this);
+                TrackCtxMenu(this, ppt, NULL, FALSE, this);
             }
         }
         return Ret;
@@ -2998,6 +3034,7 @@
         /*COM_INTERFACE_ENTRY_IID(IID_ITrayWindow, ITrayWindow)*/
         COM_INTERFACE_ENTRY_IID(IID_IShellDesktopTray, IShellDesktopTray)
         COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
+        COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
     END_COM_MAP()
 };
 
@@ -3009,12 +3046,14 @@
     HWND hWndOwner;
     CComPtr<CTrayWindow> TrayWnd;
     CComPtr<IContextMenu> pcm;
+    UINT m_idCmdCmFirst;
 
 public:
     HRESULT Initialize(ITrayWindow * pTrayWnd, IN HWND hWndOwner)
     {
         this->TrayWnd = (CTrayWindow *) pTrayWnd;
         this->hWndOwner = hWndOwner;
+        this->m_idCmdCmFirst = 0;
         return S_OK;
     }
 
@@ -3026,30 +3065,8 @@
                          UINT uFlags)
     {
         HMENU menubase = LoadPopupMenu(hExplorerInstance, 
MAKEINTRESOURCEW(IDM_TRAYWND));
-
         if (!menubase)
             return HRESULT_FROM_WIN32(GetLastError());
-
-        int count = ::GetMenuItemCount(menubase);
-
-        for (int i = 0; i < count; i++)
-        {
-            WCHAR label[128];
-
-            MENUITEMINFOW mii = { 0 };
-            mii.cbSize = sizeof(mii);
-            mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS 
-                | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
-            mii.dwTypeData = label;
-            mii.cch = _countof(label);
-            ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
-
-            TRACE("Adding item %d label %S type %d\n", mii.wID, 
mii.dwTypeData, mii.fType);
-
-            ::InsertMenuItemW(hPopup, i + 1, TRUE, &mii);
-        }
-
-        ::DestroyMenu(menubase);
 
         if (SHRestricted(REST_CLASSICSHELL) != 0)
         {
@@ -3062,13 +3079,19 @@
                       ID_LOCKTASKBAR,
                       MF_BYCOMMAND | (TrayWnd->Locked ? MF_CHECKED : 
MF_UNCHECKED));
 
+        UINT idCmdNext;
+        idCmdNext = Shell_MergeMenus(hPopup, menubase, indexMenu, idCmdFirst, 
idCmdLast, MM_SUBMENUSHAVEIDS | MM_ADDSEPARATOR);
+        m_idCmdCmFirst = idCmdNext - idCmdFirst;
+
+        ::DestroyMenu(menubase);
+
         if (TrayWnd->m_TrayBandSite != NULL)
         {
             if (FAILED(TrayWnd->m_TrayBandSite->AddContextMenus(
                 hPopup,
-                0,
-                ID_SHELL_CMD_FIRST,
-                ID_SHELL_CMD_LAST,
+                indexMenu,
+                idCmdNext,
+                idCmdLast,
                 CMF_NORMAL,
                 &pcm)))
             {
@@ -3086,7 +3109,7 @@
         UINT uiCmdId = (UINT) lpici->lpVerb;
         if (uiCmdId != 0)
         {
-            if (uiCmdId >= ID_SHELL_CMD_FIRST && uiCmdId <= ID_SHELL_CMD_LAST)
+            if (uiCmdId >= m_idCmdCmFirst)
             {
                 CMINVOKECOMMANDINFO cmici = { 0 };
 
@@ -3095,7 +3118,7 @@
                     /* Setup and invoke the shell command */
                     cmici.cbSize = sizeof(cmici);
                     cmici.hwnd = hWndOwner;
-                    cmici.lpVerb = (LPCSTR) MAKEINTRESOURCEW(uiCmdId - 
ID_SHELL_CMD_FIRST);
+                    cmici.lpVerb = (LPCSTR) MAKEINTRESOURCEW(uiCmdId - 
m_idCmdCmFirst);
                     cmici.nShow = SW_NORMAL;
 
                     pcm->InvokeCommand(&cmici);


Reply via email to