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
28 /* FIXME, I can't include windowsx because it conflicts with some #defines */
29 #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
30 #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
32 #define USE_CUSTOM_MENUBAND 1
33 HMODULE g_hRShell
= NULL
;
36 // TODO: declare these GUIDs and interfaces in the right place (whatever that may be)
38 IID IID_IAugmentedShellFolder
= { 0x91EA3F8C, 0xC99B, 0x11D0, { 0x98, 0x15, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0x72 } };
39 CLSID CLSID_MergedFolder
= { 0x26FDC864, 0xBE88, 0x46E7, { 0x92, 0x35, 0x03, 0x2D, 0x8E, 0xA5, 0x16, 0x2E } };
41 interface IAugmentedShellFolder
: public IShellFolder
43 virtual HRESULT STDMETHODCALLTYPE
AddNameSpace(LPGUID
, IShellFolder
*, LPCITEMIDLIST
, ULONG
) = 0;
44 virtual HRESULT STDMETHODCALLTYPE
GetNameSpaceID(LPCITEMIDLIST
, LPGUID
) = 0;
45 virtual HRESULT STDMETHODCALLTYPE
QueryNameSpace(ULONG
, LPGUID
, IShellFolder
**) = 0;
46 virtual HRESULT STDMETHODCALLTYPE
EnumNameSpace(ULONG
, PULONG
) = 0;
51 // navigation controls and menubar just send a message to parent window
54 ****Implement BandProxy methods
55 ****Add QueryStatus handler for built-in bands
56 ****Enable/Disable up, search, and folders commands appropriately
57 **Why are explorer toolbar separators a nonstandard width?
58 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
59 **Chevron menu on menuband doesn't work
60 **Fix CInternetToolbar::QueryBand to be generic
62 ****Fix context menu to strip divider when menu shown for menu band
63 ****Fix context menu to have items checked appropriately
64 ****Implement -1 command id update
65 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
66 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
67 Implement show/hide of bands
68 Why is the background color of my toolbars different from explorer?
69 Internet Toolbar command handler should get the target for the command and call Exec on the target.
70 For commands built in to the Internet Toolbar, its Exec handles the command
71 When window width is changed, brand band flashes badly
72 Add all bands with correct ids (system bands now add with correct ids)
74 Implement remaining IExplorerToolbar methods
75 Fix toolbar buttons to enable/disable correctly
76 After toolbar is customized, it may be necessary to patch the widths of separators
78 Check sizes and spacing of toolbars against Explorer
79 Implement resizing of the dock bar
80 Add missing icons for toolbar items
81 Draw History item in forward/back dropdown menus with icon
82 Fix toolbar customize dialog to not include separators as possible selections
83 Implement save/restore of toolbar state
84 Refactor drop down menu code to use a common function since code is so similar
87 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
88 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
89 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
90 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
91 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
93 typedef HRESULT(WINAPI
* PMENUBAND_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
94 typedef HRESULT(WINAPI
* PMERGEDFOLDER_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
96 HMODULE hRShell
= NULL
;
97 PMERGEDFOLDER_CONSTRUCTOR pCMergedFolder_Constructor
= NULL
;
98 PMENUBAND_CONSTRUCTOR pCMenuBand_Constructor
= NULL
;
100 HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
)
102 CComPtr
<IInputObject
> pio
;
104 hr
= punk
->QueryInterface(IID_PPV_ARG(IInputObject
, &pio
));
105 if (FAILED_UNEXPECTEDLY(hr
))
107 return pio
->HasFocusIO();
110 HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
)
112 CComPtr
<IInputObject
> pio
;
116 hr
= punk
->QueryInterface(IID_PPV_ARG(IInputObject
, &pio
));
117 if (FAILED_UNEXPECTEDLY(hr
))
119 return pio
->TranslateAcceleratorIO(pmsg
);
122 HRESULT
IUnknown_RelayWinEvent(IUnknown
* punk
, HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
124 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
125 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
126 if (FAILED_UNEXPECTEDLY(hResult
))
128 hResult
= menuWinEventHandler
->IsWindowOwner(hWnd
);
129 if (FAILED_UNEXPECTEDLY(hResult
))
132 return menuWinEventHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
136 HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
)
138 CComPtr
<IDockingWindow
> dockingWindow
;
139 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
140 if (FAILED_UNEXPECTEDLY(hResult
))
142 hResult
= dockingWindow
->ShowDW(fShow
);
143 if (FAILED_UNEXPECTEDLY(hResult
))
148 HRESULT
IUnknown_CloseDW(IUnknown
* punk
, DWORD dwReserved
)
150 CComPtr
<IDockingWindow
> dockingWindow
;
151 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
152 if (FAILED_UNEXPECTEDLY(hResult
))
154 hResult
= dockingWindow
->CloseDW(dwReserved
);
155 if (FAILED_UNEXPECTEDLY(hResult
))
160 class CInternetToolbar
;
163 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
164 public IDockingWindowSite
,
165 public IInputObjectSite
,
166 public IOleCommandTarget
,
167 public IServiceProvider
173 ITF_NEWBANDALWAYS
= 4,
174 ITF_GRIPPERALWAYS
= 8,
178 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
179 CInternetToolbar
*fToolbar
; // our browser
187 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
188 DESKBANDINFO fDeskBandInfo
;
192 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
193 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
196 // *** IOleWindow methods ***
197 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
198 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
200 // *** IDockingWindow methods ***
201 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
202 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
203 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
205 // *** IInputObjectSite specific methods ***
206 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
208 // *** IOleCommandTarget specific methods ***
209 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
210 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
211 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
212 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
214 // *** IServiceProvider methods ***
215 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
217 BEGIN_COM_MAP(CDockSite
)
218 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
219 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
220 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
221 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
222 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
226 CDockSite::CDockSite()
233 fInitialized
= false;
234 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
237 CDockSite::~CDockSite()
241 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
243 TCHAR textBuffer
[40];
244 REBARBANDINFOW bandInfo
;
247 fContainedBand
= containedBand
;
252 hResult
= IUnknown_SetSite(containedBand
, static_cast<IOleWindow
*>(this));
253 if (FAILED_UNEXPECTEDLY(hResult
))
255 hResult
= IUnknown_GetWindow(containedBand
, &fChildWindow
);
256 if (FAILED_UNEXPECTEDLY(hResult
))
259 memset(&bandInfo
, 0, sizeof(bandInfo
));
260 bandInfo
.cbSize
= sizeof(bandInfo
);
261 bandInfo
.lpText
= textBuffer
;
262 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
263 hResult
= GetRBBandInfo(bandInfo
);
265 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
266 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
271 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
273 CComPtr
<IDeskBand
> deskBand
;
276 hResult
= fContainedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
277 if (FAILED_UNEXPECTEDLY(hResult
))
280 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
281 DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
282 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
283 // result of call is ignored
285 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
|
286 RBBIM_TEXT
| RBBIM_STYLE
;
288 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
289 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
290 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
291 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
292 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
293 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
294 bandInfo
.fStyle
|= RBBS_BREAK
;
295 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
296 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
297 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
)
298 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
299 if (fFlags
& ITF_NOTITLE
)
300 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
301 if (fFlags
& ITF_GRIPPERALWAYS
&& !fToolbar
->fLocked
)
302 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
303 if (fFlags
& ITF_FIXEDSIZE
)
304 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
306 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
308 bandInfo
.fMask
|= RBBIM_COLORS
;
309 bandInfo
.clrFore
= CLR_DEFAULT
;
310 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
312 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
313 bandInfo
.hwndChild
= fChildWindow
;
314 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
315 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
316 bandInfo
.wID
= fBandID
;
317 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
318 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
319 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
320 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
321 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
325 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
329 *lphwnd
= fRebarWindow
;
333 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
338 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
343 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
348 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
353 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
358 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
359 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
364 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
365 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
367 TCHAR textBuffer
[40];
368 REBARBANDINFOW bandInfo
;
372 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
376 case DBID_BANDINFOCHANGED
:
377 if (fInitialized
== false)
379 if (V_VT(pvaIn
) != VT_I4
)
381 if (V_I4(pvaIn
) != fBandID
)
383 // deskband information changed
384 // call GetBandInfo and refresh information in rebar
385 memset(&bandInfo
, 0, sizeof(bandInfo
));
386 bandInfo
.cbSize
= sizeof(bandInfo
);
387 bandInfo
.lpText
= textBuffer
;
388 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
389 hResult
= GetRBBandInfo(bandInfo
);
390 if (FAILED_UNEXPECTEDLY(hResult
))
392 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
393 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
400 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
402 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
403 return this->QueryInterface(riid
, ppvObject
);
405 return fToolbar
->QueryService(guidService
, riid
, ppvObject
);
408 CMenuCallback::CMenuCallback()
412 CMenuCallback::~CMenuCallback()
416 static HRESULT
BindToDesktop(LPCITEMIDLIST pidl
, IShellFolder
** ppsfResult
)
419 CComPtr
<IShellFolder
> psfDesktop
;
423 hr
= SHGetDesktopFolder(&psfDesktop
);
427 hr
= psfDesktop
->BindToObject(pidl
, NULL
, IID_PPV_ARG(IShellFolder
, ppsfResult
));
432 static HRESULT
GetFavoritesFolder(IShellFolder
** ppsfFavorites
, LPITEMIDLIST
* ppidl
)
435 LPITEMIDLIST pidlUserFavorites
;
436 LPITEMIDLIST pidlCommonFavorites
;
437 CComPtr
<IShellFolder
> psfUserFavorites
;
438 CComPtr
<IShellFolder
> psfCommonFavorites
;
439 CComPtr
<IAugmentedShellFolder
> pasf
;
442 *ppsfFavorites
= NULL
;
447 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &pidlUserFavorites
);
451 if (FAILED(SHGetSpecialFolderLocation(NULL
, CSIDL_COMMON_FAVORITES
, &pidlCommonFavorites
)))
453 hr
= BindToDesktop(pidlUserFavorites
, ppsfFavorites
);
454 *ppidl
= pidlUserFavorites
;
458 hr
= BindToDesktop(pidlUserFavorites
, &psfUserFavorites
);
459 if (FAILED_UNEXPECTEDLY(hr
))
462 hr
= BindToDesktop(pidlCommonFavorites
, &psfCommonFavorites
);
463 if (FAILED_UNEXPECTEDLY(hr
))
469 hRShell
= GetModuleHandle(L
"rshell.dll");
471 hRShell
= LoadLibrary(L
"rshell.dll");
474 if (!pCMergedFolder_Constructor
)
475 pCMergedFolder_Constructor
= (PMERGEDFOLDER_CONSTRUCTOR
) GetProcAddress(hRShell
, "CMergedFolder_Constructor");
477 if (pCMergedFolder_Constructor
)
479 hr
= pCMergedFolder_Constructor(IID_PPV_ARG(IAugmentedShellFolder
, &pasf
));
486 hr
= CoCreateInstance(CLSID_MergedFolder
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IAugmentedShellFolder
, &pasf
));
488 if (FAILED_UNEXPECTEDLY(hr
))
490 *ppsfFavorites
= psfUserFavorites
.Detach();
491 *ppidl
= pidlUserFavorites
;
492 ILFree(pidlCommonFavorites
);
496 hr
= pasf
->AddNameSpace(NULL
, psfUserFavorites
, pidlUserFavorites
, 0xFF00);
497 if (FAILED_UNEXPECTEDLY(hr
))
500 hr
= pasf
->AddNameSpace(NULL
, psfCommonFavorites
, pidlCommonFavorites
, 0);
501 if (FAILED_UNEXPECTEDLY(hr
))
504 hr
= pasf
->QueryInterface(IID_PPV_ARG(IShellFolder
, ppsfFavorites
));
507 // TODO: obtain the folder's PIDL
509 ILFree(pidlCommonFavorites
);
510 ILFree(pidlUserFavorites
);
515 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
517 CComPtr
<IShellMenu
> parentMenu
;
518 CComPtr
<IShellMenu
> newMenu
;
519 CComPtr
<IShellFolder
> favoritesFolder
;
520 LPITEMIDLIST favoritesPIDL
;
523 HMENU favoritesHMenu
;
527 static const TCHAR szFavoritesKey
[] =
528 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
530 if (!IsEqualIID(riid
, IID_IShellMenu
))
532 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
535 if (fFavoritesMenu
.p
== NULL
)
537 // create favorites menu
538 hResult
= psmd
->punk
->QueryInterface(IID_PPV_ARG(IShellMenu
, &parentMenu
));
539 if (FAILED_UNEXPECTEDLY(hResult
))
541 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
542 if (FAILED_UNEXPECTEDLY(hResult
))
544 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
545 if (favoritesHMenu
== NULL
)
547 #if USE_CUSTOM_MENUBAND
550 hRShell
= GetModuleHandle(L
"rshell.dll");
552 hRShell
= LoadLibrary(L
"rshell.dll");
555 if (!pCMenuBand_Constructor
)
556 pCMenuBand_Constructor
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hRShell
, "CMenuBand_Constructor");
558 if (pCMenuBand_Constructor
)
560 hResult
= pCMenuBand_Constructor(IID_PPV_ARG(IShellMenu
, &newMenu
));
564 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
565 IID_PPV_ARG(IShellMenu
, &newMenu
));
568 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
569 IID_PPV_ARG(IShellMenu
, &newMenu
));
571 if (FAILED_UNEXPECTEDLY(hResult
))
573 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
574 if (FAILED_UNEXPECTEDLY(hResult
))
576 hResult
= newMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
577 if (FAILED_UNEXPECTEDLY(hResult
))
580 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
581 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
583 hResult
= GetFavoritesFolder(&favoritesFolder
, &favoritesPIDL
);
584 if (FAILED_UNEXPECTEDLY(hResult
))
587 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| SMINIT_CACHED
| SMINV_ID
);
589 ILFree(favoritesPIDL
);
594 fFavoritesMenu
= newMenu
;
597 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
600 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
612 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
613 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
615 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
617 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
621 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
624 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
631 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
632 case SMC_GETSFOBJECT
:
635 SHInvokeDefaultCommand(psmd
->hwnd
, psmd
->psf
, psmd
->pidlItem
);
637 case SMC_SFSELECTITEM
:
650 case SMC_DEFAULTICON
:
654 case SMC_CHEVRONEXPAND
:
656 case SMC_DISPLAYCHEVRONTIP
:
658 case SMC_SETSFOBJECT
:
660 case SMC_SHCHANGENOTIFY
:
662 case SMC_CHEVRONGETTIP
:
664 case SMC_SFDDRESTRICTED
:
676 CInternetToolbar::CInternetToolbar()
680 fMenuBandWindow
= NULL
;
681 fNavigationWindow
= NULL
;
682 fMenuCallback
= new CComObject
<CMenuCallback
>();
683 fToolbarWindow
= NULL
;
686 fMenuCallback
->AddRef();
689 CInternetToolbar::~CInternetToolbar()
693 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
695 CComPtr
<CDockSite
> newSite
;
697 newSite
= new CComObject
<CDockSite
>;
698 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
701 HRESULT
CInternetToolbar::ReserveBorderSpace(LONG maxHeight
)
703 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
704 RECT availableBorderSpace
;
706 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
707 if (FAILED_UNEXPECTEDLY(hResult
))
709 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
710 if (FAILED_UNEXPECTEDLY(hResult
))
713 if (availableBorderSpace
.top
> maxHeight
)
715 availableBorderSpace
.top
= maxHeight
;
718 return ResizeBorderDW(&availableBorderSpace
, fSite
, FALSE
);
721 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**pMenuBar
)
723 CComPtr
<IShellMenu
> menubar
;
724 CComPtr
<IShellMenuCallback
> callback
;
735 #if USE_CUSTOM_MENUBAND
736 if (!g_hRShell
) g_hRShell
= GetModuleHandleW(L
"rshell.dll");
738 if (!g_hRShell
) g_hRShell
= LoadLibraryW(L
"rshell.dll");
742 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(g_hRShell
, "CMenuBand_Constructor");
745 hResult
= func(IID_PPV_ARG(IShellMenu
, &menubar
));
750 if (FAILED_UNEXPECTEDLY(hResult
))
752 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
753 IID_PPV_ARG(IShellMenu
, &menubar
));
754 if (FAILED_UNEXPECTEDLY(hResult
))
758 hResult
= fMenuCallback
->QueryInterface(IID_PPV_ARG(IShellMenuCallback
, &callback
));
759 if (FAILED_UNEXPECTEDLY(hResult
))
762 hResult
= menubar
->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
763 if (FAILED_UNEXPECTEDLY(hResult
))
768 hResult
= IUnknown_Exec(fSite
, CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
769 if (FAILED_UNEXPECTEDLY(hResult
))
772 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
775 hResult
= IUnknown_GetWindow(fSite
, &ownerWindow
);
776 if (FAILED_UNEXPECTEDLY(hResult
))
779 hResult
= menubar
->SetMenu((HMENU
) V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
780 if (FAILED_UNEXPECTEDLY(hResult
))
784 hResult
= IUnknown_Exec(menubar
, CGID_MenuBand
, 3, 1, NULL
, NULL
);
785 if (FAILED_UNEXPECTEDLY(hResult
))
788 *pMenuBar
= menubar
.Detach();
793 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
796 return ::CreateBrandBand(IID_PPV_ARG(IUnknown
, logoBar
));
798 return CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, logoBar
));
802 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
804 return ::CreateToolsBar(IID_PPV_ARG(IUnknown
, toolsBar
));
807 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
810 return ::CreateAddressBand(IID_PPV_ARG(IUnknown
, toolsBar
));
812 return CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, toolsBar
));
816 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
818 REBARBANDINFOW rebarBandInfo
;
823 if (locked
!= fLocked
)
826 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
827 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
828 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
829 for (INT x
= 0; x
< bandCount
; x
++)
831 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
832 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
833 if (dockSite
!= NULL
)
835 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
836 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
837 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
838 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
839 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
840 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
843 hResult
= ReserveBorderSpace();
845 // TODO: refresh view menu?
850 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
858 // loop through buttons
859 //for buttons in CLSID_CommonButtons
860 // if up, QueryStatus for up state and update it
862 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
866 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_FORWARD
, newValue
? TBSTATE_ENABLED
: 0);
870 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_BACK
, newValue
? TBSTATE_ENABLED
: 0);
876 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
878 CComPtr
<IServiceProvider
> serviceProvider
;
881 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
882 if (FAILED_UNEXPECTEDLY(hResult
))
884 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
885 if (FAILED_UNEXPECTEDLY(hResult
))
887 hResult
= CreateBandProxy(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
888 if (FAILED_UNEXPECTEDLY(hResult
))
890 hResult
= fBandProxy
->SetSite(fSite
);
891 if (FAILED_UNEXPECTEDLY(hResult
))
897 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
902 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
904 HRESULT hr
= S_FALSE
;
907 hr
= IUnknown_HasFocusIO(fMenuBar
);
912 hr
= IUnknown_HasFocusIO(fControlsBar
);
917 hr
= IUnknown_HasFocusIO(fNavigationBar
);
924 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
926 HRESULT hr
= S_FALSE
;
929 hr
= IUnknown_TranslateAcceleratorIO(fMenuBar
, lpMsg
);
934 hr
= IUnknown_TranslateAcceleratorIO(fControlsBar
, lpMsg
);
939 hr
= IUnknown_TranslateAcceleratorIO(fNavigationBar
, lpMsg
);
946 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
954 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
959 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
966 hResult
= ReserveBorderSpace();
967 if (FAILED_UNEXPECTEDLY(hResult
))
973 hResult
= IUnknown_ShowDW(fMenuBar
, fShow
);
974 if (FAILED_UNEXPECTEDLY(hResult
))
980 hResult
= IUnknown_ShowDW(fControlsBar
, fShow
);
981 if (FAILED_UNEXPECTEDLY(hResult
))
986 hResult
= IUnknown_ShowDW(fNavigationBar
, fShow
);
987 if (FAILED_UNEXPECTEDLY(hResult
))
992 hResult
= IUnknown_ShowDW(fLogoBar
, fShow
);
993 if (FAILED_UNEXPECTEDLY(hResult
))
999 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
1005 hResult
= IUnknown_CloseDW(fMenuBar
, dwReserved
);
1006 if (FAILED_UNEXPECTEDLY(hResult
))
1008 ReleaseCComPtrExpectZero(fMenuBar
);
1012 hResult
= IUnknown_CloseDW(fControlsBar
, dwReserved
);
1013 if (FAILED_UNEXPECTEDLY(hResult
))
1015 ReleaseCComPtrExpectZero(fControlsBar
);
1019 hResult
= IUnknown_CloseDW(fNavigationBar
, dwReserved
);
1020 if (FAILED_UNEXPECTEDLY(hResult
))
1022 ReleaseCComPtrExpectZero(fNavigationBar
);
1026 hResult
= IUnknown_CloseDW(fLogoBar
, dwReserved
);
1027 if (FAILED_UNEXPECTEDLY(hResult
))
1029 ReleaseCComPtrExpectZero(fLogoBar
);
1034 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
1035 IUnknown
*punkToolbarSite
, BOOL fReserved
)
1037 RECT neededBorderSpace
;
1038 RECT availableBorderSpace
= *prcBorder
;
1040 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
1042 // RBSTR_CHANGERECT does not seem to set the proper size in the rect.
1043 // Let's make sure we fetch the actual size properly.
1044 GetWindowRect(fMainReBar
, &availableBorderSpace
);
1045 neededBorderSpace
.left
= 0;
1046 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
1048 neededBorderSpace
.top
+= 3;
1049 neededBorderSpace
.right
= 0;
1050 neededBorderSpace
.bottom
= 0;
1052 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
1054 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
1055 if (FAILED_UNEXPECTEDLY(hResult
))
1058 hResult
= dockingWindowSite
->RequestBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
1059 if (FAILED_UNEXPECTEDLY(hResult
))
1062 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
1063 if (FAILED_UNEXPECTEDLY(hResult
))
1069 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
1071 if (pClassID
== NULL
)
1073 *pClassID
= CLSID_InternetToolbar
;
1077 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
1082 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
1087 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
1092 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
1097 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
1099 CComPtr
<IShellMenu
> menuBar
;
1100 CComPtr
<IUnknown
> logoBar
;
1101 CComPtr
<IUnknown
> toolsBar
;
1102 CComPtr
<IUnknown
> navigationBar
;
1105 /* Create and attach the menubar to the rebar */
1106 hResult
= CreateMenuBar(&menuBar
);
1107 if (FAILED_UNEXPECTEDLY(hResult
))
1109 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1111 hResult
= IUnknown_GetWindow(menuBar
, &fMenuBandWindow
);
1112 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
1114 // FIXME: The ros Rebar does not properly support fixed-size items such as the brandband,
1115 // and it will put them in their own row, sized to take up the whole row.
1117 /* Create and attach the brand/logo to the rebar */
1118 hResult
= CreateBrandBand(&logoBar
);
1119 if (FAILED_UNEXPECTEDLY(hResult
))
1121 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
1122 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
1125 /* Create and attach the standard toolbar to the rebar */
1126 hResult
= CreateToolsBar(&toolsBar
);
1127 if (FAILED_UNEXPECTEDLY(hResult
))
1129 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1130 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
1131 hResult
= IUnknown_GetWindow(fControlsBar
, &fToolbarWindow
);
1132 if (FAILED_UNEXPECTEDLY(hResult
))
1135 /* Create and attach the address/navigation toolbar to the rebar */
1136 hResult
= CreateAddressBand(&navigationBar
);
1137 if (FAILED_UNEXPECTEDLY(hResult
))
1139 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1140 fNavigationBar
.Attach(navigationBar
.Detach());
1141 hResult
= IUnknown_GetWindow(fNavigationBar
, &fNavigationWindow
);
1146 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
1147 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1149 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1153 switch (prgCmds
->cmdID
)
1155 case ITID_TEXTLABELS
: // Text Labels state
1156 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1158 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
1159 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1161 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1163 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
1164 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1166 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1168 case ITID_LINKSBANDSHOWN
: // links bar visibility
1171 case ITID_MENUBANDSHOWN
: // Menubar band visibility
1172 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1174 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1176 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
1179 case ITID_CUSTOMIZEENABLED
: // customize enabled
1180 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1182 case ITID_TOOLBARLOCKED
: // lock toolbars
1183 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1185 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1199 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1200 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1202 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1207 // what do I do here?
1209 case ITID_TEXTLABELS
:
1210 // toggle text labels
1212 case ITID_TOOLBARBANDSHOWN
:
1213 // toggle toolbar band visibility
1215 case ITID_ADDRESSBANDSHOWN
:
1216 // toggle address band visibility
1218 case ITID_LINKSBANDSHOWN
:
1219 // toggle links band visibility
1221 case ITID_CUSTOMIZEENABLED
:
1224 case ITID_TOOLBARLOCKED
:
1225 return LockUnlockToolbars(!fLocked
);
1231 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
1236 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1241 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
1242 LCID lcid
, DISPID
*rgDispId
)
1247 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1248 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1252 switch(dispIdMember
)
1254 case DISPID_BEFORENAVIGATE
:
1257 case DISPID_DOWNLOADCOMPLETE
:
1260 case DISPID_COMMANDSTATECHANGE
:
1261 if (pDispParams
->cArgs
!= 2)
1262 return E_INVALIDARG
;
1263 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
1264 return E_INVALIDARG
;
1265 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
1266 V_I4(&pDispParams
->rgvarg
[1]));
1267 case DISPID_DOWNLOADBEGIN
:
1270 case DISPID_NAVIGATECOMPLETE2
:
1273 case DISPID_DOCUMENTCOMPLETE
:
1280 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1284 TRACE("SetCommandTarget %p category %s param %d\n", theTarget
, wine_dbgstr_guid(category
), param14
);
1286 fCommandTarget
.Release();
1287 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1288 if (FAILED_UNEXPECTEDLY(hResult
))
1290 fCommandCategory
= *category
;
1294 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1299 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1304 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1305 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1309 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1310 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1317 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1322 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1324 if (theState
== NULL
)
1326 // map the command id
1327 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1331 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1333 // map the command id
1334 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1338 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1339 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1344 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1348 *paramC
= MAKELONG(24, 24);
1352 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1353 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1358 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1359 HIMAGELIST param14
, HIMAGELIST param18
)
1364 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1369 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1374 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1376 CComPtr
<IBrowserService
> browserService
;
1377 CComPtr
<IServiceProvider
> serviceProvider
;
1378 CComPtr
<IOleWindow
> oleWindow
;
1383 if (pUnkSite
== NULL
)
1385 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1386 ::DestroyWindow(fMainReBar
);
1392 // get window handle of owner
1393 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1394 if (FAILED_UNEXPECTEDLY(hResult
))
1396 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1397 if (FAILED_UNEXPECTEDLY(hResult
))
1399 if (ownerWindow
== NULL
)
1402 // create dock container
1404 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1405 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1406 if (dockContainer
== NULL
)
1408 SubclassWindow(dockContainer
);
1410 // create rebar in dock container
1411 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1412 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1413 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1414 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1415 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1416 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1417 if (fMainReBar
== NULL
)
1420 // take advice to watch events
1421 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1422 hResult
= serviceProvider
->QueryService(
1423 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1424 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1429 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1431 if (ppvSite
== NULL
)
1433 if (fSite
.p
!= NULL
)
1434 return fSite
->QueryInterface(riid
, ppvSite
);
1439 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1441 CComPtr
<IServiceProvider
> serviceProvider
;
1444 if (IsEqualIID(guidService
, IID_IBandSite
))
1445 return this->QueryInterface(riid
, ppvObject
);
1446 if (IsEqualIID(guidService
, SID_IBandProxy
))
1448 if (fBandProxy
.p
== NULL
)
1450 hResult
= CreateAndInitBandProxy();
1451 if (FAILED_UNEXPECTEDLY(hResult
))
1454 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1456 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1459 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1460 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1466 hResult
= IUnknown_RelayWinEvent(fMenuBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1467 if (hResult
!= S_FALSE
)
1473 hResult
= IUnknown_RelayWinEvent(fNavigationBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1474 if (hResult
!= S_FALSE
)
1480 hResult
= IUnknown_RelayWinEvent(fLogoBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1481 if (hResult
!= S_FALSE
)
1488 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1494 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1500 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1506 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1507 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1511 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1512 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1513 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1514 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1519 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1525 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1531 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1537 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1543 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1549 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1551 CComPtr
<IServiceProvider
> serviceProvider
;
1552 CComPtr
<IWebBrowser
> webBrowser
;
1555 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1556 if (FAILED_UNEXPECTEDLY(hResult
))
1558 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1559 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1560 if (FAILED_UNEXPECTEDLY(hResult
))
1562 hResult
= webBrowser
->GoBack();
1566 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1568 CComPtr
<IServiceProvider
> serviceProvider
;
1569 CComPtr
<IWebBrowser
> webBrowser
;
1572 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1573 if (FAILED_UNEXPECTEDLY(hResult
))
1575 hResult
= serviceProvider
->QueryService(
1576 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1577 if (FAILED_UNEXPECTEDLY(hResult
))
1579 hResult
= webBrowser
->GoForward();
1583 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1585 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1588 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1589 if (FAILED_UNEXPECTEDLY(hResult
))
1591 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1595 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1597 CComPtr
<IObjectWithSite
> objectWithSite
;
1598 CComPtr
<IContextMenu
> contextMenu
;
1599 CMINVOKECOMMANDINFO commandInfo
;
1600 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1603 // TODO: Query shell if this command is enabled first
1605 memset(&commandInfo
, 0, sizeof(commandInfo
));
1606 commandInfo
.cbSize
= sizeof(commandInfo
);
1607 commandInfo
.hwnd
= m_hWnd
;
1608 commandInfo
.lpParameters
= searchGUID
;
1609 commandInfo
.nShow
= SW_SHOWNORMAL
;
1611 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1612 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1613 if (FAILED_UNEXPECTEDLY(hResult
))
1615 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1616 if (FAILED_UNEXPECTEDLY(hResult
))
1618 hResult
= objectWithSite
->SetSite(fSite
);
1619 if (FAILED_UNEXPECTEDLY(hResult
))
1621 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1622 hResult
= objectWithSite
->SetSite(NULL
);
1626 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1628 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1631 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1632 if (FAILED_UNEXPECTEDLY(hResult
))
1634 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1638 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1642 if (fCommandTarget
.p
!= NULL
)
1644 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1649 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1651 CComPtr
<IServiceProvider
> serviceProvider
;
1652 CComPtr
<IBrowserService
> browserService
;
1653 CComPtr
<IOleCommandTarget
> commandTarget
;
1654 CComPtr
<ITravelLog
> travelLog
;
1655 NMTOOLBARW
*notifyInfo
;
1664 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1665 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1667 // not from the toolbar, keep looking for a message handler
1671 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1672 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1673 switch (notifyInfo
->iItem
)
1676 newMenu
= CreatePopupMenu();
1677 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1678 hResult
= serviceProvider
->QueryService(
1679 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1680 hResult
= browserService
->GetTravelLog(&travelLog
);
1681 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1682 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1683 commandInfo
.cmdID
= 0x1d;
1684 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1685 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1686 travelLog
->CountEntries(browserService
) > 1)
1688 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1689 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1691 params
.cbSize
= sizeof (params
);
1692 params
.rcExclude
= bounds
;
1693 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1694 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1695 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1697 V_VT(&parmIn
) = VT_I4
;
1699 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1701 else if (selectedItem
!= 0)
1702 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1703 DestroyMenu(newMenu
);
1705 case IDM_GOTO_FORWARD
:
1706 newMenu
= CreatePopupMenu();
1707 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1708 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1709 hResult
= browserService
->GetTravelLog(&travelLog
);
1710 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1711 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1712 commandInfo
.cmdID
= 0x1d;
1713 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1714 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1715 travelLog
->CountEntries(browserService
) > 1)
1717 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1718 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1720 params
.cbSize
= sizeof (params
);
1721 params
.rcExclude
= bounds
;
1722 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1723 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1724 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1726 V_VT(&parmIn
) = VT_I4
;
1728 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1730 else if (selectedItem
!= 0)
1731 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1732 DestroyMenu(newMenu
);
1734 case gViewsCommandID
:
1736 CComVariant outValue
;
1739 V_VT(&inValue
) = VT_INT_PTR
;
1740 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1742 if (fCommandTarget
.p
!= NULL
)
1743 hResult
= fCommandTarget
->Exec(&fCommandCategory
, FCIDM_SHVIEW_AUTOARRANGE
, 1, &inValue
, &outValue
);
1744 // pvaOut is VT_I4 with value 0x403
1747 return TBDDRET_DEFAULT
;
1750 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1755 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1760 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1762 HMENU contextMenuBar
;
1764 POINT clickLocation
;
1766 RBHITTESTINFO hitTestInfo
;
1767 REBARBANDINFOW rebarBandInfo
;
1770 clickLocation
.x
= LOWORD(lParam
);
1771 clickLocation
.y
= HIWORD(lParam
);
1772 hitTestInfo
.pt
= clickLocation
;
1773 ScreenToClient(&hitTestInfo
.pt
);
1774 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1775 if (hitTestInfo
.iBand
== -1)
1777 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1778 rebarBandInfo
.fMask
= RBBIM_ID
;
1779 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1780 bandID
= rebarBandInfo
.wID
;
1781 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1782 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1785 case ITBBID_MENUBAND
: // menu band
1786 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1787 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1788 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1790 case ITBBID_BRANDBAND
: // brand band
1791 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1792 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1793 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1795 case ITBBID_TOOLSBAND
: // tools band
1796 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1797 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1799 case ITBBID_ADDRESSBAND
: // navigation band
1800 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1801 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1807 // TODO: Implement show/hide toolbars
1808 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, FALSE
);
1809 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_ADDRESSBAR
, FALSE
);
1810 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_LINKSBAR
, FALSE
);
1811 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, FALSE
);
1813 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, fControlsBar
!= NULL
);
1814 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_ADDRESSBAR
, fNavigationBar
!= NULL
);
1815 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_LINKSBAR
, FALSE
);
1816 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, FALSE
);
1817 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, fLocked
);
1819 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1820 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1821 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1824 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1826 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1828 case IDM_TOOLBARS_LINKSBAR
: // links
1830 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1831 LockUnlockToolbars(!fLocked
);
1833 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1834 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1838 DestroyMenu(contextMenuBar
);
1842 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1844 if (wParam
!= SIZE_MINIMIZED
)
1846 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1847 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1852 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1854 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1859 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1863 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1865 CComPtr
<IBrowserService
> browserService
;
1866 CComPtr
<ITravelLog
> travelLog
;
1867 TOOLTIPTEXTW
*pTTTW
;
1869 wchar_t tempString
[300];
1872 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1873 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1874 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1876 nID
= (UINT
)pNMHDR
->idFrom
;
1880 if (nID
== (UINT
)IDM_GOTO_BACK
|| nID
== (UINT
)IDM_GOTO_FORWARD
)
1882 // TODO: Should this call QueryService?
1883 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1884 hResult
= browserService
->GetTravelLog(&travelLog
);
1885 hResult
= travelLog
->GetToolTipText(browserService
,
1886 (nID
== (UINT
)IDM_GOTO_BACK
) ? TLOG_BACK
: TLOG_FORE
,
1887 0, tempString
, 299);
1888 if (FAILED_UNEXPECTEDLY(hResult
))
1896 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1897 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1898 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1904 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1909 hResult
= OnWinEvent((HWND
) lParam
, uMsg
, wParam
, lParam
, &theResult
);
1911 bHandled
= hResult
== S_OK
;
1913 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1915 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1917 NMHDR
*notifyHeader
;
1921 notifyHeader
= reinterpret_cast<NMHDR
*>(lParam
);
1923 hResult
= OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1925 bHandled
= hResult
== S_OK
;
1927 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1930 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1936 if (wParam
& MK_CONTROL
)
1941 DWORD msgp
= GetMessagePos();
1943 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1944 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1947 GetWindowRect(m_hWnd
, &rc
);
1949 fStartHeight
= rc
.bottom
- rc
.top
;
1957 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1963 DWORD msgp
= GetMessagePos();
1966 pt
.x
= GET_X_LPARAM(msgp
);
1967 pt
.y
= GET_Y_LPARAM(msgp
);
1969 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
1975 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1981 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
1990 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1992 return ShellObjectCreator
<CInternetToolbar
>(riid
, ppv
);