[SHELL32]
[reactos.git] / reactos / dll / win32 / shell32 / shellmenu / CMenuToolbars.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 CMenuBand;
23 class CMenuFocusManager;
24
25 #define WM_USER_ISTRACKEDITEM (WM_APP+41)
26 #define WM_USER_CHANGETRACKEDITEM (WM_APP+42)
27
28 class CMenuToolbarBase :
29 public CWindowImplBaseT< CToolbar<DWORD_PTR>, CControlWinTraits >
30 {
31 CContainedWindow m_pager;
32 private:
33 HFONT m_marlett;
34 BOOL m_useFlatMenus;
35 WNDPROC m_SubclassOld;
36 BOOL m_disableMouseTrack;
37 BOOL m_timerEnabled;
38
39 protected:
40 CMenuBand * m_menuBand;
41 DWORD m_dwMenuFlags;
42 BOOL m_hasSizes;
43 SIZE m_idealSize;
44 SIZE m_itemSize;
45 BOOL m_usePager;
46 CMenuToolbarBase * m_hotBar;
47 INT m_hotItem;
48 CMenuToolbarBase * m_popupBar;
49 INT m_popupItem;
50
51 DWORD m_initFlags;
52 BOOL m_isTrackingPopup;
53
54 INT m_executeIndex;
55 INT m_executeItem;
56 DWORD_PTR m_executeData;
57
58 BOOL m_cancelingPopup;
59
60 public:
61 CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager);
62 virtual ~CMenuToolbarBase();
63
64 HRESULT IsWindowOwner(HWND hwnd);
65 HRESULT CreateToolbar(HWND hwndParent, DWORD dwFlags);
66 HRESULT GetWindow(HWND *phwnd);
67 HRESULT ShowDW(BOOL fShow);
68 HRESULT Close();
69
70 HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
71
72 HRESULT ChangeHotItem(CMenuToolbarBase * toolbar, INT item, DWORD dwFlags);
73 HRESULT ChangePopupItem(CMenuToolbarBase * toolbar, INT item);
74
75 HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu, BOOL keyInitiated);
76 HRESULT PopupSubMenu(UINT itemId, UINT index, HMENU menu);
77 HRESULT TrackContextMenu(IContextMenu* contextMenu, POINT pt);
78
79 HRESULT KeyboardItemChange(DWORD changeType);
80
81 HRESULT PrepareExecuteItem(INT iItem);
82 HRESULT ExecuteItem();
83
84 HRESULT GetSizes(SIZE* pMinSize, SIZE* pMaxSize, SIZE* pIntegralSize);
85 HRESULT SetPosSize(int x, int y, int cx, int cy);
86
87 void InvalidateDraw();
88
89 HRESULT DisableMouseTrack(BOOL bDisable);
90
91 virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0;
92
93 HRESULT CancelCurrentPopup();
94 HRESULT PopupItem(INT iItem, BOOL keyInitiated);
95 HRESULT GetDataFromId(INT iItem, INT* pIndex, DWORD_PTR* pData);
96
97 HRESULT KillPopupTimer();
98
99 HRESULT MenuBarMouseDown(INT iIndex, BOOL isLButton);
100 HRESULT MenuBarMouseUp(INT iIndex, BOOL isLButton);
101 HRESULT ProcessClick(INT iItem);
102 HRESULT ProcessContextMenu(INT iItem);
103 HRESULT BeforeCancelPopup();
104
105 protected:
106 virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0;
107
108 virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax) = 0;
109 virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData) = 0;
110 virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated) = 0;
111 virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData) = 0;
112 virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt) = 0;
113
114 HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last);
115 HRESULT AddSeparator(BOOL last);
116 HRESULT AddPlaceholder();
117 HRESULT ClearToolbar();
118
119 HWND GetToolbar() { return m_hWnd; }
120
121 private:
122 HRESULT UpdateImageLists();
123
124 HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize);
125 HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
126 HRESULT OnGetInfoTip(NMTBGETINFOTIP * tip);
127
128 LRESULT IsTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
129 LRESULT ChangeTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
130 LRESULT OnWinEventWrap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
131 HRESULT OnPopupTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
132
133 BEGIN_MSG_MAP(CMenuToolbarBase)
134 MESSAGE_HANDLER(WM_USER_ISTRACKEDITEM, IsTrackedItem)
135 MESSAGE_HANDLER(WM_USER_CHANGETRACKEDITEM, ChangeTrackedItem)
136 MESSAGE_HANDLER(WM_COMMAND, OnWinEventWrap)
137 MESSAGE_HANDLER(WM_NOTIFY, OnWinEventWrap)
138 MESSAGE_HANDLER(WM_TIMER, OnPopupTimer)
139 END_MSG_MAP()
140 };
141
142 class CMenuStaticToolbar :
143 public CMenuToolbarBase
144 {
145 private:
146 HMENU m_hmenu;
147 HWND m_hwndMenu;
148
149 public:
150 CMenuStaticToolbar(CMenuBand *menuBand);
151 virtual ~CMenuStaticToolbar();
152
153 HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags);
154 HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
155
156 virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
157
158 protected:
159 virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
160
161 virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax);
162 virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData);
163 virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated);
164 virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
165 virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt);
166 };
167
168 class CMenuSFToolbar :
169 public CMenuToolbarBase
170 {
171 private:
172 CComPtr<IShellFolder> m_shellFolder;
173 LPCITEMIDLIST m_idList;
174 HKEY m_hKey;
175
176 public:
177 CMenuSFToolbar(CMenuBand *menuBand);
178 virtual ~CMenuSFToolbar();
179
180 HRESULT SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags);
181 HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
182
183 virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
184
185 protected:
186 virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
187
188 virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax);
189 virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData);
190 virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated);
191 virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData);
192 virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt);
193 };