ReactOS  0.4.13-dev-52-g0efcfec
CMenuToolbars.cpp
Go to the documentation of this file.
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 #include "shellmenu.h"
21 #include <commoncontrols.h>
22 #include <shlwapi_undoc.h>
23 #include <uxtheme.h>
24 #include <vssym32.h>
25 
26 #include "CMenuBand.h"
27 #include "CMenuToolbars.h"
28 
29 #define IDS_MENU_EMPTY 34561
30 
31 WINE_DEFAULT_DEBUG_CHANNEL(CMenuToolbars);
32 
33 // FIXME: Enable if/when wine comctl supports this flag properly
34 #define USE_TBSTYLE_EX_VERTICAL 0
35 
36 // User-defined timer ID used while hot-tracking around the menu
37 #define TIMERID_HOTTRACK 1
38 
40 {
41  LRESULT lr;
42  bHandled = OnWinEvent(m_hWnd, uMsg, wParam, lParam, &lr) != S_FALSE;
43  return lr;
44 }
45 
47 {
48  NMHDR * hdr;
49  HRESULT hr;
51 
52  if (theResult)
53  *theResult = 0;
54  switch (uMsg)
55  {
56  case WM_COMMAND:
57  //return OnCommand(wParam, lParam, theResult);
58  return S_OK;
59 
60  case WM_NOTIFY:
61  hdr = reinterpret_cast<LPNMHDR>(lParam);
62  switch (hdr->code)
63  {
64  case TBN_DELETINGBUTTON:
65  return OnDeletingButton(reinterpret_cast<LPNMTOOLBAR>(hdr));
66 
67  case PGN_CALCSIZE:
68  return OnPagerCalcSize(reinterpret_cast<LPNMPGCALCSIZE>(hdr));
69 
70  case TBN_DROPDOWN:
71  return ProcessClick(reinterpret_cast<LPNMTOOLBAR>(hdr)->iItem);
72 
73  case TBN_HOTITEMCHANGE:
74  //return OnHotItemChange(reinterpret_cast<LPNMTBHOTITEM>(hdr), theResult);
75  return S_OK;
76 
77  case NM_CUSTOMDRAW:
78  hr = OnCustomDraw(reinterpret_cast<LPNMTBCUSTOMDRAW>(hdr), &result);
79  if (theResult)
80  *theResult = result;
81  return hr;
82 
83  case TBN_GETINFOTIP:
84  return OnGetInfoTip(reinterpret_cast<LPNMTBGETINFOTIP>(hdr));
85 
86  // Silence unhandled items so that they don't print as unknown
87  case RBN_CHILDSIZE:
88  return S_OK;
89 
90  case TTN_GETDISPINFO:
91  return S_OK;
92 
93  case NM_RELEASEDCAPTURE:
94  break;
95 
96  case NM_CLICK:
97  case NM_RDOWN:
98  case NM_LDOWN:
99  break;
100 
101  case TBN_GETDISPINFO:
102  break;
103 
104  case TBN_BEGINDRAG:
105  case TBN_ENDDRAG:
106  break;
107 
108  case NM_TOOLTIPSCREATED:
109  break;
110 
111  case TBN_DRAGOUT: return S_FALSE;
112 
113  default:
114  TRACE("WM_NOTIFY unknown code %d, %d\n", hdr->code, hdr->idFrom);
115  return S_OK;
116  }
117  return S_FALSE;
118  case WM_WININICHANGE:
119  if (wParam == SPI_SETFLATMENU)
120  {
121  SystemParametersInfo(SPI_GETFLATMENU, 0, &m_useFlatMenus, 0);
122  }
123  }
124 
125  return S_FALSE;
126 }
127 
129 {
130  if (m_disableMouseTrack != bDisable)
131  {
132  m_disableMouseTrack = bDisable;
133  TRACE("DisableMouseTrack %d\n", bDisable);
134  }
135  return S_OK;
136 }
137 
139 {
140  SIZE tbs;
141  GetSizes(NULL, &tbs, NULL);
142  if (csize->dwFlag == PGF_CALCHEIGHT)
143  {
144  csize->iHeight = tbs.cy;
145  }
146  else if (csize->dwFlag == PGF_CALCWIDTH)
147  {
148  csize->iWidth = tbs.cx;
149  }
150  return S_OK;
151 }
152 
154 {
155  bool isHot, isPopup, isActive;
156  TBBUTTONINFO btni;
157 
158  switch (cdraw->nmcd.dwDrawStage)
159  {
160  case CDDS_PREPAINT:
161  *theResult = CDRF_NOTIFYITEMDRAW;
162  return S_OK;
163 
164  case CDDS_ITEMPREPAINT:
165 
166  HWND tlw;
168 
169  // The item with an active submenu gets the CHECKED flag.
170  isHot = m_hotBar == this && (int) cdraw->nmcd.dwItemSpec == m_hotItem;
171  isPopup = m_popupBar == this && (int) cdraw->nmcd.dwItemSpec == m_popupItem;
172  isActive = (GetForegroundWindow() == tlw) || (m_popupBar == this);
173 
174  if (m_hotItem < 0 && isPopup)
175  isHot = TRUE;
176 
177  if ((m_useFlatMenus && isHot) || (m_initFlags & SMINIT_VERTICAL))
178  {
179  COLORREF clrText;
180  HBRUSH bgBrush;
181  RECT rc = cdraw->nmcd.rc;
182  HDC hdc = cdraw->nmcd.hdc;
183 
184  // Remove HOT and CHECKED flags (will restore HOT if necessary)
185  cdraw->nmcd.uItemState &= ~(CDIS_HOT | CDIS_CHECKED);
186 
187  // Decide on the colors
188  if (isHot)
189  {
190  cdraw->nmcd.uItemState |= CDIS_HOT;
191 
192  clrText = GetSysColor(COLOR_HIGHLIGHTTEXT);
193  bgBrush = GetSysColorBrush(m_useFlatMenus ? COLOR_MENUHILIGHT : COLOR_HIGHLIGHT);
194  }
195  else
196  {
197  clrText = GetSysColor(COLOR_MENUTEXT);
198  bgBrush = GetSysColorBrush(COLOR_MENU);
199  }
200 
201  // Paint the background color with the selected color
202  FillRect(hdc, &rc, bgBrush);
203 
204  // Set the text color in advance, this color will be assigned when the ITEMPOSTPAINT triggers
205  SetTextColor(hdc, clrText);
206 
207  // Set the text color, will be used by the internal drawing code
208  cdraw->clrText = clrText;
209  cdraw->iListGap += 4;
210 
211  // Tell the default drawing code we don't want any fanciness, not even a background.
212  *theResult = CDRF_NOTIFYPOSTPAINT | TBCDRF_NOBACKGROUND | TBCDRF_NOEDGES | TBCDRF_NOOFFSET | TBCDRF_NOMARK | 0x00800000; // FIXME: the last bit is Vista+, useful for debugging only
213  }
214  else
215  {
216  // Set the text color, will be used by the internal drawing code
217  cdraw->clrText = GetSysColor(isActive ? COLOR_MENUTEXT : COLOR_GRAYTEXT);
218 
219  // Remove HOT and CHECKED flags (will restore HOT if necessary)
220  cdraw->nmcd.uItemState &= ~CDIS_HOT;
221 
222  // Decide on the colors
223  if (isHot)
224  {
225  cdraw->nmcd.uItemState |= CDIS_HOT;
226  }
227 
228  *theResult = 0;
229  }
230 
231  return S_OK;
232 
233  case CDDS_ITEMPOSTPAINT:
234 
235  // Fetch the button style
236  btni.cbSize = sizeof(btni);
237  btni.dwMask = TBIF_STYLE;
238  GetButtonInfo(cdraw->nmcd.dwItemSpec, &btni);
239 
240  // Check if we need to draw a submenu arrow
241  if (btni.fsStyle & BTNS_DROPDOWN)
242  {
243  // TODO: Support RTL text modes by drawing a leftwards arrow aligned to the left of the control
244 
245  // "8" is the rightwards dropdown arrow in the Marlett font
246  WCHAR text [] = L"8";
247 
248  // Configure the font to draw with Marlett, keeping the current background color as-is
249  SelectObject(cdraw->nmcd.hdc, m_marlett);
250  SetBkMode(cdraw->nmcd.hdc, TRANSPARENT);
251 
252  // Tweak the alignment by 1 pixel so the menu draws like the Windows start menu.
253  RECT rc = cdraw->nmcd.rc;
254  rc.right += 1;
255 
256  // The arrow is drawn at the right of the item's rect, aligned vertically.
258  }
259  *theResult = TRUE;
260  return S_OK;
261  }
262  return S_OK;
263 }
264 
266  m_pager(this, 1),
267  m_useFlatMenus(FALSE),
268  m_disableMouseTrack(FALSE),
269  m_timerEnabled(FALSE),
270  m_menuBand(menuBand),
271  m_dwMenuFlags(0),
272  m_hasSizes(FALSE),
273  m_usePager(usePager),
274  m_hotBar(NULL),
275  m_hotItem(-1),
276  m_popupBar(NULL),
277  m_popupItem(-1),
278  m_isTrackingPopup(FALSE),
279  m_cancelingPopup(FALSE)
280 {
281  m_idealSize.cx = 0;
282  m_idealSize.cy = 0;
283  m_itemSize.cx = 0;
284  m_itemSize.cy = 0;
286  0, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET,
288  DEFAULT_QUALITY, FF_DONTCARE, L"Marlett");
289 }
290 
292 {
293  ClearToolbar();
294 
295  if (m_hWnd)
296  DestroyWindow();
297 
298  if (m_pager.m_hWnd)
299  m_pager.DestroyWindow();
300 
302 }
303 
305 {
307 }
308 
310 {
311  ShowWindow(fShow ? SW_SHOW : SW_HIDE);
312 
313  // Ensure that the right image list is assigned to the toolbar
315 
316  // For custom-drawing
317  SystemParametersInfo(SPI_GETFLATMENU, 0, &m_useFlatMenus, 0);
318 
319  return S_OK;
320 }
321 
323 {
324  if ((m_initFlags & (SMINIT_TOPLEVEL | SMINIT_VERTICAL)) == SMINIT_TOPLEVEL) // not vertical.
325  {
326  // No image list, prevents the buttons from having a margin at the left side
328  return S_OK;
329  }
330 
331  // Assign the correct imagelist and padding based on the current icon size
332 
333  int shiml;
334  if (m_menuBand->UseBigIcons())
335  {
336  shiml = SHIL_LARGE;
337  SetPadding(4, 0);
338  }
339  else
340  {
341  shiml = SHIL_SMALL;
342  SetPadding(4, 4);
343  }
344 
345  IImageList * piml;
346  HRESULT hr = SHGetImageList(shiml, IID_PPV_ARG(IImageList, &piml));
347  if (FAILED_UNEXPECTEDLY(hr))
348  {
350  }
351  else
352  {
353  SetImageList((HIMAGELIST)piml);
354  }
355  return S_OK;
356 }
357 
359 {
360  if (m_hWnd)
361  DestroyWindow();
362 
363  if (m_pager.m_hWnd)
364  m_pager.DestroyWindow();
365 
366  return S_OK;
367 }
368 
370 {
375 
376  if (dwFlags & SMINIT_VERTICAL)
377  {
378  // Activate vertical semantics
379  tbStyles |= CCS_VERT;
380 
381 #if USE_TBSTYLE_EX_VERTICAL
382  tbExStyles |= TBSTYLE_EX_VERTICAL;
383 #endif
384  }
385 
387 
388  // Get a temporary rect to use while creating the toolbar window.
389  // Ensure that it is not a null rect.
390  RECT rc;
391  if (!::GetClientRect(hwndParent, &rc) ||
392  (rc.left == rc.right) ||
393  (rc.top == rc.bottom))
394  {
395  rc.left = 0;
396  rc.top = 0;
397  rc.right = 1;
398  rc.bottom = 1;
399  }
400 
401  SubclassWindow(CToolbar::Create(hwndParent, tbStyles, tbExStyles));
402 
403  SetWindowTheme(m_hWnd, L"", L"");
404 
405  SystemParametersInfo(SPI_GETFLATMENU, 0, &m_useFlatMenus, 0);
406 
408 
409  // If needed, create the pager.
410  if (m_usePager)
411  {
412  LONG pgStyles = PGS_VERT | WS_CHILD | WS_VISIBLE;
413  LONG pgExStyles = 0;
414 
415  HWND hwndPager = CreateWindowEx(
416  pgExStyles, WC_PAGESCROLLER, NULL,
417  pgStyles, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
418  hwndParent, NULL, _AtlBaseModule.GetModuleInstance(), 0);
419 
420  m_pager.SubclassWindow(hwndPager);
421 
422  ::SetParent(m_hWnd, hwndPager);
423 
424  m_pager.SendMessageW(PGM_SETCHILD, 0, reinterpret_cast<LPARAM>(m_hWnd));
425  }
426 
427  // Configure the image lists
429 
430  return S_OK;
431 }
432 
433 HRESULT CMenuToolbarBase::GetSizes(SIZE* pMinSize, SIZE* pMaxSize, SIZE* pIntegralSize)
434 {
435  if (pMinSize)
436  *pMinSize = m_idealSize;
437  if (pMaxSize)
438  *pMaxSize = m_idealSize;
439  if (pIntegralSize)
440  *pIntegralSize = m_itemSize;
441 
442  if (m_hasSizes)
443  return S_OK;
444 
445  TRACE("Sizes out of date, recalculating.\n");
446 
447  if (!m_hWnd)
448  {
449  return S_OK;
450  }
451 
452  // Obtain the ideal size, to be used as min and max
453  GetMaxSize(&m_idealSize);
454  GetIdealSize((m_initFlags & SMINIT_VERTICAL) != 0, &m_idealSize);
455 
456  TRACE("Ideal Size: (%d, %d) for %d buttons\n", m_idealSize, GetButtonCount());
457 
458  // Obtain the button size, to be used as the integral size
459  DWORD size = GetButtonSize();
462  m_hasSizes = TRUE;
463 
464  if (pMinSize)
465  *pMinSize = m_idealSize;
466  if (pMaxSize)
467  *pMaxSize = m_idealSize;
468  if (pIntegralSize)
469  *pIntegralSize = m_itemSize;
470 
471  return S_OK;
472 }
473 
475 {
476  // Update the toolbar or pager to fit the requested rect
477  // If we have a pager, set the toolbar height to the ideal height of the toolbar
478  if (m_pager.m_hWnd)
479  {
480  SetWindowPos(NULL, x, y, cx, m_idealSize.cy, 0);
481  m_pager.SetWindowPos(NULL, x, y, cx, cy, 0);
482  }
483  else
484  {
485  SetWindowPos(NULL, x, y, cx, cy, 0);
486  }
487 
488  // In a vertical menu, resize the buttons to fit the width
489  if (m_initFlags & SMINIT_VERTICAL)
490  {
491  DWORD btnSize = GetButtonSize();
492  SetButtonSize(cx, GET_Y_LPARAM(btnSize));
493  }
494 
495  return S_OK;
496 }
497 
499 {
500  if (m_hWnd && m_hWnd == hwnd) return S_OK;
501  if (m_pager.m_hWnd && m_pager.m_hWnd == hwnd) return S_OK;
502  return S_FALSE;
503 }
504 
506 {
507  if (!phwnd)
508  return E_FAIL;
509 
510  if (m_pager.m_hWnd)
511  *phwnd = m_pager.m_hWnd;
512  else
513  *phwnd = m_hWnd;
514 
515  return S_OK;
516 }
517 
519 {
520  INT index;
522 
523  INT iItem = tip->iItem;
524 
525  GetDataFromId(iItem, &index, &dwData);
526 
527  return InternalGetTooltip(iItem, index, dwData, tip->pszText, tip->cchTextMax);
528 }
529 
531 {
532  if (wParam != TIMERID_HOTTRACK)
533  {
534  bHandled = FALSE;
535  return 0;
536  }
537 
539 
540  if (!m_timerEnabled)
541  return 0;
542 
544 
545  if (m_hotItem < 0)
546  return 0;
547 
548  // Returns S_FALSE if the current item did not show a submenu
550  if (hr != S_FALSE)
551  return 0;
552 
553  // If we didn't switch submenus, cancel the current popup regardless
554  if (m_popupBar)
555  {
557  if (FAILED_UNEXPECTEDLY(hr))
558  return 0;
559  }
560 
561  return 0;
562 }
563 
565 {
566  if (m_timerEnabled)
567  {
570  return S_OK;
571  }
572  return S_FALSE;
573 }
574 
576 {
577  // Ignore the change if it already matches the stored info
578  if (m_hotBar == toolbar && m_hotItem == item)
579  return S_FALSE;
580 
581  // Prevent a change of hot item if the change was triggered by the mouse,
582  // and mouse tracking is disabled.
584  {
585  TRACE("Hot item change prevented by DisableMouseTrack\n");
586  return S_OK;
587  }
588 
589  // Notify the toolbar if the hot-tracking left this toolbar
590  if (m_hotBar == this && toolbar != this)
591  {
592  SetHotItem(-1);
593  }
594 
595  TRACE("Hot item changed from %p %p, to %p %p\n", m_hotBar, m_hotItem, toolbar, item);
596  m_hotBar = toolbar;
597  m_hotItem = item;
598 
599  if (m_hotBar == this)
600  {
601  if (m_isTrackingPopup && !(m_initFlags & SMINIT_VERTICAL))
602  {
603  // If the menubar has an open submenu, switch to the new item's submenu immediately
605  }
606  else if (dwFlags & HICF_MOUSE)
607  {
608  // Vertical menus show/hide the submenu after a delay,
609  // but only with the mouse.
610  if (m_initFlags & SMINIT_VERTICAL)
611  {
612  DWORD elapsed = 0;
613  SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &elapsed, 0);
614  SetTimer(TIMERID_HOTTRACK, elapsed);
616  TRACE("SetTimer called with m_hotItem=%d\n", m_hotItem);
617  }
618  }
619  else
620  {
622  info.cbSize = sizeof(info);
623  info.dwMask = 0;
624 
625  int index = GetButtonInfo(item, &info);
626 
627  SetHotItem(index);
628  }
629  }
630 
631  InvalidateDraw();
632  return S_OK;
633 }
634 
636 {
637  // Ignore the change if it already matches the stored info
638  if (m_popupBar == toolbar && m_popupItem == item)
639  return S_FALSE;
640 
641  // Notify the toolbar if the popup-tracking this toolbar
642  if (m_popupBar == this && toolbar != this)
643  {
644  CheckButton(m_popupItem, FALSE);
646  }
647 
648  m_popupBar = toolbar;
649  m_popupItem = item;
650 
651  if (m_popupBar == this)
652  {
653  CheckButton(m_popupItem, TRUE);
654  }
655 
656  InvalidateDraw();
657  return S_OK;
658 }
659 
661 {
662  TBBUTTON btn;
663  INT idx = (INT)wParam;
664 
665  if (m_hotBar != this)
666  return S_FALSE;
667 
668  if (idx < 0)
669  return S_FALSE;
670 
671  if (!GetButton(idx, &btn))
672  return E_FAIL;
673 
674  if (m_hotItem == btn.idCommand)
675  return S_OK;
676 
677  if (m_popupItem == btn.idCommand)
678  return S_OK;
679 
680  return S_FALSE;
681 }
682 
684 {
685  TBBUTTON btn;
686  BOOL wasTracking = LOWORD(lParam);
687  BOOL mouse = HIWORD(lParam);
688  INT idx = (INT)wParam;
689 
690  if (idx < 0)
691  {
694  }
695 
696  if (!GetButton(idx, &btn))
697  return E_FAIL;
698 
699  TRACE("ChangeTrackedItem %d, %d\n", idx, wasTracking);
700  m_isTrackingPopup = wasTracking;
701  return m_menuBand->_ChangeHotItem(this, btn.idCommand, mouse ? HICF_MOUSE : 0);
702 }
703 
704 HRESULT CMenuToolbarBase::PopupSubMenu(UINT iItem, UINT index, IShellMenu* childShellMenu, BOOL keyInitiated)
705 {
706  // Calculate the submenu position and exclude area
707  RECT rc = { 0 };
708 
709  if (!GetItemRect(index, &rc))
710  return E_FAIL;
711 
712  POINT a = { rc.left, rc.top };
713  POINT b = { rc.right, rc.bottom };
714 
715  ClientToScreen(&a);
716  ClientToScreen(&b);
717 
718  POINTL pt = { a.x, b.y };
719  RECTL rcl = { a.x, a.y, b.x, b.y };
720 
721  if (m_initFlags & SMINIT_VERTICAL)
722  {
723  // FIXME: Hardcoding this here feels hacky.
724  if (IsAppThemed())
725  {
726  pt.x = b.x - 1;
727  pt.y = a.y - 1;
728  }
729  else
730  {
731  pt.x = b.x - 3;
732  pt.y = a.y - 3;
733  }
734  }
735 
736  // Display the submenu
738 
739  m_menuBand->_ChangePopupItem(this, iItem);
740  m_menuBand->_OnPopupSubMenu(childShellMenu, &pt, &rcl, keyInitiated);
741 
742  return S_OK;
743 }
744 
746 {
747  // Calculate the submenu position and exclude area
748  RECT rc = { 0 };
749 
750  if (!GetItemRect(index, &rc))
751  return E_FAIL;
752 
753  POINT a = { rc.left, rc.top };
754  POINT b = { rc.right, rc.bottom };
755 
756  ClientToScreen(&a);
757  ClientToScreen(&b);
758 
759  POINT pt = { a.x, b.y };
760  RECT rcl = { a.x, a.y, b.x, b.y };
761 
762  if (m_initFlags & SMINIT_VERTICAL)
763  {
764  pt.x = b.x;
765  pt.y = a.y;
766  }
767 
768  HMENU popup = GetSubMenu(menu, index);
769 
770  // Display the submenu
772  m_menuBand->_ChangePopupItem(this, iItem);
773  m_menuBand->_TrackSubMenu(popup, pt.x, pt.y, rcl);
776 
777  return S_OK;
778 }
779 
781 {
782  // Cancel submenus
784  if (m_popupBar)
786 
787  // Display the context menu
788  return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
789 }
790 
792 {
794  TRACE("BeforeCancelPopup\n");
795  return S_OK;
796 }
797 
799 {
801  {
802  TRACE("Item click prevented by DisableMouseTrack\n");
803  return S_OK;
804  }
805 
806  // If a button is clicked while a submenu was open, cancel the submenu.
807  if (!(m_initFlags & SMINIT_VERTICAL) && m_isTrackingPopup)
808  {
809  TRACE("OnCommand cancelled because it was tracking submenu.\n");
810  return S_FALSE;
811  }
812 
813  if (PopupItem(iItem, FALSE) == S_OK)
814  {
815  TRACE("PopupItem returned S_OK\n");
816  return S_FALSE;
817  }
818 
819  TRACE("Executing...\n");
820 
821  return m_menuBand->_MenuItemSelect(MPOS_EXECUTE);
822 }
823 
825 {
826  INT index;
827  DWORD_PTR data;
828 
829  GetDataFromId(iItem, &index, &data);
830 
831  DWORD pos = GetMessagePos();
833 
834  return InternalContextMenu(iItem, index, data, pt);
835 }
836 
838 {
839  TBBUTTON btn;
840 
841  GetButton(iIndex, &btn);
842 
843  if ((m_initFlags & SMINIT_VERTICAL)
844  || m_popupBar
845  || m_cancelingPopup)
846  {
848  return S_OK;
849  }
850 
851  return ProcessClick(btn.idCommand);
852 }
853 
855 {
856  TBBUTTON btn;
857 
859 
860  if (!(m_initFlags & SMINIT_VERTICAL))
861  return S_OK;
862 
863  GetButton(iIndex, &btn);
864 
865  if (isLButton)
866  return ProcessClick(btn.idCommand);
867  else
868  return ProcessContextMenu(btn.idCommand);
869 }
870 
872 {
873  this->m_menuBand->_KillPopupTimers();
874 
875  m_executeItem = iItem;
876  return GetDataFromId(iItem, &m_executeIndex, &m_executeData);
877 }
878 
880 {
882 }
883 
885 {
886  int prev = m_hotItem;
887  int index = -1;
888 
889  if (dwSelectType != 0xFFFFFFFF)
890  {
891  int count = GetButtonCount();
892 
893  if (dwSelectType == VK_HOME)
894  {
895  index = 0;
896  dwSelectType = VK_DOWN;
897  }
898  else if (dwSelectType == VK_END)
899  {
900  index = count - 1;
901  dwSelectType = VK_UP;
902  }
903  else
904  {
905  if (m_hotItem >= 0)
906  {
907  TBBUTTONINFO info = { 0 };
908  info.cbSize = sizeof(TBBUTTONINFO);
909  info.dwMask = 0;
910  index = GetButtonInfo(m_hotItem, &info);
911  }
912 
913  if (index < 0)
914  {
915  if (dwSelectType == VK_UP)
916  {
917  index = count - 1;
918  }
919  else if (dwSelectType == VK_DOWN)
920  {
921  index = 0;
922  }
923  }
924  else
925  {
926  if (dwSelectType == VK_UP)
927  {
928  index--;
929  }
930  else if (dwSelectType == VK_DOWN)
931  {
932  index++;
933  }
934  }
935  }
936 
937  TBBUTTON btn = { 0 };
938  while (index >= 0 && index < count)
939  {
940  DWORD res = GetButton(index, &btn);
941  if (!res)
942  return E_FAIL;
943 
944  if (btn.dwData)
945  {
946  if (prev != btn.idCommand)
947  {
948  TRACE("Setting Hot item to %d\n", index);
949  if (!(m_initFlags & SMINIT_VERTICAL) && m_isTrackingPopup)
950  {
951  HWND tlw;
953  SendMessageW(tlw, WM_CANCELMODE, 0, 0);
955  }
956  else
957  m_menuBand->_ChangeHotItem(this, btn.idCommand, 0);
958  }
959  return S_OK;
960  }
961 
962  if (dwSelectType == VK_UP)
963  {
964  index--;
965  }
966  else if (dwSelectType == VK_DOWN)
967  {
968  index++;
969  }
970  }
971 
972  return S_FALSE;
973  }
974 
975  if (prev != -1)
976  {
977  TRACE("Setting Hot item to null\n");
978  m_menuBand->_ChangeHotItem(NULL, -1, 0);
979  }
980 
981  return S_FALSE;
982 }
983 
984 HRESULT CMenuToolbarBase::AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last)
985 {
986  TBBUTTON tbb = { 0 };
987 
988  tbb.fsState = TBSTATE_ENABLED;
989 #if !USE_TBSTYLE_EX_VERTICAL
990  if (!last && (m_initFlags & SMINIT_VERTICAL))
991  tbb.fsState |= TBSTATE_WRAP;
992 #endif
993  tbb.fsStyle = BTNS_CHECKGROUP;
994 
995  if (hasSubMenu && (m_initFlags & SMINIT_VERTICAL))
996  tbb.fsStyle |= BTNS_DROPDOWN;
997 
998  if (!(m_initFlags & SMINIT_VERTICAL))
999  tbb.fsStyle |= BTNS_AUTOSIZE;
1000 
1001  tbb.iString = (INT_PTR) caption;
1002  tbb.idCommand = commandId;
1003 
1004  tbb.iBitmap = iconId;
1005  tbb.dwData = buttonData;
1006 
1007  m_hasSizes = FALSE;
1008 
1009  if (!AddButtons(1, &tbb))
1010  return HRESULT_FROM_WIN32(GetLastError());
1011  return S_OK;
1012 }
1013 
1015 {
1016  TBBUTTON tbb = { 0 };
1017 
1018  tbb.fsState = TBSTATE_ENABLED;
1019 #if !USE_TBSTYLE_EX_VERTICAL
1020  if (!last && (m_initFlags & SMINIT_VERTICAL))
1021  tbb.fsState |= TBSTATE_WRAP;
1022 #endif
1023  tbb.fsStyle = BTNS_SEP;
1024  tbb.iBitmap = 0;
1025 
1026  m_hasSizes = FALSE;
1027 
1028  if (!AddButtons(1, &tbb))
1029  return HRESULT_FROM_WIN32(GetLastError());
1030 
1031  return S_OK;
1032 }
1033 
1035 {
1036  TBBUTTON tbb = { 0 };
1037  WCHAR MenuString[128];
1038 
1039  LoadStringW(GetModuleHandle(L"shell32.dll"), IDS_MENU_EMPTY, MenuString, _countof(MenuString));
1040 
1041  tbb.fsState = 0;
1042  tbb.fsStyle = 0;
1043  tbb.iString = (INT_PTR) MenuString;
1044  tbb.iBitmap = -1;
1045 
1046  m_hasSizes = FALSE;
1047 
1048  if (!AddButtons(1, &tbb))
1049  return HRESULT_FROM_WIN32(GetLastError());
1050 
1051  return S_OK;
1052 }
1053 
1055 {
1056  while (DeleteButton(0))
1057  {
1058  // empty;
1059  }
1060  m_hasSizes = FALSE;
1061  return S_OK;
1062 }
1063 
1065 {
1066  if (pData)
1067  *pData = NULL;
1068 
1069  if (pIndex)
1070  *pIndex = -1;
1071 
1072  if (iItem < 0)
1073  return S_OK;
1074 
1075  TBBUTTONINFO info = { 0 };
1076 
1077  info.cbSize = sizeof(TBBUTTONINFO);
1078  info.dwMask = TBIF_COMMAND | TBIF_LPARAM;
1079 
1080  int index = GetButtonInfo(iItem, &info);
1081  if (index < 0)
1082  return E_FAIL;
1083 
1084  if (pIndex)
1085  *pIndex = index;
1086 
1087  if (pData)
1088  *pData = info.lParam;
1089 
1090  return S_OK;
1091 }
1092 
1094 {
1095  return m_menuBand->_CancelCurrentPopup();
1096 }
1097 
1099 {
1100  INT index;
1101  DWORD_PTR dwData;
1102 
1103  if (iItem < 0)
1104  return S_OK;
1105 
1106  if (m_popupBar == this && m_popupItem == iItem)
1107  return S_OK;
1108 
1109  GetDataFromId(iItem, &index, &dwData);
1110 
1112  if (hr != S_OK)
1113  return hr;
1114 
1115  if (m_popupBar)
1116  {
1118  if (FAILED_UNEXPECTEDLY(hr))
1119  return hr;
1120  }
1121 
1122  if (!(m_initFlags & SMINIT_VERTICAL))
1123  {
1124  TRACE("PopupItem non-vertical %d %d\n", index, iItem);
1125  m_menuBand->_ChangeHotItem(this, iItem, 0);
1126  }
1127 
1128  return InternalPopupItem(iItem, index, dwData, keyInitiated);
1129 }
1130 
1132  CMenuToolbarBase(menuBand, FALSE),
1133  m_hmenu(NULL),
1134  m_hwndMenu(NULL)
1135 {
1136 }
1137 
1139 {
1140 }
1141 
1143  _Out_opt_ HMENU *phmenu,
1144  _Out_opt_ HWND *phwnd,
1145  _Out_opt_ DWORD *pdwFlags)
1146 {
1147  if (phmenu)
1148  *phmenu = m_hmenu;
1149  if (phwnd)
1150  *phwnd = m_hwndMenu;
1151  if (pdwFlags)
1152  *pdwFlags = m_dwMenuFlags;
1153 
1154  return S_OK;
1155 }
1156 
1158  HMENU hmenu,
1159  HWND hwnd,
1160  DWORD dwFlags)
1161 {
1162  m_hmenu = hmenu;
1163  m_hwndMenu = hwnd;
1165 
1166  ClearToolbar();
1167 
1168  return S_OK;
1169 }
1170 
1172 {
1173  int i;
1174  int ic = GetMenuItemCount(m_hmenu);
1175 
1176  if (clearFirst)
1177  {
1178  ClearToolbar();
1179  }
1180 
1181  int count = 0;
1182  for (i = 0; i < ic; i++)
1183  {
1184  BOOL last = i + 1 == ic;
1185 
1187 
1188  info.cbSize = sizeof(info);
1189  info.dwTypeData = NULL;
1190  info.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID;
1191 
1192  if (!GetMenuItemInfoW(m_hmenu, i, TRUE, &info))
1193  {
1194  TRACE("Error obtaining info for menu item at pos=%d\n", i);
1195  continue;
1196  }
1197 
1198  count++;
1199 
1200  if (info.fType & MFT_SEPARATOR)
1201  {
1202  AddSeparator(last);
1203  }
1204  else if (!(info.fType & MFT_BITMAP))
1205  {
1206  info.cch++;
1207  info.dwTypeData = (PWSTR) HeapAlloc(GetProcessHeap(), 0, (info.cch + 1) * sizeof(WCHAR));
1208 
1209  info.fMask = MIIM_STRING | MIIM_SUBMENU | MIIM_ID;
1211 
1212  SMINFO * sminfo = new SMINFO();
1213  sminfo->dwMask = SMIM_ICON | SMIM_FLAGS;
1214 
1215  HRESULT hr = m_menuBand->_CallCBWithItemId(info.wID, SMC_GETINFO, 0, reinterpret_cast<LPARAM>(sminfo));
1216  if (FAILED_UNEXPECTEDLY(hr))
1217  {
1218  delete sminfo;
1219  return hr;
1220  }
1221 
1222  AddButton(info.wID, info.dwTypeData, info.hSubMenu != NULL, sminfo->iIcon, reinterpret_cast<DWORD_PTR>(sminfo), last);
1223 
1224  HeapFree(GetProcessHeap(), 0, info.dwTypeData);
1225  }
1226  }
1227 
1228  return S_OK;
1229 }
1230 
1232 {
1233  //SMINFO * info = reinterpret_cast<SMINFO*>(dwData);
1234  UNIMPLEMENTED;
1235  return E_NOTIMPL;
1236 }
1237 
1239 {
1240  delete reinterpret_cast<SMINFO*>(tb->tbButton.dwData);
1241  return S_OK;
1242 }
1243 
1245 {
1246  CComPtr<IContextMenu> contextMenu;
1247  HRESULT hr = m_menuBand->_CallCBWithItemId(iItem, SMC_GETOBJECT,
1248  reinterpret_cast<WPARAM>(&IID_IContextMenu), reinterpret_cast<LPARAM>(&contextMenu));
1249  if (hr != S_OK)
1250  return hr;
1251 
1252  return TrackContextMenu(contextMenu, pt);
1253 }
1254 
1256 {
1257  return m_menuBand->_CallCBWithItemId(iItem, SMC_EXEC, 0, 0);
1258 }
1259 
1261 {
1262  SMINFO * nfo = reinterpret_cast<SMINFO*>(dwData);
1263  if (!nfo)
1264  return E_FAIL;
1265 
1266  if (nfo->dwFlags&SMIF_TRACKPOPUP)
1267  {
1268  return PopupSubMenu(iItem, index, m_hmenu);
1269  }
1270  else
1271  {
1272  CComPtr<IShellMenu> shellMenu;
1273  HRESULT hr = m_menuBand->_CallCBWithItemId(iItem, SMC_GETOBJECT, reinterpret_cast<WPARAM>(&IID_IShellMenu), reinterpret_cast<LPARAM>(&shellMenu));
1274  if (FAILED_UNEXPECTEDLY(hr))
1275  return hr;
1276 
1277  return PopupSubMenu(iItem, index, shellMenu, keyInitiated);
1278  }
1279 }
1280 
1282 {
1284 }
1285 
1287  CMenuToolbarBase(menuBand, TRUE),
1288  m_shellFolder(NULL),
1289  m_idList(NULL),
1290  m_hKey(NULL)
1291 {
1292 }
1293 
1295 {
1296 }
1297 
1299 {
1300  IShellFolder * psf = (IShellFolder*) lParam;
1303  HRESULT hr = psf->CompareIDs(0, pidl1, pidl2);
1304  if (FAILED(hr))
1305  {
1306  // No way to cancel, so sort to equal.
1307  return 0;
1308  }
1309  return (int)(short)LOWORD(hr);
1310 }
1311 
1313 {
1314  HRESULT hr;
1315 
1316  CComPtr<IEnumIDList> eidl;
1317  hr = m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
1318  if (FAILED_UNEXPECTEDLY(hr))
1319  return hr;
1320 
1321  HDPA dpaSort = DPA_Create(10);
1322 
1324  hr = eidl->Next(1, &item, NULL);
1325  while (hr == S_OK)
1326  {
1327  if (m_menuBand->_CallCBWithItemPidl(item, 0x10000000, 0, 0) == S_FALSE)
1328  {
1329  DPA_AppendPtr(dpaSort, item);
1330  }
1331  else
1332  {
1334  }
1335 
1336  hr = eidl->Next(1, &item, NULL);
1337  }
1338 
1339  // If no items were added, show the "empty" placeholder
1340  if (DPA_GetPtrCount(dpaSort) == 0)
1341  {
1342  DPA_Destroy(dpaSort);
1343  return AddPlaceholder();
1344  }
1345 
1346  TRACE("FillToolbar added %d items to the DPA\n", DPA_GetPtrCount(dpaSort));
1347 
1349 
1350  for (int i = 0; i<DPA_GetPtrCount(dpaSort);)
1351  {
1352  PWSTR MenuString;
1353 
1354  INT index = 0;
1355  INT indexOpen = 0;
1356 
1357  STRRET sr = { STRRET_CSTR, { 0 } };
1358 
1359  item = (LPITEMIDLIST)DPA_GetPtr(dpaSort, i);
1360 
1361  hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
1362  if (FAILED_UNEXPECTEDLY(hr))
1363  {
1364  DPA_Destroy(dpaSort);
1365  return hr;
1366  }
1367 
1368  StrRetToStr(&sr, NULL, &MenuString);
1369 
1371 
1372  LPCITEMIDLIST itemc = item;
1373 
1374  SFGAOF attrs = SFGAO_FOLDER;
1375  hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs);
1376 
1377  DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(item);
1378 
1379  // Fetch next item already, so we know if the current one is the last
1380  i++;
1381 
1382  AddButton(i, MenuString, attrs & SFGAO_FOLDER, index, dwData, i >= DPA_GetPtrCount(dpaSort));
1383 
1384  CoTaskMemFree(MenuString);
1385  }
1386 
1387  DPA_Destroy(dpaSort);
1388  return hr;
1389 }
1390 
1392 {
1393  //ITEMIDLIST * pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1394  UNIMPLEMENTED;
1395  return E_NOTIMPL;
1396 }
1397 
1399 {
1400  ILFree(reinterpret_cast<LPITEMIDLIST>(tb->tbButton.dwData));
1401  return S_OK;
1402 }
1403 
1405 {
1406  m_shellFolder = psf;
1407  m_idList = ILClone(pidlFolder);
1408  m_hKey = hKey;
1410 
1411  ClearToolbar();
1412 
1413  return S_OK;
1414 }
1415 
1417 {
1418  HRESULT hr;
1419 
1420  hr = m_shellFolder->QueryInterface(riid, ppv);
1421  if (FAILED_UNEXPECTEDLY(hr))
1422  return hr;
1423 
1424  if (pdwFlags)
1425  *pdwFlags = m_dwMenuFlags;
1426 
1427  if (ppidl)
1428  {
1429  LPITEMIDLIST pidl = NULL;
1430 
1431  if (m_idList)
1432  {
1433  pidl = ILClone(m_idList);
1434  if (!pidl)
1435  {
1436  ERR("ILClone failed!\n");
1437  (*reinterpret_cast<IUnknown**>(ppv))->Release();
1438  return E_FAIL;
1439  }
1440  }
1441 
1442  *ppidl = pidl;
1443  }
1444 
1445  return hr;
1446 }
1447 
1449 {
1450  HRESULT hr;
1451  CComPtr<IContextMenu> contextMenu = NULL;
1452  LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(dwData);
1453 
1454  hr = m_shellFolder->GetUIObjectOf(GetToolbar(), 1, &pidl, IID_NULL_PPV_ARG(IContextMenu, &contextMenu));
1455  if (FAILED_UNEXPECTEDLY(hr))
1456  {
1457  return hr;
1458  }
1459 
1460  hr = TrackContextMenu(contextMenu, pt);
1461 
1462  return hr;
1463 }
1464 
1466 {
1467  return m_menuBand->_CallCBWithItemPidl(reinterpret_cast<LPITEMIDLIST>(data), SMC_SFEXEC, 0, 0);
1468 }
1469 
1471 {
1472  HRESULT hr;
1473  UINT uId;
1474  UINT uIdAncestor;
1475  DWORD flags;
1476  CComPtr<IShellMenuCallback> psmc;
1477  CComPtr<IShellMenu> shellMenu;
1478 
1479  LPITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1480 
1481  if (!pidl)
1482  return E_FAIL;
1483 
1485  if (FAILED_UNEXPECTEDLY(hr))
1486  return hr;
1487 
1488  m_menuBand->GetMenuInfo(&psmc, &uId, &uIdAncestor, &flags);
1489 
1490  // FIXME: not sure what to use as uId/uIdAncestor here
1491  hr = shellMenu->Initialize(psmc, 0, uId, SMINIT_VERTICAL);
1492  if (FAILED_UNEXPECTEDLY(hr))
1493  return hr;
1494 
1495  CComPtr<IShellFolder> childFolder;
1496  hr = m_shellFolder->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &childFolder));
1497  if (FAILED_UNEXPECTEDLY(hr))
1498  return hr;
1499 
1500  hr = shellMenu->SetShellFolder(childFolder, NULL, NULL, 0);
1501  if (FAILED_UNEXPECTEDLY(hr))
1502  return hr;
1503 
1504  return PopupSubMenu(iItem, index, shellMenu, keyInitiated);
1505 }
1506 
1508 {
1509  HRESULT hr;
1510  LPCITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1511 
1512  SFGAOF attrs = SFGAO_FOLDER;
1513  hr = m_shellFolder->GetAttributesOf(1, &pidl, &attrs);
1514  if (FAILED_UNEXPECTEDLY(hr))
1515  return hr;
1516 
1517  return (attrs & SFGAO_FOLDER) ? S_OK : S_FALSE;
1518 }
#define TBSTYLE_EX_DOUBLEBUFFER
Definition: commctrl.h:986
#define SHIL_LARGE
Definition: shellapi.h:182
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
CMenuToolbarBase(CMenuBand *menuBand, BOOL usePager)
#define TBIF_COMMAND
Definition: commctrl.h:1196
HRESULT AddPlaceholder()
HWND Create(HWND hWndParent, DWORD dwStyles=0, DWORD dwExStyles=0)
Definition: rosctrls.h:241
HRESULT AddSeparator(BOOL last)
#define TBIF_LPARAM
Definition: commctrl.h:1195
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
HRESULT ProcessClick(INT iItem)
#define WC_PAGESCROLLER
Definition: commctrl.h:4472
HRESULT AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last)
#define MIIM_FTYPE
Definition: winuser.h:724
#define REFIID
Definition: guiddef.h:113
#define TRUE
Definition: types.h:120
#define COLOR_HIGHLIGHT
Definition: winuser.h:916
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData)
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
char hdr[14]
Definition: iptest.cpp:33
HDPA WINAPI DPA_Create(INT nGrow)
Definition: dpa.c:950
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated)=0
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt)
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:422
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData)
#define TBN_GETDISPINFO
Definition: commctrl.h:1392
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData)=0
HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT *theResult)
#define DEFAULT_QUALITY
Definition: wingdi.h:435
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
#define FF_DONTCARE
Definition: wingdi.h:447
HRESULT hr
Definition: shlfolder.c:183
static HMENU hmenu
Definition: win.c:66
_In_ BOOLEAN Release
Definition: classpnp.h:929
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
LRESULT ChangeTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL WINAPI DPA_Destroy(HDPA hdpa)
Definition: dpa.c:396
#define DrawTextEx
Definition: winuser.h:5638
#define CDRF_NOTIFYPOSTPAINT
Definition: commctrl.h:259
#define TBSTYLE_CUSTOMERASE
Definition: commctrl.h:966
POINT last
Definition: font.c:46
#define TBN_BEGINDRAG
Definition: commctrl.h:1279
#define pt(x, y)
Definition: drawing.c:79
#define SW_HIDE
Definition: winuser.h:762
REFIID riid
Definition: precomp.h:44
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
HRESULT GetDataFromId(INT iItem, INT *pIndex, DWORD_PTR *pData)
uint16_t * PWSTR
Definition: typedefs.h:54
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE)
WINE_DEFAULT_DEBUG_CHANNEL(CMenuToolbars)
#define TBSTYLE_TRANSPARENT
Definition: commctrl.h:968
const WCHAR * text
Definition: package.c:1827
#define _countof(array)
Definition: fontsub.cpp:30
HRESULT _GetTopLevelWindow(HWND *topLevel)
Definition: CMenuBand.cpp:874
GLuint GLuint GLsizei count
Definition: gl.h:1545
HRESULT ChangeHotItem(CMenuToolbarBase *toolbar, INT item, DWORD dwFlags)
#define NMTBGETINFOTIP
Definition: commctrl.h:1365
#define TBCDRF_NOOFFSET
Definition: commctrl.h:1007
#define MAKELPARAM(l, h)
Definition: winuser.h:3915
#define NM_RELEASEDCAPTURE
Definition: commctrl.h:141
#define INT
Definition: polytest.cpp:20
#define TBIF_STYLE
Definition: commctrl.h:1194
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
static HDC
Definition: imagelist.c:92
#define CALLBACK
Definition: compat.h:27
HWND hWnd
Definition: settings.c:17
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define SystemParametersInfo
Definition: winuser.h:5724
LRESULT IsTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LONG top
Definition: windef.h:292
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData)=0
#define GET_X_LPARAM(lp)
Definition: windowsx.h:274
static HANDLE ULONG_PTR dwData
Definition: file.c:35
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
#define CDDS_ITEMPREPAINT
Definition: commctrl.h:270
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define PGF_CALCHEIGHT
Definition: commctrl.h:4555
#define BTNS_AUTOSIZE
Definition: commctrl.h:976
#define MFT_BITMAP
Definition: winuser.h:733
HRESULT CreateToolbar(HWND hwndParent, DWORD dwFlags)
UINT_PTR WPARAM
Definition: windef.h:207
HRESULT PrepareExecuteItem(INT iItem)
#define VK_DOWN
Definition: winuser.h:2181
#define WS_CHILD
Definition: pedump.c:617
DWORD WINAPI GetMessagePos(void)
Definition: message.c:1350
#define DT_RIGHT
Definition: winuser.h:538
LONG left
Definition: windef.h:291
virtual HRESULT STDMETHODCALLTYPE GetMenuInfo(IShellMenuCallback **ppsmc, UINT *puId, UINT *puIdAncestor, DWORD *pdwFlags)
Definition: CMenuBand.cpp:91
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
int32_t INT_PTR
Definition: typedefs.h:62
BYTE fsStyle
Definition: commctrl.h:924
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define DEFAULT_CHARSET
Definition: wingdi.h:383
LONG right
Definition: windef.h:293
#define TBCDRF_NOEDGES
Definition: commctrl.h:1005
#define IID_PPV_ARG(Itype, ppType)
#define E_FAIL
Definition: ddrawi.h:102
HRESULT _CancelCurrentPopup()
Definition: CMenuBand.cpp:1038
BOOL WINAPI DestroyWindow(_In_ HWND)
#define PGM_SETCHILD
Definition: commctrl.h:4488
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
CMenuSFToolbar(CMenuBand *menuBand)
int32_t INT
Definition: typedefs.h:56
#define TBN_DRAGOUT
Definition: commctrl.h:1309
DWORD WINAPI GetSysColor(_In_ int)
WPARAM wParam
Definition: combotst.c:138
#define DPA_AppendPtr(hdpa, pitem)
Definition: commctrl.h:4929
#define TBN_HOTITEMCHANGE
Definition: commctrl.h:1308
#define CCS_VERT
Definition: commctrl.h:2221
struct _test_info info[]
Definition: SetCursorPos.c:19
CComPtr< IShellFolder > m_shellFolder
HRESULT OnGetInfoTip(NMTBGETINFOTIP *tip)
#define WM_USER_CHANGETRACKEDITEM
Definition: CMenuToolbars.h:26
HRESULT CompareIDs([in] LPARAM lParam, [in] PCUIDLIST_RELATIVE pidl1, [in] PCUIDLIST_RELATIVE pidl2)
#define PGN_CALCSIZE
Definition: commctrl.h:4552
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:93
#define CCS_NODIVIDER
Definition: commctrl.h:2220
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1032
#define TIMERID_HOTTRACK
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define VK_HOME
Definition: winuser.h:2177
#define MIIM_SUBMENU
Definition: winuser.h:718
HRESULT KillPopupTimer()
#define TBN_DROPDOWN
Definition: commctrl.h:1288
#define BTNS_CHECKGROUP
Definition: commctrl.h:974
#define VK_UP
Definition: winuser.h:2179
HRESULT _KillPopupTimers()
Definition: CMenuBand.cpp:1119
#define TBSTYLE_REGISTERDROP
Definition: commctrl.h:967
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated)
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
BOOL WINAPI IsAppThemed(void)
Definition: system.c:596
#define SubclassWindow(hwnd, lpfn)
Definition: windowsx.h:512
virtual HRESULT OnDeletingButton(const NMTOOLBAR *tb)
HRESULT MenuBarMouseUp(INT iIndex, BOOL isLButton)
HRESULT ProcessContextMenu(INT iItem)
HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
Definition: shellord.c:2007
HRESULT _ChangeHotItem(CMenuToolbarBase *tb, INT id, DWORD dwFlags)
Definition: CMenuBand.cpp:880
int CALLBACK PidlListSort(void *item1, void *item2, LPARAM lParam)
HRESULT BeforeCancelPopup()
#define CLIP_DEFAULT_PRECIS
Definition: wingdi.h:425
HRESULT UpdateImageLists()
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
#define TTN_GETDISPINFO
Definition: commctrl.h:1850
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
Definition: uxthemesupp.c:69
unsigned int idx
Definition: utils.c:41
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData)
#define CreateWindowEx
Definition: winuser.h:5621
#define TRANSPARENT
Definition: wingdi.h:949
#define S_FALSE
Definition: winerror.h:2357
#define HICF_MOUSE
Definition: commctrl.h:1298
#define CreateFont
Definition: wingdi.h:4421
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:570
COLORREF clrText
Definition: commctrl.h:993
smooth NULL
Definition: ftsmooth.c:416
#define PGF_CALCWIDTH
Definition: commctrl.h:4554
static HWND hwndParent
Definition: cryptui.c:300
#define COLOR_MENU
Definition: winuser.h:907
LRESULT OnWinEventWrap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
HRESULT ShowDW(BOOL fShow)
#define RBN_CHILDSIZE
Definition: commctrl.h:1608
#define WM_WININICHANGE
Definition: winuser.h:1612
HRESULT PopupItem(INT iItem, BOOL keyInitiated)
LONG cx
Definition: windef.h:319
LONG_PTR LPARAM
Definition: windef.h:208
#define CCS_TOP
Definition: commctrl.h:2214
#define CCS_NOPARENTALIGN
Definition: commctrl.h:2218
#define SMC_EXEC
Definition: undocshell.h:611
DWORD dwFlag
Definition: commctrl.h:4559
#define DPA_GetPtrCount(hdpa)
Definition: commctrl.h:4926
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated)
#define CDRF_NOTIFYITEMDRAW
Definition: commctrl.h:260
GLuint index
Definition: glext.h:6031
#define DT_VCENTER
Definition: winuser.h:543
INT_PTR iString
Definition: commctrl.h:931
#define SW_SHOW
Definition: winuser.h:769
#define COLOR_HIGHLIGHTTEXT
Definition: winuser.h:917
HRESULT KeyboardItemChange(DWORD changeType)
HRESULT _OnPopupSubMenu(IShellMenu *childShellMenu, POINTL *pAt, RECTL *pExclude, BOOL mouseInitiated)
Definition: CMenuBand.cpp:1055
HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
HRESULT _CallCBWithItemPidl(LPITEMIDLIST pidl, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CMenuBand.cpp:773
DWORD_PTR dwData
Definition: commctrl.h:930
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
int iBitmap
Definition: commctrl.h:921
#define MIIM_ID
Definition: winuser.h:717
#define TBN_ENDDRAG
Definition: commctrl.h:1280
HRESULT _ChangePopupItem(CMenuToolbarBase *tb, INT id)
Definition: CMenuBand.cpp:899
virtual ~CMenuSFToolbar()
#define _Out_opt_
Definition: no_sal2.h:339
virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax)
#define IID_NULL_PPV_ARG(Itype, ppType)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
CMenuStaticToolbar(CMenuBand *menuBand)
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
NMCUSTOMDRAW nmcd
Definition: commctrl.h:989
#define GetProcessHeap()
Definition: compat.h:395
#define BTNS_SEP
Definition: commctrl.h:971
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
BOOL UseBigIcons()
Definition: CMenuBand.h:207
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
DWORD COLORREF
Definition: windef.h:285
HRESULT _TrackContextMenu(IContextMenu *popup, INT x, INT y)
Definition: CMenuBand.cpp:821
HRESULT TrackContextMenu(IContextMenu *contextMenu, POINT pt)
virtual HRESULT OnDeletingButton(const NMTOOLBAR *tb)=0
CContainedWindow m_pager
Definition: CMenuToolbars.h:31
#define CDIS_HOT
Definition: commctrl.h:282
static const struct metadata_item item2[]
Definition: metadata.c:2807
#define NMTOOLBAR
Definition: commctrl.h:1428
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:35
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define COLOR_MENUTEXT
Definition: winuser.h:910
HRESULT OnPopupTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
#define OUT_DEFAULT_PRECIS
Definition: wingdi.h:414
unsigned long DWORD
Definition: ntddk_ex.h:95
CMenuToolbarBase * m_hotBar
Definition: CMenuToolbars.h:45
static const WCHAR tb[]
Definition: suminfo.c:286
#define TBSTYLE_TOOLTIPS
Definition: commctrl.h:961
HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags)
#define IDS_MENU_EMPTY
#define CDIS_CHECKED
Definition: commctrl.h:279
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define TBCDRF_NOMARK
Definition: commctrl.h:1008
GLbitfield flags
Definition: glext.h:7161
#define MFT_SEPARATOR
Definition: winuser.h:739
#define CCS_NORESIZE
Definition: commctrl.h:2217
HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define NM_CUSTOMDRAW
Definition: commctrl.h:137
#define CDDS_PREPAINT
Definition: commctrl.h:265
HRESULT _CallCBWithItemId(UINT Id, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CMenuBand.cpp:768
#define COLOR_GRAYTEXT
Definition: winuser.h:922
#define index(s, c)
Definition: various.h:29
static const WCHAR L[]
Definition: oid.c:1250
#define BTNS_DROPDOWN
Definition: commctrl.h:975
HDC hdc
Definition: main.c:9
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
HRESULT PopupSubMenu(UINT itemId, UINT index, IShellMenu *childShellMenu, BOOL keyInitiated)
int idCommand
Definition: commctrl.h:922
BOOL WINAPI DPA_Sort(HDPA hdpa, PFNDPACOMPARE pfnCompare, LPARAM lParam)
Definition: dpa.c:813
#define WM_CANCELMODE
Definition: winuser.h:1617
static VOID SetImageList(HWND hwnd)
Definition: mplay32.c:238
CMenuToolbarBase * m_popupBar
Definition: CMenuToolbars.h:47
virtual ~CMenuStaticToolbar()
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define WM_COMMAND
Definition: winuser.h:1716
uint32_t DWORD_PTR
Definition: typedefs.h:63
#define NM_CLICK
Definition: commctrl.h:130
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData)
HRESULT AdjustForTheme(BOOL bFlatStyle)
Definition: CMenuBand.cpp:1156
virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax)
#define ERR(fmt,...)
Definition: debug.h:109
#define DT_NOCLIP
Definition: winuser.h:536
HRESULT ChangePopupItem(CMenuToolbarBase *toolbar, INT item)
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:884
#define TBN_GETINFOTIP
Definition: commctrl.h:1364
#define MIIM_STRING
Definition: winuser.h:722
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define DT_SINGLELINE
Definition: winuser.h:540
#define S_OK
Definition: intsafe.h:59
HRESULT CancelCurrentPopup()
_Out_ PULONG _Out_ PULONG pIndex
Definition: ndis.h:4546
static ATOM item
Definition: dde.c:856
HRESULT SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags)
DWORD_PTR m_executeData
Definition: CMenuToolbars.h:55
#define GetModuleHandle
Definition: winbase.h:3641
HRESULT IsWindowOwner(HWND hwnd)
#define CMenuBand_CreateInstance
Definition: shellmenu.h:81
#define DPA_GetPtr
Definition: commctrl.h:5
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
DWORD_PTR dwItemSpec
Definition: commctrl.h:292
HRESULT _TrackSubMenu(HMENU popup, INT x, INT y, RECT &rcExclude)
Definition: CMenuBand.cpp:800
HRESULT MenuBarMouseDown(INT iIndex, BOOL isLButton)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define E_NOTIMPL
Definition: ddrawi.h:99
#define TBCDRF_NOBACKGROUND
Definition: commctrl.h:1012
unsigned int UINT
Definition: ndis.h:50
#define PGS_VERT
Definition: commctrl.h:4474
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
HRESULT SetPosSize(int x, int y, int cx, int cy)
CMenuBand * m_menuBand
Definition: CMenuToolbars.h:39
#define NM_LDOWN
Definition: commctrl.h:145
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:275
LPCITEMIDLIST m_idList
virtual ~CMenuToolbarBase()
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
_Out_opt_ int * cx
Definition: commctrl.h:570
HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt)=0
int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder *sh, LPCITEMIDLIST pidl, int *pIndex)
Definition: iconcache.cpp:789
#define TBSTATE_ENABLED
Definition: commctrl.h:946
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE)
GLuint res
Definition: glext.h:9613
#define HIWORD(l)
Definition: typedefs.h:246
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt)
#define TBSTATE_WRAP
Definition: commctrl.h:949
#define UNIMPLEMENTED
Definition: debug.h:114
LONG bottom
Definition: windef.h:294
#define StrRetToStr
Definition: shlwapi.h:1751
virtual HRESULT OnDeletingButton(const NMTOOLBAR *tb)
#define SHIL_SMALL
Definition: shellapi.h:183
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
static const struct metadata_item item1[]
Definition: metadata.c:2802
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
BYTE fsState
Definition: commctrl.h:923
WCHAR * LPWSTR
Definition: xmlstorage.h:184
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
LONG_PTR LRESULT
Definition: windef.h:209
HRESULT DisableMouseTrack(BOOL bDisable)
#define CDDS_ITEMPOSTPAINT
Definition: commctrl.h:271
#define NM_TOOLTIPSCREATED
Definition: commctrl.h:144
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
#define WS_VISIBLE
Definition: pedump.c:620
HBRUSH WINAPI GetSysColorBrush(_In_ int)
GLuint64EXT * result
Definition: glext.h:11304
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
SMDM_TOOLBAR struct tagSMINFO SMINFO
LONG cy
Definition: windef.h:320
#define TBSTYLE_LIST
Definition: commctrl.h:965
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
virtual HRESULT InternalGetTooltip(INT iItem, INT index, DWORD_PTR dwData, LPWSTR pszText, INT cchTextMax)=0
#define VK_END
Definition: winuser.h:2176
#define HeapFree(x, y, z)
Definition: compat.h:394
#define TBN_DELETINGBUTTON
Definition: commctrl.h:1310
#define TBSTYLE_FLAT
Definition: commctrl.h:964
#define NM_RDOWN
Definition: commctrl.h:146
#define WM_NOTIFY
Definition: richedit.h:61
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
#define TBBUTTONINFO
Definition: commctrl.h:1226
HRESULT GetSizes(SIZE *pMinSize, SIZE *pMaxSize, SIZE *pIntegralSize)
HRESULT GetWindow(HWND *phwnd)
HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv)
#define TBSTYLE_EX_VERTICAL
Definition: commctrl.h:983
Definition: dpa.c:48
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
HRESULT _MenuItemSelect(DWORD changeType)
Definition: CMenuBand.cpp:954