ReactOS  0.4.15-dev-4569-g032c50f
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  default:
263  *theResult = 0L;
264  break;
265  }
266  return S_OK;
267 }
268 
270  m_pager(WC_PAGESCROLLER, this),
271  m_useFlatMenus(FALSE),
272  m_disableMouseTrack(FALSE),
273  m_timerEnabled(FALSE),
274  m_menuBand(menuBand),
275  m_dwMenuFlags(0),
276  m_hasSizes(FALSE),
277  m_usePager(usePager),
278  m_hotBar(NULL),
279  m_hotItem(-1),
280  m_popupBar(NULL),
281  m_popupItem(-1),
282  m_isTrackingPopup(FALSE),
283  m_cancelingPopup(FALSE)
284 {
285  m_idealSize.cx = 0;
286  m_idealSize.cy = 0;
287  m_itemSize.cx = 0;
288  m_itemSize.cy = 0;
290  0, 0, 0, 0, 0, 0, 0, 0, DEFAULT_CHARSET,
292  DEFAULT_QUALITY, FF_DONTCARE, L"Marlett");
293 }
294 
296 {
297  ClearToolbar();
298 
299  if (m_hWnd)
300  DestroyWindow();
301 
302  if (m_pager.m_hWnd)
303  m_pager.DestroyWindow();
304 
306 }
307 
309 {
311 }
312 
314 {
315  ShowWindow(fShow ? SW_SHOW : SW_HIDE);
316 
317  // Ensure that the right image list is assigned to the toolbar
319 
320  // For custom-drawing
321  SystemParametersInfo(SPI_GETFLATMENU, 0, &m_useFlatMenus, 0);
322 
323  return S_OK;
324 }
325 
327 {
328  if ((m_initFlags & (SMINIT_TOPLEVEL | SMINIT_VERTICAL)) == SMINIT_TOPLEVEL) // not vertical.
329  {
330  // No image list, prevents the buttons from having a margin at the left side
332  return S_OK;
333  }
334 
335  // Assign the correct imagelist and padding based on the current icon size
336 
337  int shiml;
338  if (m_menuBand->UseBigIcons())
339  {
340  shiml = SHIL_LARGE;
341  SetPadding(4, 0);
342  }
343  else
344  {
345  shiml = SHIL_SMALL;
346  SetPadding(4, 4);
347  }
348 
349  IImageList * piml;
350  HRESULT hr = SHGetImageList(shiml, IID_PPV_ARG(IImageList, &piml));
351  if (FAILED_UNEXPECTEDLY(hr))
352  {
354  }
355  else
356  {
357  SetImageList((HIMAGELIST)piml);
358  }
359  return S_OK;
360 }
361 
363 {
364  if (m_hWnd)
365  DestroyWindow();
366 
367  if (m_pager.m_hWnd)
368  m_pager.DestroyWindow();
369 
370  return S_OK;
371 }
372 
374 {
379 
380  if (dwFlags & SMINIT_VERTICAL)
381  {
382  // Activate vertical semantics
383  tbStyles |= CCS_VERT;
384 
385 #if USE_TBSTYLE_EX_VERTICAL
386  tbExStyles |= TBSTYLE_EX_VERTICAL;
387 #endif
388  }
389 
391 
392  // Get a temporary rect to use while creating the toolbar window.
393  // Ensure that it is not a null rect.
394  RECT rc;
395  if (!::GetClientRect(hwndParent, &rc) ||
396  (rc.left == rc.right) ||
397  (rc.top == rc.bottom))
398  {
399  rc.left = 0;
400  rc.top = 0;
401  rc.right = 1;
402  rc.bottom = 1;
403  }
404 
405  // HACK & FIXME: CORE-17505
406  HWND toolbar = CToolbar::Create(hwndParent, tbStyles, tbExStyles);
407  m_hWnd = NULL;
408  SubclassWindow(toolbar);
409 
410  SetWindowTheme(m_hWnd, L"", L"");
411 
412  SystemParametersInfo(SPI_GETFLATMENU, 0, &m_useFlatMenus, 0);
413 
415 
416  // If needed, create the pager.
417  if (m_usePager)
418  {
419  LONG pgStyles = PGS_VERT | WS_CHILD | WS_VISIBLE;
420  LONG pgExStyles = 0;
421 
422  HWND hwndPager = CreateWindowEx(
423  pgExStyles, WC_PAGESCROLLER, NULL,
424  pgStyles, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
425  hwndParent, NULL, _AtlBaseModule.GetModuleInstance(), 0);
426 
427  m_pager.SubclassWindow(hwndPager);
428 
429  ::SetParent(m_hWnd, hwndPager);
430 
431  m_pager.SendMessageW(PGM_SETCHILD, 0, reinterpret_cast<LPARAM>(m_hWnd));
432  }
433 
434  // Configure the image lists
436 
437  return S_OK;
438 }
439 
440 HRESULT CMenuToolbarBase::GetSizes(SIZE* pMinSize, SIZE* pMaxSize, SIZE* pIntegralSize)
441 {
442  if (pMinSize)
443  *pMinSize = m_idealSize;
444  if (pMaxSize)
445  *pMaxSize = m_idealSize;
446  if (pIntegralSize)
447  *pIntegralSize = m_itemSize;
448 
449  if (m_hasSizes)
450  return S_OK;
451 
452  TRACE("Sizes out of date, recalculating.\n");
453 
454  if (!m_hWnd)
455  {
456  return S_OK;
457  }
458 
459  // Obtain the ideal size, to be used as min and max
460  GetMaxSize(&m_idealSize);
461  GetIdealSize((m_initFlags & SMINIT_VERTICAL) != 0, &m_idealSize);
462 
463  TRACE("Ideal Size: (%d, %d) for %d buttons\n", m_idealSize, GetButtonCount());
464 
465  // Obtain the button size, to be used as the integral size
466  DWORD size = GetButtonSize();
469  m_hasSizes = TRUE;
470 
471  if (pMinSize)
472  *pMinSize = m_idealSize;
473  if (pMaxSize)
474  *pMaxSize = m_idealSize;
475  if (pIntegralSize)
476  *pIntegralSize = m_itemSize;
477 
478  return S_OK;
479 }
480 
482 {
483  // Update the toolbar or pager to fit the requested rect
484  // If we have a pager, set the toolbar height to the ideal height of the toolbar
485  if (m_pager.m_hWnd)
486  {
487  SetWindowPos(NULL, x, y, cx, m_idealSize.cy, 0);
488  m_pager.SetWindowPos(NULL, x, y, cx, cy, 0);
489  }
490  else
491  {
492  SetWindowPos(NULL, x, y, cx, cy, 0);
493  }
494 
495  // In a vertical menu, resize the buttons to fit the width
496  if (m_initFlags & SMINIT_VERTICAL)
497  {
498  DWORD btnSize = GetButtonSize();
499  SetButtonSize(cx, GET_Y_LPARAM(btnSize));
500  }
501 
502  return S_OK;
503 }
504 
506 {
507  if (m_hWnd && m_hWnd == hwnd) return S_OK;
508  if (m_pager.m_hWnd && m_pager.m_hWnd == hwnd) return S_OK;
509  return S_FALSE;
510 }
511 
513 {
514  if (!phwnd)
515  return E_FAIL;
516 
517  if (m_pager.m_hWnd)
518  *phwnd = m_pager.m_hWnd;
519  else
520  *phwnd = m_hWnd;
521 
522  return S_OK;
523 }
524 
526 {
527  INT index;
529 
530  INT iItem = tip->iItem;
531 
532  GetDataFromId(iItem, &index, &dwData);
533 
534  return InternalGetTooltip(iItem, index, dwData, tip->pszText, tip->cchTextMax);
535 }
536 
538 {
539  if (wParam != TIMERID_HOTTRACK)
540  {
541  bHandled = FALSE;
542  return 0;
543  }
544 
546 
547  if (!m_timerEnabled)
548  return 0;
549 
551 
552  if (m_hotItem < 0)
553  return 0;
554 
555  // Returns S_FALSE if the current item did not show a submenu
557  if (hr != S_FALSE)
558  return 0;
559 
560  // If we didn't switch submenus, cancel the current popup regardless
561  if (m_popupBar)
562  {
564  if (FAILED_UNEXPECTEDLY(hr))
565  return 0;
566  }
567 
568  return 0;
569 }
570 
572 {
573  if (m_timerEnabled)
574  {
577  return S_OK;
578  }
579  return S_FALSE;
580 }
581 
583 {
584  // Ignore the change if it already matches the stored info
585  if (m_hotBar == toolbar && m_hotItem == item)
586  return S_FALSE;
587 
588  // Prevent a change of hot item if the change was triggered by the mouse,
589  // and mouse tracking is disabled.
591  {
592  TRACE("Hot item change prevented by DisableMouseTrack\n");
593  return S_OK;
594  }
595 
596  // Notify the toolbar if the hot-tracking left this toolbar
597  if (m_hotBar == this && toolbar != this)
598  {
599  SetHotItem(-1);
600  }
601 
602  TRACE("Hot item changed from %p %p, to %p %p\n", m_hotBar, m_hotItem, toolbar, item);
603  m_hotBar = toolbar;
604  m_hotItem = item;
605 
606  if (m_hotBar == this)
607  {
608  if (m_isTrackingPopup && !(m_initFlags & SMINIT_VERTICAL))
609  {
610  // If the menubar has an open submenu, switch to the new item's submenu immediately
612  }
613  else if (dwFlags & HICF_MOUSE)
614  {
615  // Vertical menus show/hide the submenu after a delay,
616  // but only with the mouse.
617  if (m_initFlags & SMINIT_VERTICAL)
618  {
619  DWORD elapsed = 0;
620  SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &elapsed, 0);
621  SetTimer(TIMERID_HOTTRACK, elapsed);
623  TRACE("SetTimer called with m_hotItem=%d\n", m_hotItem);
624  }
625  }
626  else
627  {
629  info.cbSize = sizeof(info);
630  info.dwMask = 0;
631 
632  int index = GetButtonInfo(item, &info);
633 
634  SetHotItem(index);
635  }
636  }
637 
638  InvalidateDraw();
639  return S_OK;
640 }
641 
643 {
644  // Ignore the change if it already matches the stored info
645  if (m_popupBar == toolbar && m_popupItem == item)
646  return S_FALSE;
647 
648  // Notify the toolbar if the popup-tracking this toolbar
649  if (m_popupBar == this && toolbar != this)
650  {
651  CheckButton(m_popupItem, FALSE);
653  }
654 
655  m_popupBar = toolbar;
656  m_popupItem = item;
657 
658  if (m_popupBar == this)
659  {
660  CheckButton(m_popupItem, TRUE);
661  }
662 
663  InvalidateDraw();
664  return S_OK;
665 }
666 
668 {
669  TBBUTTON btn;
670  INT idx = (INT)wParam;
671 
672  if (m_hotBar != this)
673  return S_FALSE;
674 
675  if (idx < 0)
676  return S_FALSE;
677 
678  if (!GetButton(idx, &btn))
679  return E_FAIL;
680 
681  if (m_hotItem == btn.idCommand)
682  return S_OK;
683 
684  if (m_popupItem == btn.idCommand)
685  return S_OK;
686 
687  return S_FALSE;
688 }
689 
691 {
692  TBBUTTON btn;
693  BOOL wasTracking = LOWORD(lParam);
694  BOOL mouse = HIWORD(lParam);
695  INT idx = (INT)wParam;
696 
697  if (idx < 0)
698  {
701  }
702 
703  if (!GetButton(idx, &btn))
704  return E_FAIL;
705 
706  TRACE("ChangeTrackedItem %d, %d\n", idx, wasTracking);
707  m_isTrackingPopup = wasTracking;
708  return m_menuBand->_ChangeHotItem(this, btn.idCommand, mouse ? HICF_MOUSE : 0);
709 }
710 
711 HRESULT CMenuToolbarBase::PopupSubMenu(UINT iItem, UINT index, IShellMenu* childShellMenu, BOOL keyInitiated)
712 {
713  // Calculate the submenu position and exclude area
714  RECT rc = { 0 };
715 
716  if (!GetItemRect(index, &rc))
717  return E_FAIL;
718 
719  POINT a = { rc.left, rc.top };
720  POINT b = { rc.right, rc.bottom };
721 
722  ClientToScreen(&a);
723  ClientToScreen(&b);
724 
725  POINTL pt = { a.x, b.y };
726  RECTL rcl = { a.x, a.y, b.x, b.y };
727 
728  if (m_initFlags & SMINIT_VERTICAL)
729  {
730  // FIXME: Hardcoding this here feels hacky.
731  if (IsAppThemed())
732  {
733  pt.x = b.x - 1;
734  pt.y = a.y - 1;
735  }
736  else
737  {
738  pt.x = b.x - 3;
739  pt.y = a.y - 3;
740  }
741  }
742 
743  // Display the submenu
745 
746  m_menuBand->_ChangePopupItem(this, iItem);
747  m_menuBand->_OnPopupSubMenu(childShellMenu, &pt, &rcl, keyInitiated);
748 
749  return S_OK;
750 }
751 
753 {
754  // Calculate the submenu position and exclude area
755  RECT rc = { 0 };
756 
757  if (!GetItemRect(index, &rc))
758  return E_FAIL;
759 
760  POINT a = { rc.left, rc.top };
761  POINT b = { rc.right, rc.bottom };
762 
763  ClientToScreen(&a);
764  ClientToScreen(&b);
765 
766  POINT pt = { a.x, b.y };
767  RECT rcl = { a.x, a.y, b.x, b.y };
768 
769  if (m_initFlags & SMINIT_VERTICAL)
770  {
771  pt.x = b.x;
772  pt.y = a.y;
773  }
774 
775  HMENU popup = GetSubMenu(menu, index);
776 
777  // Display the submenu
779  m_menuBand->_ChangePopupItem(this, iItem);
780  m_menuBand->_TrackSubMenu(popup, pt.x, pt.y, rcl);
783 
784  return S_OK;
785 }
786 
788 {
789  // Cancel submenus
791  if (m_popupBar)
793 
794  // Display the context menu
795  return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
796 }
797 
799 {
801  TRACE("BeforeCancelPopup\n");
802  return S_OK;
803 }
804 
806 {
808  {
809  TRACE("Item click prevented by DisableMouseTrack\n");
810  return S_OK;
811  }
812 
813  // If a button is clicked while a submenu was open, cancel the submenu.
814  if (!(m_initFlags & SMINIT_VERTICAL) && m_isTrackingPopup)
815  {
816  TRACE("OnCommand cancelled because it was tracking submenu.\n");
817  return S_FALSE;
818  }
819 
820  if (PopupItem(iItem, FALSE) == S_OK)
821  {
822  TRACE("PopupItem returned S_OK\n");
823  return S_FALSE;
824  }
825 
826  TRACE("Executing...\n");
827 
828  return m_menuBand->_MenuItemSelect(MPOS_EXECUTE);
829 }
830 
832 {
833  INT index;
834  DWORD_PTR data;
835 
836  GetDataFromId(iItem, &index, &data);
837 
838  DWORD pos = GetMessagePos();
840 
841  return InternalContextMenu(iItem, index, data, pt);
842 }
843 
845 {
846  TBBUTTON btn;
847 
848  GetButton(iIndex, &btn);
849 
850  if ((m_initFlags & SMINIT_VERTICAL)
851  || m_popupBar
852  || m_cancelingPopup)
853  {
855  return S_OK;
856  }
857 
858  return ProcessClick(btn.idCommand);
859 }
860 
862 {
863  TBBUTTON btn;
864 
866 
867  if (!(m_initFlags & SMINIT_VERTICAL))
868  return S_OK;
869 
870  GetButton(iIndex, &btn);
871 
872  if (isLButton)
873  return ProcessClick(btn.idCommand);
874  else
875  return ProcessContextMenu(btn.idCommand);
876 }
877 
879 {
880  this->m_menuBand->_KillPopupTimers();
881 
882  m_executeItem = iItem;
883  return GetDataFromId(iItem, &m_executeIndex, &m_executeData);
884 }
885 
887 {
889 }
890 
892 {
893  int prev = m_hotItem;
894  int index = -1;
895 
896  if (dwSelectType != 0xFFFFFFFF)
897  {
898  int count = GetButtonCount();
899 
900  if (dwSelectType == VK_HOME)
901  {
902  index = 0;
903  dwSelectType = VK_DOWN;
904  }
905  else if (dwSelectType == VK_END)
906  {
907  index = count - 1;
908  dwSelectType = VK_UP;
909  }
910  else
911  {
912  if (m_hotItem >= 0)
913  {
914  TBBUTTONINFO info = { 0 };
915  info.cbSize = sizeof(TBBUTTONINFO);
916  info.dwMask = 0;
917  index = GetButtonInfo(m_hotItem, &info);
918  }
919 
920  if (index < 0)
921  {
922  if (dwSelectType == VK_UP)
923  {
924  index = count - 1;
925  }
926  else if (dwSelectType == VK_DOWN)
927  {
928  index = 0;
929  }
930  }
931  else
932  {
933  if (dwSelectType == VK_UP)
934  {
935  index--;
936  }
937  else if (dwSelectType == VK_DOWN)
938  {
939  index++;
940  }
941  }
942  }
943 
944  TBBUTTON btn = { 0 };
945  while (index >= 0 && index < count)
946  {
947  DWORD res = GetButton(index, &btn);
948  if (!res)
949  return E_FAIL;
950 
951  if (btn.dwData)
952  {
953  if (prev != btn.idCommand)
954  {
955  TRACE("Setting Hot item to %d\n", index);
956  if (!(m_initFlags & SMINIT_VERTICAL) && m_isTrackingPopup)
957  {
958  HWND tlw;
960  ::SendMessageW(tlw, WM_CANCELMODE, 0, 0);
962  }
963  else
964  m_menuBand->_ChangeHotItem(this, btn.idCommand, 0);
965  }
966  return S_OK;
967  }
968 
969  if (dwSelectType == VK_UP)
970  {
971  index--;
972  }
973  else if (dwSelectType == VK_DOWN)
974  {
975  index++;
976  }
977  }
978 
979  return S_FALSE;
980  }
981 
982  if (prev != -1)
983  {
984  TRACE("Setting Hot item to null\n");
985  m_menuBand->_ChangeHotItem(NULL, -1, 0);
986  }
987 
988  return S_FALSE;
989 }
990 
991 HRESULT CMenuToolbarBase::AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last)
992 {
993  TBBUTTON tbb = { 0 };
994 
995  tbb.fsState = TBSTATE_ENABLED;
996 #if !USE_TBSTYLE_EX_VERTICAL
997  if (!last && (m_initFlags & SMINIT_VERTICAL))
998  tbb.fsState |= TBSTATE_WRAP;
999 #endif
1000  tbb.fsStyle = BTNS_CHECKGROUP;
1001 
1002  if (hasSubMenu && (m_initFlags & SMINIT_VERTICAL))
1003  tbb.fsStyle |= BTNS_DROPDOWN;
1004 
1005  if (!(m_initFlags & SMINIT_VERTICAL))
1006  tbb.fsStyle |= BTNS_AUTOSIZE;
1007 
1008  tbb.iString = (INT_PTR) caption;
1009  tbb.idCommand = commandId;
1010 
1011  tbb.iBitmap = iconId;
1012  tbb.dwData = buttonData;
1013 
1014  m_hasSizes = FALSE;
1015 
1016  if (!AddButtons(1, &tbb))
1017  return HRESULT_FROM_WIN32(GetLastError());
1018  return S_OK;
1019 }
1020 
1022 {
1023  TBBUTTON tbb = { 0 };
1024 
1025  tbb.fsState = TBSTATE_ENABLED;
1026 #if !USE_TBSTYLE_EX_VERTICAL
1027  if (!last && (m_initFlags & SMINIT_VERTICAL))
1028  tbb.fsState |= TBSTATE_WRAP;
1029 #endif
1030  tbb.fsStyle = BTNS_SEP;
1031  tbb.iBitmap = 0;
1032 
1033  m_hasSizes = FALSE;
1034 
1035  if (!AddButtons(1, &tbb))
1036  return HRESULT_FROM_WIN32(GetLastError());
1037 
1038  return S_OK;
1039 }
1040 
1042 {
1043  TBBUTTON tbb = { 0 };
1044  WCHAR MenuString[128];
1045 
1046  LoadStringW(GetModuleHandle(L"shell32.dll"), IDS_MENU_EMPTY, MenuString, _countof(MenuString));
1047 
1048  tbb.fsState = 0;
1049  tbb.fsStyle = 0;
1050  tbb.iString = (INT_PTR) MenuString;
1051  tbb.iBitmap = -1;
1052 
1053  m_hasSizes = FALSE;
1054 
1055  if (!AddButtons(1, &tbb))
1056  return HRESULT_FROM_WIN32(GetLastError());
1057 
1058  return S_OK;
1059 }
1060 
1062 {
1063  while (DeleteButton(0))
1064  {
1065  // empty;
1066  }
1067  m_hasSizes = FALSE;
1068  return S_OK;
1069 }
1070 
1072 {
1073  if (pData)
1074  *pData = NULL;
1075 
1076  if (pIndex)
1077  *pIndex = -1;
1078 
1079  if (iItem < 0)
1080  return S_OK;
1081 
1082  TBBUTTONINFO info = { 0 };
1083 
1084  info.cbSize = sizeof(TBBUTTONINFO);
1085  info.dwMask = TBIF_COMMAND | TBIF_LPARAM;
1086 
1087  int index = GetButtonInfo(iItem, &info);
1088  if (index < 0)
1089  return E_FAIL;
1090 
1091  if (pIndex)
1092  *pIndex = index;
1093 
1094  if (pData)
1095  *pData = info.lParam;
1096 
1097  return S_OK;
1098 }
1099 
1101 {
1102  return m_menuBand->_CancelCurrentPopup();
1103 }
1104 
1106 {
1107  INT index;
1108  DWORD_PTR dwData;
1109 
1110  if (iItem < 0)
1111  return S_OK;
1112 
1113  if (m_popupBar == this && m_popupItem == iItem)
1114  return S_OK;
1115 
1116  GetDataFromId(iItem, &index, &dwData);
1117 
1119  if (hr != S_OK)
1120  return hr;
1121 
1122  if (m_popupBar)
1123  {
1125  if (FAILED_UNEXPECTEDLY(hr))
1126  return hr;
1127  }
1128 
1129  if (!(m_initFlags & SMINIT_VERTICAL))
1130  {
1131  TRACE("PopupItem non-vertical %d %d\n", index, iItem);
1132  m_menuBand->_ChangeHotItem(this, iItem, 0);
1133  }
1134 
1135  return InternalPopupItem(iItem, index, dwData, keyInitiated);
1136 }
1137 
1139  CMenuToolbarBase(menuBand, FALSE),
1140  m_hmenu(NULL),
1141  m_hwndMenu(NULL)
1142 {
1143 }
1144 
1146 {
1147 }
1148 
1150  _Out_opt_ HMENU *phmenu,
1151  _Out_opt_ HWND *phwnd,
1152  _Out_opt_ DWORD *pdwFlags)
1153 {
1154  if (phmenu)
1155  *phmenu = m_hmenu;
1156  if (phwnd)
1157  *phwnd = m_hwndMenu;
1158  if (pdwFlags)
1159  *pdwFlags = m_dwMenuFlags;
1160 
1161  return S_OK;
1162 }
1163 
1165  HMENU hmenu,
1166  HWND hwnd,
1167  DWORD dwFlags)
1168 {
1169  m_hmenu = hmenu;
1170  m_hwndMenu = hwnd;
1172 
1173  if (IsWindow())
1174  ClearToolbar();
1175 
1176  return S_OK;
1177 }
1178 
1180 {
1181  int i;
1182  int ic = GetMenuItemCount(m_hmenu);
1183 
1184  if (clearFirst)
1185  {
1186  ClearToolbar();
1187  }
1188 
1189  int count = 0;
1190  for (i = 0; i < ic; i++)
1191  {
1192  BOOL last = i + 1 == ic;
1193 
1195 
1196  info.cbSize = sizeof(info);
1197  info.dwTypeData = NULL;
1198  info.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID;
1199 
1200  if (!GetMenuItemInfoW(m_hmenu, i, TRUE, &info))
1201  {
1202  TRACE("Error obtaining info for menu item at pos=%d\n", i);
1203  continue;
1204  }
1205 
1206  count++;
1207 
1208  if (info.fType & MFT_SEPARATOR)
1209  {
1210  AddSeparator(last);
1211  }
1212  else if (!(info.fType & MFT_BITMAP))
1213  {
1214  info.cch++;
1215  info.dwTypeData = (PWSTR) HeapAlloc(GetProcessHeap(), 0, (info.cch + 1) * sizeof(WCHAR));
1216 
1217  info.fMask = MIIM_STRING | MIIM_SUBMENU | MIIM_ID;
1219 
1220  SMINFO * sminfo = new SMINFO();
1221  sminfo->dwMask = SMIM_ICON | SMIM_FLAGS;
1222 
1223  HRESULT hr = m_menuBand->_CallCBWithItemId(info.wID, SMC_GETINFO, 0, reinterpret_cast<LPARAM>(sminfo));
1224  if (FAILED_UNEXPECTEDLY(hr))
1225  {
1226  delete sminfo;
1227  return hr;
1228  }
1229 
1230  AddButton(info.wID, info.dwTypeData, info.hSubMenu != NULL, sminfo->iIcon, reinterpret_cast<DWORD_PTR>(sminfo), last);
1231 
1232  HeapFree(GetProcessHeap(), 0, info.dwTypeData);
1233  }
1234  }
1235 
1236  return S_OK;
1237 }
1238 
1240 {
1241  //SMINFO * info = reinterpret_cast<SMINFO*>(dwData);
1242  UNIMPLEMENTED;
1243  return E_NOTIMPL;
1244 }
1245 
1247 {
1248  delete reinterpret_cast<SMINFO*>(tb->tbButton.dwData);
1249  return S_OK;
1250 }
1251 
1253 {
1254  CComPtr<IContextMenu> contextMenu;
1255  HRESULT hr = m_menuBand->_CallCBWithItemId(iItem, SMC_GETOBJECT,
1256  reinterpret_cast<WPARAM>(&IID_IContextMenu), reinterpret_cast<LPARAM>(&contextMenu));
1257  if (hr != S_OK)
1258  return hr;
1259 
1260  return TrackContextMenu(contextMenu, pt);
1261 }
1262 
1264 {
1265  return m_menuBand->_CallCBWithItemId(iItem, SMC_EXEC, 0, 0);
1266 }
1267 
1269 {
1270  SMINFO * nfo = reinterpret_cast<SMINFO*>(dwData);
1271  if (!nfo)
1272  return E_FAIL;
1273 
1274  if (nfo->dwFlags&SMIF_TRACKPOPUP)
1275  {
1276  return PopupSubMenu(iItem, index, m_hmenu);
1277  }
1278  else
1279  {
1280  CComPtr<IShellMenu> shellMenu;
1281  HRESULT hr = m_menuBand->_CallCBWithItemId(iItem, SMC_GETOBJECT, reinterpret_cast<WPARAM>(&IID_IShellMenu), reinterpret_cast<LPARAM>(&shellMenu));
1282  if (FAILED_UNEXPECTEDLY(hr))
1283  return hr;
1284 
1285  return PopupSubMenu(iItem, index, shellMenu, keyInitiated);
1286  }
1287 }
1288 
1290 {
1292 }
1293 
1295  CMenuToolbarBase(menuBand, TRUE),
1296  m_shellFolder(NULL),
1297  m_idList(NULL),
1298  m_hKey(NULL)
1299 {
1300 }
1301 
1303 {
1304 }
1305 
1307 {
1308  IShellFolder * psf = (IShellFolder*) lParam;
1311  HRESULT hr = psf->CompareIDs(0, pidl1, pidl2);
1312  if (FAILED(hr))
1313  {
1314  // No way to cancel, so sort to equal.
1315  return 0;
1316  }
1317  return (int)(short)LOWORD(hr);
1318 }
1319 
1321 {
1322  HRESULT hr;
1323 
1324  CComPtr<IEnumIDList> eidl;
1325  hr = m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
1326  if (FAILED_UNEXPECTEDLY(hr))
1327  return hr;
1328 
1329  HDPA dpaSort = DPA_Create(10);
1330 
1332  hr = eidl->Next(1, &item, NULL);
1333  while (hr == S_OK)
1334  {
1335  if (m_menuBand->_CallCBWithItemPidl(item, 0x10000000, 0, 0) == S_FALSE)
1336  {
1337  DPA_AppendPtr(dpaSort, item);
1338  }
1339  else
1340  {
1342  }
1343 
1344  hr = eidl->Next(1, &item, NULL);
1345  }
1346 
1347  // If no items were added, show the "empty" placeholder
1348  if (DPA_GetPtrCount(dpaSort) == 0)
1349  {
1350  DPA_Destroy(dpaSort);
1351  return AddPlaceholder();
1352  }
1353 
1354  TRACE("FillToolbar added %d items to the DPA\n", DPA_GetPtrCount(dpaSort));
1355 
1357 
1358  for (int i = 0; i<DPA_GetPtrCount(dpaSort);)
1359  {
1360  PWSTR MenuString;
1361 
1362  INT index = 0;
1363  INT indexOpen = 0;
1364 
1365  STRRET sr = { STRRET_CSTR, { 0 } };
1366 
1367  item = (LPITEMIDLIST)DPA_GetPtr(dpaSort, i);
1368 
1369  hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
1370  if (FAILED_UNEXPECTEDLY(hr))
1371  {
1372  DPA_Destroy(dpaSort);
1373  return hr;
1374  }
1375 
1376  StrRetToStr(&sr, NULL, &MenuString);
1377 
1379 
1380  LPCITEMIDLIST itemc = item;
1381 
1382  SFGAOF attrs = SFGAO_FOLDER;
1383  hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs);
1384 
1385  DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(item);
1386 
1387  // Fetch next item already, so we know if the current one is the last
1388  i++;
1389 
1390  AddButton(i, MenuString, attrs & SFGAO_FOLDER, index, dwData, i >= DPA_GetPtrCount(dpaSort));
1391 
1392  CoTaskMemFree(MenuString);
1393  }
1394 
1395  DPA_Destroy(dpaSort);
1396  return hr;
1397 }
1398 
1400 {
1401  //ITEMIDLIST * pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1402  UNIMPLEMENTED;
1403  return E_NOTIMPL;
1404 }
1405 
1407 {
1408  ILFree(reinterpret_cast<LPITEMIDLIST>(tb->tbButton.dwData));
1409  return S_OK;
1410 }
1411 
1413 {
1414  m_shellFolder = psf;
1415  m_idList = ILClone(pidlFolder);
1416  m_hKey = hKey;
1418 
1419  if (IsWindow())
1420  ClearToolbar();
1421 
1422  return S_OK;
1423 }
1424 
1426 {
1427  HRESULT hr;
1428 
1429  hr = m_shellFolder->QueryInterface(riid, ppv);
1430  if (FAILED_UNEXPECTEDLY(hr))
1431  return hr;
1432 
1433  if (pdwFlags)
1434  *pdwFlags = m_dwMenuFlags;
1435 
1436  if (ppidl)
1437  {
1438  LPITEMIDLIST pidl = NULL;
1439 
1440  if (m_idList)
1441  {
1442  pidl = ILClone(m_idList);
1443  if (!pidl)
1444  {
1445  ERR("ILClone failed!\n");
1446  (*reinterpret_cast<IUnknown**>(ppv))->Release();
1447  return E_FAIL;
1448  }
1449  }
1450 
1451  *ppidl = pidl;
1452  }
1453 
1454  return hr;
1455 }
1456 
1458 {
1459  HRESULT hr;
1460  CComPtr<IContextMenu> contextMenu = NULL;
1461  LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(dwData);
1462 
1463  hr = m_shellFolder->GetUIObjectOf(GetToolbar(), 1, &pidl, IID_NULL_PPV_ARG(IContextMenu, &contextMenu));
1464  if (FAILED_UNEXPECTEDLY(hr))
1465  {
1466  return hr;
1467  }
1468 
1469  hr = TrackContextMenu(contextMenu, pt);
1470 
1471  return hr;
1472 }
1473 
1475 {
1476  return m_menuBand->_CallCBWithItemPidl(reinterpret_cast<LPITEMIDLIST>(data), SMC_SFEXEC, 0, 0);
1477 }
1478 
1480 {
1481  HRESULT hr;
1482  UINT uId;
1483  UINT uIdAncestor;
1484  DWORD flags;
1485  CComPtr<IShellMenuCallback> psmc;
1486  CComPtr<IShellMenu> shellMenu;
1487 
1488  LPITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1489 
1490  if (!pidl)
1491  return E_FAIL;
1492 
1494  if (FAILED_UNEXPECTEDLY(hr))
1495  return hr;
1496 
1497  m_menuBand->GetMenuInfo(&psmc, &uId, &uIdAncestor, &flags);
1498 
1499  // FIXME: not sure what to use as uId/uIdAncestor here
1500  hr = shellMenu->Initialize(psmc, 0, uId, SMINIT_VERTICAL);
1501  if (FAILED_UNEXPECTEDLY(hr))
1502  return hr;
1503 
1504  CComPtr<IShellFolder> childFolder;
1505  hr = m_shellFolder->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &childFolder));
1506  if (FAILED_UNEXPECTEDLY(hr))
1507  return hr;
1508 
1509  hr = shellMenu->SetShellFolder(childFolder, NULL, NULL, SMSET_TOP);
1510  if (FAILED_UNEXPECTEDLY(hr))
1511  return hr;
1512 
1513  return PopupSubMenu(iItem, index, shellMenu, keyInitiated);
1514 }
1515 
1517 {
1518  HRESULT hr;
1519  LPCITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1520 
1521  SFGAOF attrs = SFGAO_FOLDER;
1522  hr = m_shellFolder->GetAttributesOf(1, &pidl, &attrs);
1523  if (FAILED_UNEXPECTEDLY(hr))
1524  return hr;
1525 
1526  return (attrs & SFGAO_FOLDER) ? S_OK : S_FALSE;
1527 }
#define TBSTYLE_EX_DOUBLEBUFFER
Definition: commctrl.h:1014
#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:1224
HRESULT AddPlaceholder()
HWND Create(HWND hWndParent, DWORD dwStyles=0, DWORD dwExStyles=0)
Definition: rosctrls.h:256
HRESULT AddSeparator(BOOL last)
#define TBIF_LPARAM
Definition: commctrl.h:1223
HRESULT ProcessClick(INT iItem)
#define WC_PAGESCROLLER
Definition: commctrl.h:4500
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:118
#define COLOR_HIGHLIGHT
Definition: winuser.h:920
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:442
virtual HRESULT InternalExecuteItem(INT iItem, INT index, DWORD_PTR dwData)
#define TBN_GETDISPINFO
Definition: commctrl.h:1420
virtual HRESULT InternalHasSubMenu(INT iItem, INT index, DWORD_PTR dwData)=0
HRESULT OnCustomDraw(LPNMTBCUSTOMDRAW cdraw, LRESULT *theResult)
#define DEFAULT_QUALITY
Definition: wingdi.h:436
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
#define FF_DONTCARE
Definition: wingdi.h:448
HRESULT hr
Definition: shlfolder.c:183
static HMENU hmenu
Definition: win.c:66
GLuint64EXT * result
Definition: glext.h:11304
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
BOOL WINAPI IsWindow(_In_opt_ HWND)
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:5752
#define CDRF_NOTIFYPOSTPAINT
Definition: commctrl.h:274
#define TBSTYLE_CUSTOMERASE
Definition: commctrl.h:994
POINT last
Definition: font.c:46
#define TBN_BEGINDRAG
Definition: commctrl.h:1307
#define TRUE
Definition: types.h:120
#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:56
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE)
WINE_DEFAULT_DEBUG_CHANNEL(CMenuToolbars)
#define TBSTYLE_TRANSPARENT
Definition: commctrl.h:996
const WCHAR * text
Definition: package.c:1743
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:1393
#define TBCDRF_NOOFFSET
Definition: commctrl.h:1035
#define MAKELPARAM(l, h)
Definition: winuser.h:3988
#define NM_RELEASEDCAPTURE
Definition: commctrl.h:141
#define INT
Definition: polytest.cpp:20
#define TBIF_STYLE
Definition: commctrl.h:1222
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
static HDC
Definition: imagelist.c:92
#define CALLBACK
Definition: compat.h:35
HWND hWnd
Definition: settings.c:17
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define SystemParametersInfo
Definition: winuser.h:5838
LRESULT IsTrackedItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LONG top
Definition: windef.h:307
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:1539
#define CDDS_ITEMPREPAINT
Definition: commctrl.h:285
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define PGF_CALCHEIGHT
Definition: commctrl.h:4583
#define BTNS_AUTOSIZE
Definition: commctrl.h:1004
#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:2207
#define WS_CHILD
Definition: pedump.c:617
DWORD WINAPI GetMessagePos(void)
Definition: message.c:1351
#define DT_RIGHT
Definition: winuser.h:538
LONG left
Definition: windef.h:306
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:64
BYTE fsStyle
Definition: commctrl.h:952
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define DEFAULT_CHARSET
Definition: wingdi.h:384
LONG right
Definition: windef.h:308
#define TBCDRF_NOEDGES
Definition: commctrl.h:1033
#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:4516
#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:58
#define TBN_DRAGOUT
Definition: commctrl.h:1337
DWORD WINAPI GetSysColor(_In_ int)
WPARAM wParam
Definition: combotst.c:138
#define DPA_AppendPtr(hdpa, pitem)
Definition: commctrl.h:4958
#define TBN_HOTITEMCHANGE
Definition: commctrl.h:1336
#define CCS_VERT
Definition: commctrl.h:2249
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:4580
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
#define CCS_NODIVIDER
Definition: commctrl.h:2248
int WINAPI SetBkMode(_In_ HDC, _In_ int)
Definition: dc.c:1056
#define TIMERID_HOTTRACK
#define VK_HOME
Definition: winuser.h:2203
#define MIIM_SUBMENU
Definition: winuser.h:718
#define L(x)
Definition: ntvdm.h:50
HRESULT KillPopupTimer()
#define TBN_DROPDOWN
Definition: commctrl.h:1316
#define BTNS_CHECKGROUP
Definition: commctrl.h:1002
#define VK_UP
Definition: winuser.h:2205
#define FALSE
Definition: types.h:117
HRESULT _KillPopupTimers()
Definition: CMenuBand.cpp:1119
#define TBSTYLE_REGISTERDROP
Definition: commctrl.h:995
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:517
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:2406
HRESULT _ChangeHotItem(CMenuToolbarBase *tb, INT id, DWORD dwFlags)
Definition: CMenuBand.cpp:880
int CALLBACK PidlListSort(void *item1, void *item2, LPARAM lParam)
static struct _test_info info[]
Definition: SetCursorPos.c:19
HRESULT BeforeCancelPopup()
#define CLIP_DEFAULT_PRECIS
Definition: wingdi.h:426
HRESULT UpdateImageLists()
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
#define TTN_GETDISPINFO
Definition: commctrl.h:1878
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:5735
#define TRANSPARENT
Definition: wingdi.h:950
#define S_FALSE
Definition: winerror.h:2357
#define HICF_MOUSE
Definition: commctrl.h:1326
#define CreateFont
Definition: wingdi.h:4443
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:585
COLORREF clrText
Definition: commctrl.h:1021
#define PGF_CALCWIDTH
Definition: commctrl.h:4582
static HWND hwndParent
Definition: cryptui.c:300
#define COLOR_MENU
Definition: winuser.h:911
LRESULT OnWinEventWrap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
HRESULT ShowDW(BOOL fShow)
#define RBN_CHILDSIZE
Definition: commctrl.h:1636
#define WM_WININICHANGE
Definition: winuser.h:1617
HRESULT PopupItem(INT iItem, BOOL keyInitiated)
LONG cx
Definition: windef.h:334
LONG_PTR LPARAM
Definition: windef.h:208
#define CCS_TOP
Definition: commctrl.h:2242
#define CCS_NOPARENTALIGN
Definition: commctrl.h:2246
#define SMC_EXEC
Definition: undocshell.h:644
DWORD dwFlag
Definition: commctrl.h:4587
#define DPA_GetPtrCount(hdpa)
Definition: commctrl.h:4955
virtual HRESULT InternalPopupItem(INT iItem, INT index, DWORD_PTR dwData, BOOL keyInitiated)
#define CDRF_NOTIFYITEMDRAW
Definition: commctrl.h:275
GLuint index
Definition: glext.h:6031
#define DT_VCENTER
Definition: winuser.h:543
INT_PTR iString
Definition: commctrl.h:959
#define SW_SHOW
Definition: winuser.h:769
#define COLOR_HIGHLIGHTTEXT
Definition: winuser.h:921
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:958
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
int iBitmap
Definition: commctrl.h:949
#define MIIM_ID
Definition: winuser.h:717
#define TBN_ENDDRAG
Definition: commctrl.h:1308
HRESULT _ChangePopupItem(CMenuToolbarBase *tb, INT id)
Definition: CMenuBand.cpp:899
virtual ~CMenuSFToolbar()
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:1017
#define GetProcessHeap()
Definition: compat.h:595
#define BTNS_SEP
Definition: commctrl.h:999
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:79
DWORD COLORREF
Definition: windef.h:300
HRESULT _TrackContextMenu(IContextMenu *popup, INT x, INT y)
Definition: CMenuBand.cpp:821
HRESULT TrackContextMenu(IContextMenu *contextMenu, POINT pt)
#define _countof(array)
Definition: sndvol32.h:68
virtual HRESULT OnDeletingButton(const NMTOOLBAR *tb)=0
CContainedWindow m_pager
Definition: CMenuToolbars.h:31
#define CDIS_HOT
Definition: commctrl.h:297
static const struct metadata_item item2[]
Definition: metadata.c:2807
#define NMTOOLBAR
Definition: commctrl.h:1456
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:82
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define COLOR_MENUTEXT
Definition: winuser.h:914
HRESULT OnPopupTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
#define OUT_DEFAULT_PRECIS
Definition: wingdi.h:415
unsigned long DWORD
Definition: ntddk_ex.h:95
CMenuToolbarBase * m_hotBar
Definition: CMenuToolbars.h:45
static const WCHAR tb[]
Definition: suminfo.c:285
#define TBSTYLE_TOOLTIPS
Definition: commctrl.h:989
HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags)
#define IDS_MENU_EMPTY
#define CDIS_CHECKED
Definition: commctrl.h:294
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define TBCDRF_NOMARK
Definition: commctrl.h:1036
GLbitfield flags
Definition: glext.h:7161
#define MFT_SEPARATOR
Definition: winuser.h:739
#define CCS_NORESIZE
Definition: commctrl.h:2245
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:280
HRESULT _CallCBWithItemId(UINT Id, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CMenuBand.cpp:768
#define COLOR_GRAYTEXT
Definition: winuser.h:926
#define index(s, c)
Definition: various.h:29
#define BTNS_DROPDOWN
Definition: commctrl.h:1003
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:950
BOOL WINAPI DPA_Sort(HDPA hdpa, PFNDPACOMPARE pfnCompare, LPARAM lParam)
Definition: dpa.c:813
#define WM_CANCELMODE
Definition: winuser.h:1622
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:1727
uint32_t DWORD_PTR
Definition: typedefs.h:65
#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:110
#define DT_NOCLIP
Definition: winuser.h:536
HRESULT ChangePopupItem(CMenuToolbarBase *toolbar, INT item)
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
Definition: text.c:911
#define TBN_GETINFOTIP
Definition: commctrl.h:1392
#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:52
_In_ BOOLEAN Release
Definition: cdrom.h:920
HRESULT CancelCurrentPopup()
_Out_ PULONG _Out_ PULONG pIndex
Definition: ndis.h:4564
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:3688
HRESULT IsWindowOwner(HWND hwnd)
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 CMenuBand_CreateInstance
Definition: shellmenu.h:81
FxAutoRegKey hKey
#define DPA_GetPtr
Definition: commctrl.h:5
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
DWORD_PTR dwItemSpec
Definition: commctrl.h:307
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:1040
#define _Out_opt_
Definition: ms_sal.h:346
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
#define PGS_VERT
Definition: commctrl.h:4502
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:585
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:783
#define TBSTATE_ENABLED
Definition: commctrl.h:974
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE)
GLuint res
Definition: glext.h:9613
#define HIWORD(l)
Definition: typedefs.h:247
virtual HRESULT InternalContextMenu(INT iItem, INT index, DWORD_PTR dwData, POINT pt)
#define TBSTATE_WRAP
Definition: commctrl.h:977
#define UNIMPLEMENTED
Definition: debug.h:115
LONG bottom
Definition: windef.h:309
#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:951
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)
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4022
#define CDDS_ITEMPOSTPAINT
Definition: commctrl.h:286
#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)
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:335
#define TBSTYLE_LIST
Definition: commctrl.h:993
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:2202
#define HeapFree(x, y, z)
Definition: compat.h:594
#define TBN_DELETINGBUTTON
Definition: commctrl.h:1338
#define TBSTYLE_FLAT
Definition: commctrl.h:992
#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:1254
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:1011
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