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
27 // navigation controls and menubar just send a message to parent window
30 ****Implement BandProxy methods
31 ****Add QueryStatus handler for built-in bands
32 ****Enable/Disable up, search, and folders commands appropriately
33 **Why are explorer toolbar separators a nonstandard width?
34 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
35 **Chevron menu on menuband doesn't work
36 **Fix CInternetToolbar::QueryBand to be generic
38 ****Fix context menu to strip divider when menu shown for menu band
39 ****Fix context menu to have items checked appropriately
40 ****Implement -1 command id update
41 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
42 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
43 Implement show/hide of bands
44 Why is the background color of my toolbars different from explorer?
45 Internet Toolbar command handler should get the target for the command and call Exec on the target.
46 For commands built in to the Internet Toolbar, its Exec handles the command
47 When window width is changed, brand band flashes badly
48 Add all bands with correct ids (system bands now add with correct ids)
50 Implement remaining IExplorerToolbar methods
51 Fix toolbar buttons to enable/disable correctly
52 After toolbar is customized, it may be necessary to patch the widths of separators
54 Check sizes and spacing of toolbars against Explorer
55 Implement resizing of the dock bar
56 Add missing icons for toolbar items
57 Draw History item in forward/back dropdown menus with icon
58 Fix toolbar customize dialog to not include separators as possible selections
59 Implement save/restore of toolbar state
60 Refactor drop down menu code to use a common function since code is so similar
63 extern HRESULT WINAPI
SHBindToFolder(LPITEMIDLIST path
, IShellFolder
**newFolder
);
64 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
65 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
66 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
67 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
69 class CInternetToolbar
;
72 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
73 public IDockingWindowSite
,
74 public IInputObjectSite
,
75 public IOleCommandTarget
,
76 public IServiceProvider
82 ITF_NEWBANDALWAYS
= 4,
83 ITF_GRIPPERALWAYS
= 8,
87 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
88 CInternetToolbar
*fToolbar
; // our browser
96 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
97 DESKBANDINFO fDeskBandInfo
;
101 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
102 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
105 // *** IOleWindow methods ***
106 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
107 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
109 // *** IDockingWindow methods ***
110 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
111 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
112 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
114 // *** IInputObjectSite specific methods ***
115 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
117 // *** IOleCommandTarget specific methods ***
118 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
119 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
121 // *** IServiceProvider methods ***
122 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
124 BEGIN_COM_MAP(CDockSite
)
125 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
126 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
127 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
128 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
129 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
133 CDockSite::CDockSite()
140 fInitialized
= false;
141 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
144 CDockSite::~CDockSite()
148 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
150 CComPtr
<IObjectWithSite
> site
;
151 CComPtr
<IOleWindow
> oleWindow
;
152 CComPtr
<IDeskBand
> deskBand
;
153 TCHAR textBuffer
[40];
154 REBARBANDINFOW bandInfo
;
157 hResult
= containedBand
->QueryInterface(IID_IObjectWithSite
, (void **)&site
);
160 hResult
= containedBand
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
163 hResult
= containedBand
->QueryInterface(IID_IDeskBand
, (void **)&deskBand
);
166 fContainedBand
= containedBand
;
171 hResult
= site
->SetSite((IOleWindow
*)this);
174 hResult
= oleWindow
->GetWindow(&fChildWindow
);
178 memset(&bandInfo
, 0, sizeof(bandInfo
));
179 bandInfo
.cbSize
= sizeof(bandInfo
);
180 bandInfo
.lpText
= textBuffer
;
181 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
182 hResult
= GetRBBandInfo(bandInfo
);
184 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
185 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
190 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
192 CComPtr
<IDeskBand
> deskBand
;
195 hResult
= fContainedBand
->QueryInterface(IID_IDeskBand
, (void **)&deskBand
);
199 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
| DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
200 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
201 // result of call is ignored
203 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
| RBBIM_TEXT
| RBBIM_STYLE
;
205 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
206 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
207 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
208 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
209 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
210 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
211 bandInfo
.fStyle
|= RBBS_BREAK
;
212 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
213 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
214 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
== true)
215 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
216 if (fFlags
& ITF_NOTITLE
)
217 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
218 if (fFlags
& ITF_GRIPPERALWAYS
&& fToolbar
->fLocked
== false)
219 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
220 if (fFlags
& ITF_FIXEDSIZE
)
221 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
223 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
225 bandInfo
.fMask
|= RBBIM_COLORS
;
226 bandInfo
.clrFore
= CLR_DEFAULT
;
227 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
229 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
230 bandInfo
.hwndChild
= fChildWindow
;
231 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
232 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
233 bandInfo
.wID
= fBandID
;
234 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
235 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
236 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
237 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
238 bandInfo
.lParam
= (LPARAM
)this;
242 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
246 *lphwnd
= fRebarWindow
;
250 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
255 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
260 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
265 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
270 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
275 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
280 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
282 TCHAR textBuffer
[40];
283 REBARBANDINFOW bandInfo
;
287 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
291 case DBID_BANDINFOCHANGED
:
292 if (fInitialized
== false)
294 if (V_VT(pvaIn
) != VT_I4
)
296 if (V_I4(pvaIn
) != fBandID
)
298 // deskband information changed
299 // call GetBandInfo and refresh information in rebar
300 memset(&bandInfo
, 0, sizeof(bandInfo
));
301 bandInfo
.cbSize
= sizeof(bandInfo
);
302 bandInfo
.lpText
= textBuffer
;
303 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
304 hResult
= GetRBBandInfo(bandInfo
);
307 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
308 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
315 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
317 CComPtr
<IServiceProvider
> serviceProvider
;
320 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
321 return this->QueryInterface(riid
, ppvObject
);
322 hResult
= fToolbar
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
323 if (FAILED (hResult
))
325 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
328 CMenuCallback::CMenuCallback()
332 CMenuCallback::~CMenuCallback()
336 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
338 CComPtr
<IShellMenu
> parentMenu
;
339 CComPtr
<IShellMenu
> newMenu
;
340 CComPtr
<IShellFolder
> favoritesFolder
;
341 LPITEMIDLIST favoritesPIDL
;
344 HMENU favoritesHMenu
;
349 if (!IsEqualIID(riid
, IID_IShellMenu
))
351 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
353 if (fFavoritesMenu
.p
== NULL
)
355 hResult
= psmd
->punk
->QueryInterface(IID_IShellMenu
, (void **)&parentMenu
);
358 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
361 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
362 if (favoritesHMenu
== NULL
)
364 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IShellMenu
, (void **)&newMenu
);
367 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
370 hResult
= newMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
373 hResult
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &favoritesPIDL
);
376 hResult
= SHBindToFolder(favoritesPIDL
, &favoritesFolder
);
379 RegCreateKeyEx(HKEY_CURRENT_USER
, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites"),
380 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
381 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| 0x18);
382 ILFree(favoritesPIDL
);
383 if (SUCCEEDED(hResult
))
384 fFavoritesMenu
.Attach(newMenu
.Detach());
386 if (fFavoritesMenu
.p
== NULL
)
388 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
391 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
403 SMINFO
*infoPtr
= (SMINFO
*)lParam
;
404 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
406 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
408 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
412 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
415 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
422 return GetObject(psmd
, *(IID
*)wParam
, (void **)lParam
);
423 case SMC_GETSFOBJECT
:
427 case SMC_SFSELECTITEM
:
440 case SMC_DEFAULTICON
:
444 case SMC_CHEVRONEXPAND
:
446 case SMC_DISPLAYCHEVRONTIP
:
448 case SMC_SETSFOBJECT
:
450 case SMC_SHCHANGENOTIFY
:
452 case SMC_CHEVRONGETTIP
:
454 case SMC_SFDDRESTRICTED
:
466 CInternetToolbar::CInternetToolbar()
470 fMenuBandWindow
= NULL
;
471 fNavigationWindow
= NULL
;
472 fMenuCallback
.AddRef();
473 fToolbarWindow
= NULL
;
477 CInternetToolbar::~CInternetToolbar()
479 fMenuCallback
.Release();
482 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
486 newSite
= new CComObject
<CDockSite
>;
488 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
491 HRESULT
CInternetToolbar::ReserveBorderSpace()
493 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
494 RECT availableBorderSpace
;
495 RECT neededBorderSpace
;
498 hResult
= fSite
->QueryInterface(IID_IDockingWindowSite
, (void **)&dockingWindowSite
);
501 hResult
= dockingWindowSite
->GetBorderDW((IDockingWindow
*)this, &availableBorderSpace
);
504 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, (LPARAM
)&availableBorderSpace
);
505 neededBorderSpace
.left
= 0;
506 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
507 if (fLocked
== false)
508 neededBorderSpace
.top
+= 3;
509 neededBorderSpace
.right
= 0;
510 neededBorderSpace
.bottom
= 0;
511 hResult
= dockingWindowSite
->SetBorderSpaceDW((IDockingWindow
*)this, &neededBorderSpace
);
517 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**menuBar
)
519 CComPtr
<IOleCommandTarget
> siteCommandTarget
;
520 CComPtr
<IOleWindow
> oleWindow
;
521 CComPtr
<IOleCommandTarget
> commandTarget
;
522 CComPtr
<IShellMenuCallback
> callback
;
527 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IShellMenu
, (void **)menuBar
);
530 hResult
= fMenuCallback
.QueryInterface(IID_IShellMenuCallback
, (void **)&callback
);
533 hResult
= (*menuBar
)->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
536 hResult
= fSite
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
539 hResult
= oleWindow
->GetWindow(&ownerWindow
);
542 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&siteCommandTarget
);
545 hResult
= siteCommandTarget
->Exec(&CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
548 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
550 hResult
= (*menuBar
)->SetMenu((HMENU
)V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
553 hResult
= (*menuBar
)->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
556 hResult
= commandTarget
->Exec(&CGID_MenuBand
, 3, 1, NULL
, NULL
);
562 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
564 CComPtr
<IUnknown
> tempBand
;
568 hResult
= ::CreateBrandBand(IID_IUnknown
, (void **)logoBar
);
570 hResult
= CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)logoBar
);
577 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
581 hResult
= ::CreateToolsBar(IID_IUnknown
, (void **)toolsBar
);
587 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
589 CComPtr
<IAddressBand
> addressBand
;
593 hResult
= ::CreateAddressBand(IID_IUnknown
, (void **)toolsBar
);
595 hResult
= CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)toolsBar
);
599 hResult
= (*toolsBar
)->QueryInterface(IID_IAddressBand
, (void **)&addressBand
);
603 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
605 REBARBANDINFOW rebarBandInfo
;
611 if (locked
!= fLocked
)
614 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
615 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
616 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
617 for (x
= 0; x
< bandCount
; x
++)
619 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
620 dockSite
= (CDockSite
*)rebarBandInfo
.lParam
;
621 if (dockSite
!= NULL
)
623 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
624 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
== true)
625 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
626 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& fLocked
== false)
627 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
628 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
631 hResult
= ReserveBorderSpace();
636 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
644 // loop through buttons
645 // for buttons in CLSID_CommonButtons
646 // if up, QueryStatus for up state and update it
648 // for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
652 hResult
= SetState(&CLSID_CommonButtons
, gForwardCommandID
, newValue
? TBSTATE_ENABLED
: 0);
656 hResult
= SetState(&CLSID_CommonButtons
, gBackCommandID
, newValue
? TBSTATE_ENABLED
: 0);
662 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
664 CComPtr
<IServiceProvider
> serviceProvider
;
667 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
668 if (FAILED (hResult
))
670 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_IBandProxy
, (void **)&fBandProxy
);
671 if (FAILED (hResult
))
673 hResult
= CreateBandProxy(IID_IBandProxy
, (void **)&fBandProxy
);
674 if (FAILED (hResult
))
676 hResult
= fBandProxy
->SetSite(fSite
);
677 if (FAILED (hResult
))
683 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
688 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
693 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
698 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
706 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
711 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
713 CComPtr
<IDockingWindow
> dockingWindow
;
717 hResult
= ReserveBorderSpace();
718 hResult
= fMenuBar
->QueryInterface(IID_IDockingWindow
, (void **)&dockingWindow
);
719 hResult
= dockingWindow
->ShowDW(fShow
);
723 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
728 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
733 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
735 if (pClassID
== NULL
)
737 *pClassID
= CLSID_InternetToolbar
;
741 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
746 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
751 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
756 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
761 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
763 CComPtr
<IShellMenu
> menuBar
;
764 CComPtr
<IUnknown
> logoBar
;
765 CComPtr
<IUnknown
> toolsBar
;
766 CComPtr
<IUnknown
> navigationBar
;
767 CComPtr
<IOleWindow
> menuOleWindow
;
768 CComPtr
<IOleWindow
> toolbarOleWindow
;
769 CComPtr
<IOleWindow
> navigationOleWindow
;
772 hResult
= CreateMenuBar(&menuBar
);
775 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
776 hResult
= menuBar
->QueryInterface(IID_IOleWindow
, (void **)&menuOleWindow
);
777 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
778 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
780 hResult
= CreateBrandBand(&logoBar
);
783 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
784 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
786 hResult
= CreateToolsBar(&toolsBar
);
789 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
);
790 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
791 hResult
= fControlsBar
->QueryInterface(IID_IOleWindow
, (void **)&toolbarOleWindow
);
794 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
798 hResult
= CreateAddressBand(&navigationBar
);
801 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
);
802 hResult
= navigationBar
->QueryInterface(IID_IOleWindow
, (void **)&navigationOleWindow
);
803 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
804 fNavigationBar
.Attach(navigationBar
.Detach());
809 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
811 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
815 switch (prgCmds
->cmdID
)
817 case ITID_TEXTLABELS
: // Text Labels state
818 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
820 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
821 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
823 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
824 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
826 case ITID_LINKSBANDSHOWN
: // links bar visibility
829 case ITID_MENUBANDSHOWN
: // Menubar band visibility
832 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
835 case ITID_CUSTOMIZEENABLED
: // customize enabled
836 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
838 case ITID_TOOLBARLOCKED
: // lock toolbars
839 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
841 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
855 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
857 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
862 // what do I do here?
864 case ITID_TEXTLABELS
:
865 // toggle text labels
867 case ITID_TOOLBARBANDSHOWN
:
868 // toggle toolbar band visibility
870 case ITID_ADDRESSBANDSHOWN
:
871 // toggle address band visibility
873 case ITID_LINKSBANDSHOWN
:
874 // toggle links band visibility
876 case ITID_CUSTOMIZEENABLED
:
879 case ITID_TOOLBARLOCKED
:
880 return LockUnlockToolbars(!fLocked
);
886 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
891 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
896 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
901 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
907 case DISPID_BEFORENAVIGATE
:
910 case DISPID_DOWNLOADCOMPLETE
:
913 case DISPID_COMMANDSTATECHANGE
:
914 if (pDispParams
->cArgs
!= 2)
916 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
918 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) == VARIANT_FALSE
? false : true,
919 V_I4(&pDispParams
->rgvarg
[1]));
920 case DISPID_DOWNLOADBEGIN
:
923 case DISPID_NAVIGATECOMPLETE2
:
926 case DISPID_DOCUMENTCOMPLETE
:
933 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
937 fCommandTarget
.Release();
938 hResult
= theTarget
->QueryInterface(IID_IOleCommandTarget
, (void **)&fCommandTarget
);
941 fCommandCategory
= *category
;
945 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
950 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
955 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
, HINSTANCE param10
, LPCTSTR param14
, long *param18
)
959 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
, (WPARAM
)param10
, (LPARAM
)param14
);
966 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
971 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
973 if (theState
== NULL
)
975 // map the command id
976 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
980 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
982 // map the command id
983 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
987 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
, TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
992 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
996 *paramC
= MAKELONG(24, 24);
1000 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1005 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
, HIMAGELIST param14
, HIMAGELIST param18
)
1010 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1015 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1020 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1022 CComPtr
<IBrowserService
> browserService
;
1023 CComPtr
<IServiceProvider
> serviceProvider
;
1024 CComPtr
<IOleWindow
> oleWindow
;
1029 if (pUnkSite
== NULL
)
1031 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1032 ::DestroyWindow(fMainReBar
);
1038 hResult
= pUnkSite
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
1039 if (FAILED(hResult
))
1041 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1042 if (FAILED(hResult
))
1044 if (ownerWindow
== NULL
)
1047 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0, WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1048 if (dockContainer
== NULL
)
1050 SubclassWindow(dockContainer
);
1051 fMainReBar
= CreateWindow(REBARCLASSNAMEW
, _T(""), WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
|
1052 RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
,
1053 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1054 if (fMainReBar
== NULL
)
1056 hResult
= pUnkSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1057 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1058 hResult
= AtlAdvise(browserService
, (IDispatch
*)this, DIID_DWebBrowserEvents
, &fAdviseCookie
);
1063 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1065 if (ppvSite
== NULL
)
1067 if (fSite
.p
!= NULL
)
1068 return fSite
->QueryInterface(riid
, ppvSite
);
1073 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1075 CComPtr
<IServiceProvider
> serviceProvider
;
1078 if (IsEqualIID(guidService
, IID_IBandSite
))
1079 return this->QueryInterface(riid
, ppvObject
);
1080 if (IsEqualIID(guidService
, SID_IBandProxy
))
1082 if (fBandProxy
.p
== NULL
)
1084 hResult
= CreateAndInitBandProxy();
1085 if (FAILED (hResult
))
1088 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1090 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1091 if (FAILED (hResult
))
1093 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
1096 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1098 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1101 if (fMenuBar
.p
!= NULL
)
1103 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1104 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1109 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1114 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1119 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1124 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1128 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1129 return fMenuBar
->QueryInterface(IID_IDeskBand
, (void **)ppstb
);
1130 if (dwBandID
== ITBBID_BRANDBAND
&& fLogoBar
.p
!= NULL
)
1131 return fLogoBar
->QueryInterface(IID_IDeskBand
, (void **)ppstb
);
1136 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1141 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1146 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1151 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1156 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1161 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1163 CComPtr
<IServiceProvider
> serviceProvider
;
1164 CComPtr
<IWebBrowser
> webBrowser
;
1167 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1168 if (FAILED (hResult
))
1170 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IWebBrowser
, (void **)&webBrowser
);
1171 if (FAILED (hResult
))
1173 hResult
= webBrowser
->GoBack();
1177 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1179 CComPtr
<IServiceProvider
> serviceProvider
;
1180 CComPtr
<IWebBrowser
> webBrowser
;
1183 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1184 if (FAILED (hResult
))
1186 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IWebBrowser
, (void **)&webBrowser
);
1187 if (FAILED (hResult
))
1189 hResult
= webBrowser
->GoForward();
1193 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1195 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1198 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1199 if (FAILED (hResult
))
1201 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1205 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1207 CComPtr
<IObjectWithSite
> objectWithSite
;
1208 CComPtr
<IContextMenu
> contextMenu
;
1209 CMINVOKECOMMANDINFO commandInfo
;
1210 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1213 // TODO: Query shell if this command is enabled first
1215 memset(&commandInfo
, 0, sizeof(commandInfo
));
1216 commandInfo
.cbSize
= sizeof(commandInfo
);
1217 commandInfo
.hwnd
= m_hWnd
;
1218 commandInfo
.lpParameters
= searchGUID
;
1219 commandInfo
.nShow
= SW_SHOWNORMAL
;
1221 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_IContextMenu
, (void **)&contextMenu
);
1222 if (FAILED (hResult
))
1224 hResult
= contextMenu
->QueryInterface(IID_IObjectWithSite
, (void **)&objectWithSite
);
1225 if (FAILED (hResult
))
1227 hResult
= objectWithSite
->SetSite(fSite
);
1228 if (FAILED (hResult
))
1230 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1231 hResult
= objectWithSite
->SetSite(NULL
);
1235 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1237 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1240 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1241 if (FAILED (hResult
))
1243 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1247 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1251 if (fCommandTarget
.p
!= NULL
)
1253 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1258 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1260 CComPtr
<IServiceProvider
> serviceProvider
;
1261 CComPtr
<IBrowserService
> browserService
;
1262 CComPtr
<IOleCommandTarget
> commandTarget
;
1263 CComPtr
<ITravelLog
> travelLog
;
1264 NMTOOLBARW
*notifyInfo
;
1273 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1274 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1276 // not from the toolbar, keep looking for a message handler
1280 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, (LPARAM
)&bounds
);
1281 ::MapWindowPoints(fToolbarWindow
, NULL
, (POINT
*)&bounds
, 2);
1282 switch (notifyInfo
->iItem
)
1284 case gBackCommandID
:
1285 newMenu
= CreatePopupMenu();
1286 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1287 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1288 hResult
= browserService
->GetTravelLog(&travelLog
);
1289 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1290 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
1291 commandInfo
.cmdID
= 0x1d;
1292 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1293 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&& travelLog
->CountEntries(browserService
) > 1)
1295 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1296 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1298 params
.cbSize
= sizeof (params
);
1299 params
.rcExclude
= bounds
;
1300 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1301 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1302 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1304 V_VT(&parmIn
) = VT_I4
;
1306 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1308 else if (selectedItem
!= 0)
1309 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1310 DestroyMenu(newMenu
);
1312 case gForwardCommandID
:
1313 newMenu
= CreatePopupMenu();
1314 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1315 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1316 hResult
= browserService
->GetTravelLog(&travelLog
);
1317 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1318 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
1319 commandInfo
.cmdID
= 0x1d;
1320 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1321 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&& travelLog
->CountEntries(browserService
) > 1)
1323 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1324 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1326 params
.cbSize
= sizeof (params
);
1327 params
.rcExclude
= bounds
;
1328 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1329 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1330 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1332 V_VT(&parmIn
) = VT_I4
;
1334 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1336 else if (selectedItem
!= 0)
1337 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1338 DestroyMenu(newMenu
);
1340 case gViewsCommandID
:
1342 CComVariant outValue
;
1345 V_VT(&inValue
) = VT_INT_PTR
;
1346 V_INTREF(&inValue
) = (INT
*)&bounds
;
1348 if (fCommandTarget
.p
!= NULL
)
1349 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1350 // pvaOut is VT_I4 with value 0x403
1353 return TBDDRET_DEFAULT
;
1356 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1361 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1366 LRESULT
CInternetToolbar::OnNavigateCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1368 CComPtr
<IWinEventHandler
> winEventHandler
;
1372 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, (void **)&winEventHandler
);
1373 hResult
= winEventHandler
->OnWinEvent(m_hWnd
, uMsg
, wParam
, lParam
, &theResult
);
1374 if (SUCCEEDED(hResult
))
1380 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1382 HMENU contextMenuBar
;
1384 POINT clickLocation
;
1386 RBHITTESTINFO hitTestInfo
;
1387 REBARBANDINFOW rebarBandInfo
;
1390 clickLocation
.x
= LOWORD(lParam
);
1391 clickLocation
.y
= HIWORD(lParam
);
1392 hitTestInfo
.pt
= clickLocation
;
1393 ScreenToClient(&hitTestInfo
.pt
);
1394 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1395 if (hitTestInfo
.iBand
== -1)
1397 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1398 rebarBandInfo
.fMask
= RBBIM_ID
;
1399 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1400 bandID
= rebarBandInfo
.wID
;
1401 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1402 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1405 case ITBBID_MENUBAND
: // menu band
1406 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1407 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1408 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1410 case ITBBID_BRANDBAND
: // brand band
1411 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1412 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1413 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1415 case ITBBID_TOOLSBAND
: // tools band
1416 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1417 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1419 case ITBBID_ADDRESSBAND
: // navigation band
1420 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1421 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1426 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1427 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1428 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1431 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1433 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1435 case IDM_TOOLBARS_LINKSBAR
: // links
1437 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1438 LockUnlockToolbars(!fLocked
);
1440 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1441 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1447 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1449 if (wParam
!= SIZE_MINIMIZED
)
1451 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
), SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1456 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1458 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1463 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1467 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1469 CComPtr
<IBrowserService
> browserService
;
1470 CComPtr
<ITravelLog
> travelLog
;
1471 TOOLTIPTEXTW
*pTTTW
;
1473 wchar_t tempString
[300];
1476 pTTTW
= (TOOLTIPTEXTW
*)pNMHDR
;
1477 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1478 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1480 nID
= (UINT
)pNMHDR
->idFrom
;
1484 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1486 // TODO: Should this call QueryService?
1487 hResult
= fSite
->QueryInterface(IID_IBrowserService
, (void **)&browserService
);
1488 hResult
= browserService
->GetTravelLog(&travelLog
);
1489 hResult
= travelLog
->GetToolTipText(browserService
, nID
== (UINT
)gBackCommandID
? TLOG_BACK
: TLOG_FORE
,
1490 0, tempString
, 299);
1491 if (FAILED(hResult
))
1499 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1500 ::SetWindowPos (pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0, SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1506 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1508 NMHDR
*notifyHeader
;
1509 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1513 notifyHeader
= (NMHDR
*)lParam
;
1514 if (fMenuBar
.p
!= NULL
&& notifyHeader
->hwndFrom
== fMenuBandWindow
)
1516 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1517 hResult
= menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, &theResult
);
1520 if (fNavigationBar
.p
!= NULL
&& notifyHeader
->hwndFrom
== fNavigationWindow
)
1522 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1523 hResult
= menuWinEventHandler
->OnWinEvent(m_hWnd
, uMsg
, wParam
, lParam
, &theResult
);
1529 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1531 CComObject
<CInternetToolbar
> *theToolbar
;
1537 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1538 if (theToolbar
== NULL
)
1539 return E_OUTOFMEMORY
;
1540 hResult
= theToolbar
->QueryInterface (riid
, (void **)ppv
);
1541 if (FAILED (hResult
))