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)
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
, *(IID
*)wParam
, (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
, (void **)&dockingWindowSite
);
513 hResult
= dockingWindowSite
->GetBorderDW((IDockingWindow
*)this, &availableBorderSpace
);
516 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, (LPARAM
)&availableBorderSpace
);
517 neededBorderSpace
.left
= 0;
518 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
519 if (fLocked
== false)
520 neededBorderSpace
.top
+= 3;
521 neededBorderSpace
.right
= 0;
522 neededBorderSpace
.bottom
= 0;
523 hResult
= dockingWindowSite
->SetBorderSpaceDW((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
, IID_IShellMenu
, (void **)menuBar
);
542 hResult
= fMenuCallback
.QueryInterface(IID_IShellMenuCallback
, (void **)&callback
);
545 hResult
= (*menuBar
)->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
548 hResult
= fSite
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
551 hResult
= oleWindow
->GetWindow(&ownerWindow
);
554 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&siteCommandTarget
);
557 hResult
= siteCommandTarget
->Exec(&CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
560 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
562 hResult
= (*menuBar
)->SetMenu((HMENU
)V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
565 hResult
= (*menuBar
)->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
568 hResult
= commandTarget
->Exec(&CGID_MenuBand
, 3, 1, NULL
, NULL
);
574 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
576 CComPtr
<IUnknown
> tempBand
;
580 hResult
= ::CreateBrandBand(IID_IUnknown
, (void **)logoBar
);
582 hResult
= CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)logoBar
);
589 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
593 hResult
= ::CreateToolsBar(IID_IUnknown
, (void **)toolsBar
);
599 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
601 CComPtr
<IAddressBand
> addressBand
;
605 hResult
= ::CreateAddressBand(IID_IUnknown
, (void **)toolsBar
);
607 hResult
= CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)toolsBar
);
611 hResult
= (*toolsBar
)->QueryInterface(IID_IAddressBand
, (void **)&addressBand
);
615 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
617 REBARBANDINFOW rebarBandInfo
;
623 if (locked
!= fLocked
)
626 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
627 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
628 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
629 for (x
= 0; x
< bandCount
; x
++)
631 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
632 dockSite
= (CDockSite
*)rebarBandInfo
.lParam
;
633 if (dockSite
!= NULL
)
635 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
636 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
== true)
637 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
638 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& fLocked
== false)
639 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
640 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
643 hResult
= ReserveBorderSpace();
648 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
656 // loop through buttons
657 // for buttons in CLSID_CommonButtons
658 // if up, QueryStatus for up state and update it
660 // for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
664 hResult
= SetState(&CLSID_CommonButtons
, gForwardCommandID
, newValue
? TBSTATE_ENABLED
: 0);
668 hResult
= SetState(&CLSID_CommonButtons
, gBackCommandID
, newValue
? TBSTATE_ENABLED
: 0);
674 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
676 CComPtr
<IServiceProvider
> serviceProvider
;
679 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
680 if (FAILED (hResult
))
682 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_IBandProxy
, (void **)&fBandProxy
);
683 if (FAILED (hResult
))
685 hResult
= CreateBandProxy(IID_IBandProxy
, (void **)&fBandProxy
);
686 if (FAILED (hResult
))
688 hResult
= fBandProxy
->SetSite(fSite
);
689 if (FAILED (hResult
))
695 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
700 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
705 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
710 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
718 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
723 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
725 CComPtr
<IDockingWindow
> dockingWindow
;
729 hResult
= ReserveBorderSpace();
730 hResult
= fMenuBar
->QueryInterface(IID_IDockingWindow
, (void **)&dockingWindow
);
731 hResult
= dockingWindow
->ShowDW(fShow
);
735 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
740 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
, IUnknown
*punkToolbarSite
, BOOL fReserved
)
745 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
747 if (pClassID
== NULL
)
749 *pClassID
= CLSID_InternetToolbar
;
753 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
758 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
763 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
768 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
773 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
775 CComPtr
<IShellMenu
> menuBar
;
776 CComPtr
<IUnknown
> logoBar
;
777 CComPtr
<IUnknown
> toolsBar
;
778 CComPtr
<IUnknown
> navigationBar
;
779 CComPtr
<IOleWindow
> menuOleWindow
;
780 CComPtr
<IOleWindow
> toolbarOleWindow
;
781 CComPtr
<IOleWindow
> navigationOleWindow
;
784 hResult
= CreateMenuBar(&menuBar
);
787 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
788 hResult
= menuBar
->QueryInterface(IID_IOleWindow
, (void **)&menuOleWindow
);
789 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
790 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
792 hResult
= CreateBrandBand(&logoBar
);
795 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
796 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
798 hResult
= CreateToolsBar(&toolsBar
);
801 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
);
802 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
803 hResult
= fControlsBar
->QueryInterface(IID_IOleWindow
, (void **)&toolbarOleWindow
);
806 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
810 hResult
= CreateAddressBand(&navigationBar
);
813 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
);
814 hResult
= navigationBar
->QueryInterface(IID_IOleWindow
, (void **)&navigationOleWindow
);
815 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
816 fNavigationBar
.Attach(navigationBar
.Detach());
821 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
823 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
827 switch (prgCmds
->cmdID
)
829 case ITID_TEXTLABELS
: // Text Labels state
830 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
832 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
833 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
835 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
836 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
838 case ITID_LINKSBANDSHOWN
: // links bar visibility
841 case ITID_MENUBANDSHOWN
: // Menubar band visibility
844 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
847 case ITID_CUSTOMIZEENABLED
: // customize enabled
848 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
850 case ITID_TOOLBARLOCKED
: // lock toolbars
851 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
853 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
867 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
869 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
874 // what do I do here?
876 case ITID_TEXTLABELS
:
877 // toggle text labels
879 case ITID_TOOLBARBANDSHOWN
:
880 // toggle toolbar band visibility
882 case ITID_ADDRESSBANDSHOWN
:
883 // toggle address band visibility
885 case ITID_LINKSBANDSHOWN
:
886 // toggle links band visibility
888 case ITID_CUSTOMIZEENABLED
:
891 case ITID_TOOLBARLOCKED
:
892 return LockUnlockToolbars(!fLocked
);
898 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
903 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
908 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
913 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
919 case DISPID_BEFORENAVIGATE
:
922 case DISPID_DOWNLOADCOMPLETE
:
925 case DISPID_COMMANDSTATECHANGE
:
926 if (pDispParams
->cArgs
!= 2)
928 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
930 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) == VARIANT_FALSE
? false : true,
931 V_I4(&pDispParams
->rgvarg
[1]));
932 case DISPID_DOWNLOADBEGIN
:
935 case DISPID_NAVIGATECOMPLETE2
:
938 case DISPID_DOCUMENTCOMPLETE
:
945 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
949 fCommandTarget
.Release();
950 hResult
= theTarget
->QueryInterface(IID_IOleCommandTarget
, (void **)&fCommandTarget
);
953 fCommandCategory
= *category
;
957 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
962 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
967 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
, HINSTANCE param10
, LPCTSTR param14
, long *param18
)
971 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
, (WPARAM
)param10
, (LPARAM
)param14
);
978 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
983 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
985 if (theState
== NULL
)
987 // map the command id
988 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
992 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
994 // map the command id
995 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
999 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
, TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1004 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1008 *paramC
= MAKELONG(24, 24);
1012 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1017 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
, HIMAGELIST param14
, HIMAGELIST param18
)
1022 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1027 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1032 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1034 CComPtr
<IBrowserService
> browserService
;
1035 CComPtr
<IServiceProvider
> serviceProvider
;
1036 CComPtr
<IOleWindow
> oleWindow
;
1041 if (pUnkSite
== NULL
)
1043 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1044 ::DestroyWindow(fMainReBar
);
1050 hResult
= pUnkSite
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
1051 if (FAILED(hResult
))
1053 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1054 if (FAILED(hResult
))
1056 if (ownerWindow
== NULL
)
1059 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0, WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1060 if (dockContainer
== NULL
)
1062 SubclassWindow(dockContainer
);
1063 fMainReBar
= CreateWindow(REBARCLASSNAMEW
, _T(""), WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
|
1064 RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
,
1065 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1066 if (fMainReBar
== NULL
)
1068 hResult
= pUnkSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1069 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1070 hResult
= AtlAdvise(browserService
, (IDispatch
*)this, DIID_DWebBrowserEvents
, &fAdviseCookie
);
1075 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1077 if (ppvSite
== NULL
)
1079 if (fSite
.p
!= NULL
)
1080 return fSite
->QueryInterface(riid
, ppvSite
);
1085 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1087 CComPtr
<IServiceProvider
> serviceProvider
;
1090 if (IsEqualIID(guidService
, IID_IBandSite
))
1091 return this->QueryInterface(riid
, ppvObject
);
1092 if (IsEqualIID(guidService
, SID_IBandProxy
))
1094 if (fBandProxy
.p
== NULL
)
1096 hResult
= CreateAndInitBandProxy();
1097 if (FAILED (hResult
))
1100 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1102 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1103 if (FAILED (hResult
))
1105 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
1108 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1110 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1113 if (fMenuBar
.p
!= NULL
)
1115 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1116 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1121 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1126 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1131 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1136 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
, IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1140 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1141 return fMenuBar
->QueryInterface(IID_IDeskBand
, (void **)ppstb
);
1142 if (dwBandID
== ITBBID_BRANDBAND
&& fLogoBar
.p
!= NULL
)
1143 return fLogoBar
->QueryInterface(IID_IDeskBand
, (void **)ppstb
);
1148 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1153 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1158 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1163 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1168 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1173 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1175 CComPtr
<IServiceProvider
> serviceProvider
;
1176 CComPtr
<IWebBrowser
> webBrowser
;
1179 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1180 if (FAILED (hResult
))
1182 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IWebBrowser
, (void **)&webBrowser
);
1183 if (FAILED (hResult
))
1185 hResult
= webBrowser
->GoBack();
1189 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1191 CComPtr
<IServiceProvider
> serviceProvider
;
1192 CComPtr
<IWebBrowser
> webBrowser
;
1195 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1196 if (FAILED (hResult
))
1198 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IWebBrowser
, (void **)&webBrowser
);
1199 if (FAILED (hResult
))
1201 hResult
= webBrowser
->GoForward();
1205 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1207 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1210 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1211 if (FAILED (hResult
))
1213 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1217 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1219 CComPtr
<IObjectWithSite
> objectWithSite
;
1220 CComPtr
<IContextMenu
> contextMenu
;
1221 CMINVOKECOMMANDINFO commandInfo
;
1222 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1225 // TODO: Query shell if this command is enabled first
1227 memset(&commandInfo
, 0, sizeof(commandInfo
));
1228 commandInfo
.cbSize
= sizeof(commandInfo
);
1229 commandInfo
.hwnd
= m_hWnd
;
1230 commandInfo
.lpParameters
= searchGUID
;
1231 commandInfo
.nShow
= SW_SHOWNORMAL
;
1233 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_IContextMenu
, (void **)&contextMenu
);
1234 if (FAILED (hResult
))
1236 hResult
= contextMenu
->QueryInterface(IID_IObjectWithSite
, (void **)&objectWithSite
);
1237 if (FAILED (hResult
))
1239 hResult
= objectWithSite
->SetSite(fSite
);
1240 if (FAILED (hResult
))
1242 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1243 hResult
= objectWithSite
->SetSite(NULL
);
1247 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1249 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1252 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1253 if (FAILED (hResult
))
1255 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1259 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1263 if (fCommandTarget
.p
!= NULL
)
1265 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1270 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1272 CComPtr
<IServiceProvider
> serviceProvider
;
1273 CComPtr
<IBrowserService
> browserService
;
1274 CComPtr
<IOleCommandTarget
> commandTarget
;
1275 CComPtr
<ITravelLog
> travelLog
;
1276 NMTOOLBARW
*notifyInfo
;
1285 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1286 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1288 // not from the toolbar, keep looking for a message handler
1292 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, (LPARAM
)&bounds
);
1293 ::MapWindowPoints(fToolbarWindow
, NULL
, (POINT
*)&bounds
, 2);
1294 switch (notifyInfo
->iItem
)
1296 case gBackCommandID
:
1297 newMenu
= CreatePopupMenu();
1298 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1299 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1300 hResult
= browserService
->GetTravelLog(&travelLog
);
1301 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1302 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
1303 commandInfo
.cmdID
= 0x1d;
1304 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1305 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&& travelLog
->CountEntries(browserService
) > 1)
1307 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1308 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1310 params
.cbSize
= sizeof (params
);
1311 params
.rcExclude
= bounds
;
1312 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1313 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1314 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1316 V_VT(&parmIn
) = VT_I4
;
1318 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1320 else if (selectedItem
!= 0)
1321 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1322 DestroyMenu(newMenu
);
1324 case gForwardCommandID
:
1325 newMenu
= CreatePopupMenu();
1326 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1327 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
, (void **)&browserService
);
1328 hResult
= browserService
->GetTravelLog(&travelLog
);
1329 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1330 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
1331 commandInfo
.cmdID
= 0x1d;
1332 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1333 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&& travelLog
->CountEntries(browserService
) > 1)
1335 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1336 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1338 params
.cbSize
= sizeof (params
);
1339 params
.rcExclude
= bounds
;
1340 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1341 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1342 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1344 V_VT(&parmIn
) = VT_I4
;
1346 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1348 else if (selectedItem
!= 0)
1349 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1350 DestroyMenu(newMenu
);
1352 case gViewsCommandID
:
1354 CComVariant outValue
;
1357 V_VT(&inValue
) = VT_INT_PTR
;
1358 V_INTREF(&inValue
) = (INT
*)&bounds
;
1360 if (fCommandTarget
.p
!= NULL
)
1361 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1362 // pvaOut is VT_I4 with value 0x403
1365 return TBDDRET_DEFAULT
;
1368 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1373 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1378 LRESULT
CInternetToolbar::OnNavigateCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1380 CComPtr
<IWinEventHandler
> winEventHandler
;
1384 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, (void **)&winEventHandler
);
1385 hResult
= winEventHandler
->OnWinEvent(m_hWnd
, uMsg
, wParam
, lParam
, &theResult
);
1386 if (SUCCEEDED(hResult
))
1392 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1394 HMENU contextMenuBar
;
1396 POINT clickLocation
;
1398 RBHITTESTINFO hitTestInfo
;
1399 REBARBANDINFOW rebarBandInfo
;
1402 clickLocation
.x
= LOWORD(lParam
);
1403 clickLocation
.y
= HIWORD(lParam
);
1404 hitTestInfo
.pt
= clickLocation
;
1405 ScreenToClient(&hitTestInfo
.pt
);
1406 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1407 if (hitTestInfo
.iBand
== -1)
1409 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1410 rebarBandInfo
.fMask
= RBBIM_ID
;
1411 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1412 bandID
= rebarBandInfo
.wID
;
1413 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1414 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1417 case ITBBID_MENUBAND
: // menu band
1418 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1419 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1420 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1422 case ITBBID_BRANDBAND
: // brand band
1423 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1424 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1425 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1427 case ITBBID_TOOLSBAND
: // tools band
1428 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1429 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1431 case ITBBID_ADDRESSBAND
: // navigation band
1432 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1433 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1438 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1439 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1440 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1443 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1445 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1447 case IDM_TOOLBARS_LINKSBAR
: // links
1449 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1450 LockUnlockToolbars(!fLocked
);
1452 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1453 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1459 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1461 if (wParam
!= SIZE_MINIMIZED
)
1463 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
), SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1468 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1470 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1475 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1479 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1481 CComPtr
<IBrowserService
> browserService
;
1482 CComPtr
<ITravelLog
> travelLog
;
1483 TOOLTIPTEXTW
*pTTTW
;
1485 wchar_t tempString
[300];
1488 pTTTW
= (TOOLTIPTEXTW
*)pNMHDR
;
1489 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1490 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1492 nID
= (UINT
)pNMHDR
->idFrom
;
1496 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1498 // TODO: Should this call QueryService?
1499 hResult
= fSite
->QueryInterface(IID_IBrowserService
, (void **)&browserService
);
1500 hResult
= browserService
->GetTravelLog(&travelLog
);
1501 hResult
= travelLog
->GetToolTipText(browserService
, nID
== (UINT
)gBackCommandID
? TLOG_BACK
: TLOG_FORE
,
1502 0, tempString
, 299);
1503 if (FAILED(hResult
))
1511 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1512 ::SetWindowPos (pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0, SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1518 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1520 NMHDR
*notifyHeader
;
1521 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1525 notifyHeader
= (NMHDR
*)lParam
;
1526 if (fMenuBar
.p
!= NULL
&& notifyHeader
->hwndFrom
== fMenuBandWindow
)
1528 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1529 hResult
= menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, &theResult
);
1532 if (fNavigationBar
.p
!= NULL
&& notifyHeader
->hwndFrom
== fNavigationWindow
)
1534 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, (void **)&menuWinEventHandler
);
1535 hResult
= menuWinEventHandler
->OnWinEvent(m_hWnd
, uMsg
, wParam
, lParam
, &theResult
);
1541 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1543 CComObject
<CInternetToolbar
> *theToolbar
;
1549 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1550 if (theToolbar
== NULL
)
1551 return E_OUTOFMEMORY
;
1552 hResult
= theToolbar
->QueryInterface (riid
, (void **)ppv
);
1553 if (FAILED (hResult
))