4 * Copyright 2014 David Quintana
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.
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.
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
23 class CMenuFocusManager
;
25 #define WM_USER_ISTRACKEDITEM (WM_APP+41)
26 #define WM_USER_CHANGETRACKEDITEM (WM_APP+42)
28 class CMenuToolbarBase
:
29 public CWindowImplBaseT
< CToolbar
<DWORD_PTR
>, CControlWinTraits
>
31 CContainedWindow m_pager
;
35 WNDPROC m_SubclassOld
;
36 BOOL m_disableMouseTrack
;
40 CMenuBand
* m_menuBand
;
46 CMenuToolbarBase
* m_hotBar
;
48 CMenuToolbarBase
* m_popupBar
;
52 BOOL m_isTrackingPopup
;
56 DWORD_PTR m_executeData
;
58 BOOL m_cancelingPopup
;
61 CMenuToolbarBase(CMenuBand
*menuBand
, BOOL usePager
);
62 virtual ~CMenuToolbarBase();
64 HRESULT
IsWindowOwner(HWND hwnd
);
65 HRESULT
CreateToolbar(HWND hwndParent
, DWORD dwFlags
);
66 HRESULT
GetWindow(HWND
*phwnd
);
67 HRESULT
ShowDW(BOOL fShow
);
70 HRESULT
OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
);
72 HRESULT
ChangeHotItem(CMenuToolbarBase
* toolbar
, INT item
, DWORD dwFlags
);
73 HRESULT
ChangePopupItem(CMenuToolbarBase
* toolbar
, INT item
);
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
);
79 HRESULT
KeyboardItemChange(DWORD changeType
);
81 HRESULT
PrepareExecuteItem(INT iItem
);
82 HRESULT
ExecuteItem();
84 HRESULT
GetSizes(SIZE
* pMinSize
, SIZE
* pMaxSize
, SIZE
* pIntegralSize
);
85 HRESULT
SetPosSize(int x
, int y
, int cx
, int cy
);
87 void InvalidateDraw();
89 HRESULT
DisableMouseTrack(BOOL bDisable
);
91 virtual HRESULT
FillToolbar(BOOL clearFirst
=FALSE
) = 0;
93 HRESULT
CancelCurrentPopup();
94 HRESULT
PopupItem(INT iItem
, BOOL keyInitiated
);
95 HRESULT
GetDataFromId(INT iItem
, INT
* pIndex
, DWORD_PTR
* pData
);
97 HRESULT
KillPopupTimer();
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();
106 virtual HRESULT
OnDeletingButton(const NMTOOLBAR
* tb
) = 0;
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;
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();
119 HWND
GetToolbar() { return m_hWnd
; }
122 HRESULT
UpdateImageLists();
124 HRESULT
OnPagerCalcSize(LPNMPGCALCSIZE csize
);
125 HRESULT
OnCustomDraw(LPNMTBCUSTOMDRAW cdraw
, LRESULT
* theResult
);
126 HRESULT
OnGetInfoTip(NMTBGETINFOTIP
* tip
);
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
);
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
)
142 class CMenuStaticToolbar
:
143 public CMenuToolbarBase
150 CMenuStaticToolbar(CMenuBand
*menuBand
);
151 virtual ~CMenuStaticToolbar();
153 HRESULT
SetMenu(HMENU hmenu
, HWND hwnd
, DWORD dwFlags
);
154 HRESULT
GetMenu(HMENU
*phmenu
, HWND
*phwnd
, DWORD
*pdwFlags
);
156 virtual HRESULT
FillToolbar(BOOL clearFirst
=FALSE
);
159 virtual HRESULT
OnDeletingButton(const NMTOOLBAR
* tb
);
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
);
168 class CMenuSFToolbar
:
169 public CMenuToolbarBase
172 CComPtr
<IShellFolder
> m_shellFolder
;
173 LPCITEMIDLIST m_idList
;
177 CMenuSFToolbar(CMenuBand
*menuBand
);
178 virtual ~CMenuSFToolbar();
180 HRESULT
SetShellFolder(IShellFolder
*psf
, LPCITEMIDLIST pidlFolder
, HKEY hKey
, DWORD dwFlags
);
181 HRESULT
GetShellFolder(DWORD
*pdwFlags
, LPITEMIDLIST
*ppidl
, REFIID riid
, void **ppv
);
183 virtual HRESULT
FillToolbar(BOOL clearFirst
=FALSE
);
186 virtual HRESULT
OnDeletingButton(const NMTOOLBAR
* tb
);
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
);