Sync with trunk r63647.
[reactos.git] / dll / win32 / shell32 / newmenu.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 IContextMenu2,
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 HBITMAP hBitmap;
51 SHELLNEW_ITEM *pNext;
52 };
53
54 LPWSTR m_wszPath;
55 SHELLNEW_ITEM *m_pItems;
56 SHELLNEW_ITEM *m_pLinkItem;
57 IUnknown *m_pSite;
58 HMENU m_hSubMenu;
59 HBITMAP m_hbmFolder, m_hbmLink;
60
61 SHELLNEW_ITEM *LoadItem(LPCWSTR pwszExt);
62 void UnloadItem(SHELLNEW_ITEM *pItem);
63 void UnloadAllItems();
64 BOOL LoadAllItems();
65 UINT InsertShellNewItems(HMENU hMenu, UINT idFirst, UINT idMenu);
66 SHELLNEW_ITEM *FindItemFromIdOffset(UINT IdOffset);
67 HRESULT CreateNewFolder(IShellView *psv);
68 HRESULT CreateNewItem(SHELLNEW_ITEM *pItem, LPCMINVOKECOMMANDINFO lpcmi, IShellView *psv);
69
70 public:
71 CNewMenu();
72 ~CNewMenu();
73
74 // IObjectWithSite
75 virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
76 virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite);
77
78 // IContextMenu
79 virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
80 virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
81 virtual HRESULT WINAPI GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen);
82
83 // IContextMenu2
84 virtual HRESULT WINAPI HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
85
86 // IShellExtInit
87 virtual HRESULT STDMETHODCALLTYPE Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
88
89 DECLARE_REGISTRY_RESOURCEID(IDR_NEWMENU)
90 DECLARE_NOT_AGGREGATABLE(CNewMenu)
91
92 DECLARE_PROTECT_FINAL_CONSTRUCT()
93
94 BEGIN_COM_MAP(CNewMenu)
95 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
96 COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
97 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
98 COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
99 END_COM_MAP()
100 };
101
102 #endif /* _SHV_ITEM_NEW_H_ */