xref: /reactos/dll/win32/shell32/CSendToMenu.h (revision 11345aed)
1 /*
2  * provides new shell item service
3  *
4  * Copyright 2019 Katayama Hirofumi MZ.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #ifndef _SHV_ITEM_SENDTO_H_
22 #define _SHV_ITEM_SENDTO_H_
23 
24 extern "C" const GUID CLSID_SendToMenu;
25 
26 class CSendToMenu :
27     public CComCoClass<CSendToMenu, &CLSID_SendToMenu>,
28     public CComObjectRootEx<CComMultiThreadModelNoCS>,
29     public IContextMenu3,
30     public IShellExtInit
31 {
32 private:
33     struct SENDTO_ITEM
34     {
35         SENDTO_ITEM *pNext;
36         PITEMID_CHILD pidlChild;
37         LPWSTR pszText;
38         HICON hIcon;
39 
40         SENDTO_ITEM(PITEMID_CHILD child, LPWSTR text, HICON icon)
41             : pNext(NULL)
42             , pidlChild(child)
43             , pszText(text)
44             , hIcon(icon)
45         {
46         }
47 
48         ~SENDTO_ITEM()
49         {
50             CoTaskMemFree(pidlChild);
51             CoTaskMemFree(pszText);
52             DestroyIcon(hIcon);
53         }
54 
55     private:
56         SENDTO_ITEM();
57         SENDTO_ITEM(const SENDTO_ITEM&);
58         SENDTO_ITEM& operator=(const SENDTO_ITEM&);
59     };
60 
61     HMENU m_hSubMenu;
62     SENDTO_ITEM *m_pItems;
63     UINT m_idCmdFirst;
64 
65     CComPtr<IShellFolder> m_pDesktop;
66     CComPtr<IShellFolder> m_pSendTo;
67     CComPtr<IDataObject> m_pDataObject;
68 
69     HRESULT LoadAllItems(HWND hwnd);
70     void UnloadAllItems();
71 
72     UINT InsertSendToItems(HMENU hMenu, UINT idFirst, UINT idMenu);
73 
74     SENDTO_ITEM *FindItemFromIdOffset(UINT IdOffset);
75     HRESULT DoSendToItem(SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici);
76 
77     HRESULT DoDrop(IDataObject *pDataObject, IDropTarget *pDropTarget);
78     HRESULT GetSpecialFolder(HWND hwnd, IShellFolder **ppFolder, int csidl,
79                              PIDLIST_ABSOLUTE *ppidl = NULL);
80     HRESULT GetUIObjectFromPidl(HWND hwnd, PIDLIST_ABSOLUTE pidl, REFIID riid, LPVOID *ppvOut);
81 
82 public:
83     CSendToMenu();
84     ~CSendToMenu();
85 
86     // IContextMenu
87     STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
88     STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
89     STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen);
90 
91     // IContextMenu3
92     STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
93 
94     // IContextMenu2
95     STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
96 
97     // IShellExtInit
98     STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
99 
100     DECLARE_REGISTRY_RESOURCEID(IDR_SENDTOMENU)
101     DECLARE_NOT_AGGREGATABLE(CSendToMenu)
102     DECLARE_PROTECT_FINAL_CONSTRUCT()
103 
104     BEGIN_COM_MAP(CSendToMenu)
105         COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3)
106         COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
107         COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
108         COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
109     END_COM_MAP()
110 };
111 
112 #endif /* _SHV_ITEM_SENDTO_H_ */
113