0a33ec73e7908bc7591011c09cb5416359a9a17d
[reactos.git] / base / shell / rshell / 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_USER+41)
26 #define WM_USER_CHANGETRACKEDITEM (WM_USER+42)
27
28
29 class CMenuToolbarBase
30 {
31 private:
32 HWND m_hwnd; // May be the pager
33 HFONT m_marlett;
34 BOOL m_useFlatMenus;
35 WNDPROC m_SubclassOld;
36 BOOL m_disableMouseTrack;
37
38 protected:
39 CMenuBand * m_menuBand;
40 HWND m_hwndToolbar;
41 DWORD m_dwMenuFlags;
42 BOOL m_hasIdealSize;
43 SIZE m_idealSize;
44 BOOL m_usePager;
45 CMenuToolbarBase * m_hotBar;
46 INT m_hotItem;
47 CMenuToolbarBase * m_popupBar;
48 INT m_popupItem;
49
50 DWORD m_toolbarFlags;
51 BOOL m_isTracking;
52
53 private:
54 static LRESULT CALLBACK s_SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
55
56 public:
57 CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager);
58 virtual ~CMenuToolbarBase();
59
60 HRESULT IsWindowOwner(HWND hwnd);
61 HRESULT CreateToolbar(HWND hwndParent, DWORD dwFlags);
62 HRESULT GetWindow(HWND *phwnd);
63 HRESULT ShowWindow(BOOL fShow);
64 HRESULT Close();
65
66 HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult);
67
68 HRESULT OnHotItemChanged(CMenuToolbarBase * toolbar, INT item);
69 HRESULT OnPopupItemChanged(CMenuToolbarBase * toolbar, INT item);
70
71 HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu* childShellMenu);
72 HRESULT PopupSubMenu(UINT itemId, UINT index, HMENU menu);
73 HRESULT DoContextMenu(IContextMenu* contextMenu);
74
75 HRESULT ChangeHotItem(DWORD changeType);
76 HRESULT OnHotItemChange(const NMTBHOTITEM * hot, LRESULT * theResult);
77
78 HRESULT IsTrackedItem(INT index);
79 HRESULT ChangeTrackedItem(INT index);
80
81 HRESULT GetIdealSize(SIZE& size);
82 HRESULT SetPosSize(int x, int y, int cx, int cy);
83
84 void InvalidateDraw();
85
86 HRESULT DisableMouseTrack(BOOL bDisable);
87
88 virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) = 0;
89 virtual HRESULT OnContextMenu(NMMOUSE * rclick) = 0;
90
91 HRESULT PopupItem(INT uItem);
92 HRESULT HasSubMenu(INT uItem);
93 HRESULT GetDataFromId(INT uItem, INT* pIndex, DWORD_PTR* pData);
94
95 protected:
96 virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
97
98 virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0;
99 virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData) = 0;
100 virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData) = 0;
101
102 LRESULT CALLBACK SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
103
104 HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last);
105 HRESULT AddSeparator(BOOL last);
106 HRESULT AddPlaceholder();
107
108 HRESULT UpdateImageLists();
109
110 private:
111 HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT * theResult);
112 };
113
114 class CMenuStaticToolbar :
115 public CMenuToolbarBase
116 {
117 private:
118 HMENU m_hmenu;
119
120 public:
121 CMenuStaticToolbar(CMenuBand *menuBand);
122 virtual ~CMenuStaticToolbar() {}
123
124 HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags);
125 HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags);
126
127 virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
128 virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
129 virtual HRESULT OnContextMenu(NMMOUSE * rclick);
130
131 protected:
132 virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
133
134 virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData);
135 virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData);
136 };
137
138 class CMenuSFToolbar :
139 public CMenuToolbarBase
140 {
141 private:
142 CComPtr<IShellFolder> m_shellFolder;
143 LPCITEMIDLIST m_idList;
144 HKEY m_hKey;
145
146 public:
147 CMenuSFToolbar(CMenuBand *menuBand);
148 virtual ~CMenuSFToolbar();
149
150 HRESULT SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags);
151 HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv);
152
153 virtual HRESULT FillToolbar(BOOL clearFirst=FALSE);
154 virtual HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult);
155 virtual HRESULT OnContextMenu(NMMOUSE * rclick);
156
157 protected:
158 virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb);
159
160 virtual HRESULT InternalPopupItem(INT uItem, INT index, DWORD_PTR dwData);
161 virtual HRESULT InternalHasSubMenu(INT uItem, INT index, DWORD_PTR dwData);
162 };