3cbef65c74f3005629e7e59b293ca7dd36976d13
[reactos.git] / base / shell / rshell / CMenuBand.h
1 /*
2 * Shell Menu Band
3 *
4 * Copyright 2014 David Quintana
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 #pragma once
21
22 class CMenuToolbarBase;
23 class CMenuStaticToolbar;
24 class CMenuSFToolbar;
25 class CMenuFocusManager;
26
27 class CMenuBand :
28 public CComObjectRootEx<CComMultiThreadModelNoCS>,
29 public IDeskBand,
30 public IObjectWithSite,
31 public IInputObject,
32 public IPersistStream,
33 public IOleCommandTarget,
34 public IServiceProvider,
35 public IMenuPopup,
36 public IMenuBand,
37 public IShellMenu2,
38 public IWinEventHandler,
39 public IShellMenuAcc
40 {
41 private:
42 CMenuFocusManager * m_focusManager;
43 CMenuStaticToolbar * m_staticToolbar;
44 CMenuSFToolbar * m_SFToolbar;
45
46 CComPtr<IOleWindow> m_site;
47 CComPtr<IShellMenuCallback> m_psmc;
48 CComPtr<IMenuPopup> m_subMenuChild;
49 CComPtr<IMenuPopup> m_subMenuParent;
50 CComPtr<CMenuBand> m_childBand;
51 CComPtr<CMenuBand> m_parentBand;
52
53 UINT m_uId;
54 UINT m_uIdAncestor;
55 DWORD m_dwFlags;
56 PVOID m_UserData;
57 HMENU m_hmenu;
58 HWND m_menuOwner;
59
60 BOOL m_useBigIcons;
61 HWND m_topLevelWindow;
62
63 CMenuToolbarBase * m_hotBar;
64 INT m_hotItem;
65 CMenuToolbarBase * m_popupBar;
66 INT m_popupItem;
67
68 public:
69 CMenuBand();
70 ~CMenuBand();
71
72 DECLARE_NOT_AGGREGATABLE(CMenuBand)
73 DECLARE_PROTECT_FINAL_CONSTRUCT()
74
75 BEGIN_COM_MAP(CMenuBand)
76 COM_INTERFACE_ENTRY_IID(IID_IDeskBar, IMenuPopup)
77 COM_INTERFACE_ENTRY_IID(IID_IShellMenu, IShellMenu)
78 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
79 COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IDeskBand)
80 COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow)
81 COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
82 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
83 COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)
84 COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
85 COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersistStream)
86 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
87 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup)
88 COM_INTERFACE_ENTRY_IID(IID_IMenuBand, IMenuBand)
89 COM_INTERFACE_ENTRY_IID(IID_IShellMenu2, IShellMenu2)
90 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler)
91 COM_INTERFACE_ENTRY_IID(IID_IShellMenuAcc, IShellMenuAcc)
92 END_COM_MAP()
93
94 // *** IDeskBand methods ***
95 virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi);
96
97 // *** IDockingWindow methods ***
98 virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow);
99 virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved);
100 virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved);
101
102 // *** IOleWindow methods ***
103 virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd);
104 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
105
106 // *** IObjectWithSite methods ***
107 virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
108 virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, PVOID *ppvSite);
109
110 // *** IInputObject methods ***
111 virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg);
112 virtual HRESULT STDMETHODCALLTYPE HasFocusIO();
113 virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg);
114
115 // *** IPersistStream methods ***
116 virtual HRESULT STDMETHODCALLTYPE IsDirty();
117 virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm);
118 virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty);
119 virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize);
120
121 // *** IPersist methods ***
122 virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
123
124 // *** IOleCommandTarget methods ***
125 virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText);
126 virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
127
128 // *** IServiceProvider methods ***
129 virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
130
131 // *** IMenuPopup methods ***
132 virtual HRESULT STDMETHODCALLTYPE Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags);
133 virtual HRESULT STDMETHODCALLTYPE OnSelect(DWORD dwSelectType);
134 virtual HRESULT STDMETHODCALLTYPE SetSubMenu(IMenuPopup *pmp, BOOL fSet);
135
136 // *** IDeskBar methods ***
137 virtual HRESULT STDMETHODCALLTYPE SetClient(IUnknown *punkClient);
138 virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown **ppunkClient);
139 virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(RECT *prc);
140
141 // *** IMenuBand methods ***
142 virtual HRESULT STDMETHODCALLTYPE IsMenuMessage(MSG *pmsg);
143 virtual HRESULT STDMETHODCALLTYPE TranslateMenuMessage(MSG *pmsg, LRESULT *plRet);
144
145 // *** IShellMenu methods ***
146 virtual HRESULT STDMETHODCALLTYPE Initialize(IShellMenuCallback *psmc, UINT uId, UINT uIdAncestor, DWORD dwFlags);
147 virtual HRESULT STDMETHODCALLTYPE GetMenuInfo(IShellMenuCallback **ppsmc, UINT *puId, UINT *puIdAncestor, DWORD *pdwFlags);
148 virtual HRESULT STDMETHODCALLTYPE SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags);
149 virtual HRESULT STDMETHODCALLTYPE GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
150 virtual HRESULT STDMETHODCALLTYPE SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags);
151 virtual HRESULT STDMETHODCALLTYPE GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
152 virtual HRESULT STDMETHODCALLTYPE InvalidateItem(LPSMDATA psmd, DWORD dwFlags);
153 virtual HRESULT STDMETHODCALLTYPE GetState(LPSMDATA psmd);
154 virtual HRESULT STDMETHODCALLTYPE SetMenuToolbar(IUnknown *punk, DWORD dwFlags);
155
156 // *** IWinEventHandler methods ***
157 virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
158 virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd);
159
160 // *** IShellMenu2 methods ***
161 virtual HRESULT STDMETHODCALLTYPE GetSubMenu(THIS);
162 virtual HRESULT STDMETHODCALLTYPE SetToolbar(THIS);
163 virtual HRESULT STDMETHODCALLTYPE SetMinWidth(THIS);
164 virtual HRESULT STDMETHODCALLTYPE SetNoBorder(THIS);
165 virtual HRESULT STDMETHODCALLTYPE SetTheme(THIS);
166
167 // *** IShellMenuAcc methods ***
168 virtual HRESULT STDMETHODCALLTYPE GetTop(THIS);
169 virtual HRESULT STDMETHODCALLTYPE GetBottom(THIS);
170 virtual HRESULT STDMETHODCALLTYPE GetTracked(THIS);
171 virtual HRESULT STDMETHODCALLTYPE GetParentSite(THIS);
172 virtual HRESULT STDMETHODCALLTYPE GetState(THIS);
173 virtual HRESULT STDMETHODCALLTYPE DoDefaultAction(THIS);
174 virtual HRESULT STDMETHODCALLTYPE IsEmpty(THIS);
175
176 HRESULT _CallCBWithItemId(UINT Id, UINT uMsg, WPARAM wParam, LPARAM lParam);
177 HRESULT _CallCBWithItemPidl(LPITEMIDLIST pidl, UINT uMsg, WPARAM wParam, LPARAM lParam);
178 HRESULT _TrackSubMenu(HMENU popup, INT x, INT y, RECT& rcExclude);
179 HRESULT _TrackContextMenu(IContextMenu * popup, INT x, INT y);
180 HRESULT _GetTopLevelWindow(HWND*topLevel);
181 HRESULT _ChangeHotItem(CMenuToolbarBase * tb, INT id, DWORD dwFlags);
182 HRESULT _ChangePopupItem(CMenuToolbarBase * tb, INT id);
183 HRESULT _MenuItemHotTrack(DWORD changeType);
184 HRESULT _CancelCurrentPopup();
185 HRESULT _OnPopupSubMenu(IShellMenu * childShellMenu, POINTL * pAt, RECTL * pExclude, BOOL mouseInitiated);
186 HRESULT _DisableMouseTrack(BOOL bDisable);
187 HRESULT _SetChildBand(CMenuBand * child);
188 HRESULT _SetParentBand(CMenuBand * parent);
189 HRESULT _IsPopup();
190 HRESULT _IsTracking();
191 HRESULT _KillPopupTimers();
192
193 BOOL UseBigIcons()
194 {
195 return m_useBigIcons;
196 }
197
198 private:
199 HRESULT _KeyboardItemChange(DWORD change);
200 HRESULT _CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam, UINT id = 0, LPITEMIDLIST pidl = NULL);
201 };