ReactOS  0.4.15-dev-5142-g967f5b9
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  if (m_hWnd)
298  {
299  ClearToolbar();
300  DestroyWindow();
301  }
302 
303  if (m_pager.m_hWnd)
304  m_pager.DestroyWindow();
305 
307 }
308 
310 {
312 }
313 
315 {
316  ShowWindow(fShow ? SW_SHOW : SW_HIDE);
317 
318  // Ensure that the right image list is assigned to the toolbar
320 
321  // For custom-drawing
322  SystemParametersInfo(SPI_GETFLATMENU, 0, &m_useFlatMenus, 0);
323 
324  return S_OK;
325 }
326 
328 {
329  if ((m_initFlags & (SMINIT_TOPLEVEL | SMINIT_VERTICAL)) == SMINIT_TOPLEVEL) // not vertical.
330  {
331  // No image list, prevents the buttons from having a margin at the left side
333  return S_OK;
334  }
335 
336  // Assign the correct imagelist and padding based on the current icon size
337 
338  int shiml;
339  if (m_menuBand->UseBigIcons())
340  {
341  shiml = SHIL_LARGE;
342  SetPadding(4, 0);
343  }
344  else
345  {
346  shiml = SHIL_SMALL;
347  SetPadding(4, 4);
348  }
349 
350  IImageList * piml;
351  HRESULT hr = SHGetImageList(shiml, IID_PPV_ARG(IImageList, &piml));
352  if (FAILED_UNEXPECTEDLY(hr))
353  {
355  }
356  else
357  {
358  SetImageList((HIMAGELIST)piml);
359  }
360  return S_OK;
361 }
362 
364 {
365  if (m_hWnd)
366  DestroyWindow();
367 
368  if (m_pager.m_hWnd)
369  m_pager.DestroyWindow();
370 
371  return S_OK;
372 }
373 
375 {
380 
381  if (dwFlags & SMINIT_VERTICAL)
382  {
383  // Activate vertical semantics
384  tbStyles |= CCS_VERT;
385 
386 #if USE_TBSTYLE_EX_VERTICAL
387  tbExStyles |= TBSTYLE_EX_VERTICAL;
388 #endif
389  }
390 
392 
393  // Get a temporary rect to use while creating the toolbar window.
394  // Ensure that it is not a null rect.
395  RECT rc;
396  if (!::GetClientRect(hwndParent, &rc) ||
397  (rc.left == rc.right) ||
398  (rc.top == rc.bottom))
399  {
400  rc.left = 0;
401  rc.top = 0;
402  rc.right = 1;
403  rc.bottom = 1;
404  }
405 
406  // HACK & FIXME: CORE-17505
407  HWND toolbar = CToolbar::Create(hwndParent, tbStyles, tbExStyles);
408  m_hWnd = NULL;
409  SubclassWindow(toolbar);
410 
411  SetWindowTheme(m_hWnd, L"", L"");
412 
413  SystemParametersInfo(SPI_GETFLATMENU, 0, &m_useFlatMenus, 0);
414 
416 
417  // If needed, create the pager.
418  if (m_usePager)
419  {
420  LONG pgStyles = PGS_VERT | WS_CHILD | WS_VISIBLE;
421  LONG pgExStyles = 0;
422 
423  HWND hwndPager = CreateWindowEx(
424  pgExStyles, WC_PAGESCROLLER, NULL,
425  pgStyles, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top,
426  hwndParent, NULL, _AtlBaseModule.GetModuleInstance(), 0);
427 
428  m_pager.SubclassWindow(hwndPager);
429 
430  ::SetParent(m_hWnd, hwndPager);
431 
432  m_pager.SendMessageW(PGM_SETCHILD, 0, reinterpret_cast<LPARAM>(m_hWnd));
433  }
434 
435  // Configure the image lists
437 
438  return S_OK;
439 }
440 
441 HRESULT CMenuToolbarBase::GetSizes(SIZE* pMinSize, SIZE* pMaxSize, SIZE* pIntegralSize)
442 {
443  if (pMinSize)
444  *pMinSize = m_idealSize;
445  if (pMaxSize)
446  *pMaxSize = m_idealSize;
447  if (pIntegralSize)
448  *pIntegralSize = m_itemSize;
449 
450  if (m_hasSizes)
451  return S_OK;
452 
453  TRACE("Sizes out of date, recalculating.\n");
454 
455  if (!m_hWnd)
456  {
457  return S_OK;
458  }
459 
460  // Obtain the ideal size, to be used as min and max
461  GetMaxSize(&m_idealSize);
462  GetIdealSize((m_initFlags & SMINIT_VERTICAL) != 0, &m_idealSize);
463 
464  TRACE("Ideal Size: (%d, %d) for %d buttons\n", m_idealSize, GetButtonCount());
465 
466  // Obtain the button size, to be used as the integral size
467  DWORD size = GetButtonSize();
470  m_hasSizes = TRUE;
471 
472  if (pMinSize)
473  *pMinSize = m_idealSize;
474  if (pMaxSize)
475  *pMaxSize = m_idealSize;
476  if (pIntegralSize)
477  *pIntegralSize = m_itemSize;
478 
479  return S_OK;
480 }
481 
483 {
484  // Update the toolbar or pager to fit the requested rect
485  // If we have a pager, set the toolbar height to the ideal height of the toolbar
486  if (m_pager.m_hWnd)
487  {
488  SetWindowPos(NULL, x, y, cx, m_idealSize.cy, 0);
489  m_pager.SetWindowPos(NULL, x, y, cx, cy, 0);
490  }
491  else
492  {
493  SetWindowPos(NULL, x, y, cx, cy, 0);
494  }
495 
496  // In a vertical menu, resize the buttons to fit the width
497  if (m_initFlags & SMINIT_VERTICAL)
498  {
499  DWORD btnSize = GetButtonSize();
500  SetButtonSize(cx, GET_Y_LPARAM(btnSize));
501  }
502 
503  return S_OK;
504 }
505 
507 {
508  if (m_hWnd && m_hWnd == hwnd) return S_OK;
509  if (m_pager.m_hWnd && m_pager.m_hWnd == hwnd) return S_OK;
510  return S_FALSE;
511 }
512 
514 {
515  if (!phwnd)
516  return E_FAIL;
517 
518  if (m_pager.m_hWnd)
519  *phwnd = m_pager.m_hWnd;
520  else
521  *phwnd = m_hWnd;
522 
523  return S_OK;
524 }
525 
527 {
528  INT index;
530 
531  INT iItem = tip->iItem;
532 
533  GetDataFromId(iItem, &index, &dwData);
534 
535  return InternalGetTooltip(iItem, index, dwData, tip->pszText, tip->cchTextMax);
536 }
537 
539 {
540  if (wParam != TIMERID_HOTTRACK)
541  {
542  bHandled = FALSE;
543  return 0;
544  }
545 
547 
548  if (!m_timerEnabled)
549  return 0;
550 
552 
553  if (m_hotItem < 0)
554  return 0;
555 
556  // Returns S_FALSE if the current item did not show a submenu
558  if (hr != S_FALSE)
559  return 0;
560 
561  // If we didn't switch submenus, cancel the current popup regardless
562  if (m_popupBar)
563  {
565  if (FAILED_UNEXPECTEDLY(hr))
566  return 0;
567  }
568 
569  return 0;
570 }
571 
573 {
574  if (m_timerEnabled)
575  {
578  return S_OK;
579  }
580  return S_FALSE;
581 }
582 
584 {
585  // Ignore the change if it already matches the stored info
586  if (m_hotBar == toolbar && m_hotItem == item)
587  return S_FALSE;
588 
589  // Prevent a change of hot item if the change was triggered by the mouse,
590  // and mouse tracking is disabled.
592  {
593  TRACE("Hot item change prevented by DisableMouseTrack\n");
594  return S_OK;
595  }
596 
597  // Notify the toolbar if the hot-tracking left this toolbar
598  if (m_hotBar == this && toolbar != this)
599  {
600  SetHotItem(-1);
601  }
602 
603  TRACE("Hot item changed from %p %p, to %p %p\n", m_hotBar, m_hotItem, toolbar, item);
604  m_hotBar = toolbar;
605  m_hotItem = item;
606 
607  if (m_hotBar == this)
608  {
609  if (m_isTrackingPopup && !(m_initFlags & SMINIT_VERTICAL))
610  {
611  // If the menubar has an open submenu, switch to the new item's submenu immediately
613  }
614  else if (dwFlags & HICF_MOUSE)
615  {
616  // Vertical menus show/hide the submenu after a delay,
617  // but only with the mouse.
618  if (m_initFlags & SMINIT_VERTICAL)
619  {
620  DWORD elapsed = 0;
621  SystemParametersInfo(SPI_GETMENUSHOWDELAY, 0, &elapsed, 0);
622  SetTimer(TIMERID_HOTTRACK, elapsed);
624  TRACE("SetTimer called with m_hotItem=%d\n", m_hotItem);
625  }
626  }
627  else
628  {
630  info.cbSize = sizeof(info);
631  info.dwMask = 0;
632 
633  int index = GetButtonInfo(item, &info);
634 
635  SetHotItem(index);
636  }
637  }
638 
639  InvalidateDraw();
640  return S_OK;
641 }
642 
644 {
645  // Ignore the change if it already matches the stored info
646  if (m_popupBar == toolbar && m_popupItem == item)
647  return S_FALSE;
648 
649  // Notify the toolbar if the popup-tracking this toolbar
650  if (m_popupBar == this && toolbar != this)
651  {
652  CheckButton(m_popupItem, FALSE);
654  }
655 
656  m_popupBar = toolbar;
657  m_popupItem = item;
658 
659  if (m_popupBar == this)
660  {
661  CheckButton(m_popupItem, TRUE);
662  }
663 
664  InvalidateDraw();
665  return S_OK;
666 }
667 
669 {
670  TBBUTTON btn;
671  INT idx = (INT)wParam;
672 
673  if (m_hotBar != this)
674  return S_FALSE;
675 
676  if (idx < 0)
677  return S_FALSE;
678 
679  if (!GetButton(idx, &btn))
680  return E_FAIL;
681 
682  if (m_hotItem == btn.idCommand)
683  return S_OK;
684 
685  if (m_popupItem == btn.idCommand)
686  return S_OK;
687 
688  return S_FALSE;
689 }
690 
692 {
693  TBBUTTON btn;
694  BOOL wasTracking = LOWORD(lParam);
695  BOOL mouse = HIWORD(lParam);
696  INT idx = (INT)wParam;
697 
698  if (idx < 0)
699  {
702  }
703 
704  if (!GetButton(idx, &btn))
705  return E_FAIL;
706 
707  TRACE("ChangeTrackedItem %d, %d\n", idx, wasTracking);
708  m_isTrackingPopup = wasTracking;
709  return m_menuBand->_ChangeHotItem(this, btn.idCommand, mouse ? HICF_MOUSE : 0);
710 }
711 
712 HRESULT CMenuToolbarBase::PopupSubMenu(UINT iItem, UINT index, IShellMenu* childShellMenu, BOOL keyInitiated)
713 {
714  // Calculate the submenu position and exclude area
715  RECT rc = { 0 };
716 
717  if (!GetItemRect(index, &rc))
718  return E_FAIL;
719 
720  POINT a = { rc.left, rc.top };
721  POINT b = { rc.right, rc.bottom };
722 
723  ClientToScreen(&a);
724  ClientToScreen(&b);
725 
726  POINTL pt = { a.x, b.y };
727  RECTL rcl = { a.x, a.y, b.x, b.y };
728 
729  if (m_initFlags & SMINIT_VERTICAL)
730  {
731  // FIXME: Hardcoding this here feels hacky.
732  if (IsAppThemed())
733  {
734  pt.x = b.x - 1;
735  pt.y = a.y - 1;
736  }
737  else
738  {
739  pt.x = b.x - 3;
740  pt.y = a.y - 3;
741  }
742  }
743 
744  // Display the submenu
746 
747  m_menuBand->_ChangePopupItem(this, iItem);
748  m_menuBand->_OnPopupSubMenu(childShellMenu, &pt, &rcl, keyInitiated);
749 
750  return S_OK;
751 }
752 
754 {
755  // Calculate the submenu position and exclude area
756  RECT rc = { 0 };
757 
758  if (!GetItemRect(index, &rc))
759  return E_FAIL;
760 
761  POINT a = { rc.left, rc.top };
762  POINT b = { rc.right, rc.bottom };
763 
764  ClientToScreen(&a);
765  ClientToScreen(&b);
766 
767  POINT pt = { a.x, b.y };
768  RECT rcl = { a.x, a.y, b.x, b.y };
769 
770  if (m_initFlags & SMINIT_VERTICAL)
771  {
772  pt.x = b.x;
773  pt.y = a.y;
774  }
775 
776  HMENU popup = GetSubMenu(menu, index);
777 
778  // Display the submenu
780  m_menuBand->_ChangePopupItem(this, iItem);
781  m_menuBand->_TrackSubMenu(popup, pt.x, pt.y, rcl);
784 
785  return S_OK;
786 }
787 
789 {
790  // Cancel submenus
792  if (m_popupBar)
794 
795  // Display the context menu
796  return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
797 }
798 
800 {
802  TRACE("BeforeCancelPopup\n");
803  return S_OK;
804 }
805 
807 {
809  {
810  TRACE("Item click prevented by DisableMouseTrack\n");
811  return S_OK;
812  }
813 
814  // If a button is clicked while a submenu was open, cancel the submenu.
815  if (!(m_initFlags & SMINIT_VERTICAL) && m_isTrackingPopup)
816  {
817  TRACE("OnCommand cancelled because it was tracking submenu.\n");
818  return S_FALSE;
819  }
820 
821  if (PopupItem(iItem, FALSE) == S_OK)
822  {
823  TRACE("PopupItem returned S_OK\n");
824  return S_FALSE;
825  }
826 
827  TRACE("Executing...\n");
828 
829  return m_menuBand->_MenuItemSelect(MPOS_EXECUTE);
830 }
831 
833 {
834  INT index;
835  DWORD_PTR data;
836 
837  GetDataFromId(iItem, &index, &data);
838 
839  DWORD pos = GetMessagePos();
841 
842  return InternalContextMenu(iItem, index, data, pt);
843 }
844 
846 {
847  TBBUTTON btn;
848 
849  GetButton(iIndex, &btn);
850 
851  if ((m_initFlags & SMINIT_VERTICAL)
852  || m_popupBar
853  || m_cancelingPopup)
854  {
856  return S_OK;
857  }
858 
859  return ProcessClick(btn.idCommand);
860 }
861 
863 {
864  TBBUTTON btn;
865 
867 
868  if (!(m_initFlags & SMINIT_VERTICAL))
869  return S_OK;
870 
871  GetButton(iIndex, &btn);
872 
873  if (isLButton)
874  return ProcessClick(btn.idCommand);
875  else
876  return ProcessContextMenu(btn.idCommand);
877 }
878 
880 {
881  this->m_menuBand->_KillPopupTimers();
882 
883  m_executeItem = iItem;
884  return GetDataFromId(iItem, &m_executeIndex, &m_executeData);
885 }
886 
888 {
890 }
891 
893 {
894  int prev = m_hotItem;
895  int index = -1;
896 
897  if (dwSelectType != 0xFFFFFFFF)
898  {
899  int count = GetButtonCount();
900 
901  if (dwSelectType == VK_HOME)
902  {
903  index = 0;
904  dwSelectType = VK_DOWN;
905  }
906  else if (dwSelectType == VK_END)
907  {
908  index = count - 1;
909  dwSelectType = VK_UP;
910  }
911  else
912  {
913  if (m_hotItem >= 0)
914  {
915  TBBUTTONINFO info = { 0 };
916  info.cbSize = sizeof(TBBUTTONINFO);
917  info.dwMask = 0;
918  index = GetButtonInfo(m_hotItem, &info);
919  }
920 
921  if (index < 0)
922  {
923  if (dwSelectType == VK_UP)
924  {
925  index = count - 1;
926  }
927  else if (dwSelectType == VK_DOWN)
928  {
929  index = 0;
930  }
931  }
932  else
933  {
934  if (dwSelectType == VK_UP)
935  {
936  index--;
937  }
938  else if (dwSelectType == VK_DOWN)
939  {
940  index++;
941  }
942  }
943  }
944 
945  TBBUTTON btn = { 0 };
946  while (index >= 0 && index < count)
947  {
948  DWORD res = GetButton(index, &btn);
949  if (!res)
950  return E_FAIL;
951 
952  if (btn.dwData)
953  {
954  if (prev != btn.idCommand)
955  {
956  TRACE("Setting Hot item to %d\n", index);
957  if (!(m_initFlags & SMINIT_VERTICAL) && m_isTrackingPopup)
958  {
959  HWND tlw;
961  ::SendMessageW(tlw, WM_CANCELMODE, 0, 0);
963  }
964  else
965  m_menuBand->_ChangeHotItem(this, btn.idCommand, 0);
966  }
967  return S_OK;
968  }
969 
970  if (dwSelectType == VK_UP)
971  {
972  index--;
973  }
974  else if (dwSelectType == VK_DOWN)
975  {
976  index++;
977  }
978  }
979 
980  return S_FALSE;
981  }
982 
983  if (prev != -1)
984  {
985  TRACE("Setting Hot item to null\n");
986  m_menuBand->_ChangeHotItem(NULL, -1, 0);
987  }
988 
989  return S_FALSE;
990 }
991 
992 HRESULT CMenuToolbarBase::AddButton(DWORD commandId, LPCWSTR caption, BOOL hasSubMenu, INT iconId, DWORD_PTR buttonData, BOOL last)
993 {
994  TBBUTTON tbb = { 0 };
995 
996  tbb.fsState = TBSTATE_ENABLED;
997 #if !USE_TBSTYLE_EX_VERTICAL
998  if (!last && (m_initFlags & SMINIT_VERTICAL))
999  tbb.fsState |= TBSTATE_WRAP;
1000 #endif
1001  tbb.fsStyle = BTNS_CHECKGROUP;
1002 
1003  if (hasSubMenu && (m_initFlags & SMINIT_VERTICAL))
1004  tbb.fsStyle |= BTNS_DROPDOWN;
1005 
1006  if (!(m_initFlags & SMINIT_VERTICAL))
1007  tbb.fsStyle |= BTNS_AUTOSIZE;
1008 
1009  tbb.iString = (INT_PTR) caption;
1010  tbb.idCommand = commandId;
1011 
1012  tbb.iBitmap = iconId;
1013  tbb.dwData = buttonData;
1014 
1015  m_hasSizes = FALSE;
1016 
1017  if (!AddButtons(1, &tbb))
1018  return HRESULT_FROM_WIN32(GetLastError());
1019  return S_OK;
1020 }
1021 
1023 {
1024  TBBUTTON tbb = { 0 };
1025 
1026  tbb.fsState = TBSTATE_ENABLED;
1027 #if !USE_TBSTYLE_EX_VERTICAL
1028  if (!last && (m_initFlags & SMINIT_VERTICAL))
1029  tbb.fsState |= TBSTATE_WRAP;
1030 #endif
1031  tbb.fsStyle = BTNS_SEP;
1032  tbb.iBitmap = 0;
1033 
1034  m_hasSizes = FALSE;
1035 
1036  if (!AddButtons(1, &tbb))
1037  return HRESULT_FROM_WIN32(GetLastError());
1038 
1039  return S_OK;
1040 }
1041 
1043 {
1044  TBBUTTON tbb = { 0 };
1045  WCHAR MenuString[128];
1046 
1047  LoadStringW(GetModuleHandle(L"shell32.dll"), IDS_MENU_EMPTY, MenuString, _countof(MenuString));
1048 
1049  tbb.fsState = 0;
1050  tbb.fsStyle = 0;
1051  tbb.iString = (INT_PTR) MenuString;
1052  tbb.iBitmap = -1;
1053 
1054  m_hasSizes = FALSE;
1055 
1056  if (!AddButtons(1, &tbb))
1057  return HRESULT_FROM_WIN32(GetLastError());
1058 
1059  return S_OK;
1060 }
1061 
1063 {
1064  while (DeleteButton(0))
1065  {
1066  // empty;
1067  }
1068  m_hasSizes = FALSE;
1069  return S_OK;
1070 }
1071 
1073 {
1074  if (pData)
1075  *pData = NULL;
1076 
1077  if (pIndex)
1078  *pIndex = -1;
1079 
1080  if (iItem < 0)
1081  return S_OK;
1082 
1083  TBBUTTONINFO info = { 0 };
1084 
1085  info.cbSize = sizeof(TBBUTTONINFO);
1086  info.dwMask = TBIF_COMMAND | TBIF_LPARAM;
1087 
1088  int index = GetButtonInfo(iItem, &info);
1089  if (index < 0)
1090  return E_FAIL;
1091 
1092  if (pIndex)
1093  *pIndex = index;
1094 
1095  if (pData)
1096  *pData = info.lParam;
1097 
1098  return S_OK;
1099 }
1100 
1102 {
1103  return m_menuBand->_CancelCurrentPopup();
1104 }
1105 
1107 {
1108  INT index;
1109  DWORD_PTR dwData;
1110 
1111  if (iItem < 0)
1112  return S_OK;
1113 
1114  if (m_popupBar == this && m_popupItem == iItem)
1115  return S_OK;
1116 
1117  GetDataFromId(iItem, &index, &dwData);
1118 
1120  if (hr != S_OK)
1121  return hr;
1122 
1123  if (m_popupBar)
1124  {
1126  if (FAILED_UNEXPECTEDLY(hr))
1127  return hr;
1128  }
1129 
1130  if (!(m_initFlags & SMINIT_VERTICAL))
1131  {
1132  TRACE("PopupItem non-vertical %d %d\n", index, iItem);
1133  m_menuBand->_ChangeHotItem(this, iItem, 0);
1134  }
1135 
1136  return InternalPopupItem(iItem, index, dwData, keyInitiated);
1137 }
1138 
1140  CMenuToolbarBase(menuBand, FALSE),
1141  m_hmenu(NULL),
1142  m_hwndMenu(NULL)
1143 {
1144 }
1145 
1147 {
1148 }
1149 
1151  _Out_opt_ HMENU *phmenu,
1152  _Out_opt_ HWND *phwnd,
1153  _Out_opt_ DWORD *pdwFlags)
1154 {
1155  if (phmenu)
1156  *phmenu = m_hmenu;
1157  if (phwnd)
1158  *phwnd = m_hwndMenu;
1159  if (pdwFlags)
1160  *pdwFlags = m_dwMenuFlags;
1161 
1162  return S_OK;
1163 }
1164 
1166  HMENU hmenu,
1167  HWND hwnd,
1168  DWORD dwFlags)
1169 {
1170  m_hmenu = hmenu;
1171  m_hwndMenu = hwnd;
1173 
1174  if (IsWindow())
1175  ClearToolbar();
1176 
1177  return S_OK;
1178 }
1179 
1181 {
1182  int i;
1183  int ic = GetMenuItemCount(m_hmenu);
1184 
1185  if (clearFirst)
1186  {
1187  ClearToolbar();
1188  }
1189 
1190  int count = 0;
1191  for (i = 0; i < ic; i++)
1192  {
1193  BOOL last = i + 1 == ic;
1194 
1196 
1197  info.cbSize = sizeof(info);
1198  info.dwTypeData = NULL;
1199  info.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID;
1200 
1201  if (!GetMenuItemInfoW(m_hmenu, i, TRUE, &info))
1202  {
1203  TRACE("Error obtaining info for menu item at pos=%d\n", i);
1204  continue;
1205  }
1206 
1207  count++;
1208 
1209  if (info.fType & MFT_SEPARATOR)
1210  {
1211  AddSeparator(last);
1212  }
1213  else if (!(info.fType & MFT_BITMAP))
1214  {
1215  info.cch++;
1216  info.dwTypeData = (PWSTR) HeapAlloc(GetProcessHeap(), 0, (info.cch + 1) * sizeof(WCHAR));
1217 
1218  info.fMask = MIIM_STRING | MIIM_SUBMENU | MIIM_ID;
1220 
1221  SMINFO * sminfo = new SMINFO();
1222  sminfo->dwMask = SMIM_ICON | SMIM_FLAGS;
1223 
1224  HRESULT hr = m_menuBand->_CallCBWithItemId(info.wID, SMC_GETINFO, 0, reinterpret_cast<LPARAM>(sminfo));
1225  if (FAILED_UNEXPECTEDLY(hr))
1226  {
1227  delete sminfo;
1228  return hr;
1229  }
1230 
1231  AddButton(info.wID, info.dwTypeData, info.hSubMenu != NULL, sminfo->iIcon, reinterpret_cast<DWORD_PTR>(sminfo), last);
1232 
1233  HeapFree(GetProcessHeap(), 0, info.dwTypeData);
1234  }
1235  }
1236 
1237  return S_OK;
1238 }
1239 
1241 {
1242  //SMINFO * info = reinterpret_cast<SMINFO*>(dwData);
1243  UNIMPLEMENTED;
1244  return E_NOTIMPL;
1245 }
1246 
1248 {
1249  delete reinterpret_cast<SMINFO*>(tb->tbButton.dwData);
1250  return S_OK;
1251 }
1252 
1254 {
1255  CComPtr<IContextMenu> contextMenu;
1256  HRESULT hr = m_menuBand->_CallCBWithItemId(iItem, SMC_GETOBJECT,
1257  reinterpret_cast<WPARAM>(&IID_IContextMenu), reinterpret_cast<LPARAM>(&contextMenu));
1258  if (hr != S_OK)
1259  return hr;
1260 
1261  return TrackContextMenu(contextMenu, pt);
1262 }
1263 
1265 {
1266  return m_menuBand->_CallCBWithItemId(iItem, SMC_EXEC, 0, 0);
1267 }
1268 
1270 {
1271  SMINFO * nfo = reinterpret_cast<SMINFO*>(dwData);
1272  if (!nfo)
1273  return E_FAIL;
1274 
1275  if (nfo->dwFlags&SMIF_TRACKPOPUP)
1276  {
1277  return PopupSubMenu(iItem, index, m_hmenu);
1278  }
1279  else
1280  {
1281  CComPtr<IShellMenu> shellMenu;
1282  HRESULT hr = m_menuBand->_CallCBWithItemId(iItem, SMC_GETOBJECT, reinterpret_cast<WPARAM>(&IID_IShellMenu), reinterpret_cast<LPARAM>(&shellMenu));
1283  if (FAILED_UNEXPECTEDLY(hr))
1284  return hr;
1285 
1286  return PopupSubMenu(iItem, index, shellMenu, keyInitiated);
1287  }
1288 }
1289 
1291 {
1293 }
1294 
1296  CMenuToolbarBase(menuBand, TRUE),
1297  m_shellFolder(NULL),
1298  m_idList(NULL),
1299  m_hKey(NULL)
1300 {
1301 }
1302 
1304 {
1305 }
1306 
1308 {
1309  IShellFolder * psf = (IShellFolder*) lParam;
1312  HRESULT hr = psf->CompareIDs(0, pidl1, pidl2);
1313  if (FAILED(hr))
1314  {
1315  // No way to cancel, so sort to equal.
1316  return 0;
1317  }
1318  return (int)(short)LOWORD(hr);
1319 }
1320 
1322 {
1323  HRESULT hr;
1324 
1325  CComPtr<IEnumIDList> eidl;
1326  hr = m_shellFolder->EnumObjects(GetToolbar(), SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &eidl);
1327  if (FAILED_UNEXPECTEDLY(hr))
1328  return hr;
1329 
1330  HDPA dpaSort = DPA_Create(10);
1331 
1333  hr = eidl->Next(1, &item, NULL);
1334  while (hr == S_OK)
1335  {
1336  if (m_menuBand->_CallCBWithItemPidl(item, 0x10000000, 0, 0) == S_FALSE)
1337  {
1338  DPA_AppendPtr(dpaSort, item);
1339  }
1340  else
1341  {
1343  }
1344 
1345  hr = eidl->Next(1, &item, NULL);
1346  }
1347 
1348  // If no items were added, show the "empty" placeholder
1349  if (DPA_GetPtrCount(dpaSort) == 0)
1350  {
1351  DPA_Destroy(dpaSort);
1352  return AddPlaceholder();
1353  }
1354 
1355  TRACE("FillToolbar added %d items to the DPA\n", DPA_GetPtrCount(dpaSort));
1356 
1358 
1359  for (int i = 0; i<DPA_GetPtrCount(dpaSort);)
1360  {
1361  PWSTR MenuString;
1362 
1363  INT index = 0;
1364  INT indexOpen = 0;
1365 
1366  STRRET sr = { STRRET_CSTR, { 0 } };
1367 
1368  item = (LPITEMIDLIST)DPA_GetPtr(dpaSort, i);
1369 
1370  hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
1371  if (FAILED_UNEXPECTEDLY(hr))
1372  {
1373  DPA_Destroy(dpaSort);
1374  return hr;
1375  }
1376 
1377  StrRetToStr(&sr, NULL, &MenuString);
1378 
1380 
1381  LPCITEMIDLIST itemc = item;
1382 
1383  SFGAOF attrs = SFGAO_FOLDER;
1384  hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs);
1385 
1386  DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(item);
1387 
1388  // Fetch next item already, so we know if the current one is the last
1389  i++;
1390 
1391  AddButton(i, MenuString, attrs & SFGAO_FOLDER, index, dwData, i >= DPA_GetPtrCount(dpaSort));
1392 
1393  CoTaskMemFree(MenuString);
1394  }
1395 
1396  DPA_Destroy(dpaSort);
1397  return hr;
1398 }
1399 
1401 {
1402  //ITEMIDLIST * pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1403  UNIMPLEMENTED;
1404  return E_NOTIMPL;
1405 }
1406 
1408 {
1409  ILFree(reinterpret_cast<LPITEMIDLIST>(tb->tbButton.dwData));
1410  return S_OK;
1411 }
1412 
1414 {
1415  m_shellFolder = psf;
1416  m_idList = ILClone(pidlFolder);
1417  m_hKey = hKey;
1419 
1420  if (IsWindow())
1421  ClearToolbar();
1422 
1423  return S_OK;
1424 }
1425 
1427 {
1428  HRESULT hr;
1429 
1430  hr = m_shellFolder->QueryInterface(riid, ppv);
1431  if (FAILED_UNEXPECTEDLY(hr))
1432  return hr;
1433 
1434  if (pdwFlags)
1435  *pdwFlags = m_dwMenuFlags;
1436 
1437  if (ppidl)
1438  {
1439  LPITEMIDLIST pidl = NULL;
1440 
1441  if (m_idList)
1442  {
1443  pidl = ILClone(m_idList);
1444  if (!pidl)
1445  {
1446  ERR("ILClone failed!\n");
1447  (*reinterpret_cast<IUnknown**>(ppv))->Release();
1448  return E_FAIL;
1449  }
1450  }
1451 
1452  *ppidl = pidl;
1453  }
1454 
1455  return hr;
1456 }
1457 
1459 {
1460  HRESULT hr;
1461  CComPtr<IContextMenu> contextMenu = NULL;
1462  LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(dwData);
1463 
1464  hr = m_shellFolder->GetUIObjectOf(GetToolbar(), 1, &pidl, IID_NULL_PPV_ARG(IContextMenu, &contextMenu));
1465  if (FAILED_UNEXPECTEDLY(hr))
1466  {
1467  return hr;
1468  }
1469 
1470  hr = TrackContextMenu(contextMenu, pt);
1471 
1472  return hr;
1473 }
1474 
1476 {
1477  return m_menuBand->_CallCBWithItemPidl(reinterpret_cast<LPITEMIDLIST>(data), SMC_SFEXEC, 0, 0);
1478 }
1479 
1481 {
1482  HRESULT hr;
1483  UINT uId;
1484  UINT uIdAncestor;
1485  DWORD flags;
1486  CComPtr<IShellMenuCallback> psmc;
1487  CComPtr<IShellMenu> shellMenu;
1488 
1489  LPITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1490 
1491  if (!pidl)
1492  return E_FAIL;
1493 
1495  if (FAILED_UNEXPECTEDLY(hr))
1496  return hr;
1497 
1498  m_menuBand->GetMenuInfo(&psmc, &uId, &uIdAncestor, &flags);
1499 
1500  // FIXME: not sure what to use as uId/uIdAncestor here
1501  hr = shellMenu->Initialize(psmc, 0, uId, SMINIT_VERTICAL);
1502  if (FAILED_UNEXPECTEDLY(hr))
1503  return hr;
1504 
1505  CComPtr<IShellFolder> childFolder;
1506  hr = m_shellFolder->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &childFolder));
1507  if (FAILED_UNEXPECTEDLY(hr))
1508  return hr;
1509 
1510  hr = shellMenu->SetShellFolder(childFolder, NULL, NULL, SMSET_TOP);
1511  if (FAILED_UNEXPECTEDLY(hr))
1512  return hr;
1513 
1514  return PopupSubMenu(iItem, index, shellMenu, keyInitiated);
1515 }
1516 
1518 {
1519  HRESULT hr;
1520  LPCITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(dwData);
1521 
1522  SFGAOF attrs = SFGAO_FOLDER;
1523  hr = m_shellFolder->GetAttributesOf(1, &pidl, &attrs);
1524  if (FAILED_UNEXPECTEDLY(hr))
1525  return hr;
1526 
1527  return (attrs & SFGAO_FOLDER) ? S_OK : S_FALSE;
1528 }
#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:5762
#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:1799
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:3998
#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:5848
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:2217
#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:2213
#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:2215
#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:5745
#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:1620
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:1625
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:1730
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:918
#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:2212
#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