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 #define USE_CUSTOM_MENUBAND 1
30 // navigation controls and menubar just send a message to parent window
33 ****Implement BandProxy methods
34 ****Add QueryStatus handler for built-in bands
35 ****Enable/Disable up, search, and folders commands appropriately
36 **Why are explorer toolbar separators a nonstandard width?
37 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
38 **Chevron menu on menuband doesn't work
39 **Fix CInternetToolbar::QueryBand to be generic
41 ****Fix context menu to strip divider when menu shown for menu band
42 ****Fix context menu to have items checked appropriately
43 ****Implement -1 command id update
44 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
45 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
46 Implement show/hide of bands
47 Why is the background color of my toolbars different from explorer?
48 Internet Toolbar command handler should get the target for the command and call Exec on the target.
49 For commands built in to the Internet Toolbar, its Exec handles the command
50 When window width is changed, brand band flashes badly
51 Add all bands with correct ids (system bands now add with correct ids)
53 Implement remaining IExplorerToolbar methods
54 Fix toolbar buttons to enable/disable correctly
55 After toolbar is customized, it may be necessary to patch the widths of separators
57 Check sizes and spacing of toolbars against Explorer
58 Implement resizing of the dock bar
59 Add missing icons for toolbar items
60 Draw History item in forward/back dropdown menus with icon
61 Fix toolbar customize dialog to not include separators as possible selections
62 Implement save/restore of toolbar state
63 Refactor drop down menu code to use a common function since code is so similar
66 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
67 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
68 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
69 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
70 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
72 typedef HRESULT(*PMENUBAND_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
74 class CInternetToolbar
;
77 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
78 public IDockingWindowSite
,
79 public IInputObjectSite
,
80 public IOleCommandTarget
,
81 public IServiceProvider
87 ITF_NEWBANDALWAYS
= 4,
88 ITF_GRIPPERALWAYS
= 8,
92 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
93 CInternetToolbar
*fToolbar
; // our browser
101 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
102 DESKBANDINFO fDeskBandInfo
;
106 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
107 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
110 // *** IOleWindow methods ***
111 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
112 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
114 // *** IDockingWindow methods ***
115 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
116 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
117 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
119 // *** IInputObjectSite specific methods ***
120 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
122 // *** IOleCommandTarget specific methods ***
123 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
124 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
125 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
126 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
128 // *** IServiceProvider methods ***
129 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
131 BEGIN_COM_MAP(CDockSite
)
132 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
133 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
134 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
135 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
136 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
140 CDockSite::CDockSite()
147 fInitialized
= false;
148 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
151 CDockSite::~CDockSite()
155 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
157 CComPtr
<IObjectWithSite
> site
;
158 CComPtr
<IOleWindow
> oleWindow
;
159 CComPtr
<IDeskBand
> deskBand
;
160 TCHAR textBuffer
[40];
161 REBARBANDINFOW bandInfo
;
164 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &site
));
167 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
170 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
173 fContainedBand
= containedBand
;
178 hResult
= site
->SetSite(static_cast<IOleWindow
*>(this));
181 hResult
= oleWindow
->GetWindow(&fChildWindow
);
185 memset(&bandInfo
, 0, sizeof(bandInfo
));
186 bandInfo
.cbSize
= sizeof(bandInfo
);
187 bandInfo
.lpText
= textBuffer
;
188 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
189 hResult
= GetRBBandInfo(bandInfo
);
191 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
192 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
197 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
199 CComPtr
<IDeskBand
> deskBand
;
202 hResult
= fContainedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
206 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
207 DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
208 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
209 // result of call is ignored
211 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
|
212 RBBIM_TEXT
| RBBIM_STYLE
;
214 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
215 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
216 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
217 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
218 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
219 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
220 bandInfo
.fStyle
|= RBBS_BREAK
;
221 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
222 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
223 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
)
224 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
225 if (fFlags
& ITF_NOTITLE
)
226 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
227 if (fFlags
& ITF_GRIPPERALWAYS
&& !fToolbar
->fLocked
)
228 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
229 if (fFlags
& ITF_FIXEDSIZE
)
230 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
232 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
234 bandInfo
.fMask
|= RBBIM_COLORS
;
235 bandInfo
.clrFore
= CLR_DEFAULT
;
236 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
238 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
239 bandInfo
.hwndChild
= fChildWindow
;
240 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
241 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
242 bandInfo
.wID
= fBandID
;
243 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
244 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
245 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
246 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
247 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
251 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
255 *lphwnd
= fRebarWindow
;
259 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
264 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
269 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
274 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
279 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
284 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
285 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
290 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
291 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
293 TCHAR textBuffer
[40];
294 REBARBANDINFOW bandInfo
;
298 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
302 case DBID_BANDINFOCHANGED
:
303 if (fInitialized
== false)
305 if (V_VT(pvaIn
) != VT_I4
)
307 if (V_I4(pvaIn
) != fBandID
)
309 // deskband information changed
310 // call GetBandInfo and refresh information in rebar
311 memset(&bandInfo
, 0, sizeof(bandInfo
));
312 bandInfo
.cbSize
= sizeof(bandInfo
);
313 bandInfo
.lpText
= textBuffer
;
314 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
315 hResult
= GetRBBandInfo(bandInfo
);
318 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
319 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
326 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
328 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
329 return this->QueryInterface(riid
, ppvObject
);
331 return fToolbar
->QueryService(guidService
, riid
, ppvObject
);
334 CMenuCallback::CMenuCallback()
338 CMenuCallback::~CMenuCallback()
342 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
344 CComPtr
<IShellMenu
> parentMenu
;
345 CComPtr
<IShellMenu
> newMenu
;
346 CComPtr
<IShellFolder
> favoritesFolder
;
347 LPITEMIDLIST favoritesPIDL
;
350 HMENU favoritesHMenu
;
354 static const TCHAR szFavoritesKey
[] =
355 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
357 if (!IsEqualIID(riid
, IID_IShellMenu
))
359 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
362 if (fFavoritesMenu
.p
== NULL
)
364 // create favorites menu
365 hResult
= psmd
->punk
->QueryInterface(IID_PPV_ARG(IShellMenu
, &parentMenu
));
368 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
371 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
372 if (favoritesHMenu
== NULL
)
374 #if USE_CUSTOM_MENUBAND
375 HMODULE hrs
= LoadLibrary(L
"rshell.dll");
377 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hrs
, "CMenuBand_Constructor");
380 hResult
= func(IID_PPV_ARG(IShellMenu
, &newMenu
));
384 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
385 IID_PPV_ARG(IShellMenu
, &newMenu
));
388 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
389 IID_PPV_ARG(IShellMenu
, &newMenu
));
393 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
396 hResult
= newMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
399 hResult
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &favoritesPIDL
);
402 hResult
= SHBindToFolder(favoritesPIDL
, &favoritesFolder
);
405 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
406 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
407 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| 0x18);
408 ILFree(favoritesPIDL
);
409 if (SUCCEEDED(hResult
))
410 fFavoritesMenu
.Attach(newMenu
.Detach());
412 if (fFavoritesMenu
.p
== NULL
)
414 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
417 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
429 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
430 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
432 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
434 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
438 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
441 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
448 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
449 case SMC_GETSFOBJECT
:
453 case SMC_SFSELECTITEM
:
466 case SMC_DEFAULTICON
:
470 case SMC_CHEVRONEXPAND
:
472 case SMC_DISPLAYCHEVRONTIP
:
474 case SMC_SETSFOBJECT
:
476 case SMC_SHCHANGENOTIFY
:
478 case SMC_CHEVRONGETTIP
:
480 case SMC_SFDDRESTRICTED
:
492 CInternetToolbar::CInternetToolbar()
496 fMenuBandWindow
= NULL
;
497 fNavigationWindow
= NULL
;
498 fMenuCallback
.AddRef();
499 fToolbarWindow
= NULL
;
503 CInternetToolbar::~CInternetToolbar()
505 fMenuCallback
.Release();
508 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
512 newSite
= new CComObject
<CDockSite
>;
514 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
517 HRESULT
CInternetToolbar::ReserveBorderSpace()
519 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
520 RECT availableBorderSpace
;
521 RECT neededBorderSpace
;
524 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
527 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
530 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
531 neededBorderSpace
.left
= 0;
532 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
534 neededBorderSpace
.top
+= 3;
535 neededBorderSpace
.right
= 0;
536 neededBorderSpace
.bottom
= 0;
537 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
543 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**menuBar
)
545 CComPtr
<IOleCommandTarget
> siteCommandTarget
;
546 CComPtr
<IOleWindow
> oleWindow
;
547 CComPtr
<IOleCommandTarget
> commandTarget
;
548 CComPtr
<IShellMenuCallback
> callback
;
553 #if USE_CUSTOM_MENUBAND
554 HMODULE hrs
= LoadLibraryW(L
"rshell.dll");
558 DbgPrint("Failed: %d\n", GetLastError());
562 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hrs
, "CMenuBand_Constructor");
565 hResult
= func(IID_PPV_ARG(IShellMenu
, menuBar
));
569 DbgPrint("Failed: %d\n", GetLastError());
575 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
576 IID_PPV_ARG(IShellMenu
, menuBar
));
579 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
580 IID_PPV_ARG(IShellMenu
, menuBar
));
584 hResult
= fMenuCallback
.QueryInterface(IID_PPV_ARG(IShellMenuCallback
, &callback
));
587 hResult
= (*menuBar
)->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
590 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
593 hResult
= oleWindow
->GetWindow(&ownerWindow
);
596 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &siteCommandTarget
));
599 hResult
= siteCommandTarget
->Exec(&CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
602 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
604 hResult
= (*menuBar
)->SetMenu((HMENU
)V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
607 hResult
= (*menuBar
)->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
610 hResult
= commandTarget
->Exec(&CGID_MenuBand
, 3, 1, NULL
, NULL
);
616 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
618 CComPtr
<IUnknown
> tempBand
;
622 hResult
= ::CreateBrandBand(IID_PPV_ARG(IUnknown
, logoBar
));
624 hResult
= CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, logoBar
));
631 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
635 hResult
= ::CreateToolsBar(IID_PPV_ARG(IUnknown
, toolsBar
));
641 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
643 CComPtr
<IAddressBand
> addressBand
;
647 hResult
= ::CreateAddressBand(IID_PPV_ARG(IUnknown
, toolsBar
));
649 hResult
= CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, toolsBar
));
653 hResult
= (*toolsBar
)->QueryInterface(IID_PPV_ARG(IAddressBand
, &addressBand
));
657 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
659 REBARBANDINFOW rebarBandInfo
;
664 if (locked
!= fLocked
)
667 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
668 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
669 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
670 for (INT x
= 0; x
< bandCount
; x
++)
672 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
673 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
674 if (dockSite
!= NULL
)
676 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
677 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
678 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
679 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
680 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
681 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
684 hResult
= ReserveBorderSpace();
689 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
697 // loop through buttons
698 //for buttons in CLSID_CommonButtons
699 // if up, QueryStatus for up state and update it
701 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
705 hResult
= SetState(&CLSID_CommonButtons
, gForwardCommandID
, newValue
? TBSTATE_ENABLED
: 0);
709 hResult
= SetState(&CLSID_CommonButtons
, gBackCommandID
, newValue
? TBSTATE_ENABLED
: 0);
715 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
717 CComPtr
<IServiceProvider
> serviceProvider
;
720 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
723 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
726 hResult
= CreateBandProxy(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
729 hResult
= fBandProxy
->SetSite(fSite
);
736 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
741 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
746 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
751 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
759 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
764 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
766 CComPtr
<IDockingWindow
> dockingWindow
;
770 hResult
= ReserveBorderSpace();
771 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
772 hResult
= dockingWindow
->ShowDW(fShow
);
776 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
781 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
782 IUnknown
*punkToolbarSite
, BOOL fReserved
)
787 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
789 if (pClassID
== NULL
)
791 *pClassID
= CLSID_InternetToolbar
;
795 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
800 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
805 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
810 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
815 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
817 CComPtr
<IShellMenu
> menuBar
;
818 CComPtr
<IUnknown
> logoBar
;
819 CComPtr
<IUnknown
> toolsBar
;
820 CComPtr
<IUnknown
> navigationBar
;
821 CComPtr
<IOleWindow
> menuOleWindow
;
822 CComPtr
<IOleWindow
> toolbarOleWindow
;
823 CComPtr
<IOleWindow
> navigationOleWindow
;
826 /* Create and attach the menubar to the rebar */
827 hResult
= CreateMenuBar(&menuBar
);
830 AddDockItem(menuBar
, ITBBID_MENUBAND
,
831 CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
833 hResult
= menuBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &menuOleWindow
));
834 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
835 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
837 /* Create and attach the brand/logo to the rebar */
838 hResult
= CreateBrandBand(&logoBar
);
841 AddDockItem(logoBar
, ITBBID_BRANDBAND
,
842 CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
843 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
845 /* Create and attach the standard toolbar to the rebar */
846 hResult
= CreateToolsBar(&toolsBar
);
849 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
);
850 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
851 hResult
= fControlsBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &toolbarOleWindow
));
854 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
858 /* Create and attach the address/navigation toolbar to the rebar */
859 hResult
= CreateAddressBand(&navigationBar
);
862 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
);
863 hResult
= navigationBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &navigationOleWindow
));
864 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
865 fNavigationBar
.Attach(navigationBar
.Detach());
870 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
871 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
873 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
877 switch (prgCmds
->cmdID
)
879 case ITID_TEXTLABELS
: // Text Labels state
880 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
882 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
883 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
885 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
886 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
888 case ITID_LINKSBANDSHOWN
: // links bar visibility
891 case ITID_MENUBANDSHOWN
: // Menubar band visibility
894 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
897 case ITID_CUSTOMIZEENABLED
: // customize enabled
898 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
900 case ITID_TOOLBARLOCKED
: // lock toolbars
901 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
903 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
917 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
918 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
920 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
925 // what do I do here?
927 case ITID_TEXTLABELS
:
928 // toggle text labels
930 case ITID_TOOLBARBANDSHOWN
:
931 // toggle toolbar band visibility
933 case ITID_ADDRESSBANDSHOWN
:
934 // toggle address band visibility
936 case ITID_LINKSBANDSHOWN
:
937 // toggle links band visibility
939 case ITID_CUSTOMIZEENABLED
:
942 case ITID_TOOLBARLOCKED
:
943 return LockUnlockToolbars(!fLocked
);
949 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
954 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
959 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
960 LCID lcid
, DISPID
*rgDispId
)
965 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
966 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
972 case DISPID_BEFORENAVIGATE
:
975 case DISPID_DOWNLOADCOMPLETE
:
978 case DISPID_COMMANDSTATECHANGE
:
979 if (pDispParams
->cArgs
!= 2)
981 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
983 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
984 V_I4(&pDispParams
->rgvarg
[1]));
985 case DISPID_DOWNLOADBEGIN
:
988 case DISPID_NAVIGATECOMPLETE2
:
991 case DISPID_DOCUMENTCOMPLETE
:
998 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1002 fCommandTarget
.Release();
1003 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1004 if (FAILED(hResult
))
1006 fCommandCategory
= *category
;
1010 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1015 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1020 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1021 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1025 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1026 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1033 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1038 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1040 if (theState
== NULL
)
1042 // map the command id
1043 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1047 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1049 // map the command id
1050 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1054 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1055 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1060 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1064 *paramC
= MAKELONG(24, 24);
1068 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1069 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1074 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1075 HIMAGELIST param14
, HIMAGELIST param18
)
1080 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1085 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1090 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1092 CComPtr
<IBrowserService
> browserService
;
1093 CComPtr
<IServiceProvider
> serviceProvider
;
1094 CComPtr
<IOleWindow
> oleWindow
;
1100 if (pUnkSite
== NULL
)
1102 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1103 ::DestroyWindow(fMainReBar
);
1109 // get window handle of owner
1110 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1111 if (FAILED(hResult
))
1113 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1114 if (FAILED(hResult
))
1116 if (ownerWindow
== NULL
)
1119 // create dock container
1121 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1122 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1123 if (dockContainer
== NULL
)
1125 SubclassWindow(dockContainer
);
1127 // create rebar in dock container
1128 style
= WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
|
1129 RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1130 fMainReBar
= CreateWindow(REBARCLASSNAMEW
, NULL
, style
,
1131 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1132 if (fMainReBar
== NULL
)
1135 // take advice to watch events
1136 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1137 hResult
= serviceProvider
->QueryService(
1138 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1139 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1144 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1146 if (ppvSite
== NULL
)
1148 if (fSite
.p
!= NULL
)
1149 return fSite
->QueryInterface(riid
, ppvSite
);
1154 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1156 CComPtr
<IServiceProvider
> serviceProvider
;
1159 if (IsEqualIID(guidService
, IID_IBandSite
))
1160 return this->QueryInterface(riid
, ppvObject
);
1161 if (IsEqualIID(guidService
, SID_IBandProxy
))
1163 if (fBandProxy
.p
== NULL
)
1165 hResult
= CreateAndInitBandProxy();
1166 if (FAILED(hResult
))
1169 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1171 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1174 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1175 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1177 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1182 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1183 if (menuWinEventHandler
->IsWindowOwner(hWnd
))
1185 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1192 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1197 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1202 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1207 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1208 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1212 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1213 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1214 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1215 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1220 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1225 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1230 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1235 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1240 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1245 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1247 CComPtr
<IServiceProvider
> serviceProvider
;
1248 CComPtr
<IWebBrowser
> webBrowser
;
1251 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1252 if (FAILED(hResult
))
1254 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1255 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1256 if (FAILED(hResult
))
1258 hResult
= webBrowser
->GoBack();
1262 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1264 CComPtr
<IServiceProvider
> serviceProvider
;
1265 CComPtr
<IWebBrowser
> webBrowser
;
1268 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1269 if (FAILED(hResult
))
1271 hResult
= serviceProvider
->QueryService(
1272 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1273 if (FAILED(hResult
))
1275 hResult
= webBrowser
->GoForward();
1279 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1281 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1284 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1285 if (FAILED(hResult
))
1287 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1291 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1293 CComPtr
<IObjectWithSite
> objectWithSite
;
1294 CComPtr
<IContextMenu
> contextMenu
;
1295 CMINVOKECOMMANDINFO commandInfo
;
1296 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1299 // TODO: Query shell if this command is enabled first
1301 memset(&commandInfo
, 0, sizeof(commandInfo
));
1302 commandInfo
.cbSize
= sizeof(commandInfo
);
1303 commandInfo
.hwnd
= m_hWnd
;
1304 commandInfo
.lpParameters
= searchGUID
;
1305 commandInfo
.nShow
= SW_SHOWNORMAL
;
1307 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1308 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1309 if (FAILED(hResult
))
1311 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1312 if (FAILED(hResult
))
1314 hResult
= objectWithSite
->SetSite(fSite
);
1315 if (FAILED(hResult
))
1317 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1318 hResult
= objectWithSite
->SetSite(NULL
);
1322 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1324 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1327 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1328 if (FAILED(hResult
))
1330 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1334 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1338 if (fCommandTarget
.p
!= NULL
)
1340 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1345 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1347 CComPtr
<IServiceProvider
> serviceProvider
;
1348 CComPtr
<IBrowserService
> browserService
;
1349 CComPtr
<IOleCommandTarget
> commandTarget
;
1350 CComPtr
<ITravelLog
> travelLog
;
1351 NMTOOLBARW
*notifyInfo
;
1360 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1361 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1363 // not from the toolbar, keep looking for a message handler
1367 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1368 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1369 switch (notifyInfo
->iItem
)
1371 case gBackCommandID
:
1372 newMenu
= CreatePopupMenu();
1373 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1374 hResult
= serviceProvider
->QueryService(
1375 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1376 hResult
= browserService
->GetTravelLog(&travelLog
);
1377 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1378 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1379 commandInfo
.cmdID
= 0x1d;
1380 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1381 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1382 travelLog
->CountEntries(browserService
) > 1)
1384 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1385 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1387 params
.cbSize
= sizeof (params
);
1388 params
.rcExclude
= bounds
;
1389 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1390 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1391 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1393 V_VT(&parmIn
) = VT_I4
;
1395 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1397 else if (selectedItem
!= 0)
1398 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1399 DestroyMenu(newMenu
);
1401 case gForwardCommandID
:
1402 newMenu
= CreatePopupMenu();
1403 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1404 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1405 hResult
= browserService
->GetTravelLog(&travelLog
);
1406 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1407 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1408 commandInfo
.cmdID
= 0x1d;
1409 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1410 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1411 travelLog
->CountEntries(browserService
) > 1)
1413 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1414 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1416 params
.cbSize
= sizeof (params
);
1417 params
.rcExclude
= bounds
;
1418 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1419 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1420 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1422 V_VT(&parmIn
) = VT_I4
;
1424 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1426 else if (selectedItem
!= 0)
1427 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1428 DestroyMenu(newMenu
);
1430 case gViewsCommandID
:
1432 CComVariant outValue
;
1435 V_VT(&inValue
) = VT_INT_PTR
;
1436 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1438 if (fCommandTarget
.p
!= NULL
)
1439 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1440 // pvaOut is VT_I4 with value 0x403
1443 return TBDDRET_DEFAULT
;
1446 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1451 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1456 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1458 HMENU contextMenuBar
;
1460 POINT clickLocation
;
1462 RBHITTESTINFO hitTestInfo
;
1463 REBARBANDINFOW rebarBandInfo
;
1466 clickLocation
.x
= LOWORD(lParam
);
1467 clickLocation
.y
= HIWORD(lParam
);
1468 hitTestInfo
.pt
= clickLocation
;
1469 ScreenToClient(&hitTestInfo
.pt
);
1470 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1471 if (hitTestInfo
.iBand
== -1)
1473 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1474 rebarBandInfo
.fMask
= RBBIM_ID
;
1475 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1476 bandID
= rebarBandInfo
.wID
;
1477 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1478 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1481 case ITBBID_MENUBAND
: // menu band
1482 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1483 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1484 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1486 case ITBBID_BRANDBAND
: // brand band
1487 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1488 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1489 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1491 case ITBBID_TOOLSBAND
: // tools band
1492 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1493 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1495 case ITBBID_ADDRESSBAND
: // navigation band
1496 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1497 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1502 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1503 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1504 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1507 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1509 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1511 case IDM_TOOLBARS_LINKSBAR
: // links
1513 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1514 LockUnlockToolbars(!fLocked
);
1516 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1517 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1523 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1525 if (wParam
!= SIZE_MINIMIZED
)
1527 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1528 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1533 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1535 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1540 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1544 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1546 CComPtr
<IBrowserService
> browserService
;
1547 CComPtr
<ITravelLog
> travelLog
;
1548 TOOLTIPTEXTW
*pTTTW
;
1550 wchar_t tempString
[300];
1553 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1554 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1555 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1557 nID
= (UINT
)pNMHDR
->idFrom
;
1561 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1563 // TODO: Should this call QueryService?
1564 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1565 hResult
= browserService
->GetTravelLog(&travelLog
);
1566 hResult
= travelLog
->GetToolTipText(browserService
,
1567 (nID
== (UINT
)gBackCommandID
) ? TLOG_BACK
: TLOG_FORE
,
1568 0, tempString
, 299);
1569 if (FAILED(hResult
))
1577 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1578 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1579 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1585 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1589 HWND target
= (HWND
) lParam
;
1593 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1594 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1595 if (SUCCEEDED(hResult
))
1597 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1599 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1600 return FAILED(hResult
) ? 0 : theResult
;
1607 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1608 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1609 if (SUCCEEDED(hResult
))
1611 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1613 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1614 return FAILED(hResult
) ? 0 : theResult
;
1621 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1623 NMHDR
*notifyHeader
;
1627 notifyHeader
= (NMHDR
*) lParam
;
1631 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1632 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1633 if (SUCCEEDED(hResult
))
1635 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1637 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1638 return FAILED(hResult
) ? 0 : theResult
;
1645 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1646 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1647 if (SUCCEEDED(hResult
))
1649 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1651 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1652 return FAILED(hResult
) ? 0 : theResult
;
1660 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1662 CComObject
<CInternetToolbar
> *theToolbar
;
1668 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1669 if (theToolbar
== NULL
)
1670 return E_OUTOFMEMORY
;
1671 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
1672 if (FAILED(hResult
))