[SHELL32]
[reactos.git] / reactos / dll / win32 / shell32 / CNewMenu.h
1 /*
2 * provides new shell item service
3 *
4 * Copyright 2007 Johannes Anderwald (johannes.anderwald@reactos.org)
5 * Copyright 2009 Andrew Hill
6 * Copyright 2012 Rafal Harabien
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 */
22
23 #ifndef _SHV_ITEM_NEW_H_
24 #define _SHV_ITEM_NEW_H_
25
26 class CNewMenu :
27 public CComCoClass<CNewMenu, &CLSID_NewMenu>,
28 public CComObjectRootEx<CComMultiThreadModelNoCS>,
29 public IObjectWithSite,
30 public IContextMenu3,
31 public IShellExtInit
32 {
33 private:
34 enum SHELLNEW_TYPE
35 {
36 SHELLNEW_TYPE_INVALID = -1,
37 SHELLNEW_TYPE_COMMAND = 1,
38 SHELLNEW_TYPE_DATA = 2,
39 SHELLNEW_TYPE_FILENAME = 4,
40 SHELLNEW_TYPE_NULLFILE = 8
41 };
42
43 struct SHELLNEW_ITEM
44 {
45 SHELLNEW_TYPE Type;
46 LPWSTR pwszExt;
47 PBYTE pData;
48 ULONG cbData;
49 LPWSTR pwszDesc;
50 HICON hIcon;
51 SHELLNEW_ITEM *pNext;
52 };
53
54 LPITEMIDLIST m_pidlFolder;
55 LPWSTR m_wszPath;
56 SHELLNEW_ITEM *m_pItems;
57 SHELLNEW_ITEM *m_pLinkItem;
58 CComPtr<IUnknown> m_pSite;
59 HMENU m_hSubMenu;
60 HICON m_hiconFolder, m_hiconLink;
61 UINT m_idCmdFirst;
62
63 SHELLNEW_ITEM *LoadItem(LPCWSTR pwszExt);
64 void UnloadItem(SHELLNEW_ITEM *pItem);
65 void UnloadAllItems();
66 BOOL LoadAllItems();
67 UINT InsertShellNewItems(HMENU hMenu, UINT idFirst, UINT idMenu);
68 SHELLNEW_ITEM *FindItemFromIdOffset(UINT IdOffset);
69 HRESULT CreateNewFolder(LPCMINVOKECOMMANDINFO lpici);
70 HRESULT CreateNewItem(SHELLNEW_ITEM *pItem, LPCMINVOKECOMMANDINFO lpcmi);
71 HRESULT SelectNewItem(LPCMINVOKECOMMANDINFO lpici, LONG wEventId, UINT uFlags, LPWSTR pszName);
72
73 public:
74 CNewMenu();
75 ~CNewMenu();
76
77 // IObjectWithSite
78 virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
79 virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite);
80
81 // IContextMenu
82 virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
83 virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
84 virtual HRESULT WINAPI GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen);
85
86 // IContextMenu3
87 virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
88
89 // IContextMenu2
90 virtual HRESULT WINAPI HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
91
92 // IShellExtInit
93 virtual HRESULT STDMETHODCALLTYPE Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
94
95 DECLARE_REGISTRY_RESOURCEID(IDR_NEWMENU)
96 DECLARE_NOT_AGGREGATABLE(CNewMenu)
97
98 DECLARE_PROTECT_FINAL_CONSTRUCT()
99
100 BEGIN_COM_MAP(CNewMenu)
101 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
102 COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3)
103 COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
104 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
105 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
106 END_COM_MAP()
107 };
108
109 #endif /* _SHV_ITEM_NEW_H_ */