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_IUnknown
,
625 reinterpret_cast<void **>(logoBar
));
632 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
636 hResult
= ::CreateToolsBar(IID_PPV_ARG(IUnknown
, toolsBar
));
642 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
644 CComPtr
<IAddressBand
> addressBand
;
648 hResult
= ::CreateAddressBand(IID_PPV_ARG(IUnknown
, toolsBar
));
650 hResult
= CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
,
651 reinterpret_cast<void **>(toolsBar
));
655 hResult
= (*toolsBar
)->QueryInterface(IID_PPV_ARG(IAddressBand
, &addressBand
));
659 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
661 REBARBANDINFOW rebarBandInfo
;
666 if (locked
!= fLocked
)
669 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
670 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
671 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
672 for (INT x
= 0; x
< bandCount
; x
++)
674 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
675 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
676 if (dockSite
!= NULL
)
678 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
679 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
680 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
681 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
682 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
683 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
686 hResult
= ReserveBorderSpace();
691 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
699 // loop through buttons
700 //for buttons in CLSID_CommonButtons
701 // if up, QueryStatus for up state and update it
703 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
707 hResult
= SetState(&CLSID_CommonButtons
, gForwardCommandID
, newValue
? TBSTATE_ENABLED
: 0);
711 hResult
= SetState(&CLSID_CommonButtons
, gBackCommandID
, newValue
? TBSTATE_ENABLED
: 0);
717 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
719 CComPtr
<IServiceProvider
> serviceProvider
;
722 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
725 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
728 hResult
= CreateBandProxy(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
731 hResult
= fBandProxy
->SetSite(fSite
);
738 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
743 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
748 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
753 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
761 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
766 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
768 CComPtr
<IDockingWindow
> dockingWindow
;
772 hResult
= ReserveBorderSpace();
773 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
774 hResult
= dockingWindow
->ShowDW(fShow
);
778 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
783 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
784 IUnknown
*punkToolbarSite
, BOOL fReserved
)
789 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
791 if (pClassID
== NULL
)
793 *pClassID
= CLSID_InternetToolbar
;
797 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
802 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
807 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
812 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
817 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
819 CComPtr
<IShellMenu
> menuBar
;
820 CComPtr
<IUnknown
> logoBar
;
821 CComPtr
<IUnknown
> toolsBar
;
822 CComPtr
<IUnknown
> navigationBar
;
823 CComPtr
<IOleWindow
> menuOleWindow
;
824 CComPtr
<IOleWindow
> toolbarOleWindow
;
825 CComPtr
<IOleWindow
> navigationOleWindow
;
828 /* Create and attach the menubar to the rebar */
829 hResult
= CreateMenuBar(&menuBar
);
832 AddDockItem(menuBar
, ITBBID_MENUBAND
,
833 CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
835 hResult
= menuBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &menuOleWindow
));
836 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
837 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
839 /* Create and attach the brand/logo to the rebar */
840 hResult
= CreateBrandBand(&logoBar
);
843 AddDockItem(logoBar
, ITBBID_BRANDBAND
,
844 CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
845 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
847 /* Create and attach the standard toolbar to the rebar */
848 hResult
= CreateToolsBar(&toolsBar
);
851 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
);
852 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
853 hResult
= fControlsBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &toolbarOleWindow
));
856 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
860 /* Create and attach the address/navigation toolbar to the rebar */
861 hResult
= CreateAddressBand(&navigationBar
);
864 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
);
865 hResult
= navigationBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &navigationOleWindow
));
866 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
867 fNavigationBar
.Attach(navigationBar
.Detach());
872 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
873 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
875 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
879 switch (prgCmds
->cmdID
)
881 case ITID_TEXTLABELS
: // Text Labels state
882 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
884 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
885 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
887 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
888 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
890 case ITID_LINKSBANDSHOWN
: // links bar visibility
893 case ITID_MENUBANDSHOWN
: // Menubar band visibility
896 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
899 case ITID_CUSTOMIZEENABLED
: // customize enabled
900 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
902 case ITID_TOOLBARLOCKED
: // lock toolbars
903 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
905 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
919 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
920 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
922 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
927 // what do I do here?
929 case ITID_TEXTLABELS
:
930 // toggle text labels
932 case ITID_TOOLBARBANDSHOWN
:
933 // toggle toolbar band visibility
935 case ITID_ADDRESSBANDSHOWN
:
936 // toggle address band visibility
938 case ITID_LINKSBANDSHOWN
:
939 // toggle links band visibility
941 case ITID_CUSTOMIZEENABLED
:
944 case ITID_TOOLBARLOCKED
:
945 return LockUnlockToolbars(!fLocked
);
951 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
956 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
961 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
962 LCID lcid
, DISPID
*rgDispId
)
967 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
968 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
974 case DISPID_BEFORENAVIGATE
:
977 case DISPID_DOWNLOADCOMPLETE
:
980 case DISPID_COMMANDSTATECHANGE
:
981 if (pDispParams
->cArgs
!= 2)
983 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
985 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
986 V_I4(&pDispParams
->rgvarg
[1]));
987 case DISPID_DOWNLOADBEGIN
:
990 case DISPID_NAVIGATECOMPLETE2
:
993 case DISPID_DOCUMENTCOMPLETE
:
1000 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1004 fCommandTarget
.Release();
1005 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1006 if (FAILED(hResult
))
1008 fCommandCategory
= *category
;
1012 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1017 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1022 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1023 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1027 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1028 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1035 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1040 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1042 if (theState
== NULL
)
1044 // map the command id
1045 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1049 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1051 // map the command id
1052 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1056 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1057 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1062 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1066 *paramC
= MAKELONG(24, 24);
1070 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1071 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1076 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1077 HIMAGELIST param14
, HIMAGELIST param18
)
1082 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1087 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1092 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1094 CComPtr
<IBrowserService
> browserService
;
1095 CComPtr
<IServiceProvider
> serviceProvider
;
1096 CComPtr
<IOleWindow
> oleWindow
;
1102 if (pUnkSite
== NULL
)
1104 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1105 ::DestroyWindow(fMainReBar
);
1111 // get window handle of owner
1112 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1113 if (FAILED(hResult
))
1115 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1116 if (FAILED(hResult
))
1118 if (ownerWindow
== NULL
)
1121 // create dock container
1123 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1124 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1125 if (dockContainer
== NULL
)
1127 SubclassWindow(dockContainer
);
1129 // create rebar in dock container
1130 style
= WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
|
1131 RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1132 fMainReBar
= CreateWindow(REBARCLASSNAMEW
, NULL
, style
,
1133 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1134 if (fMainReBar
== NULL
)
1137 // take advice to watch events
1138 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1139 hResult
= serviceProvider
->QueryService(
1140 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1141 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1146 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1148 if (ppvSite
== NULL
)
1150 if (fSite
.p
!= NULL
)
1151 return fSite
->QueryInterface(riid
, ppvSite
);
1156 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1158 CComPtr
<IServiceProvider
> serviceProvider
;
1161 if (IsEqualIID(guidService
, IID_IBandSite
))
1162 return this->QueryInterface(riid
, ppvObject
);
1163 if (IsEqualIID(guidService
, SID_IBandProxy
))
1165 if (fBandProxy
.p
== NULL
)
1167 hResult
= CreateAndInitBandProxy();
1168 if (FAILED(hResult
))
1171 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1173 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1176 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1177 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1179 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1184 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1185 if (menuWinEventHandler
->IsWindowOwner(hWnd
))
1187 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1194 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1199 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1204 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1209 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1210 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1214 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1215 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1216 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1217 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1222 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1227 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1232 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1237 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1242 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1247 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1249 CComPtr
<IServiceProvider
> serviceProvider
;
1250 CComPtr
<IWebBrowser
> webBrowser
;
1253 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1254 if (FAILED(hResult
))
1256 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1257 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1258 if (FAILED(hResult
))
1260 hResult
= webBrowser
->GoBack();
1264 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1266 CComPtr
<IServiceProvider
> serviceProvider
;
1267 CComPtr
<IWebBrowser
> webBrowser
;
1270 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1271 if (FAILED(hResult
))
1273 hResult
= serviceProvider
->QueryService(
1274 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1275 if (FAILED(hResult
))
1277 hResult
= webBrowser
->GoForward();
1281 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1283 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1286 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1287 if (FAILED(hResult
))
1289 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1293 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1295 CComPtr
<IObjectWithSite
> objectWithSite
;
1296 CComPtr
<IContextMenu
> contextMenu
;
1297 CMINVOKECOMMANDINFO commandInfo
;
1298 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1301 // TODO: Query shell if this command is enabled first
1303 memset(&commandInfo
, 0, sizeof(commandInfo
));
1304 commandInfo
.cbSize
= sizeof(commandInfo
);
1305 commandInfo
.hwnd
= m_hWnd
;
1306 commandInfo
.lpParameters
= searchGUID
;
1307 commandInfo
.nShow
= SW_SHOWNORMAL
;
1309 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1310 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1311 if (FAILED(hResult
))
1313 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1314 if (FAILED(hResult
))
1316 hResult
= objectWithSite
->SetSite(fSite
);
1317 if (FAILED(hResult
))
1319 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1320 hResult
= objectWithSite
->SetSite(NULL
);
1324 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1326 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1329 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1330 if (FAILED(hResult
))
1332 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1336 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1340 if (fCommandTarget
.p
!= NULL
)
1342 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1347 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1349 CComPtr
<IServiceProvider
> serviceProvider
;
1350 CComPtr
<IBrowserService
> browserService
;
1351 CComPtr
<IOleCommandTarget
> commandTarget
;
1352 CComPtr
<ITravelLog
> travelLog
;
1353 NMTOOLBARW
*notifyInfo
;
1362 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1363 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1365 // not from the toolbar, keep looking for a message handler
1369 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1370 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1371 switch (notifyInfo
->iItem
)
1373 case gBackCommandID
:
1374 newMenu
= CreatePopupMenu();
1375 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1376 hResult
= serviceProvider
->QueryService(
1377 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1378 hResult
= browserService
->GetTravelLog(&travelLog
);
1379 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1380 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1381 commandInfo
.cmdID
= 0x1d;
1382 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1383 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1384 travelLog
->CountEntries(browserService
) > 1)
1386 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1387 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1389 params
.cbSize
= sizeof (params
);
1390 params
.rcExclude
= bounds
;
1391 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1392 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1393 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1395 V_VT(&parmIn
) = VT_I4
;
1397 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1399 else if (selectedItem
!= 0)
1400 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1401 DestroyMenu(newMenu
);
1403 case gForwardCommandID
:
1404 newMenu
= CreatePopupMenu();
1405 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1406 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
,
1407 reinterpret_cast<void **>(&browserService
));
1408 hResult
= browserService
->GetTravelLog(&travelLog
);
1409 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1410 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1411 commandInfo
.cmdID
= 0x1d;
1412 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1413 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1414 travelLog
->CountEntries(browserService
) > 1)
1416 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1417 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1419 params
.cbSize
= sizeof (params
);
1420 params
.rcExclude
= bounds
;
1421 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1422 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1423 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1425 V_VT(&parmIn
) = VT_I4
;
1427 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1429 else if (selectedItem
!= 0)
1430 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1431 DestroyMenu(newMenu
);
1433 case gViewsCommandID
:
1435 CComVariant outValue
;
1438 V_VT(&inValue
) = VT_INT_PTR
;
1439 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1441 if (fCommandTarget
.p
!= NULL
)
1442 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1443 // pvaOut is VT_I4 with value 0x403
1446 return TBDDRET_DEFAULT
;
1449 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1454 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1459 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1461 HMENU contextMenuBar
;
1463 POINT clickLocation
;
1465 RBHITTESTINFO hitTestInfo
;
1466 REBARBANDINFOW rebarBandInfo
;
1469 clickLocation
.x
= LOWORD(lParam
);
1470 clickLocation
.y
= HIWORD(lParam
);
1471 hitTestInfo
.pt
= clickLocation
;
1472 ScreenToClient(&hitTestInfo
.pt
);
1473 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1474 if (hitTestInfo
.iBand
== -1)
1476 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1477 rebarBandInfo
.fMask
= RBBIM_ID
;
1478 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1479 bandID
= rebarBandInfo
.wID
;
1480 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1481 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1484 case ITBBID_MENUBAND
: // menu band
1485 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1486 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1487 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1489 case ITBBID_BRANDBAND
: // brand band
1490 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1491 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1492 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1494 case ITBBID_TOOLSBAND
: // tools band
1495 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1496 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1498 case ITBBID_ADDRESSBAND
: // navigation band
1499 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1500 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1505 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1506 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1507 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1510 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1512 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1514 case IDM_TOOLBARS_LINKSBAR
: // links
1516 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1517 LockUnlockToolbars(!fLocked
);
1519 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1520 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1526 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1528 if (wParam
!= SIZE_MINIMIZED
)
1530 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1531 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1536 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1538 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1543 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1547 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1549 CComPtr
<IBrowserService
> browserService
;
1550 CComPtr
<ITravelLog
> travelLog
;
1551 TOOLTIPTEXTW
*pTTTW
;
1553 wchar_t tempString
[300];
1556 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1557 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1558 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1560 nID
= (UINT
)pNMHDR
->idFrom
;
1564 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1566 // TODO: Should this call QueryService?
1567 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1568 hResult
= browserService
->GetTravelLog(&travelLog
);
1569 hResult
= travelLog
->GetToolTipText(browserService
,
1570 (nID
== (UINT
)gBackCommandID
) ? TLOG_BACK
: TLOG_FORE
,
1571 0, tempString
, 299);
1572 if (FAILED(hResult
))
1580 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1581 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1582 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1588 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1592 HWND target
= (HWND
) lParam
;
1596 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1597 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1598 if (SUCCEEDED(hResult
))
1600 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1602 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1603 return FAILED(hResult
) ? 0 : theResult
;
1610 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1611 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1612 if (SUCCEEDED(hResult
))
1614 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1616 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1617 return FAILED(hResult
) ? 0 : theResult
;
1624 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1626 NMHDR
*notifyHeader
;
1630 notifyHeader
= (NMHDR
*) lParam
;
1634 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1635 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1636 if (SUCCEEDED(hResult
))
1638 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1640 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1641 return FAILED(hResult
) ? 0 : theResult
;
1648 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1649 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1650 if (SUCCEEDED(hResult
))
1652 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1654 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1655 return FAILED(hResult
) ? 0 : theResult
;
1663 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1665 CComObject
<CInternetToolbar
> *theToolbar
;
1671 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1672 if (theToolbar
== NULL
)
1673 return E_OUTOFMEMORY
;
1674 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
1675 if (FAILED(hResult
))