4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 Implements a class that knows how to hold and manage the menu band, brand band,
23 toolbar, and address band for an explorer window
30 interface IAugmentedShellFolder
: public IShellFolder
32 STDMETHOD(AddNameSpace
)(LPGUID
, IShellFolder
*, LPCITEMIDLIST
, ULONG
) PURE
;
33 STDMETHOD(GetNameSpaceID
)(LPCITEMIDLIST
, LPGUID
) PURE
;
34 STDMETHOD(QueryNameSpace
)(ULONG
, LPGUID
, IShellFolder
**) PURE
;
35 STDMETHOD(EnumNameSpace
)(ULONG
, PULONG
) PURE
;
40 // navigation controls and menubar just send a message to parent window
43 ****Implement BandProxy methods
44 ****Add QueryStatus handler for built-in bands
45 ****Enable/Disable up, search, and folders commands appropriately
46 **Why are explorer toolbar separators a nonstandard width?
47 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
48 **Chevron menu on menuband doesn't work
49 **Fix CInternetToolbar::QueryBand to be generic
51 ****Fix context menu to strip divider when menu shown for menu band
52 ****Fix context menu to have items checked appropriately
53 ****Implement -1 command id update
54 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
55 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
56 Implement show/hide of bands
57 Why is the background color of my toolbars different from explorer?
58 Internet Toolbar command handler should get the target for the command and call Exec on the target.
59 For commands built in to the Internet Toolbar, its Exec handles the command
60 When window width is changed, brand band flashes badly
61 Add all bands with correct ids (system bands now add with correct ids)
63 Implement remaining IExplorerToolbar methods
64 Fix toolbar buttons to enable/disable correctly
65 After toolbar is customized, it may be necessary to patch the widths of separators
67 Check sizes and spacing of toolbars against Explorer
68 Implement resizing of the dock bar
69 Add missing icons for toolbar items
70 Draw History item in forward/back dropdown menus with icon
71 Fix toolbar customize dialog to not include separators as possible selections
72 Implement save/restore of toolbar state
73 Refactor drop down menu code to use a common function since code is so similar
76 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
78 HRESULT
IUnknown_RelayWinEvent(IUnknown
* punk
, HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
80 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
81 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
82 if (FAILED_UNEXPECTEDLY(hResult
))
84 hResult
= menuWinEventHandler
->IsWindowOwner(hWnd
);
85 if (FAILED_UNEXPECTEDLY(hResult
))
88 return menuWinEventHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
92 HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
)
94 CComPtr
<IDockingWindow
> dockingWindow
;
95 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
96 if (FAILED_UNEXPECTEDLY(hResult
))
98 hResult
= dockingWindow
->ShowDW(fShow
);
99 if (FAILED_UNEXPECTEDLY(hResult
))
104 HRESULT
IUnknown_CloseDW(IUnknown
* punk
, DWORD dwReserved
)
106 CComPtr
<IDockingWindow
> dockingWindow
;
107 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
108 if (FAILED_UNEXPECTEDLY(hResult
))
110 hResult
= dockingWindow
->CloseDW(dwReserved
);
111 if (FAILED_UNEXPECTEDLY(hResult
))
116 class CInternetToolbar
;
119 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
120 public IDockingWindowSite
,
121 public IInputObjectSite
,
122 public IOleCommandTarget
,
123 public IServiceProvider
129 ITF_NEWBANDALWAYS
= 4,
130 ITF_GRIPPERALWAYS
= 8,
134 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
135 CInternetToolbar
*fToolbar
; // our browser
143 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
144 DESKBANDINFO fDeskBandInfo
;
148 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
149 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
152 // *** IOleWindow methods ***
153 STDMETHOD(GetWindow
)(HWND
*lphwnd
) override
;
154 STDMETHOD(ContextSensitiveHelp
)(BOOL fEnterMode
) override
;
156 // *** IDockingWindow methods ***
157 STDMETHOD(GetBorderDW
)(IUnknown
* punkObj
, LPRECT prcBorder
) override
;
158 STDMETHOD(RequestBorderSpaceDW
)(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
) override
;
159 STDMETHOD(SetBorderSpaceDW
)(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
) override
;
161 // *** IInputObjectSite specific methods ***
162 STDMETHOD(OnFocusChangeIS
)(IUnknown
*punkObj
, BOOL fSetFocus
) override
;
164 // *** IOleCommandTarget specific methods ***
165 STDMETHOD(QueryStatus
)(const GUID
*pguidCmdGroup
, ULONG cCmds
,
166 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
) override
;
167 STDMETHOD(Exec
)(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
168 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
) override
;
170 // *** IServiceProvider methods ***
171 STDMETHOD(QueryService
)(REFGUID guidService
, REFIID riid
, void **ppvObject
) override
;
173 BEGIN_COM_MAP(CDockSite
)
174 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
175 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
176 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
177 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
178 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
182 CDockSite::CDockSite()
189 fInitialized
= false;
190 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
193 CDockSite::~CDockSite()
197 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
199 TCHAR textBuffer
[40];
200 REBARBANDINFOW bandInfo
;
203 fContainedBand
= containedBand
;
208 hResult
= IUnknown_SetSite(containedBand
, static_cast<IOleWindow
*>(this));
209 if (FAILED_UNEXPECTEDLY(hResult
))
211 hResult
= IUnknown_GetWindow(containedBand
, &fChildWindow
);
212 if (FAILED_UNEXPECTEDLY(hResult
))
215 memset(&bandInfo
, 0, sizeof(bandInfo
));
216 bandInfo
.cbSize
= sizeof(bandInfo
);
217 bandInfo
.lpText
= textBuffer
;
218 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
219 hResult
= GetRBBandInfo(bandInfo
);
221 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
222 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
227 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
229 CComPtr
<IDeskBand
> deskBand
;
232 hResult
= fContainedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
233 if (FAILED_UNEXPECTEDLY(hResult
))
236 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
237 DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
238 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
239 // result of call is ignored
241 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
|
242 RBBIM_TEXT
| RBBIM_STYLE
;
244 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
245 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
246 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
247 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
248 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
249 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
250 bandInfo
.fStyle
|= RBBS_BREAK
;
251 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
252 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
253 if ((fFlags
& ITF_NOGRIPPER
) || fToolbar
->pSettings
->fLocked
)
254 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
255 if (fFlags
& ITF_NOTITLE
)
256 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
257 if ((fFlags
& ITF_GRIPPERALWAYS
) && !fToolbar
->pSettings
->fLocked
)
258 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
259 if (fFlags
& ITF_FIXEDSIZE
)
260 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
262 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
264 bandInfo
.fMask
|= RBBIM_COLORS
;
265 bandInfo
.clrFore
= CLR_DEFAULT
;
266 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
268 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
269 bandInfo
.hwndChild
= fChildWindow
;
270 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
271 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
272 bandInfo
.wID
= fBandID
;
273 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
274 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
275 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
276 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
277 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
281 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
285 *lphwnd
= fRebarWindow
;
289 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
294 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
299 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
304 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
309 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
314 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
315 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
320 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
321 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
323 TCHAR textBuffer
[40];
324 REBARBANDINFOW bandInfo
;
328 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
332 case DBID_BANDINFOCHANGED
:
333 if (fInitialized
== false)
335 if (V_VT(pvaIn
) != VT_I4
)
337 if (V_I4(pvaIn
) != fBandID
)
339 // deskband information changed
340 // call GetBandInfo and refresh information in rebar
341 memset(&bandInfo
, 0, sizeof(bandInfo
));
342 bandInfo
.cbSize
= sizeof(bandInfo
);
343 bandInfo
.lpText
= textBuffer
;
344 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
345 hResult
= GetRBBandInfo(bandInfo
);
346 if (FAILED_UNEXPECTEDLY(hResult
))
348 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
349 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
356 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
358 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
359 return this->QueryInterface(riid
, ppvObject
);
361 return fToolbar
->QueryService(guidService
, riid
, ppvObject
);
364 CMenuCallback::CMenuCallback()
368 CMenuCallback::~CMenuCallback()
372 static HRESULT
BindToDesktop(LPCITEMIDLIST pidl
, IShellFolder
** ppsfResult
)
375 CComPtr
<IShellFolder
> psfDesktop
;
379 hr
= SHGetDesktopFolder(&psfDesktop
);
383 hr
= psfDesktop
->BindToObject(pidl
, NULL
, IID_PPV_ARG(IShellFolder
, ppsfResult
));
388 static HRESULT
GetFavoritesFolder(IShellFolder
** ppsfFavorites
, LPITEMIDLIST
* ppidl
)
391 LPITEMIDLIST pidlUserFavorites
;
392 LPITEMIDLIST pidlCommonFavorites
;
393 CComPtr
<IShellFolder
> psfUserFavorites
;
394 CComPtr
<IShellFolder
> psfCommonFavorites
;
395 CComPtr
<IAugmentedShellFolder
> pasf
;
398 *ppsfFavorites
= NULL
;
403 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &pidlUserFavorites
);
406 WARN("Failed to get the USER favorites folder. Trying to run with just the COMMON one.\n");
408 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_COMMON_FAVORITES
, &pidlCommonFavorites
);
409 if (FAILED_UNEXPECTEDLY(hr
))
412 TRACE("COMMON favorites obtained.\n");
413 *ppidl
= pidlCommonFavorites
;
414 hr
= BindToDesktop(pidlCommonFavorites
, ppsfFavorites
);
418 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_COMMON_FAVORITES
, &pidlCommonFavorites
);
419 if (FAILED_UNEXPECTEDLY(hr
))
421 WARN("Failed to get the COMMON favorites folder. Will use only the USER contents.\n");
422 *ppidl
= pidlCommonFavorites
;
423 hr
= BindToDesktop(pidlUserFavorites
, ppsfFavorites
);
427 TRACE("Both COMMON and USER favorites folders obtained, merging them...\n");
429 hr
= BindToDesktop(pidlUserFavorites
, &psfUserFavorites
);
430 if (FAILED_UNEXPECTEDLY(hr
))
433 hr
= BindToDesktop(pidlCommonFavorites
, &psfCommonFavorites
);
434 if (FAILED_UNEXPECTEDLY(hr
))
437 hr
= CMergedFolder_CreateInstance(IID_PPV_ARG(IAugmentedShellFolder
, &pasf
));
438 if (FAILED_UNEXPECTEDLY(hr
))
440 *ppsfFavorites
= psfUserFavorites
.Detach();
441 *ppidl
= pidlUserFavorites
;
442 ILFree(pidlCommonFavorites
);
446 hr
= pasf
->AddNameSpace(NULL
, psfUserFavorites
, pidlUserFavorites
, 0xFF00);
447 if (FAILED_UNEXPECTEDLY(hr
))
450 hr
= pasf
->AddNameSpace(NULL
, psfCommonFavorites
, pidlCommonFavorites
, 0);
451 if (FAILED_UNEXPECTEDLY(hr
))
454 hr
= pasf
->QueryInterface(IID_PPV_ARG(IShellFolder
, ppsfFavorites
));
457 // TODO: obtain the folder's PIDL
459 ILFree(pidlCommonFavorites
);
460 ILFree(pidlUserFavorites
);
465 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
467 CComPtr
<IShellMenu
> parentMenu
;
468 CComPtr
<IShellMenu
> newMenu
;
469 CComPtr
<IShellFolder
> favoritesFolder
;
470 LPITEMIDLIST favoritesPIDL
;
473 HMENU favoritesHMenu
;
477 static const TCHAR szFavoritesKey
[] =
478 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
480 if (!IsEqualIID(riid
, IID_IShellMenu
))
482 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
485 // create favorites menu
486 hResult
= psmd
->punk
->QueryInterface(IID_PPV_ARG(IShellMenu
, &parentMenu
));
487 if (FAILED_UNEXPECTEDLY(hResult
))
489 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
490 if (FAILED_UNEXPECTEDLY(hResult
))
492 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
493 if (favoritesHMenu
== NULL
)
496 if (fFavoritesMenu
.p
== NULL
)
498 hResult
= CMenuBand_CreateInstance(IID_PPV_ARG(IShellMenu
, &newMenu
));
499 if (FAILED_UNEXPECTEDLY(hResult
))
501 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
502 if (FAILED_UNEXPECTEDLY(hResult
))
505 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
506 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
508 hResult
= GetFavoritesFolder(&favoritesFolder
, &favoritesPIDL
);
509 if (FAILED_UNEXPECTEDLY(hResult
))
512 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| SMINIT_CACHED
| SMINV_ID
);
514 ILFree(favoritesPIDL
);
519 fFavoritesMenu
= newMenu
;
522 hResult
= fFavoritesMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
523 if (FAILED_UNEXPECTEDLY(hResult
))
526 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
529 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
541 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
542 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
544 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
546 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
550 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
553 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
560 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
561 case SMC_GETSFOBJECT
:
564 PostMessageW(psmd
->hwnd
, WM_COMMAND
, psmd
->uId
, 0);
567 SHInvokeDefaultCommand(psmd
->hwnd
, psmd
->psf
, psmd
->pidlItem
);
569 case SMC_SFSELECTITEM
:
582 case SMC_DEFAULTICON
:
586 case SMC_CHEVRONEXPAND
:
588 case SMC_DISPLAYCHEVRONTIP
:
590 case SMC_SETSFOBJECT
:
592 case SMC_SHCHANGENOTIFY
:
594 case SMC_CHEVRONGETTIP
:
596 case SMC_SFDDRESTRICTED
:
608 CInternetToolbar::CInternetToolbar()
611 fMenuBandWindow
= NULL
;
612 fNavigationWindow
= NULL
;
613 fMenuCallback
= new CComObject
<CMenuCallback
>();
614 fToolbarWindow
= NULL
;
619 CInternetToolbar::~CInternetToolbar()
623 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
625 CComPtr
<CDockSite
> newSite
;
627 newSite
= new CComObject
<CDockSite
>;
628 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
631 HRESULT
CInternetToolbar::ReserveBorderSpace(LONG maxHeight
)
633 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
634 RECT availableBorderSpace
;
636 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
637 if (FAILED_UNEXPECTEDLY(hResult
))
639 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
640 if (FAILED_UNEXPECTEDLY(hResult
))
643 if (maxHeight
&& availableBorderSpace
.bottom
- availableBorderSpace
.top
> maxHeight
)
645 availableBorderSpace
.bottom
= availableBorderSpace
.top
+ maxHeight
;
648 return ResizeBorderDW(&availableBorderSpace
, fSite
, FALSE
);
651 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**pMenuBar
)
653 CComPtr
<IShellMenu
> menubar
;
654 CComPtr
<IShellMenuCallback
> callback
;
664 hResult
= CMenuBand_CreateInstance(IID_PPV_ARG(IShellMenu
, &menubar
));
665 if (FAILED_UNEXPECTEDLY(hResult
))
668 hResult
= fMenuCallback
->QueryInterface(IID_PPV_ARG(IShellMenuCallback
, &callback
));
669 if (FAILED_UNEXPECTEDLY(hResult
))
672 hResult
= menubar
->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
673 if (FAILED_UNEXPECTEDLY(hResult
))
678 hResult
= IUnknown_Exec(fSite
, CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
679 if (FAILED_UNEXPECTEDLY(hResult
))
682 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
685 hResult
= IUnknown_GetWindow(fSite
, &ownerWindow
);
686 if (FAILED_UNEXPECTEDLY(hResult
))
689 HMENU hMenuBar
= (HMENU
) V_INTREF(&menuOut
);
691 // FIXME: Figure out the proper way to do this.
692 HMENU hMenuFavs
= GetSubMenu(hMenuBar
, 3);
695 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
698 hResult
= menubar
->SetMenu(hMenuBar
, ownerWindow
, SMSET_DONTOWN
);
699 if (FAILED_UNEXPECTEDLY(hResult
))
703 hResult
= IUnknown_Exec(menubar
, CGID_MenuBand
, 3, 1, NULL
, NULL
);
704 if (FAILED_UNEXPECTEDLY(hResult
))
707 *pMenuBar
= menubar
.Detach();
712 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
714 if (locked
!= !!pSettings
->fLocked
)
716 pSettings
->fLocked
= (BOOL
)locked
;
718 RefreshLockedToolbarState();
723 void CInternetToolbar::RefreshLockedToolbarState()
725 REBARBANDINFOW rebarBandInfo
;
729 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
730 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
731 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
732 for (INT x
= 0; x
< bandCount
; x
++)
734 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
735 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
736 if (dockSite
!= NULL
)
738 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
739 if ((dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
) || pSettings
->fLocked
)
740 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
741 if ((dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
) && !pSettings
->fLocked
)
742 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
743 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
746 ReserveBorderSpace(0);
749 HRESULT
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, OLECMD
* pcmd
)
752 if (pcmd
->cmdf
& OLECMDF_ENABLED
)
753 state
|= TBSTATE_ENABLED
;
754 if (pcmd
->cmdf
& OLECMDF_LATCHED
)
755 state
|= TBSTATE_CHECKED
;
756 return SetState(pguidCmdGroup
, commandID
, state
);
759 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
767 // loop through buttons
768 //for buttons in CLSID_CommonButtons
769 // if up, QueryStatus for up state and update it
771 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
773 OLECMD commandList
[4];
774 commandList
[0].cmdID
= 0x1c;
775 commandList
[1].cmdID
= 0x1d;
776 commandList
[2].cmdID
= 0x1e;
777 commandList
[3].cmdID
= 0x23;
778 IUnknown_QueryStatus(fSite
, CGID_Explorer
, 4, commandList
, NULL
);
779 SetState(&CLSID_CommonButtons
, gSearchCommandID
, &commandList
[0]);
780 SetState(&CLSID_CommonButtons
, gFoldersCommandID
, &commandList
[3]);
781 //SetState(&CLSID_CommonButtons, gFavoritesCommandID, &commandList[2]);
782 //SetState(&CLSID_CommonButtons, gHistoryCommandID, &commandList[1]);
787 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_FORWARD
, newValue
? TBSTATE_ENABLED
: 0);
791 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_BACK
, newValue
? TBSTATE_ENABLED
: 0);
795 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_UPONELEVEL
, newValue
? TBSTATE_ENABLED
: 0);
801 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
803 CComPtr
<IServiceProvider
> serviceProvider
;
806 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
807 if (FAILED_UNEXPECTEDLY(hResult
))
809 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
810 if (FAILED_UNEXPECTEDLY(hResult
))
812 hResult
= CBandProxy_CreateInstance(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
813 if (FAILED_UNEXPECTEDLY(hResult
))
815 hResult
= fBandProxy
->SetSite(fSite
);
816 if (FAILED_UNEXPECTEDLY(hResult
))
822 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
827 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
829 HRESULT hr
= S_FALSE
;
832 hr
= IUnknown_HasFocusIO(fMenuBar
);
837 hr
= IUnknown_HasFocusIO(fControlsBar
);
842 hr
= IUnknown_HasFocusIO(fNavigationBar
);
849 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
851 HRESULT hr
= S_FALSE
;
854 hr
= IUnknown_TranslateAcceleratorIO(fMenuBar
, lpMsg
);
859 hr
= IUnknown_TranslateAcceleratorIO(fControlsBar
, lpMsg
);
864 hr
= IUnknown_TranslateAcceleratorIO(fNavigationBar
, lpMsg
);
871 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
879 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
884 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
891 hResult
= ReserveBorderSpace();
892 if (FAILED_UNEXPECTEDLY(hResult
))
898 hResult
= IUnknown_ShowDW(fMenuBar
, fShow
);
899 if (FAILED_UNEXPECTEDLY(hResult
))
905 hResult
= IUnknown_ShowDW(fControlsBar
, fShow
);
906 if (FAILED_UNEXPECTEDLY(hResult
))
911 hResult
= IUnknown_ShowDW(fNavigationBar
, fShow
);
912 if (FAILED_UNEXPECTEDLY(hResult
))
917 hResult
= IUnknown_ShowDW(fLogoBar
, fShow
);
918 if (FAILED_UNEXPECTEDLY(hResult
))
924 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
930 hResult
= IUnknown_CloseDW(fMenuBar
, dwReserved
);
931 if (FAILED_UNEXPECTEDLY(hResult
))
933 ReleaseCComPtrExpectZero(fMenuBar
);
937 hResult
= IUnknown_CloseDW(fControlsBar
, dwReserved
);
938 if (FAILED_UNEXPECTEDLY(hResult
))
940 ReleaseCComPtrExpectZero(fControlsBar
);
944 hResult
= IUnknown_CloseDW(fNavigationBar
, dwReserved
);
945 if (FAILED_UNEXPECTEDLY(hResult
))
947 ReleaseCComPtrExpectZero(fNavigationBar
);
951 hResult
= IUnknown_CloseDW(fLogoBar
, dwReserved
);
952 if (FAILED_UNEXPECTEDLY(hResult
))
954 ReleaseCComPtrExpectZero(fLogoBar
);
961 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
962 IUnknown
*punkToolbarSite
, BOOL fReserved
)
964 RECT neededBorderSpace
;
965 RECT availableBorderSpace
= *prcBorder
;
967 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
969 // RBSTR_CHANGERECT does not seem to set the proper size in the rect.
970 // Let's make sure we fetch the actual size properly.
971 ::GetWindowRect(fMainReBar
, &availableBorderSpace
);
972 neededBorderSpace
.left
= 0;
973 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
974 if (!pSettings
->fLocked
)
975 neededBorderSpace
.top
+= 3;
976 neededBorderSpace
.right
= 0;
977 neededBorderSpace
.bottom
= 0;
979 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
981 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
982 if (FAILED_UNEXPECTEDLY(hResult
))
985 hResult
= dockingWindowSite
->RequestBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
986 if (FAILED_UNEXPECTEDLY(hResult
))
989 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
990 if (FAILED_UNEXPECTEDLY(hResult
))
996 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
998 if (pClassID
== NULL
)
1000 *pClassID
= CLSID_InternetToolbar
;
1004 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
1009 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
1014 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
1019 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
1024 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
1026 CComPtr
<IShellMenu
> menuBar
;
1027 CComPtr
<IUnknown
> logoBar
;
1028 CComPtr
<IUnknown
> toolsBar
;
1029 CComPtr
<IUnknown
> navigationBar
;
1032 /* Create and attach the menubar to the rebar */
1033 hResult
= CreateMenuBar(&menuBar
);
1034 if (FAILED_UNEXPECTEDLY(hResult
))
1036 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1038 hResult
= IUnknown_GetWindow(menuBar
, &fMenuBandWindow
);
1039 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
1041 // FIXME: The ROS Rebar does not properly support fixed-size items such as the brandband,
1042 // and it will put them in their own row, sized to take up the whole row.
1044 /* Create and attach the brand/logo to the rebar */
1045 hResult
= CBrandBand_CreateInstance(IID_PPV_ARG(IUnknown
, &logoBar
));
1046 if (FAILED_UNEXPECTEDLY(hResult
))
1048 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
1049 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
1052 /* Create and attach the standard toolbar to the rebar */
1053 hResult
= CToolsBand_CreateInstance(IID_PPV_ARG(IUnknown
, &toolsBar
));
1054 if (FAILED_UNEXPECTEDLY(hResult
))
1056 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1057 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
1058 hResult
= IUnknown_GetWindow(fControlsBar
, &fToolbarWindow
);
1059 if (FAILED_UNEXPECTEDLY(hResult
))
1062 /* Create and attach the address/navigation toolbar to the rebar */
1063 hResult
= CAddressBand_CreateInstance(IID_PPV_ARG(IUnknown
, &navigationBar
));
1064 if (FAILED_UNEXPECTEDLY(hResult
))
1066 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1067 fNavigationBar
.Attach(navigationBar
.Detach());
1068 hResult
= IUnknown_GetWindow(fNavigationBar
, &fNavigationWindow
);
1073 HRESULT
CInternetToolbar::IsBandVisible(int BandID
)
1075 int index
= (int)SendMessage(fMainReBar
, RB_IDTOINDEX
, BandID
, 0);
1077 REBARBANDINFOW bandInfo
= {sizeof(REBARBANDINFOW
), RBBIM_STYLE
};
1078 SendMessage(fMainReBar
, RB_GETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
1080 return (bandInfo
.fStyle
& RBBS_HIDDEN
) ? S_FALSE
: S_OK
;
1083 HRESULT
CInternetToolbar::ToggleBandVisibility(int BandID
)
1085 int index
= (int)SendMessage(fMainReBar
, RB_IDTOINDEX
, BandID
, 0);
1087 REBARBANDINFOW bandInfo
= {sizeof(REBARBANDINFOW
), RBBIM_STYLE
};
1088 SendMessage(fMainReBar
, RB_GETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
1090 if (bandInfo
.fStyle
& RBBS_HIDDEN
)
1091 bandInfo
.fStyle
&= ~RBBS_HIDDEN
;
1093 bandInfo
.fStyle
|= RBBS_HIDDEN
;
1095 SendMessage(fMainReBar
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
1097 ReserveBorderSpace(0);
1101 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
1102 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1104 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1108 switch (prgCmds
->cmdID
)
1110 case ITID_TEXTLABELS
: // Text Labels state
1111 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1113 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
1114 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1115 if (IsBandVisible(ITBBID_TOOLSBAND
) == S_OK
)
1116 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1118 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
1119 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1120 if (IsBandVisible(ITBBID_ADDRESSBAND
) == S_OK
)
1121 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1123 case ITID_LINKSBANDSHOWN
: // links bar visibility
1126 case ITID_MENUBANDSHOWN
: // Menubar band visibility
1127 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1129 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1131 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
1134 case ITID_CUSTOMIZEENABLED
: // customize enabled
1135 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1137 case ITID_TOOLBARLOCKED
: // lock toolbars
1138 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1139 if (pSettings
->fLocked
)
1140 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1154 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1155 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1157 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1162 // what do I do here?
1164 case ITID_TEXTLABELS
:
1165 // toggle text labels
1167 case ITID_TOOLBARBANDSHOWN
:
1168 return ToggleBandVisibility(ITBBID_TOOLSBAND
);
1169 case ITID_ADDRESSBANDSHOWN
:
1170 return ToggleBandVisibility(ITBBID_ADDRESSBAND
);
1171 case ITID_LINKSBANDSHOWN
:
1172 // toggle links band visibility
1174 case ITID_CUSTOMIZEENABLED
:
1177 case ITID_TOOLBARLOCKED
:
1178 return LockUnlockToolbars(!pSettings
->fLocked
);
1184 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
1189 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1194 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
1195 LCID lcid
, DISPID
*rgDispId
)
1200 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1201 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1205 switch(dispIdMember
)
1207 case DISPID_BEFORENAVIGATE
:
1210 case DISPID_DOWNLOADCOMPLETE
:
1213 case DISPID_COMMANDSTATECHANGE
:
1214 if (pDispParams
->cArgs
!= 2)
1215 return E_INVALIDARG
;
1216 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
1217 return E_INVALIDARG
;
1218 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
1219 V_I4(&pDispParams
->rgvarg
[1]));
1220 case DISPID_DOWNLOADBEGIN
:
1223 case DISPID_NAVIGATECOMPLETE2
:
1226 case DISPID_DOCUMENTCOMPLETE
:
1233 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1237 TRACE("SetCommandTarget %p category %s param %d\n", theTarget
, wine_dbgstr_guid(category
), param14
);
1239 fCommandTarget
.Release();
1240 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1241 if (FAILED_UNEXPECTEDLY(hResult
))
1243 fCommandCategory
= *category
;
1247 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1252 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1257 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1258 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1262 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1263 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1270 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1275 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1277 if (theState
== NULL
)
1279 // map the command id
1280 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1284 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1286 // map the command id
1287 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1291 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1292 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1297 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1301 *paramC
= MAKELONG(24, 24);
1305 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1306 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1311 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1312 HIMAGELIST param14
, HIMAGELIST param18
)
1317 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1322 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1327 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1329 CComPtr
<IBrowserService
> browserService
;
1334 if (pUnkSite
== NULL
)
1336 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1337 ::DestroyWindow(fMainReBar
);
1343 // get window handle of owner
1344 hResult
= IUnknown_GetWindow(pUnkSite
, &ownerWindow
);
1345 if (FAILED_UNEXPECTEDLY(hResult
))
1347 if (ownerWindow
== NULL
)
1350 // Get settings from owner window
1351 ::SendMessageW(ownerWindow
, BWM_GETSETTINGSPTR
, 0, (LPARAM
)&pSettings
);
1353 // create dock container
1355 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1356 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1357 if (dockContainer
== NULL
)
1359 SubclassWindow(dockContainer
);
1361 // create rebar in dock container
1362 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1363 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1364 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1365 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1366 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1367 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1368 if (fMainReBar
== NULL
)
1371 // take advice to watch events
1372 hResult
= IUnknown_QueryService(pUnkSite
, SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1373 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1378 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1380 if (ppvSite
== NULL
)
1382 if (fSite
.p
!= NULL
)
1383 return fSite
->QueryInterface(riid
, ppvSite
);
1388 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1392 if (IsEqualIID(guidService
, IID_IBandSite
))
1393 return this->QueryInterface(riid
, ppvObject
);
1394 if (IsEqualIID(guidService
, SID_IBandProxy
))
1396 if (fBandProxy
.p
== NULL
)
1398 hResult
= CreateAndInitBandProxy();
1399 if (FAILED_UNEXPECTEDLY(hResult
))
1402 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1404 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1407 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1408 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1414 hResult
= IUnknown_RelayWinEvent(fMenuBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1415 if (hResult
!= S_FALSE
)
1421 hResult
= IUnknown_RelayWinEvent(fNavigationBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1422 if (hResult
!= S_FALSE
)
1428 hResult
= IUnknown_RelayWinEvent(fLogoBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1429 if (hResult
!= S_FALSE
)
1436 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1442 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1448 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1454 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1455 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1459 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1460 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1461 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1462 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1467 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1473 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1479 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1485 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1491 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1497 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1499 CComPtr
<IWebBrowser
> webBrowser
;
1502 hResult
= IUnknown_QueryService(fSite
, SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1503 if (FAILED_UNEXPECTEDLY(hResult
))
1505 hResult
= webBrowser
->GoBack();
1509 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1511 CComPtr
<IWebBrowser
> webBrowser
;
1514 hResult
= IUnknown_QueryService(fSite
, SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1515 if (FAILED_UNEXPECTEDLY(hResult
))
1517 hResult
= webBrowser
->GoForward();
1521 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1523 IUnknown_Exec(fSite
, CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1527 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1529 IUnknown_Exec(fSite
, CGID_Explorer
, 0x1c, 1, NULL
, NULL
);
1533 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1535 IUnknown_Exec(fSite
, CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1539 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1543 if (fCommandTarget
.p
!= NULL
)
1545 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1546 if (FAILED(hResult
))
1548 ::SendMessageW(::GetParent(m_hWnd
), WM_COMMAND
, wID
, 0);
1554 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1556 CComPtr
<IBrowserService
> browserService
;
1557 CComPtr
<IOleCommandTarget
> commandTarget
;
1558 CComPtr
<ITravelLog
> travelLog
;
1559 NMTOOLBARW
*notifyInfo
;
1567 wchar_t templateString
[200];
1569 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1570 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1572 // not from the toolbar, keep looking for a message handler
1576 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1577 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1578 switch (notifyInfo
->iItem
)
1581 newMenu
= CreatePopupMenu();
1582 hResult
= IUnknown_QueryService(fSite
, SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1583 hResult
= browserService
->GetTravelLog(&travelLog
);
1584 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1585 commandInfo
.cmdID
= 0x1d;
1586 hResult
= IUnknown_QueryStatus(browserService
, CGID_Explorer
, 1, &commandInfo
, NULL
);
1587 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1588 travelLog
->CountEntries(browserService
) > 1)
1590 AppendMenuW(newMenu
, MF_SEPARATOR
, -1, L
"");
1592 if (LoadStringW(_AtlBaseModule
.GetResourceInstance(),
1593 IDS_HISTORYTEXT
, templateString
, sizeof(templateString
) / sizeof(wchar_t)) == 0)
1594 StringCbCopyW(templateString
, sizeof(templateString
), L
"&History\tCtrl+H");
1596 AppendMenuW(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, templateString
);
1598 params
.cbSize
= sizeof(params
);
1599 params
.rcExclude
= bounds
;
1600 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1601 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1602 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1604 V_VT(&parmIn
) = VT_I4
;
1606 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1608 else if (selectedItem
!= 0)
1609 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1610 DestroyMenu(newMenu
);
1612 case IDM_GOTO_FORWARD
:
1613 newMenu
= CreatePopupMenu();
1614 hResult
= IUnknown_QueryService(fSite
, SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1615 hResult
= browserService
->GetTravelLog(&travelLog
);
1616 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1617 commandInfo
.cmdID
= 0x1d;
1618 hResult
= IUnknown_QueryStatus(browserService
, CGID_Explorer
, 1, &commandInfo
, NULL
);
1619 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1620 travelLog
->CountEntries(browserService
) > 1)
1622 AppendMenuW(newMenu
, MF_SEPARATOR
, -1, L
"");
1624 if (LoadStringW(_AtlBaseModule
.GetResourceInstance(),
1625 IDS_HISTORYTEXT
, templateString
, sizeof(templateString
) / sizeof(wchar_t)) == 0)
1626 StringCbCopyW(templateString
, sizeof(templateString
), L
"&History\tCtrl+H");
1628 AppendMenuW(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, templateString
);
1630 params
.cbSize
= sizeof(params
);
1631 params
.rcExclude
= bounds
;
1632 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1633 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1634 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1636 V_VT(&parmIn
) = VT_I4
;
1638 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1640 else if (selectedItem
!= 0)
1641 hResult
= travelLog
->Travel(browserService
, selectedItem
);
1642 DestroyMenu(newMenu
);
1644 case gViewsCommandID
:
1646 CComVariant outValue
;
1649 V_VT(&inValue
) = VT_INT_PTR
;
1650 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1652 if (fCommandTarget
.p
!= NULL
)
1653 hResult
= fCommandTarget
->Exec(&fCommandCategory
, FCIDM_SHVIEW_AUTOARRANGE
, 1, &inValue
, &outValue
);
1654 // pvaOut is VT_I4 with value 0x403
1657 return TBDDRET_DEFAULT
;
1660 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1665 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1670 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1672 HMENU contextMenuBar
;
1674 POINT clickLocation
;
1676 RBHITTESTINFO hitTestInfo
;
1677 REBARBANDINFOW rebarBandInfo
;
1680 clickLocation
.x
= LOWORD(lParam
);
1681 clickLocation
.y
= HIWORD(lParam
);
1682 hitTestInfo
.pt
= clickLocation
;
1683 ScreenToClient(&hitTestInfo
.pt
);
1684 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1685 if (hitTestInfo
.iBand
== -1)
1689 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1690 rebarBandInfo
.fMask
= RBBIM_ID
;
1691 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1692 bandID
= rebarBandInfo
.wID
;
1693 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1694 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1697 case ITBBID_MENUBAND
: // menu band
1698 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1699 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1700 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1702 case ITBBID_BRANDBAND
: // brand band
1703 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1704 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1705 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1707 case ITBBID_TOOLSBAND
: // tools band
1708 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1709 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1711 case ITBBID_ADDRESSBAND
: // navigation band
1712 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1713 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1719 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_LINKSBAR
, FALSE
);
1721 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, IsBandVisible(ITBBID_TOOLSBAND
) == S_OK
);
1722 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_ADDRESSBAR
, IsBandVisible(ITBBID_ADDRESSBAND
) == S_OK
);
1723 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_LINKSBAR
, FALSE
);
1724 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, FALSE
);
1725 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, pSettings
->fLocked
);
1726 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_GOBUTTON
, pSettings
->fShowGoButton
);
1728 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1729 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1730 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1733 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1734 ToggleBandVisibility(ITBBID_TOOLSBAND
);
1736 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1737 ToggleBandVisibility(ITBBID_ADDRESSBAND
);
1739 case IDM_TOOLBARS_LINKSBAR
: // links
1741 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1742 LockUnlockToolbars(!pSettings
->fLocked
);
1744 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1745 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1747 case IDM_TOOLBARS_GOBUTTON
:
1748 SendMessage(fNavigationWindow
, WM_COMMAND
, IDM_TOOLBARS_GOBUTTON
, 0);
1752 DestroyMenu(contextMenuBar
);
1756 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1758 if (wParam
!= SIZE_MINIMIZED
)
1760 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1761 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1766 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1768 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1773 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1777 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1779 CComPtr
<IBrowserService
> browserService
;
1780 CComPtr
<ITravelLog
> travelLog
;
1781 TOOLTIPTEXTW
*pTTTW
;
1784 wchar_t tempString
[300];
1786 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1787 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1788 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1790 nID
= (UINT
)pNMHDR
->idFrom
;
1794 if (nID
== (UINT
)IDM_GOTO_BACK
|| nID
== (UINT
)IDM_GOTO_FORWARD
)
1796 // TODO: Should this call QueryService?
1797 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1798 hResult
= browserService
->GetTravelLog(&travelLog
);
1799 hResult
= travelLog
->GetToolTipText(browserService
,
1800 (nID
== (UINT
)IDM_GOTO_BACK
) ? TLOG_BACK
: TLOG_FORE
,
1801 0, tempString
, 299);
1802 if (FAILED_UNEXPECTEDLY(hResult
))
1810 wcsncpy (pTTTW
->szText
, tempString
, sizeof(pTTTW
->szText
) / sizeof(wchar_t));
1811 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1812 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1818 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1823 hResult
= OnWinEvent((HWND
) lParam
, uMsg
, wParam
, lParam
, &theResult
);
1825 bHandled
= hResult
== S_OK
;
1827 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1829 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1831 NMHDR
*notifyHeader
;
1835 notifyHeader
= reinterpret_cast<NMHDR
*>(lParam
);
1837 hResult
= OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1839 bHandled
= hResult
== S_OK
;
1841 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1844 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1847 if (pSettings
->fLocked
)
1850 if (wParam
& MK_CONTROL
)
1855 DWORD msgp
= GetMessagePos();
1857 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1858 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1863 fStartHeight
= rc
.bottom
- rc
.top
;
1871 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1877 DWORD msgp
= GetMessagePos();
1880 pt
.x
= GET_X_LPARAM(msgp
);
1881 pt
.y
= GET_Y_LPARAM(msgp
);
1883 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
1889 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1895 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
1904 LRESULT
CInternetToolbar::OnWinIniChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1909 hr
= IUnknown_GetWindow(fMenuBar
, &hwndMenu
);
1910 if (FAILED_UNEXPECTEDLY(hr
))
1913 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1914 hr
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1915 if (FAILED_UNEXPECTEDLY(hr
))
1919 hr
= menuWinEventHandler
->OnWinEvent(hwndMenu
, uMsg
, wParam
, lParam
, &lres
);
1920 if (FAILED_UNEXPECTEDLY(hr
))
1926 LRESULT
CInternetToolbar::OnSettingsChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
& bHandled
)
1928 /* Refresh toolbar locked state */
1929 RefreshLockedToolbarState();