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
863 /* Create and attach the brand/logo to the rebar */
864 hResult
= CreateBrandBand(&logoBar
);
867 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
868 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
870 /* Create and attach the standard toolbar to the rebar */
871 hResult
= CreateToolsBar(&toolsBar
);
874 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
875 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
876 hResult
= fControlsBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &toolbarOleWindow
));
879 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
883 /* Create and attach the address/navigation toolbar to the rebar */
884 hResult
= CreateAddressBand(&navigationBar
);
887 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
888 hResult
= navigationBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &navigationOleWindow
));
889 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
890 fNavigationBar
.Attach(navigationBar
.Detach());
895 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
896 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
898 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
902 switch (prgCmds
->cmdID
)
904 case ITID_TEXTLABELS
: // Text Labels state
905 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
907 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
908 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
910 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
911 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
913 case ITID_LINKSBANDSHOWN
: // links bar visibility
916 case ITID_MENUBANDSHOWN
: // Menubar band visibility
919 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
922 case ITID_CUSTOMIZEENABLED
: // customize enabled
923 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
925 case ITID_TOOLBARLOCKED
: // lock toolbars
926 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
928 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
942 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
943 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
945 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
950 // what do I do here?
952 case ITID_TEXTLABELS
:
953 // toggle text labels
955 case ITID_TOOLBARBANDSHOWN
:
956 // toggle toolbar band visibility
958 case ITID_ADDRESSBANDSHOWN
:
959 // toggle address band visibility
961 case ITID_LINKSBANDSHOWN
:
962 // toggle links band visibility
964 case ITID_CUSTOMIZEENABLED
:
967 case ITID_TOOLBARLOCKED
:
968 return LockUnlockToolbars(!fLocked
);
974 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
979 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
984 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
985 LCID lcid
, DISPID
*rgDispId
)
990 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
991 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
997 case DISPID_BEFORENAVIGATE
:
1000 case DISPID_DOWNLOADCOMPLETE
:
1003 case DISPID_COMMANDSTATECHANGE
:
1004 if (pDispParams
->cArgs
!= 2)
1005 return E_INVALIDARG
;
1006 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
1007 return E_INVALIDARG
;
1008 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
1009 V_I4(&pDispParams
->rgvarg
[1]));
1010 case DISPID_DOWNLOADBEGIN
:
1013 case DISPID_NAVIGATECOMPLETE2
:
1016 case DISPID_DOCUMENTCOMPLETE
:
1023 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1027 fCommandTarget
.Release();
1028 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1029 if (FAILED(hResult
))
1031 fCommandCategory
= *category
;
1035 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1040 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1045 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1046 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1050 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1051 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1058 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1063 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1065 if (theState
== NULL
)
1067 // map the command id
1068 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1072 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1074 // map the command id
1075 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1079 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1080 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1085 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1089 *paramC
= MAKELONG(24, 24);
1093 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1094 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1099 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1100 HIMAGELIST param14
, HIMAGELIST param18
)
1105 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1110 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1115 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1117 CComPtr
<IBrowserService
> browserService
;
1118 CComPtr
<IServiceProvider
> serviceProvider
;
1119 CComPtr
<IOleWindow
> oleWindow
;
1124 if (pUnkSite
== NULL
)
1126 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1127 ::DestroyWindow(fMainReBar
);
1133 // get window handle of owner
1134 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1135 if (FAILED(hResult
))
1137 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1138 if (FAILED(hResult
))
1140 if (ownerWindow
== NULL
)
1143 // create dock container
1145 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1146 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1147 if (dockContainer
== NULL
)
1149 SubclassWindow(dockContainer
);
1151 // create rebar in dock container
1152 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1153 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1154 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1155 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1156 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1157 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1158 if (fMainReBar
== NULL
)
1161 // take advice to watch events
1162 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1163 hResult
= serviceProvider
->QueryService(
1164 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1165 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1170 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1172 if (ppvSite
== NULL
)
1174 if (fSite
.p
!= NULL
)
1175 return fSite
->QueryInterface(riid
, ppvSite
);
1180 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1182 CComPtr
<IServiceProvider
> serviceProvider
;
1185 if (IsEqualIID(guidService
, IID_IBandSite
))
1186 return this->QueryInterface(riid
, ppvObject
);
1187 if (IsEqualIID(guidService
, SID_IBandProxy
))
1189 if (fBandProxy
.p
== NULL
)
1191 hResult
= CreateAndInitBandProxy();
1192 if (FAILED(hResult
))
1195 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1197 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1200 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1201 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1203 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1208 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1209 if (menuWinEventHandler
->IsWindowOwner(hWnd
) == S_OK
)
1211 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1218 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1223 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1228 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1233 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1234 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1238 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1239 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1240 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1241 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1246 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1251 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1256 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1261 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1266 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1271 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1273 CComPtr
<IServiceProvider
> serviceProvider
;
1274 CComPtr
<IWebBrowser
> webBrowser
;
1277 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1278 if (FAILED(hResult
))
1280 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1281 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1282 if (FAILED(hResult
))
1284 hResult
= webBrowser
->GoBack();
1288 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1290 CComPtr
<IServiceProvider
> serviceProvider
;
1291 CComPtr
<IWebBrowser
> webBrowser
;
1294 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1295 if (FAILED(hResult
))
1297 hResult
= serviceProvider
->QueryService(
1298 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1299 if (FAILED(hResult
))
1301 hResult
= webBrowser
->GoForward();
1305 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1307 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1310 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1311 if (FAILED(hResult
))
1313 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1317 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1319 CComPtr
<IObjectWithSite
> objectWithSite
;
1320 CComPtr
<IContextMenu
> contextMenu
;
1321 CMINVOKECOMMANDINFO commandInfo
;
1322 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1325 // TODO: Query shell if this command is enabled first
1327 memset(&commandInfo
, 0, sizeof(commandInfo
));
1328 commandInfo
.cbSize
= sizeof(commandInfo
);
1329 commandInfo
.hwnd
= m_hWnd
;
1330 commandInfo
.lpParameters
= searchGUID
;
1331 commandInfo
.nShow
= SW_SHOWNORMAL
;
1333 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1334 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1335 if (FAILED(hResult
))
1337 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1338 if (FAILED(hResult
))
1340 hResult
= objectWithSite
->SetSite(fSite
);
1341 if (FAILED(hResult
))
1343 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1344 hResult
= objectWithSite
->SetSite(NULL
);
1348 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1350 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1353 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1354 if (FAILED(hResult
))
1356 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1360 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1364 if (fCommandTarget
.p
!= NULL
)
1366 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1371 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1373 CComPtr
<IServiceProvider
> serviceProvider
;
1374 CComPtr
<IBrowserService
> browserService
;
1375 CComPtr
<IOleCommandTarget
> commandTarget
;
1376 CComPtr
<ITravelLog
> travelLog
;
1377 NMTOOLBARW
*notifyInfo
;
1386 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1387 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1389 // not from the toolbar, keep looking for a message handler
1393 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1394 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1395 switch (notifyInfo
->iItem
)
1397 case gBackCommandID
:
1398 newMenu
= CreatePopupMenu();
1399 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1400 hResult
= serviceProvider
->QueryService(
1401 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1402 hResult
= browserService
->GetTravelLog(&travelLog
);
1403 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1404 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1405 commandInfo
.cmdID
= 0x1d;
1406 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1407 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1408 travelLog
->CountEntries(browserService
) > 1)
1410 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1411 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1413 params
.cbSize
= sizeof (params
);
1414 params
.rcExclude
= bounds
;
1415 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1416 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1417 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1419 V_VT(&parmIn
) = VT_I4
;
1421 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1423 else if (selectedItem
!= 0)
1424 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1425 DestroyMenu(newMenu
);
1427 case gForwardCommandID
:
1428 newMenu
= CreatePopupMenu();
1429 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1430 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1431 hResult
= browserService
->GetTravelLog(&travelLog
);
1432 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1433 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1434 commandInfo
.cmdID
= 0x1d;
1435 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1436 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1437 travelLog
->CountEntries(browserService
) > 1)
1439 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1440 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1442 params
.cbSize
= sizeof (params
);
1443 params
.rcExclude
= bounds
;
1444 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1445 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1446 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1448 V_VT(&parmIn
) = VT_I4
;
1450 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1452 else if (selectedItem
!= 0)
1453 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1454 DestroyMenu(newMenu
);
1456 case gViewsCommandID
:
1458 CComVariant outValue
;
1461 V_VT(&inValue
) = VT_INT_PTR
;
1462 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1464 if (fCommandTarget
.p
!= NULL
)
1465 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1466 // pvaOut is VT_I4 with value 0x403
1469 return TBDDRET_DEFAULT
;
1472 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1477 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1482 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1484 HMENU contextMenuBar
;
1486 POINT clickLocation
;
1488 RBHITTESTINFO hitTestInfo
;
1489 REBARBANDINFOW rebarBandInfo
;
1492 clickLocation
.x
= LOWORD(lParam
);
1493 clickLocation
.y
= HIWORD(lParam
);
1494 hitTestInfo
.pt
= clickLocation
;
1495 ScreenToClient(&hitTestInfo
.pt
);
1496 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1497 if (hitTestInfo
.iBand
== -1)
1499 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1500 rebarBandInfo
.fMask
= RBBIM_ID
;
1501 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1502 bandID
= rebarBandInfo
.wID
;
1503 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1504 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1507 case ITBBID_MENUBAND
: // menu band
1508 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1509 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1510 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1512 case ITBBID_BRANDBAND
: // brand band
1513 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1514 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1515 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1517 case ITBBID_TOOLSBAND
: // tools band
1518 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1519 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1521 case ITBBID_ADDRESSBAND
: // navigation band
1522 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1523 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1528 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1529 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1530 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1533 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1535 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1537 case IDM_TOOLBARS_LINKSBAR
: // links
1539 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1540 LockUnlockToolbars(!fLocked
);
1542 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1543 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1549 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1551 if (wParam
!= SIZE_MINIMIZED
)
1553 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1554 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1559 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1561 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1566 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1570 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1572 CComPtr
<IBrowserService
> browserService
;
1573 CComPtr
<ITravelLog
> travelLog
;
1574 TOOLTIPTEXTW
*pTTTW
;
1576 wchar_t tempString
[300];
1579 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1580 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1581 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1583 nID
= (UINT
)pNMHDR
->idFrom
;
1587 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1589 // TODO: Should this call QueryService?
1590 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1591 hResult
= browserService
->GetTravelLog(&travelLog
);
1592 hResult
= travelLog
->GetToolTipText(browserService
,
1593 (nID
== (UINT
)gBackCommandID
) ? TLOG_BACK
: TLOG_FORE
,
1594 0, tempString
, 299);
1595 if (FAILED(hResult
))
1603 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1604 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1605 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1611 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1615 HWND target
= (HWND
) lParam
;
1619 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1620 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1621 if (SUCCEEDED(hResult
))
1623 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1625 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1626 return FAILED(hResult
) ? 0 : theResult
;
1633 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1634 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1635 if (SUCCEEDED(hResult
))
1637 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1639 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1640 return FAILED(hResult
) ? 0 : theResult
;
1647 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1649 NMHDR
*notifyHeader
;
1653 notifyHeader
= (NMHDR
*) lParam
;
1657 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1658 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1659 if (SUCCEEDED(hResult
))
1661 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1663 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1664 return FAILED(hResult
) ? 0 : theResult
;
1671 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1672 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1673 if (SUCCEEDED(hResult
))
1675 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1677 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1678 return FAILED(hResult
) ? 0 : theResult
;
1686 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1692 if (wParam
& MK_CONTROL
)
1697 DWORD msgp
= GetMessagePos();
1699 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1700 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1703 GetWindowRect(m_hWnd
, &rc
);
1705 fStartHeight
= rc
.bottom
- rc
.top
;
1713 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1719 DWORD msgp
= GetMessagePos();
1722 pt
.x
= GET_X_LPARAM(msgp
);
1723 pt
.y
= GET_Y_LPARAM(msgp
);
1725 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
1731 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1737 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
1746 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1748 CComObject
<CInternetToolbar
> *theToolbar
;
1754 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1755 if (theToolbar
== NULL
)
1756 return E_OUTOFMEMORY
;
1757 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
1758 if (FAILED(hResult
))