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 #include <shlobj_undoc.h>
29 #include <shlguid_undoc.h>
38 #include "internettoolbar.h"
40 // navigation controls and menubar just send a message to parent window
43 ****Implement BandProxy methods
44 ****Add QueryStatus handler for built-in bands
45 ****Enable/Disable up, search, and folders commands appropriately
46 **Why are explorer toolbar separators a nonstandard width?
47 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
48 **Chevron menu on menuband doesn't work
49 **Fix CInternetToolbar::QueryBand to be generic
51 ****Fix context menu to strip divider when menu shown for menu band
52 ****Fix context menu to have items checked appropriately
53 ****Implement -1 command id update
54 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
55 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
56 Implement show/hide of bands
57 Why is the background color of my toolbars different from explorer?
58 Internet Toolbar command handler should get the target for the command and call Exec on the target.
59 For commands built in to the Internet Toolbar, its Exec handles the command
60 When window width is changed, brand band flashes badly
61 Add all bands with correct ids (system bands now add with correct ids)
63 Implement remaining IExplorerToolbar methods
64 Fix toolbar buttons to enable/disable correctly
65 After toolbar is customized, it may be necessary to patch the widths of separators
67 Check sizes and spacing of toolbars against Explorer
68 Implement resizing of the dock bar
69 Add missing icons for toolbar items
70 Draw History item in forward/back dropdown menus with icon
71 Fix toolbar customize dialog to not include separators as possible selections
72 Implement save/restore of toolbar state
73 Refactor drop down menu code to use a common function since code is so similar
76 extern HRESULT WINAPI
SHBindToFolder(LPITEMIDLIST path
, IShellFolder
**newFolder
);
77 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
78 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
79 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
80 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
82 class CInternetToolbar
;
85 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
86 public IDockingWindowSite
,
87 public IInputObjectSite
,
88 public IOleCommandTarget
,
89 public IServiceProvider
95 ITF_NEWBANDALWAYS
= 4,
96 ITF_GRIPPERALWAYS
= 8,
100 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
101 CInternetToolbar
*fToolbar
; // our browser
109 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
110 DESKBANDINFO fDeskBandInfo
;
114 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
115 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
118 // *** IOleWindow methods ***
119 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
120 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
122 // *** IDockingWindow methods ***
123 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
124 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
125 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
127 // *** IInputObjectSite specific methods ***
128 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
130 // *** IOleCommandTarget specific methods ***
131 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
132 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
134 // *** IServiceProvider methods ***
135 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
137 BEGIN_COM_MAP(CDockSite
)
138 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
139 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
140 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
141 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
142 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
146 CDockSite::CDockSite()
151 fInitialized
= false;
152 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
155 CDockSite::~CDockSite()
159 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
161 CComPtr
<IObjectWithSite
> site
;
162 CComPtr
<IOleWindow
> oleWindow
;
163 CComPtr
<IDeskBand
> deskBand
;
164 TCHAR textBuffer
[40];
165 REBARBANDINFOW bandInfo
;
169 hResult
= containedBand
->QueryInterface(IID_IObjectWithSite
, (void **)&site
);
172 hResult
= containedBand
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
175 hResult
= containedBand
->QueryInterface(IID_IDeskBand
, (void **)&deskBand
);
178 fContainedBand
= containedBand
;
183 hResult
= site
->SetSite((IOleWindow
*)this);
186 hResult
= oleWindow
->GetWindow(&fChildWindow
);
190 memset(&bandInfo
, 0, sizeof(bandInfo
));
191 bandInfo
.cbSize
= sizeof(bandInfo
);
192 bandInfo
.lpText
= textBuffer
;
193 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
194 hResult
= GetRBBandInfo(bandInfo
);
196 bandCount
= (int)SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
197 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
202 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
204 CComPtr
<IDeskBand
> deskBand
;
207 hResult
= fContainedBand
->QueryInterface(IID_IDeskBand
, (void **)&deskBand
);
211 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
| DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
212 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
213 // result of call is ignored
215 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
| RBBIM_TEXT
| RBBIM_STYLE
;
217 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
218 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
219 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
220 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
221 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
222 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
223 bandInfo
.fStyle
|= RBBS_BREAK
;
224 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
225 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
226 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
== true)
227 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
228 if (fFlags
& ITF_NOTITLE
)
229 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
230 if (fFlags
& ITF_GRIPPERALWAYS
&& fToolbar
->fLocked
== false)
231 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
232 if (fFlags
& ITF_FIXEDSIZE
)
233 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
235 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
237 bandInfo
.fMask
|= RBBIM_COLORS
;
238 bandInfo
.clrFore
= CLR_DEFAULT
;
239 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
241 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
242 bandInfo
.hwndChild
= fChildWindow
;
243 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
244 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
245 bandInfo
.wID
= fBandID
;
246 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
247 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
248 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
249 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
250 bandInfo
.lParam
= (LPARAM
)this;
254 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
258 *lphwnd
= fRebarWindow
;
262 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
267 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
272 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
277 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
282 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
287 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
292 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
294 TCHAR textBuffer
[40];
295 REBARBANDINFOW bandInfo
;
299 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
303 case DBID_BANDINFOCHANGED
:
304 if (fInitialized
== false)
306 if (V_VT(pvaIn
) != VT_I4
)
308 if (V_I4(pvaIn
) != fBandID
)
310 // deskband information changed
311 // call GetBandInfo and refresh information in rebar
312 memset(&bandInfo
, 0, sizeof(bandInfo
));
313 bandInfo
.cbSize
= sizeof(bandInfo
);
314 bandInfo
.lpText
= textBuffer
;
315 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
316 hResult
= GetRBBandInfo(bandInfo
);
319 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
320 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
327 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
329 CComPtr
<IServiceProvider
> serviceProvider
;
332 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
333 return this->QueryInterface(riid
, ppvObject
);
334 hResult
= fToolbar
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
335 if (FAILED (hResult
))
337 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
340 CMenuCallback::CMenuCallback()
344 CMenuCallback::~CMenuCallback()
348 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
350 CComPtr
<IShellMenu
> parentMenu
;
351 CComPtr
<IShellMenu
> newMenu
;
352 CComPtr
<IShellFolder
> favoritesFolder
;
353 LPITEMIDLIST favoritesPIDL
;
356 HMENU favoritesHMenu
;
361 if (!IsEqualIID(riid
, IID_IShellMenu
))
363 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
365 if (fFavoritesMenu
.p
== NULL
)
367 hResult
= psmd
->punk
->QueryInterface(IID_IShellMenu
, (void **)&parentMenu
);
370 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
373 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
374 if (favoritesHMenu
== NULL
)
376 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IShellMenu
, (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
, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites"),
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
= (SMINFO
*)lParam
;
416 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
417 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
418 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
420 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;}
421 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
428 return GetObject(psmd
, *(IID
*)wParam
, (void **)lParam
);
429 case SMC_GETSFOBJECT
:
433 case SMC_SFSELECTITEM
:
446 case SMC_DEFAULTICON
:
450 case SMC_CHEVRONEXPAND
:
452 case SMC_DISPLAYCHEVRONTIP
:
454 case SMC_SETSFOBJECT
:
456 case SMC_SHCHANGENOTIFY
:
458 case SMC_CHEVRONGETTIP
:
460 case SMC_SFDDRESTRICTED
:
472 CInternetToolbar::CInternetToolbar()
476 fMenuBandWindow
= NULL
;
477 fNavigationWindow
= NULL
;
478 fMenuCallback
.AddRef();
479 fToolbarWindow
= NULL
;
483 CInternetToolbar::~CInternetToolbar()
485 fMenuCallback
.Release();
488 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
492 newSite
= new CComObject
<CDockSite
>;
494 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
497 HRESULT
CInternetToolbar::ReserveBorderSpace()
499 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
500 RECT availableBorderSpace
;
501 RECT neededBorderSpace
;
504 hResult
= fSite
->QueryInterface(IID_IDockingWindowSite
, (void **)&dockingWindowSite
);
507 hResult
= dockingWindowSite
->GetBorderDW((IDockingWindow
*)this, &availableBorderSpace
);
510 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, (LPARAM
)&availableBorderSpace
);
511 neededBorderSpace
.left
= 0;
512 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
513 if (fLocked
== false)
514 neededBorderSpace
.top
+= 3;
515 neededBorderSpace
.right
= 0;
516 neededBorderSpace
.bottom
= 0;
517 hResult
= dockingWindowSite
->SetBorderSpaceDW((IDockingWindow
*)this, &neededBorderSpace
);
523 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**menuBar
)
525 CComPtr
<IOleCommandTarget
> siteCommandTarget
;
526 CComPtr
<IOleWindow
> oleWindow
;
527 CComPtr
<IOleCommandTarget
> commandTarget
;
528 CComPtr
<IShellMenuCallback
> callback
;
533 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IShellMenu
, (void **)menuBar
);
536 hResult
= fMenuCallback
.QueryInterface(IID_IShellMenuCallback
, (void **)&callback
);
539 hResult
= (*menuBar
)->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
542 hResult
= fSite
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
545 hResult
= oleWindow
->GetWindow(&ownerWindow
);
548 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&siteCommandTarget
);
551 hResult
= siteCommandTarget
->Exec(&CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
554 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
556 hResult
= (*menuBar
)->SetMenu((HMENU
)V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
559 hResult
= (*menuBar
)->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
562 hResult
= commandTarget
->Exec(&CGID_MenuBand
, 3, 1, NULL
, NULL
);
568 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
570 CComPtr
<IUnknown
> tempBand
;
574 hResult
= ::CreateBrandBand(IID_IUnknown
, (void **)logoBar
);
576 hResult
= CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)logoBar
);
583 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
587 hResult
= ::CreateToolsBar(IID_IUnknown
, (void **)toolsBar
);
593 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
595 CComPtr
<IAddressBand
> addressBand
;
599 hResult
= ::CreateAddressBand(IID_IUnknown
, (void **)toolsBar
);
601 hResult
= CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)toolsBar
);
605 hResult
= (*toolsBar
)->QueryInterface(IID_IAddressBand
, (void **)&addressBand
);
609 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
611 REBARBANDINFOW rebarBandInfo
;
617 if (locked
!= fLocked
)
620 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
621 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
622 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
623 for (x
= 0; x
< bandCount
; x
++)
625 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
626 dockSite
= (CDockSite
*)rebarBandInfo
.lParam
;
627 if (dockSite
!= NULL
)
629 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
630 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
== true)
631 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
632 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& fLocked
== false)
633 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
634 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
637 hResult
= ReserveBorderSpace();
642 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
650 // loop through buttons
651 // for buttons in CLSID_CommonButtons
652 // if up, QueryStatus for up state and update it
654 // for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
658 hResult
= SetState(&CLSID_CommonButtons
, gForwardCommandID
, newValue
? TBSTATE_ENABLED
: 0);
662 hResult
= SetState(&CLSID_CommonButtons
, gBackCommandID
, newValue
? TBSTATE_ENABLED
: 0);
668 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
670 CComPtr
<IServiceProvider
> serviceProvider
;
673 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
674 if (FAILED (hResult
))
676 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_IBandProxy
, (void **)&fBandProxy
);
677 if (FAILED (hResult
))
679 hResult
= CreateBandProxy(IID_IBandProxy
, (void **)&fBandProxy
);
680 if (FAILED (hResult
))
682 hResult
= fBandProxy
->SetSite(fSite
);
683 if (FAILED (hResult
))
689 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
694 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
699 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
704 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
712 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
717 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
719 CComPtr
<IDockingWindow
> dockingWindow
;
723 hResult
= ReserveBorderSpace();
724 hResult
= fMenuBar
->QueryInterface(IID_IDockingWindow
, (void **)&dockingWindow
);
725 hResult
= dockingWindow
->ShowDW(fShow
);
729 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
734 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
739 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
741 if (pClassID
== NULL
)
743 *pClassID
= CLSID_InternetToolbar
;
747 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
752 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
757 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
762 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
767 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
769 CComPtr
<IShellMenu
> menuBar
;
770 CComPtr
<IUnknown
> logoBar
;
771 CComPtr
<IUnknown
> toolsBar
;
772 CComPtr
<IUnknown
> navigationBar
;
773 CComPtr
<IOleWindow
> menuOleWindow
;
774 CComPtr
<IOleWindow
> toolbarOleWindow
;
775 CComPtr
<IOleWindow
> navigationOleWindow
;
778 hResult
= CreateMenuBar(&menuBar
);
781 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
782 hResult
= menuBar
->QueryInterface(IID_IOleWindow
, (void **)&menuOleWindow
);
783 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
784 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
786 hResult
= CreateBrandBand(&logoBar
);
789 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
790 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
792 hResult
= CreateToolsBar(&toolsBar
);
795 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
);
796 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
797 hResult
= fControlsBar
->QueryInterface(IID_IOleWindow
, (void **)&toolbarOleWindow
);
800 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
804 hResult
= CreateAddressBand(&navigationBar
);
807 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
);
808 hResult
= navigationBar
->QueryInterface(IID_IOleWindow
, (void **)&navigationOleWindow
);
809 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
810 fNavigationBar
.Attach(navigationBar
.Detach());
815 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
817 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
821 switch (prgCmds
->cmdID
)
823 case ITID_TEXTLABELS
: // Text Labels state
824 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
826 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
827 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
829 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
830 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
832 case ITID_LINKSBANDSHOWN
: // links bar visibility
835 case ITID_MENUBANDSHOWN
: // Menubar band visibility
838 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
841 case ITID_CUSTOMIZEENABLED
: // customize enabled
842 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
844 case ITID_TOOLBARLOCKED
: // lock toolbars
845 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
847 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
861 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
863 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
868 // what do I do here?
870 case ITID_TEXTLABELS
:
871 // toggle text labels
873 case ITID_TOOLBARBANDSHOWN
:
874 // toggle toolbar band visibility
876 case ITID_ADDRESSBANDSHOWN
:
877 // toggle address band visibility
879 case ITID_LINKSBANDSHOWN
:
880 // toggle links band visibility
882 case ITID_CUSTOMIZEENABLED
:
885 case ITID_TOOLBARLOCKED
:
886 return LockUnlockToolbars(!fLocked
);
892 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
897 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
902 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
907 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
913 case DISPID_BEFORENAVIGATE
:
916 case DISPID_DOWNLOADCOMPLETE
:
919 case DISPID_COMMANDSTATECHANGE
:
920 if (pDispParams
->cArgs
!= 2)
922 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
924 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) == VARIANT_FALSE
? false : true,
925 V_I4(&pDispParams
->rgvarg
[1]));
926 case DISPID_DOWNLOADBEGIN
:
929 case DISPID_NAVIGATECOMPLETE2
:
932 case DISPID_DOCUMENTCOMPLETE
:
939 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
943 fCommandTarget
.Release();
944 hResult
= theTarget
->QueryInterface(IID_IOleCommandTarget
, (void **)&fCommandTarget
);
947 fCommandCategory
= *category
;
951 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
956 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
961 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
, HINSTANCE param10
, LPCTSTR param14
, long *param18
)
965 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
, (WPARAM
)param10
, (LPARAM
)param14
);
972 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
977 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
979 if (theState
== NULL
)
981 // map the command id
982 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
986 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
988 // map the command id
989 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
993 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
, TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
998 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1002 *paramC
= MAKELONG(24, 24);
1006 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1011 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
, HIMAGELIST param14
, HIMAGELIST param18
)
1016 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1021 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1026 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1028 CComPtr
<IBrowserService
> browserService
;
1029 CComPtr
<IServiceProvider
> serviceProvider
;
1030 CComPtr
<IOleWindow
> oleWindow
;
1035 if (pUnkSite
== NULL
)
1037 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1038 ::DestroyWindow(fMainReBar
);
1044 hResult
= pUnkSite
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
1045 if (FAILED(hResult
))
1047 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1048 if (FAILED(hResult
))
1050 if (ownerWindow
== NULL
)
1053 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0, WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1054 if (dockContainer
== NULL
)
1056 SubclassWindow(dockContainer
);
1057 fMainReBar
= CreateWindow(REBARCLASSNAMEW
, _T(""), WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
|
1058 RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
,
1059 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1060 if (fMainReBar
== NULL
)
1062 hResult
= pUnkSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1063 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1064 hResult
= AtlAdvise(browserService
, (IDispatch
*)this, DIID_DWebBrowserEvents
, &fAdviseCookie
);
1069 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1071 if (ppvSite
== NULL
)
1073 if (fSite
.p
!= NULL
)
1074 return fSite
->QueryInterface(riid
, ppvSite
);
1079 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1081 CComPtr
<IServiceProvider
> serviceProvider
;
1084 if (IsEqualIID(guidService
, IID_IBandSite
))
1085 return this->QueryInterface(riid
, ppvObject
);
1086 if (IsEqualIID(guidService
, SID_IBandProxy
))
1088 if (fBandProxy
.p
== NULL
)
1090 hResult
= CreateAndInitBandProxy();
1091 if (FAILED (hResult
))
1094 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1096 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1097 if (FAILED (hResult
))
1099 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
1102 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1104 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1107 if (fMenuBar
.p
!= NULL
)
1109 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1110 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1115 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1120 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1125 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1130 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1134 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1135 return fMenuBar
->QueryInterface(IID_IDeskBand
, (void **)ppstb
);
1136 if (dwBandID
== ITBBID_BRANDBAND
&& fLogoBar
.p
!= NULL
)
1137 return fLogoBar
->QueryInterface(IID_IDeskBand
, (void **)ppstb
);
1142 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1147 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1152 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1157 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1162 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1167 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1169 CComPtr
<IServiceProvider
> serviceProvider
;
1170 CComPtr
<IWebBrowser
> webBrowser
;
1173 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1174 if (FAILED (hResult
))
1176 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IWebBrowser
, (void **)&webBrowser
);
1177 if (FAILED (hResult
))
1179 hResult
= webBrowser
->GoBack();
1183 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1185 CComPtr
<IServiceProvider
> serviceProvider
;
1186 CComPtr
<IWebBrowser
> webBrowser
;
1189 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1190 if (FAILED (hResult
))
1192 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IWebBrowser
, (void **)&webBrowser
);
1193 if (FAILED (hResult
))
1195 hResult
= webBrowser
->GoForward();
1199 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1201 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1204 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1205 if (FAILED (hResult
))
1207 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1211 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1213 CComPtr
<IObjectWithSite
> objectWithSite
;
1214 CComPtr
<IContextMenu
> contextMenu
;
1215 CMINVOKECOMMANDINFO commandInfo
;
1216 char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1219 // TODO: Query shell if this command is enabled first
1221 memset(&commandInfo
, 0, sizeof(commandInfo
));
1222 commandInfo
.cbSize
= sizeof(commandInfo
);
1223 commandInfo
.hwnd
= m_hWnd
;
1224 commandInfo
.lpParameters
= searchGUID
;
1225 commandInfo
.nShow
= SW_SHOWNORMAL
;
1227 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_IContextMenu
, (void **)&contextMenu
);
1228 if (FAILED (hResult
))
1230 hResult
= contextMenu
->QueryInterface(IID_IObjectWithSite
, (void **)&objectWithSite
);
1231 if (FAILED (hResult
))
1233 hResult
= objectWithSite
->SetSite(fSite
);
1234 if (FAILED (hResult
))
1236 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1237 hResult
= objectWithSite
->SetSite(NULL
);
1241 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1243 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1246 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1247 if (FAILED (hResult
))
1249 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1253 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1257 if (fCommandTarget
.p
!= NULL
)
1259 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1264 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1266 CComPtr
<IServiceProvider
> serviceProvider
;
1267 CComPtr
<IBrowserService
> browserService
;
1268 CComPtr
<IOleCommandTarget
> commandTarget
;
1269 CComPtr
<ITravelLog
> travelLog
;
1270 NMTOOLBARW
*notifyInfo
;
1279 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1280 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1282 // not from the toolbar, keep looking for a message handler
1286 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, (LPARAM
)&bounds
);
1287 ::MapWindowPoints(fToolbarWindow
, NULL
, (POINT
*)&bounds
, 2);
1288 switch (notifyInfo
->iItem
)
1290 case gBackCommandID
:
1291 newMenu
= CreatePopupMenu();
1292 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1293 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1294 hResult
= browserService
->GetTravelLog(&travelLog
);
1295 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1296 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
1297 commandInfo
.cmdID
= 0x1d;
1298 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1299 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&& travelLog
->CountEntries(browserService
) > 1)
1301 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1302 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1304 params
.cbSize
= sizeof (params
);
1305 params
.rcExclude
= bounds
;
1306 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1307 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1308 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1310 V_VT(&parmIn
) = VT_I4
;
1312 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1314 else if (selectedItem
!= 0)
1315 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1316 DestroyMenu(newMenu
);
1318 case gForwardCommandID
:
1319 newMenu
= CreatePopupMenu();
1320 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1321 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1322 hResult
= browserService
->GetTravelLog(&travelLog
);
1323 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1324 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
1325 commandInfo
.cmdID
= 0x1d;
1326 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1327 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&& travelLog
->CountEntries(browserService
) > 1)
1329 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1330 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1332 params
.cbSize
= sizeof (params
);
1333 params
.rcExclude
= bounds
;
1334 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1335 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1336 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1338 V_VT(&parmIn
) = VT_I4
;
1340 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1342 else if (selectedItem
!= 0)
1343 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1344 DestroyMenu(newMenu
);
1346 case gViewsCommandID
:
1348 CComVariant outValue
;
1351 V_VT(&inValue
) = VT_INT_PTR
;
1352 V_INTREF(&inValue
) = (INT
*)&bounds
;
1354 if (fCommandTarget
.p
!= NULL
)
1355 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1356 // pvaOut is VT_I4 with value 0x403
1359 return TBDDRET_DEFAULT
;
1362 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1367 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1372 LRESULT
CInternetToolbar::OnNavigateCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1374 CComPtr
<IWinEventHandler
> winEventHandler
;
1378 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, (void **)&winEventHandler
);
1379 hResult
= winEventHandler
->OnWinEvent(m_hWnd
, uMsg
, wParam
, lParam
, &theResult
);
1380 if (SUCCEEDED(hResult
))
1386 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1388 HMENU contextMenuBar
;
1390 POINT clickLocation
;
1392 RBHITTESTINFO hitTestInfo
;
1393 REBARBANDINFOW rebarBandInfo
;
1396 clickLocation
.x
= LOWORD(lParam
);
1397 clickLocation
.y
= HIWORD(lParam
);
1398 hitTestInfo
.pt
= clickLocation
;
1399 ScreenToClient(&hitTestInfo
.pt
);
1400 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1401 if (hitTestInfo
.iBand
== -1)
1403 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1404 rebarBandInfo
.fMask
= RBBIM_ID
;
1405 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1406 bandID
= rebarBandInfo
.wID
;
1407 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1408 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1411 case ITBBID_MENUBAND
: // menu band
1412 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1413 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1414 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1416 case ITBBID_BRANDBAND
: // brand band
1417 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1418 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1419 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1421 case ITBBID_TOOLSBAND
: // tools band
1422 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1423 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1425 case ITBBID_ADDRESSBAND
: // navigation band
1426 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1427 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1432 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1433 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1434 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1437 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1439 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1441 case IDM_TOOLBARS_LINKSBAR
: // links
1443 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1444 LockUnlockToolbars(!fLocked
);
1446 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1447 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1453 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1455 if (wParam
!= SIZE_MINIMIZED
)
1457 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
), SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1462 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1464 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1469 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1473 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1475 CComPtr
<IBrowserService
> browserService
;
1476 CComPtr
<ITravelLog
> travelLog
;
1477 TOOLTIPTEXTW
*pTTTW
;
1479 wchar_t tempString
[300];
1482 pTTTW
= (TOOLTIPTEXTW
*)pNMHDR
;
1483 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1484 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1486 nID
= (UINT
)pNMHDR
->idFrom
;
1490 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1492 // TODO: Should this call QueryService?
1493 hResult
= fSite
->QueryInterface(IID_IBrowserService
, (void **)&browserService
);
1494 hResult
= browserService
->GetTravelLog(&travelLog
);
1495 hResult
= travelLog
->GetToolTipText(browserService
, nID
== (UINT
)gBackCommandID
? TLOG_BACK
: TLOG_FORE
,
1496 0, tempString
, 299);
1497 if (FAILED(hResult
))
1505 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1506 ::SetWindowPos (pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0, SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1512 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1514 NMHDR
*notifyHeader
;
1515 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1519 notifyHeader
= (NMHDR
*)lParam
;
1520 if (fMenuBar
.p
!= NULL
&& notifyHeader
->hwndFrom
== fMenuBandWindow
)
1522 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1523 hResult
= menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, &theResult
);
1526 if (fNavigationBar
.p
!= NULL
&& notifyHeader
->hwndFrom
== fNavigationWindow
)
1528 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1529 hResult
= menuWinEventHandler
->OnWinEvent(m_hWnd
, uMsg
, wParam
, lParam
, &theResult
);
1535 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1537 CComObject
<CInternetToolbar
> *theToolbar
;
1543 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1544 if (theToolbar
== NULL
)
1545 return E_OUTOFMEMORY
;
1546 hResult
= theToolbar
->QueryInterface (riid
, (void **)ppv
);
1547 if (FAILED (hResult
))