a9f1972ad3c7d7b60e4a943ec4db8b0fc48e356f
[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 BOOL m_Show;
69
70 public:
71 CMenuBand();
72 ~CMenuBand();
73
74 DECLARE_NOT_AGGREGATABLE(CMenuBand)
75 DECLARE_PROTECT_FINAL_CONSTRUCT()
76
77 BEGIN_COM_MAP(CMenuBand)
78 COM_INTERFACE_ENTRY_IID(IID_IDeskBar, IMenuPopup)
79 COM_INTERFACE_ENTRY_IID(IID_IShellMenu, IShellMenu)
80 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
81 COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IDeskBand)
82 COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow)
83 COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
84 COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
85 COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)
86 COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
87 COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersistStream)
88 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
89 COM_INTERFACE_ENTRY_IID(IID_IMenuPopup, IMenuPopup)
90 COM_INTERFACE_ENTRY_IID(IID_IMenuBand, IMenuBand)
91 COM_INTERFACE_ENTRY_IID(IID_IShellMenu2, IShellMenu2)
92 COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler)
93 COM_INTERFACE_ENTRY_IID(IID_IShellMenuAcc, IShellMenuAcc)
94 END_COM_MAP()
95
96 // *** IDeskBand methods ***
97 virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi);
98
99 // *** IDockingWindow methods ***
100 virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow);
101 virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved);
102 virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved);
103
104 // *** IOleWindow methods ***
105 virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd);
106 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
107
108 // *** IObjectWithSite methods ***
109 virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);
110 virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, PVOID *ppvSite);
111
112 // *** IInputObject methods ***
113 virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg);
114 virtual HRESULT STDMETHODCALLTYPE HasFocusIO();
115 virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg);
116
117 // *** IPersistStream methods ***
118 virtual HRESULT STDMETHODCALLTYPE IsDirty();
119 virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm);
120 virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty);
121 virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize);
122
123 // *** IPersist methods ***
124 virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
125
126 // *** IOleCommandTarget methods ***
127 virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText);
128 virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
129
130 // *** IServiceProvider methods ***
131 virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
132
133 // *** IMenuPopup methods ***
134 virtual HRESULT STDMETHODCALLTYPE Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags);
135 virtual HRESULT STDMETHODCALLTYPE OnSelect(DWORD dwSelectType);
136 virtual HRESULT STDMETHODCALLTYPE SetSubMenu(IMenuPopup *pmp, BOOL fSet);
137
138 // *** IDeskBar methods ***
139 virtual HRESULT STDMETHODCALLTYPE SetClient(IUnknown *punkClient);
140 virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown **ppunkClient);
141 virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(RECT *prc);
142
143 // *** IMenuBand methods ***
144 virtual HRESULT STDMETHODCALLTYPE IsMenuMessage(MSG *pmsg);
145 virtual HRESULT STDMETHODCALLTYPE TranslateMenuMessage(MSG *pmsg, LRESULT *plRet);
146
147 // *** IShellMenu methods ***
148 virtual HRESULT STDMETHODCALLTYPE Initialize(IShellMenuCallback *psmc, UINT uId, UINT uIdAncestor, DWORD dwFlags);
149 virtual HRESULT STDMETHODCALLTYPE GetMenuInfo(IShellMenuCallback **ppsmc, UINT *puId, UINT *puIdAncestor, DWORD *pdwFlags);
150 virtual HRESULT STDMETHODCALLTYPE SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags);
151 virtual HRESULT STDMETHODCALLTYPE GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
152 virtual HRESULT STDMETHODCALLTYPE SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags);
153 virtual HRESULT STDMETHODCALLTYPE GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
154 virtual HRESULT STDMETHODCALLTYPE InvalidateItem(LPSMDATA psmd, DWORD dwFlags);
155 virtual HRESULT STDMETHODCALLTYPE GetState(LPSMDATA psmd);
156 virtual HRESULT STDMETHODCALLTYPE SetMenuToolbar(IUnknown *punk, DWORD dwFlags);
157
158 // *** IWinEventHandler methods ***
159 virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
160 virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd);
161
162 // *** IShellMenu2 methods ***
163 virtual HRESULT STDMETHODCALLTYPE GetSubMenu(THIS);
164 virtual HRESULT STDMETHODCALLTYPE SetToolbar(THIS);
165 virtual HRESULT STDMETHODCALLTYPE SetMinWidth(THIS);
166 virtual HRESULT STDMETHODCALLTYPE SetNoBorder(THIS);
167 virtual HRESULT STDMETHODCALLTYPE SetTheme(THIS);
168
169 // *** IShellMenuAcc methods ***
170 virtual HRESULT STDMETHODCALLTYPE GetTop(THIS);
171 virtual HRESULT STDMETHODCALLTYPE GetBottom(THIS);
172 virtual HRESULT STDMETHODCALLTYPE GetTracked(THIS);
173 virtual HRESULT STDMETHODCALLTYPE GetParentSite(THIS);
174 virtual HRESULT STDMETHODCALLTYPE GetState(THIS);
175 virtual HRESULT STDMETHODCALLTYPE DoDefaultAction(THIS);
176 virtual HRESULT STDMETHODCALLTYPE IsEmpty(THIS);
177
178 HRESULT _CallCBWithItemId(UINT Id, UINT uMsg, WPARAM wParam, LPARAM lParam);
179 HRESULT _CallCBWithItemPidl(LPITEMIDLIST pidl, UINT uMsg, WPARAM wParam, LPARAM lParam);
180 HRESULT _TrackSubMenu(HMENU popup, INT x, INT y, RECT& rcExclude);
181 HRESULT _TrackContextMenu(IContextMenu * popup, INT x, INT y);
182 HRESULT _GetTopLevelWindow(HWND*topLevel);
183 HRESULT _ChangeHotItem(CMenuToolbarBase * tb, INT id, DWORD dwFlags);
184 HRESULT _ChangePopupItem(CMenuToolbarBase * tb, INT id);
185 HRESULT _MenuItemHotTrack(DWORD changeType);
186 HRESULT _CancelCurrentPopup();
187 HRESULT _OnPopupSubMenu(IShellMenu * childShellMenu, POINTL * pAt, RECTL * pExclude, BOOL mouseInitiated);
188 HRESULT _DisableMouseTrack(BOOL bDisable);
189 HRESULT _SetChildBand(CMenuBand * child);
190 HRESULT _SetParentBand(CMenuBand * parent);
191 HRESULT _IsPopup();
192 HRESULT _IsTracking();
193 HRESULT _KillPopupTimers();
194
195 BOOL UseBigIcons()
196 {
197 return m_useBigIcons;
198 }
199
200 private:
201 HRESULT _KeyboardItemChange(DWORD change);
202 HRESULT _CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam, UINT id = 0, LPITEMIDLIST pidl = NULL);
203 };