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 /* FIXME, I can't include windowsx because it conflicts with some #defines */
29 #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
30 #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
32 #define USE_CUSTOM_MENUBAND 1
34 // navigation controls and menubar just send a message to parent window
37 ****Implement BandProxy methods
38 ****Add QueryStatus handler for built-in bands
39 ****Enable/Disable up, search, and folders commands appropriately
40 **Why are explorer toolbar separators a nonstandard width?
41 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
42 **Chevron menu on menuband doesn't work
43 **Fix CInternetToolbar::QueryBand to be generic
45 ****Fix context menu to strip divider when menu shown for menu band
46 ****Fix context menu to have items checked appropriately
47 ****Implement -1 command id update
48 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
49 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
50 Implement show/hide of bands
51 Why is the background color of my toolbars different from explorer?
52 Internet Toolbar command handler should get the target for the command and call Exec on the target.
53 For commands built in to the Internet Toolbar, its Exec handles the command
54 When window width is changed, brand band flashes badly
55 Add all bands with correct ids (system bands now add with correct ids)
57 Implement remaining IExplorerToolbar methods
58 Fix toolbar buttons to enable/disable correctly
59 After toolbar is customized, it may be necessary to patch the widths of separators
61 Check sizes and spacing of toolbars against Explorer
62 Implement resizing of the dock bar
63 Add missing icons for toolbar items
64 Draw History item in forward/back dropdown menus with icon
65 Fix toolbar customize dialog to not include separators as possible selections
66 Implement save/restore of toolbar state
67 Refactor drop down menu code to use a common function since code is so similar
70 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
71 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
72 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
73 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
74 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
76 typedef HRESULT(*PMENUBAND_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
78 class CInternetToolbar
;
81 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
82 public IDockingWindowSite
,
83 public IInputObjectSite
,
84 public IOleCommandTarget
,
85 public IServiceProvider
91 ITF_NEWBANDALWAYS
= 4,
92 ITF_GRIPPERALWAYS
= 8,
96 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
97 CInternetToolbar
*fToolbar
; // our browser
105 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
106 DESKBANDINFO fDeskBandInfo
;
110 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
111 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
114 // *** IOleWindow methods ***
115 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
116 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
118 // *** IDockingWindow methods ***
119 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
120 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
121 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
123 // *** IInputObjectSite specific methods ***
124 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
126 // *** IOleCommandTarget specific methods ***
127 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
128 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
129 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
130 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
132 // *** IServiceProvider methods ***
133 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
135 BEGIN_COM_MAP(CDockSite
)
136 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
137 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
138 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
139 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
140 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
144 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
;
168 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &site
));
171 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
174 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
177 fContainedBand
= containedBand
;
182 hResult
= site
->SetSite(static_cast<IOleWindow
*>(this));
185 hResult
= oleWindow
->GetWindow(&fChildWindow
);
189 memset(&bandInfo
, 0, sizeof(bandInfo
));
190 bandInfo
.cbSize
= sizeof(bandInfo
);
191 bandInfo
.lpText
= textBuffer
;
192 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
193 hResult
= GetRBBandInfo(bandInfo
);
195 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
196 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
201 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
203 CComPtr
<IDeskBand
> deskBand
;
206 hResult
= fContainedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
210 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
211 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
|
216 RBBIM_TEXT
| RBBIM_STYLE
;
218 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
219 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
220 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
221 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
222 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
223 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
224 bandInfo
.fStyle
|= RBBS_BREAK
;
225 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
226 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
227 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
)
228 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
229 if (fFlags
& ITF_NOTITLE
)
230 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
231 if (fFlags
& ITF_GRIPPERALWAYS
&& !fToolbar
->fLocked
)
232 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
233 if (fFlags
& ITF_FIXEDSIZE
)
234 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
236 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
238 bandInfo
.fMask
|= RBBIM_COLORS
;
239 bandInfo
.clrFore
= CLR_DEFAULT
;
240 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
242 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
243 bandInfo
.hwndChild
= fChildWindow
;
244 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
245 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
246 bandInfo
.wID
= fBandID
;
247 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
248 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
249 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
250 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
251 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
255 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
259 *lphwnd
= fRebarWindow
;
263 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
268 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
273 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
278 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
283 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
288 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
289 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
294 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
295 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
297 TCHAR textBuffer
[40];
298 REBARBANDINFOW bandInfo
;
302 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
306 case DBID_BANDINFOCHANGED
:
307 if (fInitialized
== false)
309 if (V_VT(pvaIn
) != VT_I4
)
311 if (V_I4(pvaIn
) != fBandID
)
313 // deskband information changed
314 // call GetBandInfo and refresh information in rebar
315 memset(&bandInfo
, 0, sizeof(bandInfo
));
316 bandInfo
.cbSize
= sizeof(bandInfo
);
317 bandInfo
.lpText
= textBuffer
;
318 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
319 hResult
= GetRBBandInfo(bandInfo
);
322 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
323 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
330 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
332 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
333 return this->QueryInterface(riid
, ppvObject
);
335 return fToolbar
->QueryService(guidService
, riid
, ppvObject
);
338 CMenuCallback::CMenuCallback()
342 CMenuCallback::~CMenuCallback()
346 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
348 CComPtr
<IShellMenu
> parentMenu
;
349 CComPtr
<IShellMenu
> newMenu
;
350 CComPtr
<IShellFolder
> favoritesFolder
;
351 LPITEMIDLIST favoritesPIDL
;
354 HMENU favoritesHMenu
;
358 static const TCHAR szFavoritesKey
[] =
359 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
361 if (!IsEqualIID(riid
, IID_IShellMenu
))
363 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
366 if (fFavoritesMenu
.p
== NULL
)
368 // create favorites menu
369 hResult
= psmd
->punk
->QueryInterface(IID_PPV_ARG(IShellMenu
, &parentMenu
));
372 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
375 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
376 if (favoritesHMenu
== NULL
)
378 #if USE_CUSTOM_MENUBAND
379 HMODULE hrs
= LoadLibrary(L
"rshell.dll");
381 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hrs
, "CMenuBand_Constructor");
384 hResult
= func(IID_PPV_ARG(IShellMenu
, &newMenu
));
388 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
389 IID_PPV_ARG(IShellMenu
, &newMenu
));
392 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
393 IID_PPV_ARG(IShellMenu
, &newMenu
));
397 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
400 hResult
= newMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
403 hResult
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &favoritesPIDL
);
406 hResult
= SHBindToFolder(favoritesPIDL
, &favoritesFolder
);
409 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
410 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
411 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| 0x18);
412 ILFree(favoritesPIDL
);
413 if (SUCCEEDED(hResult
))
414 fFavoritesMenu
.Attach(newMenu
.Detach());
416 if (fFavoritesMenu
.p
== NULL
)
418 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
421 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
433 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
434 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
436 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
438 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
442 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
445 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
452 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
453 case SMC_GETSFOBJECT
:
457 case SMC_SFSELECTITEM
:
470 case SMC_DEFAULTICON
:
474 case SMC_CHEVRONEXPAND
:
476 case SMC_DISPLAYCHEVRONTIP
:
478 case SMC_SETSFOBJECT
:
480 case SMC_SHCHANGENOTIFY
:
482 case SMC_CHEVRONGETTIP
:
484 case SMC_SFDDRESTRICTED
:
496 CInternetToolbar::CInternetToolbar()
500 fMenuBandWindow
= NULL
;
501 fNavigationWindow
= NULL
;
502 fMenuCallback
.AddRef();
503 fToolbarWindow
= NULL
;
507 CInternetToolbar::~CInternetToolbar()
509 fMenuCallback
.Release();
512 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
516 newSite
= new CComObject
<CDockSite
>;
518 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
521 HRESULT
CInternetToolbar::ReserveBorderSpace(LONG maxHeight
)
523 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
524 RECT availableBorderSpace
;
526 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
529 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
533 if (availableBorderSpace
.top
> maxHeight
)
535 availableBorderSpace
.top
= maxHeight
;
538 return ResizeBorderDW(&availableBorderSpace
, fSite
, FALSE
);
541 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**menuBar
)
543 CComPtr
<IOleCommandTarget
> siteCommandTarget
;
544 CComPtr
<IOleWindow
> oleWindow
;
545 CComPtr
<IOleCommandTarget
> commandTarget
;
546 CComPtr
<IShellMenuCallback
> callback
;
551 #if USE_CUSTOM_MENUBAND
552 HMODULE hrs
= LoadLibraryW(L
"rshell.dll");
556 DbgPrint("Failed: %d\n", GetLastError());
560 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hrs
, "CMenuBand_Constructor");
563 hResult
= func(IID_PPV_ARG(IShellMenu
, menuBar
));
567 DbgPrint("Failed: %d\n", GetLastError());
573 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
574 IID_PPV_ARG(IShellMenu
, menuBar
));
577 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
578 IID_PPV_ARG(IShellMenu
, menuBar
));
582 hResult
= fMenuCallback
.QueryInterface(IID_PPV_ARG(IShellMenuCallback
, &callback
));
585 hResult
= (*menuBar
)->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
588 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
591 hResult
= oleWindow
->GetWindow(&ownerWindow
);
594 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &siteCommandTarget
));
597 hResult
= siteCommandTarget
->Exec(&CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
600 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
602 hResult
= (*menuBar
)->SetMenu((HMENU
)V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
605 hResult
= (*menuBar
)->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
608 hResult
= commandTarget
->Exec(&CGID_MenuBand
, 3, 1, NULL
, NULL
);
614 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
616 CComPtr
<IUnknown
> tempBand
;
620 hResult
= ::CreateBrandBand(IID_PPV_ARG(IUnknown
, logoBar
));
622 hResult
= CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, logoBar
));
629 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
633 hResult
= ::CreateToolsBar(IID_PPV_ARG(IUnknown
, toolsBar
));
639 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
641 CComPtr
<IAddressBand
> addressBand
;
645 hResult
= ::CreateAddressBand(IID_PPV_ARG(IUnknown
, toolsBar
));
647 hResult
= CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, toolsBar
));
651 hResult
= (*toolsBar
)->QueryInterface(IID_PPV_ARG(IAddressBand
, &addressBand
));
655 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
657 REBARBANDINFOW rebarBandInfo
;
662 if (locked
!= fLocked
)
665 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
666 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
667 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
668 for (INT x
= 0; x
< bandCount
; x
++)
670 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
671 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
672 if (dockSite
!= NULL
)
674 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
675 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
676 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
677 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
678 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
679 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
682 hResult
= ReserveBorderSpace();
687 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
695 // loop through buttons
696 //for buttons in CLSID_CommonButtons
697 // if up, QueryStatus for up state and update it
699 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
703 hResult
= SetState(&CLSID_CommonButtons
, gForwardCommandID
, newValue
? TBSTATE_ENABLED
: 0);
707 hResult
= SetState(&CLSID_CommonButtons
, gBackCommandID
, newValue
? TBSTATE_ENABLED
: 0);
713 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
715 CComPtr
<IServiceProvider
> serviceProvider
;
718 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
721 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
724 hResult
= CreateBandProxy(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
727 hResult
= fBandProxy
->SetSite(fSite
);
734 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
739 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
744 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
749 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
757 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
762 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
764 CComPtr
<IDockingWindow
> dockingWindow
;
768 hResult
= ReserveBorderSpace();
769 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
770 hResult
= dockingWindow
->ShowDW(fShow
);
774 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
779 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
780 IUnknown
*punkToolbarSite
, BOOL fReserved
)
782 RECT neededBorderSpace
;
783 RECT availableBorderSpace
= *prcBorder
;
785 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
787 // RBSTR_CHANGERECT does not seem to set the proper size in the rect.
788 // Let's make sure we fetch the actual size properly.
789 GetWindowRect(fMainReBar
, &availableBorderSpace
);
790 neededBorderSpace
.left
= 0;
791 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
793 neededBorderSpace
.top
+= 3;
794 neededBorderSpace
.right
= 0;
795 neededBorderSpace
.bottom
= 0;
797 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
799 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
803 hResult
= dockingWindowSite
->RequestBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
807 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
814 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
816 if (pClassID
== NULL
)
818 *pClassID
= CLSID_InternetToolbar
;
822 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
827 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
832 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
837 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
842 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
844 CComPtr
<IShellMenu
> menuBar
;
845 CComPtr
<IUnknown
> logoBar
;
846 CComPtr
<IUnknown
> toolsBar
;
847 CComPtr
<IUnknown
> navigationBar
;
848 CComPtr
<IOleWindow
> menuOleWindow
;
849 CComPtr
<IOleWindow
> toolbarOleWindow
;
850 CComPtr
<IOleWindow
> navigationOleWindow
;
853 /* Create and attach the menubar to the rebar */
854 hResult
= CreateMenuBar(&menuBar
);
857 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
859 hResult
= menuBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &menuOleWindow
));
860 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
861 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
864 /* Create and attach the brand/logo to the rebar */
865 hResult
= CreateBrandBand(&logoBar
);
868 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
869 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
872 /* Create and attach the standard toolbar to the rebar */
873 hResult
= CreateToolsBar(&toolsBar
);
876 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
877 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
878 hResult
= fControlsBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &toolbarOleWindow
));
881 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
885 /* Create and attach the address/navigation toolbar to the rebar */
886 hResult
= CreateAddressBand(&navigationBar
);
889 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
890 hResult
= navigationBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &navigationOleWindow
));
891 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
892 fNavigationBar
.Attach(navigationBar
.Detach());
897 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
898 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
900 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
904 switch (prgCmds
->cmdID
)
906 case ITID_TEXTLABELS
: // Text Labels state
907 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
909 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
910 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
912 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
913 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
915 case ITID_LINKSBANDSHOWN
: // links bar visibility
918 case ITID_MENUBANDSHOWN
: // Menubar band visibility
921 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
924 case ITID_CUSTOMIZEENABLED
: // customize enabled
925 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
927 case ITID_TOOLBARLOCKED
: // lock toolbars
928 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
930 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
944 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
945 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
947 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
952 // what do I do here?
954 case ITID_TEXTLABELS
:
955 // toggle text labels
957 case ITID_TOOLBARBANDSHOWN
:
958 // toggle toolbar band visibility
960 case ITID_ADDRESSBANDSHOWN
:
961 // toggle address band visibility
963 case ITID_LINKSBANDSHOWN
:
964 // toggle links band visibility
966 case ITID_CUSTOMIZEENABLED
:
969 case ITID_TOOLBARLOCKED
:
970 return LockUnlockToolbars(!fLocked
);
976 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
981 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
986 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
987 LCID lcid
, DISPID
*rgDispId
)
992 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
993 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
999 case DISPID_BEFORENAVIGATE
:
1002 case DISPID_DOWNLOADCOMPLETE
:
1005 case DISPID_COMMANDSTATECHANGE
:
1006 if (pDispParams
->cArgs
!= 2)
1007 return E_INVALIDARG
;
1008 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
1009 return E_INVALIDARG
;
1010 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
1011 V_I4(&pDispParams
->rgvarg
[1]));
1012 case DISPID_DOWNLOADBEGIN
:
1015 case DISPID_NAVIGATECOMPLETE2
:
1018 case DISPID_DOCUMENTCOMPLETE
:
1025 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1029 fCommandTarget
.Release();
1030 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1031 if (FAILED(hResult
))
1033 fCommandCategory
= *category
;
1037 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1042 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1047 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1048 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1052 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1053 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1060 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1065 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1067 if (theState
== NULL
)
1069 // map the command id
1070 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1074 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1076 // map the command id
1077 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1081 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1082 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1087 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1091 *paramC
= MAKELONG(24, 24);
1095 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1096 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1101 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1102 HIMAGELIST param14
, HIMAGELIST param18
)
1107 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1112 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1117 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1119 CComPtr
<IBrowserService
> browserService
;
1120 CComPtr
<IServiceProvider
> serviceProvider
;
1121 CComPtr
<IOleWindow
> oleWindow
;
1126 if (pUnkSite
== NULL
)
1128 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1129 ::DestroyWindow(fMainReBar
);
1135 // get window handle of owner
1136 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1137 if (FAILED(hResult
))
1139 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1140 if (FAILED(hResult
))
1142 if (ownerWindow
== NULL
)
1145 // create dock container
1147 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1148 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1149 if (dockContainer
== NULL
)
1151 SubclassWindow(dockContainer
);
1153 // create rebar in dock container
1154 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1155 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1156 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1157 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1158 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1159 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1160 if (fMainReBar
== NULL
)
1163 // take advice to watch events
1164 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1165 hResult
= serviceProvider
->QueryService(
1166 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1167 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1172 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1174 if (ppvSite
== NULL
)
1176 if (fSite
.p
!= NULL
)
1177 return fSite
->QueryInterface(riid
, ppvSite
);
1182 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1184 CComPtr
<IServiceProvider
> serviceProvider
;
1187 if (IsEqualIID(guidService
, IID_IBandSite
))
1188 return this->QueryInterface(riid
, ppvObject
);
1189 if (IsEqualIID(guidService
, SID_IBandProxy
))
1191 if (fBandProxy
.p
== NULL
)
1193 hResult
= CreateAndInitBandProxy();
1194 if (FAILED(hResult
))
1197 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1199 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1202 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1203 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1205 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1210 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1211 if (menuWinEventHandler
->IsWindowOwner(hWnd
) == S_OK
)
1213 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1220 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1225 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1230 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1235 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1236 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1240 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1241 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1242 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1243 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1248 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1253 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1258 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1263 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1268 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1273 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1275 CComPtr
<IServiceProvider
> serviceProvider
;
1276 CComPtr
<IWebBrowser
> webBrowser
;
1279 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1280 if (FAILED(hResult
))
1282 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1283 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1284 if (FAILED(hResult
))
1286 hResult
= webBrowser
->GoBack();
1290 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1292 CComPtr
<IServiceProvider
> serviceProvider
;
1293 CComPtr
<IWebBrowser
> webBrowser
;
1296 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1297 if (FAILED(hResult
))
1299 hResult
= serviceProvider
->QueryService(
1300 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1301 if (FAILED(hResult
))
1303 hResult
= webBrowser
->GoForward();
1307 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1309 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1312 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1313 if (FAILED(hResult
))
1315 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1319 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1321 CComPtr
<IObjectWithSite
> objectWithSite
;
1322 CComPtr
<IContextMenu
> contextMenu
;
1323 CMINVOKECOMMANDINFO commandInfo
;
1324 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1327 // TODO: Query shell if this command is enabled first
1329 memset(&commandInfo
, 0, sizeof(commandInfo
));
1330 commandInfo
.cbSize
= sizeof(commandInfo
);
1331 commandInfo
.hwnd
= m_hWnd
;
1332 commandInfo
.lpParameters
= searchGUID
;
1333 commandInfo
.nShow
= SW_SHOWNORMAL
;
1335 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1336 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1337 if (FAILED(hResult
))
1339 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1340 if (FAILED(hResult
))
1342 hResult
= objectWithSite
->SetSite(fSite
);
1343 if (FAILED(hResult
))
1345 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1346 hResult
= objectWithSite
->SetSite(NULL
);
1350 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1352 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1355 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1356 if (FAILED(hResult
))
1358 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1362 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1366 if (fCommandTarget
.p
!= NULL
)
1368 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1373 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1375 CComPtr
<IServiceProvider
> serviceProvider
;
1376 CComPtr
<IBrowserService
> browserService
;
1377 CComPtr
<IOleCommandTarget
> commandTarget
;
1378 CComPtr
<ITravelLog
> travelLog
;
1379 NMTOOLBARW
*notifyInfo
;
1388 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1389 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1391 // not from the toolbar, keep looking for a message handler
1395 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1396 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1397 switch (notifyInfo
->iItem
)
1399 case gBackCommandID
:
1400 newMenu
= CreatePopupMenu();
1401 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1402 hResult
= serviceProvider
->QueryService(
1403 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1404 hResult
= browserService
->GetTravelLog(&travelLog
);
1405 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1406 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1407 commandInfo
.cmdID
= 0x1d;
1408 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1409 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1410 travelLog
->CountEntries(browserService
) > 1)
1412 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1413 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1415 params
.cbSize
= sizeof (params
);
1416 params
.rcExclude
= bounds
;
1417 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1418 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1419 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1421 V_VT(&parmIn
) = VT_I4
;
1423 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1425 else if (selectedItem
!= 0)
1426 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1427 DestroyMenu(newMenu
);
1429 case gForwardCommandID
:
1430 newMenu
= CreatePopupMenu();
1431 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1432 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1433 hResult
= browserService
->GetTravelLog(&travelLog
);
1434 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1435 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1436 commandInfo
.cmdID
= 0x1d;
1437 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1438 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1439 travelLog
->CountEntries(browserService
) > 1)
1441 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1442 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1444 params
.cbSize
= sizeof (params
);
1445 params
.rcExclude
= bounds
;
1446 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1447 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1448 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1450 V_VT(&parmIn
) = VT_I4
;
1452 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1454 else if (selectedItem
!= 0)
1455 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1456 DestroyMenu(newMenu
);
1458 case gViewsCommandID
:
1460 CComVariant outValue
;
1463 V_VT(&inValue
) = VT_INT_PTR
;
1464 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1466 if (fCommandTarget
.p
!= NULL
)
1467 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1468 // pvaOut is VT_I4 with value 0x403
1471 return TBDDRET_DEFAULT
;
1474 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1479 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1484 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1486 HMENU contextMenuBar
;
1488 POINT clickLocation
;
1490 RBHITTESTINFO hitTestInfo
;
1491 REBARBANDINFOW rebarBandInfo
;
1494 clickLocation
.x
= LOWORD(lParam
);
1495 clickLocation
.y
= HIWORD(lParam
);
1496 hitTestInfo
.pt
= clickLocation
;
1497 ScreenToClient(&hitTestInfo
.pt
);
1498 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1499 if (hitTestInfo
.iBand
== -1)
1501 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1502 rebarBandInfo
.fMask
= RBBIM_ID
;
1503 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1504 bandID
= rebarBandInfo
.wID
;
1505 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1506 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1509 case ITBBID_MENUBAND
: // menu band
1510 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1511 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1512 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1514 case ITBBID_BRANDBAND
: // brand band
1515 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1516 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1517 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1519 case ITBBID_TOOLSBAND
: // tools band
1520 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1521 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1523 case ITBBID_ADDRESSBAND
: // navigation band
1524 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1525 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1530 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1531 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1532 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1535 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1537 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1539 case IDM_TOOLBARS_LINKSBAR
: // links
1541 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1542 LockUnlockToolbars(!fLocked
);
1544 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1545 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1551 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1553 if (wParam
!= SIZE_MINIMIZED
)
1555 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1556 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1561 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1563 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1568 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1572 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1574 CComPtr
<IBrowserService
> browserService
;
1575 CComPtr
<ITravelLog
> travelLog
;
1576 TOOLTIPTEXTW
*pTTTW
;
1578 wchar_t tempString
[300];
1581 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1582 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1583 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1585 nID
= (UINT
)pNMHDR
->idFrom
;
1589 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1591 // TODO: Should this call QueryService?
1592 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1593 hResult
= browserService
->GetTravelLog(&travelLog
);
1594 hResult
= travelLog
->GetToolTipText(browserService
,
1595 (nID
== (UINT
)gBackCommandID
) ? TLOG_BACK
: TLOG_FORE
,
1596 0, tempString
, 299);
1597 if (FAILED(hResult
))
1605 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1606 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1607 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1613 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1617 HWND target
= (HWND
) lParam
;
1621 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1622 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1623 if (SUCCEEDED(hResult
))
1625 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1627 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1628 return FAILED(hResult
) ? 0 : theResult
;
1635 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1636 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1637 if (SUCCEEDED(hResult
))
1639 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1641 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1642 return FAILED(hResult
) ? 0 : theResult
;
1649 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1651 NMHDR
*notifyHeader
;
1655 notifyHeader
= (NMHDR
*) lParam
;
1659 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1660 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1661 if (SUCCEEDED(hResult
))
1663 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1665 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1666 return FAILED(hResult
) ? 0 : theResult
;
1673 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1674 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1675 if (SUCCEEDED(hResult
))
1677 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1679 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1680 return FAILED(hResult
) ? 0 : theResult
;
1688 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1694 if (wParam
& MK_CONTROL
)
1699 DWORD msgp
= GetMessagePos();
1701 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1702 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1705 GetWindowRect(m_hWnd
, &rc
);
1707 fStartHeight
= rc
.bottom
- rc
.top
;
1715 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1721 DWORD msgp
= GetMessagePos();
1724 pt
.x
= GET_X_LPARAM(msgp
);
1725 pt
.y
= GET_Y_LPARAM(msgp
);
1727 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
1733 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1739 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
1748 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1750 CComObject
<CInternetToolbar
> *theToolbar
;
1756 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1757 if (theToolbar
== NULL
)
1758 return E_OUTOFMEMORY
;
1759 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
1760 if (FAILED(hResult
))