[SHELL32] Improve and fix SendTo (#2122)
[reactos.git] / dll / win32 / shell32 / CSendToMenu.h
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_ */