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