xref: /reactos/dll/win32/shell32/CSendToMenu.h (revision ebaf247c)
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     BOOL FolderHasAnyItems() const;
73     HRESULT CreateSendToFiles(LPCWSTR pszSendTo);
74 
75     UINT InsertSendToItems(HMENU hMenu, UINT idFirst, UINT idMenu);
76 
77     SENDTO_ITEM *FindItemFromIdOffset(UINT IdOffset);
78     HRESULT DoSendToItem(SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici);
79 
80     HRESULT DoDrop(IDataObject *pDataObject, IDropTarget *pDropTarget);
81     HRESULT GetSpecialFolder(HWND hwnd, IShellFolder **ppFolder, int csidl,
82                              PIDLIST_ABSOLUTE *ppidl = NULL);
83     HRESULT GetUIObjectFromPidl(HWND hwnd, PIDLIST_ABSOLUTE pidl, REFIID riid, LPVOID *ppvOut);
84 
85 public:
86     CSendToMenu();
87     ~CSendToMenu();
88 
89     // IContextMenu
90     STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
91     STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
92     STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen);
93 
94     // IContextMenu3
95     STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
96 
97     // IContextMenu2
98     STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
99 
100     // IShellExtInit
101     STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
102 
103     DECLARE_REGISTRY_RESOURCEID(IDR_SENDTOMENU)
104     DECLARE_NOT_AGGREGATABLE(CSendToMenu)
105     DECLARE_PROTECT_FINAL_CONSTRUCT()
106 
107     BEGIN_COM_MAP(CSendToMenu)
108         COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3)
109         COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
110         COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
111         COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
112     END_COM_MAP()
113 };
114 
115 #endif /* _SHV_ITEM_SENDTO_H_ */
116