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 // navigation controls and menubar just send a message to parent window
31 ****Implement BandProxy methods
32 ****Add QueryStatus handler for built-in bands
33 ****Enable/Disable up, search, and folders commands appropriately
34 **Why are explorer toolbar separators a nonstandard width?
35 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
36 **Chevron menu on menuband doesn't work
37 **Fix CInternetToolbar::QueryBand to be generic
39 ****Fix context menu to strip divider when menu shown for menu band
40 ****Fix context menu to have items checked appropriately
41 ****Implement -1 command id update
42 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
43 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
44 Implement show/hide of bands
45 Why is the background color of my toolbars different from explorer?
46 Internet Toolbar command handler should get the target for the command and call Exec on the target.
47 For commands built in to the Internet Toolbar, its Exec handles the command
48 When window width is changed, brand band flashes badly
49 Add all bands with correct ids (system bands now add with correct ids)
51 Implement remaining IExplorerToolbar methods
52 Fix toolbar buttons to enable/disable correctly
53 After toolbar is customized, it may be necessary to patch the widths of separators
55 Check sizes and spacing of toolbars against Explorer
56 Implement resizing of the dock bar
57 Add missing icons for toolbar items
58 Draw History item in forward/back dropdown menus with icon
59 Fix toolbar customize dialog to not include separators as possible selections
60 Implement save/restore of toolbar state
61 Refactor drop down menu code to use a common function since code is so similar
64 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
65 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
66 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
67 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
68 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
70 class CInternetToolbar
;
73 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
74 public IDockingWindowSite
,
75 public IInputObjectSite
,
76 public IOleCommandTarget
,
77 public IServiceProvider
83 ITF_NEWBANDALWAYS
= 4,
84 ITF_GRIPPERALWAYS
= 8,
88 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
89 CInternetToolbar
*fToolbar
; // our browser
97 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
98 DESKBANDINFO fDeskBandInfo
;
102 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
103 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
106 // *** IOleWindow methods ***
107 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
108 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
110 // *** IDockingWindow methods ***
111 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
112 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
113 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
115 // *** IInputObjectSite specific methods ***
116 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
118 // *** IOleCommandTarget specific methods ***
119 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
120 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
121 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
122 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
124 // *** IServiceProvider methods ***
125 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
127 BEGIN_COM_MAP(CDockSite
)
128 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
129 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
130 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
131 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
132 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
136 CDockSite::CDockSite()
143 fInitialized
= false;
144 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
147 CDockSite::~CDockSite()
151 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
153 CComPtr
<IObjectWithSite
> site
;
154 CComPtr
<IOleWindow
> oleWindow
;
155 CComPtr
<IDeskBand
> deskBand
;
156 TCHAR textBuffer
[40];
157 REBARBANDINFOW bandInfo
;
160 hResult
= containedBand
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&site
));
163 hResult
= containedBand
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
166 hResult
= containedBand
->QueryInterface(IID_IDeskBand
, reinterpret_cast<void **>(&deskBand
));
169 fContainedBand
= containedBand
;
174 hResult
= site
->SetSite(static_cast<IOleWindow
*>(this));
177 hResult
= oleWindow
->GetWindow(&fChildWindow
);
181 memset(&bandInfo
, 0, sizeof(bandInfo
));
182 bandInfo
.cbSize
= sizeof(bandInfo
);
183 bandInfo
.lpText
= textBuffer
;
184 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
185 hResult
= GetRBBandInfo(bandInfo
);
187 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
188 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
193 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
195 CComPtr
<IDeskBand
> deskBand
;
198 hResult
= fContainedBand
->QueryInterface(IID_IDeskBand
, reinterpret_cast<void **>(&deskBand
));
202 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
203 DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
204 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
205 // result of call is ignored
207 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
|
208 RBBIM_TEXT
| RBBIM_STYLE
;
210 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
211 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
212 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
213 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
214 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
215 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
216 bandInfo
.fStyle
|= RBBS_BREAK
;
217 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
218 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
219 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
)
220 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
221 if (fFlags
& ITF_NOTITLE
)
222 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
223 if (fFlags
& ITF_GRIPPERALWAYS
&& !fToolbar
->fLocked
)
224 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
225 if (fFlags
& ITF_FIXEDSIZE
)
226 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
228 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
230 bandInfo
.fMask
|= RBBIM_COLORS
;
231 bandInfo
.clrFore
= CLR_DEFAULT
;
232 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
234 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
235 bandInfo
.hwndChild
= fChildWindow
;
236 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
237 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
238 bandInfo
.wID
= fBandID
;
239 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
240 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
241 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
242 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
243 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
247 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
251 *lphwnd
= fRebarWindow
;
255 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
260 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
265 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
270 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
275 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
280 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
281 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
286 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
287 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
289 TCHAR textBuffer
[40];
290 REBARBANDINFOW bandInfo
;
294 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
298 case DBID_BANDINFOCHANGED
:
299 if (fInitialized
== false)
301 if (V_VT(pvaIn
) != VT_I4
)
303 if (V_I4(pvaIn
) != fBandID
)
305 // deskband information changed
306 // call GetBandInfo and refresh information in rebar
307 memset(&bandInfo
, 0, sizeof(bandInfo
));
308 bandInfo
.cbSize
= sizeof(bandInfo
);
309 bandInfo
.lpText
= textBuffer
;
310 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
311 hResult
= GetRBBandInfo(bandInfo
);
314 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
315 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
322 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
324 CComPtr
<IServiceProvider
> serviceProvider
;
327 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
328 return this->QueryInterface(riid
, ppvObject
);
329 hResult
= fToolbar
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
332 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
335 CMenuCallback::CMenuCallback()
339 CMenuCallback::~CMenuCallback()
343 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
345 CComPtr
<IShellMenu
> parentMenu
;
346 CComPtr
<IShellMenu
> newMenu
;
347 CComPtr
<IShellFolder
> favoritesFolder
;
348 LPITEMIDLIST favoritesPIDL
;
351 HMENU favoritesHMenu
;
355 static const TCHAR szFavoritesKey
[] =
356 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
358 if (!IsEqualIID(riid
, IID_IShellMenu
))
360 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
363 if (fFavoritesMenu
.p
== NULL
)
365 // create favorites menu
366 hResult
= psmd
->punk
->QueryInterface(IID_IShellMenu
, reinterpret_cast<void **>(&parentMenu
));
369 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
372 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
373 if (favoritesHMenu
== NULL
)
375 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
376 IID_IShellMenu
, reinterpret_cast<void **>(&newMenu
));
379 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
382 hResult
= newMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
385 hResult
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &favoritesPIDL
);
388 hResult
= SHBindToFolder(favoritesPIDL
, &favoritesFolder
);
391 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
392 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
393 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| 0x18);
394 ILFree(favoritesPIDL
);
395 if (SUCCEEDED(hResult
))
396 fFavoritesMenu
.Attach(newMenu
.Detach());
398 if (fFavoritesMenu
.p
== NULL
)
400 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
403 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
415 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
416 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
418 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
420 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
424 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
427 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
434 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
435 case SMC_GETSFOBJECT
:
439 case SMC_SFSELECTITEM
:
452 case SMC_DEFAULTICON
:
456 case SMC_CHEVRONEXPAND
:
458 case SMC_DISPLAYCHEVRONTIP
:
460 case SMC_SETSFOBJECT
:
462 case SMC_SHCHANGENOTIFY
:
464 case SMC_CHEVRONGETTIP
:
466 case SMC_SFDDRESTRICTED
:
478 CInternetToolbar::CInternetToolbar()
482 fMenuBandWindow
= NULL
;
483 fNavigationWindow
= NULL
;
484 fMenuCallback
.AddRef();
485 fToolbarWindow
= NULL
;
489 CInternetToolbar::~CInternetToolbar()
491 fMenuCallback
.Release();
494 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
498 newSite
= new CComObject
<CDockSite
>;
500 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
503 HRESULT
CInternetToolbar::ReserveBorderSpace()
505 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
506 RECT availableBorderSpace
;
507 RECT neededBorderSpace
;
510 hResult
= fSite
->QueryInterface(IID_IDockingWindowSite
, reinterpret_cast<void **>(&dockingWindowSite
));
513 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
516 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
517 neededBorderSpace
.left
= 0;
518 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
520 neededBorderSpace
.top
+= 3;
521 neededBorderSpace
.right
= 0;
522 neededBorderSpace
.bottom
= 0;
523 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
529 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**menuBar
)
531 CComPtr
<IOleCommandTarget
> siteCommandTarget
;
532 CComPtr
<IOleWindow
> oleWindow
;
533 CComPtr
<IOleCommandTarget
> commandTarget
;
534 CComPtr
<IShellMenuCallback
> callback
;
539 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
540 IID_IShellMenu
, reinterpret_cast<void **>(menuBar
));
543 hResult
= fMenuCallback
.QueryInterface(IID_IShellMenuCallback
, reinterpret_cast<void **>(&callback
));
546 hResult
= (*menuBar
)->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
549 hResult
= fSite
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
552 hResult
= oleWindow
->GetWindow(&ownerWindow
);
555 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&siteCommandTarget
));
558 hResult
= siteCommandTarget
->Exec(&CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
561 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
563 hResult
= (*menuBar
)->SetMenu((HMENU
)V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
566 hResult
= (*menuBar
)->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
569 hResult
= commandTarget
->Exec(&CGID_MenuBand
, 3, 1, NULL
, NULL
);
575 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
577 CComPtr
<IUnknown
> tempBand
;
581 hResult
= ::CreateBrandBand(IID_IUnknown
, reinterpret_cast<void **>(logoBar
));
583 hResult
= CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
,
584 reinterpret_cast<void **>(logoBar
));
591 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
595 hResult
= ::CreateToolsBar(IID_IUnknown
, reinterpret_cast<void **>(toolsBar
));
601 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
603 CComPtr
<IAddressBand
> addressBand
;
607 hResult
= ::CreateAddressBand(IID_IUnknown
, reinterpret_cast<void **>(toolsBar
));
609 hResult
= CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
,
610 reinterpret_cast<void **>(toolsBar
));
614 hResult
= (*toolsBar
)->QueryInterface(IID_IAddressBand
, reinterpret_cast<void **>(&addressBand
));
618 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
620 REBARBANDINFOW rebarBandInfo
;
625 if (locked
!= fLocked
)
628 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
629 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
630 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
631 for (INT x
= 0; x
< bandCount
; x
++)
633 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
634 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
635 if (dockSite
!= NULL
)
637 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
638 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
639 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
640 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
641 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
642 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
645 hResult
= ReserveBorderSpace();
650 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
658 // loop through buttons
659 //for buttons in CLSID_CommonButtons
660 // if up, QueryStatus for up state and update it
662 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
666 hResult
= SetState(&CLSID_CommonButtons
, gForwardCommandID
, newValue
? TBSTATE_ENABLED
: 0);
670 hResult
= SetState(&CLSID_CommonButtons
, gBackCommandID
, newValue
? TBSTATE_ENABLED
: 0);
676 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
678 CComPtr
<IServiceProvider
> serviceProvider
;
681 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
684 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_IBandProxy
, reinterpret_cast<void **>(&fBandProxy
));
687 hResult
= CreateBandProxy(IID_IBandProxy
, reinterpret_cast<void **>(&fBandProxy
));
690 hResult
= fBandProxy
->SetSite(fSite
);
697 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
702 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
707 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
712 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
720 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
725 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
727 CComPtr
<IDockingWindow
> dockingWindow
;
731 hResult
= ReserveBorderSpace();
732 hResult
= fMenuBar
->QueryInterface(IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
733 hResult
= dockingWindow
->ShowDW(fShow
);
737 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
742 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
743 IUnknown
*punkToolbarSite
, BOOL fReserved
)
748 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
750 if (pClassID
== NULL
)
752 *pClassID
= CLSID_InternetToolbar
;
756 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
761 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
766 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
771 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
776 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
778 CComPtr
<IShellMenu
> menuBar
;
779 CComPtr
<IUnknown
> logoBar
;
780 CComPtr
<IUnknown
> toolsBar
;
781 CComPtr
<IUnknown
> navigationBar
;
782 CComPtr
<IOleWindow
> menuOleWindow
;
783 CComPtr
<IOleWindow
> toolbarOleWindow
;
784 CComPtr
<IOleWindow
> navigationOleWindow
;
787 hResult
= CreateMenuBar(&menuBar
);
790 AddDockItem(menuBar
, ITBBID_MENUBAND
,
791 CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
793 hResult
= menuBar
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&menuOleWindow
));
794 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
795 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
797 hResult
= CreateBrandBand(&logoBar
);
800 AddDockItem(logoBar
, ITBBID_BRANDBAND
,
801 CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
802 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
804 hResult
= CreateToolsBar(&toolsBar
);
807 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
);
808 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
809 hResult
= fControlsBar
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&toolbarOleWindow
));
812 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
816 hResult
= CreateAddressBand(&navigationBar
);
819 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
);
820 hResult
= navigationBar
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&navigationOleWindow
));
821 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
822 fNavigationBar
.Attach(navigationBar
.Detach());
827 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
828 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
830 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
834 switch (prgCmds
->cmdID
)
836 case ITID_TEXTLABELS
: // Text Labels state
837 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
839 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
840 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
842 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
843 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
845 case ITID_LINKSBANDSHOWN
: // links bar visibility
848 case ITID_MENUBANDSHOWN
: // Menubar band visibility
851 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
854 case ITID_CUSTOMIZEENABLED
: // customize enabled
855 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
857 case ITID_TOOLBARLOCKED
: // lock toolbars
858 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
860 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
874 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
875 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
877 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
882 // what do I do here?
884 case ITID_TEXTLABELS
:
885 // toggle text labels
887 case ITID_TOOLBARBANDSHOWN
:
888 // toggle toolbar band visibility
890 case ITID_ADDRESSBANDSHOWN
:
891 // toggle address band visibility
893 case ITID_LINKSBANDSHOWN
:
894 // toggle links band visibility
896 case ITID_CUSTOMIZEENABLED
:
899 case ITID_TOOLBARLOCKED
:
900 return LockUnlockToolbars(!fLocked
);
906 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
911 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
916 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
917 LCID lcid
, DISPID
*rgDispId
)
922 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
923 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
929 case DISPID_BEFORENAVIGATE
:
932 case DISPID_DOWNLOADCOMPLETE
:
935 case DISPID_COMMANDSTATECHANGE
:
936 if (pDispParams
->cArgs
!= 2)
938 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
940 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
941 V_I4(&pDispParams
->rgvarg
[1]));
942 case DISPID_DOWNLOADBEGIN
:
945 case DISPID_NAVIGATECOMPLETE2
:
948 case DISPID_DOCUMENTCOMPLETE
:
955 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
959 fCommandTarget
.Release();
960 hResult
= theTarget
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&fCommandTarget
));
963 fCommandCategory
= *category
;
967 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
972 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
977 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
978 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
982 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
983 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
990 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
995 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
997 if (theState
== NULL
)
999 // map the command id
1000 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1004 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1006 // map the command id
1007 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1011 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1012 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1017 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1021 *paramC
= MAKELONG(24, 24);
1025 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1026 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1031 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1032 HIMAGELIST param14
, HIMAGELIST param18
)
1037 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1042 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1047 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1049 CComPtr
<IBrowserService
> browserService
;
1050 CComPtr
<IServiceProvider
> serviceProvider
;
1051 CComPtr
<IOleWindow
> oleWindow
;
1057 if (pUnkSite
== NULL
)
1059 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1060 ::DestroyWindow(fMainReBar
);
1066 // get window handle of owner
1067 hResult
= pUnkSite
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
1068 if (FAILED(hResult
))
1070 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1071 if (FAILED(hResult
))
1073 if (ownerWindow
== NULL
)
1076 // create dock container
1078 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1079 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1080 if (dockContainer
== NULL
)
1082 SubclassWindow(dockContainer
);
1084 // create rebar in dock container
1085 style
= WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
|
1086 RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1087 fMainReBar
= CreateWindow(REBARCLASSNAMEW
, NULL
, style
,
1088 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1089 if (fMainReBar
== NULL
)
1092 // take advice to watch events
1093 hResult
= pUnkSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1094 hResult
= serviceProvider
->QueryService(
1095 SID_SShellBrowser
, IID_IBrowserService
, reinterpret_cast<void **>(&browserService
));
1096 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1101 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1103 if (ppvSite
== NULL
)
1105 if (fSite
.p
!= NULL
)
1106 return fSite
->QueryInterface(riid
, ppvSite
);
1111 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1113 CComPtr
<IServiceProvider
> serviceProvider
;
1116 if (IsEqualIID(guidService
, IID_IBandSite
))
1117 return this->QueryInterface(riid
, ppvObject
);
1118 if (IsEqualIID(guidService
, SID_IBandProxy
))
1120 if (fBandProxy
.p
== NULL
)
1122 hResult
= CreateAndInitBandProxy();
1123 if (FAILED(hResult
))
1126 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1128 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1129 if (FAILED(hResult
))
1131 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
1134 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1135 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1137 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1140 if (fMenuBar
.p
!= NULL
)
1142 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&menuWinEventHandler
));
1143 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1148 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1153 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1158 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1163 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1164 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1168 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1169 return fMenuBar
->QueryInterface(IID_IDeskBand
, reinterpret_cast<void **>(ppstb
));
1170 if (dwBandID
== ITBBID_BRANDBAND
&& fLogoBar
.p
!= NULL
)
1171 return fLogoBar
->QueryInterface(IID_IDeskBand
, reinterpret_cast<void **>(ppstb
));
1176 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1181 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1186 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1191 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1196 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1201 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1203 CComPtr
<IServiceProvider
> serviceProvider
;
1204 CComPtr
<IWebBrowser
> webBrowser
;
1207 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1208 if (FAILED(hResult
))
1210 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1211 IID_IWebBrowser
, reinterpret_cast<void **>(&webBrowser
));
1212 if (FAILED(hResult
))
1214 hResult
= webBrowser
->GoBack();
1218 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1220 CComPtr
<IServiceProvider
> serviceProvider
;
1221 CComPtr
<IWebBrowser
> webBrowser
;
1224 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1225 if (FAILED(hResult
))
1227 hResult
= serviceProvider
->QueryService(
1228 SID_SShellBrowser
, IID_IWebBrowser
, reinterpret_cast<void **>(&webBrowser
));
1229 if (FAILED(hResult
))
1231 hResult
= webBrowser
->GoForward();
1235 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1237 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1240 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1241 if (FAILED(hResult
))
1243 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1247 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1249 CComPtr
<IObjectWithSite
> objectWithSite
;
1250 CComPtr
<IContextMenu
> contextMenu
;
1251 CMINVOKECOMMANDINFO commandInfo
;
1252 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1255 // TODO: Query shell if this command is enabled first
1257 memset(&commandInfo
, 0, sizeof(commandInfo
));
1258 commandInfo
.cbSize
= sizeof(commandInfo
);
1259 commandInfo
.hwnd
= m_hWnd
;
1260 commandInfo
.lpParameters
= searchGUID
;
1261 commandInfo
.nShow
= SW_SHOWNORMAL
;
1263 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1264 IID_IContextMenu
, reinterpret_cast<void **>(&contextMenu
));
1265 if (FAILED(hResult
))
1267 hResult
= contextMenu
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1268 if (FAILED(hResult
))
1270 hResult
= objectWithSite
->SetSite(fSite
);
1271 if (FAILED(hResult
))
1273 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1274 hResult
= objectWithSite
->SetSite(NULL
);
1278 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1280 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1283 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1284 if (FAILED(hResult
))
1286 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1290 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1294 if (fCommandTarget
.p
!= NULL
)
1296 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1301 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1303 CComPtr
<IServiceProvider
> serviceProvider
;
1304 CComPtr
<IBrowserService
> browserService
;
1305 CComPtr
<IOleCommandTarget
> commandTarget
;
1306 CComPtr
<ITravelLog
> travelLog
;
1307 NMTOOLBARW
*notifyInfo
;
1316 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1317 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1319 // not from the toolbar, keep looking for a message handler
1323 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1324 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1325 switch (notifyInfo
->iItem
)
1327 case gBackCommandID
:
1328 newMenu
= CreatePopupMenu();
1329 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1330 hResult
= serviceProvider
->QueryService(
1331 SID_SShellBrowser
, IID_IBrowserService
, reinterpret_cast<void **>(&browserService
));
1332 hResult
= browserService
->GetTravelLog(&travelLog
);
1333 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1334 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
1335 commandInfo
.cmdID
= 0x1d;
1336 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1337 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1338 travelLog
->CountEntries(browserService
) > 1)
1340 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1341 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1343 params
.cbSize
= sizeof (params
);
1344 params
.rcExclude
= bounds
;
1345 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1346 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1347 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1349 V_VT(&parmIn
) = VT_I4
;
1351 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1353 else if (selectedItem
!= 0)
1354 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1355 DestroyMenu(newMenu
);
1357 case gForwardCommandID
:
1358 newMenu
= CreatePopupMenu();
1359 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1360 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
,
1361 reinterpret_cast<void **>(&browserService
));
1362 hResult
= browserService
->GetTravelLog(&travelLog
);
1363 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1364 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
1365 commandInfo
.cmdID
= 0x1d;
1366 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1367 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1368 travelLog
->CountEntries(browserService
) > 1)
1370 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1371 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1373 params
.cbSize
= sizeof (params
);
1374 params
.rcExclude
= bounds
;
1375 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1376 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1377 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1379 V_VT(&parmIn
) = VT_I4
;
1381 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1383 else if (selectedItem
!= 0)
1384 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1385 DestroyMenu(newMenu
);
1387 case gViewsCommandID
:
1389 CComVariant outValue
;
1392 V_VT(&inValue
) = VT_INT_PTR
;
1393 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1395 if (fCommandTarget
.p
!= NULL
)
1396 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1397 // pvaOut is VT_I4 with value 0x403
1400 return TBDDRET_DEFAULT
;
1403 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1408 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1413 LRESULT
CInternetToolbar::OnNavigateCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1415 CComPtr
<IWinEventHandler
> winEventHandler
;
1419 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&winEventHandler
));
1420 hResult
= winEventHandler
->OnWinEvent(m_hWnd
, uMsg
, wParam
, lParam
, &theResult
);
1421 if (SUCCEEDED(hResult
))
1427 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1429 HMENU contextMenuBar
;
1431 POINT clickLocation
;
1433 RBHITTESTINFO hitTestInfo
;
1434 REBARBANDINFOW rebarBandInfo
;
1437 clickLocation
.x
= LOWORD(lParam
);
1438 clickLocation
.y
= HIWORD(lParam
);
1439 hitTestInfo
.pt
= clickLocation
;
1440 ScreenToClient(&hitTestInfo
.pt
);
1441 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1442 if (hitTestInfo
.iBand
== -1)
1444 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1445 rebarBandInfo
.fMask
= RBBIM_ID
;
1446 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1447 bandID
= rebarBandInfo
.wID
;
1448 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1449 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1452 case ITBBID_MENUBAND
: // menu band
1453 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1454 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1455 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1457 case ITBBID_BRANDBAND
: // brand band
1458 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1459 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1460 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1462 case ITBBID_TOOLSBAND
: // tools band
1463 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1464 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1466 case ITBBID_ADDRESSBAND
: // navigation band
1467 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1468 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1473 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1474 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1475 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1478 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1480 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1482 case IDM_TOOLBARS_LINKSBAR
: // links
1484 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1485 LockUnlockToolbars(!fLocked
);
1487 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1488 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1494 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1496 if (wParam
!= SIZE_MINIMIZED
)
1498 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1499 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1504 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1506 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1511 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1515 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1517 CComPtr
<IBrowserService
> browserService
;
1518 CComPtr
<ITravelLog
> travelLog
;
1519 TOOLTIPTEXTW
*pTTTW
;
1521 wchar_t tempString
[300];
1524 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1525 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1526 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1528 nID
= (UINT
)pNMHDR
->idFrom
;
1532 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1534 // TODO: Should this call QueryService?
1535 hResult
= fSite
->QueryInterface(IID_IBrowserService
, reinterpret_cast<void **>(&browserService
));
1536 hResult
= browserService
->GetTravelLog(&travelLog
);
1537 hResult
= travelLog
->GetToolTipText(browserService
,
1538 (nID
== (UINT
)gBackCommandID
) ? TLOG_BACK
: TLOG_FORE
,
1539 0, tempString
, 299);
1540 if (FAILED(hResult
))
1548 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1549 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1550 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1556 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1558 NMHDR
*notifyHeader
;
1559 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1563 notifyHeader
= (NMHDR
*)lParam
;
1564 if (fMenuBar
.p
!= NULL
&& notifyHeader
->hwndFrom
== fMenuBandWindow
)
1566 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&menuWinEventHandler
));
1567 hResult
= menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, &theResult
);
1570 if (fNavigationBar
.p
!= NULL
&& notifyHeader
->hwndFrom
== fNavigationWindow
)
1572 hResult
= fNavigationBar
->QueryInterface(
1573 IID_IWinEventHandler
, reinterpret_cast<void **>(&menuWinEventHandler
));
1574 hResult
= menuWinEventHandler
->OnWinEvent(m_hWnd
, uMsg
, wParam
, lParam
, &theResult
);
1580 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1582 CComObject
<CInternetToolbar
> *theToolbar
;
1588 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1589 if (theToolbar
== NULL
)
1590 return E_OUTOFMEMORY
;
1591 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
1592 if (FAILED(hResult
))