4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 Implements a class that knows how to hold and manage the menu band, brand band,
23 toolbar, and address band for an explorer window
28 #define USE_CUSTOM_MENUBAND 1
30 // navigation controls and menubar just send a message to parent window
33 ****Implement BandProxy methods
34 ****Add QueryStatus handler for built-in bands
35 ****Enable/Disable up, search, and folders commands appropriately
36 **Why are explorer toolbar separators a nonstandard width?
37 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
38 **Chevron menu on menuband doesn't work
39 **Fix CInternetToolbar::QueryBand to be generic
41 ****Fix context menu to strip divider when menu shown for menu band
42 ****Fix context menu to have items checked appropriately
43 ****Implement -1 command id update
44 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
45 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
46 Implement show/hide of bands
47 Why is the background color of my toolbars different from explorer?
48 Internet Toolbar command handler should get the target for the command and call Exec on the target.
49 For commands built in to the Internet Toolbar, its Exec handles the command
50 When window width is changed, brand band flashes badly
51 Add all bands with correct ids (system bands now add with correct ids)
53 Implement remaining IExplorerToolbar methods
54 Fix toolbar buttons to enable/disable correctly
55 After toolbar is customized, it may be necessary to patch the widths of separators
57 Check sizes and spacing of toolbars against Explorer
58 Implement resizing of the dock bar
59 Add missing icons for toolbar items
60 Draw History item in forward/back dropdown menus with icon
61 Fix toolbar customize dialog to not include separators as possible selections
62 Implement save/restore of toolbar state
63 Refactor drop down menu code to use a common function since code is so similar
66 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
67 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
68 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
69 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
70 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
72 typedef HRESULT(*PMENUBAND_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
74 class CInternetToolbar
;
77 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
78 public IDockingWindowSite
,
79 public IInputObjectSite
,
80 public IOleCommandTarget
,
81 public IServiceProvider
87 ITF_NEWBANDALWAYS
= 4,
88 ITF_GRIPPERALWAYS
= 8,
92 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
93 CInternetToolbar
*fToolbar
; // our browser
101 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
102 DESKBANDINFO fDeskBandInfo
;
106 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
107 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
110 // *** IOleWindow methods ***
111 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
112 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
114 // *** IDockingWindow methods ***
115 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
116 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
117 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
119 // *** IInputObjectSite specific methods ***
120 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
122 // *** IOleCommandTarget specific methods ***
123 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
124 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
125 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
126 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
128 // *** IServiceProvider methods ***
129 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
131 BEGIN_COM_MAP(CDockSite
)
132 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
133 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
134 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
135 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
136 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
140 CDockSite::CDockSite()
147 fInitialized
= false;
148 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
151 CDockSite::~CDockSite()
155 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
157 CComPtr
<IObjectWithSite
> site
;
158 CComPtr
<IOleWindow
> oleWindow
;
159 CComPtr
<IDeskBand
> deskBand
;
160 TCHAR textBuffer
[40];
161 REBARBANDINFOW bandInfo
;
164 hResult
= containedBand
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&site
));
167 hResult
= containedBand
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
170 hResult
= containedBand
->QueryInterface(IID_IDeskBand
, reinterpret_cast<void **>(&deskBand
));
173 fContainedBand
= containedBand
;
178 hResult
= site
->SetSite(static_cast<IOleWindow
*>(this));
181 hResult
= oleWindow
->GetWindow(&fChildWindow
);
185 memset(&bandInfo
, 0, sizeof(bandInfo
));
186 bandInfo
.cbSize
= sizeof(bandInfo
);
187 bandInfo
.lpText
= textBuffer
;
188 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
189 hResult
= GetRBBandInfo(bandInfo
);
191 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
192 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
197 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
199 CComPtr
<IDeskBand
> deskBand
;
202 hResult
= fContainedBand
->QueryInterface(IID_IDeskBand
, reinterpret_cast<void **>(&deskBand
));
206 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
207 DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
208 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
209 // result of call is ignored
211 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
|
212 RBBIM_TEXT
| RBBIM_STYLE
;
214 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
215 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
216 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
217 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
218 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
219 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
220 bandInfo
.fStyle
|= RBBS_BREAK
;
221 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
222 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
223 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
)
224 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
225 if (fFlags
& ITF_NOTITLE
)
226 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
227 if (fFlags
& ITF_GRIPPERALWAYS
&& !fToolbar
->fLocked
)
228 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
229 if (fFlags
& ITF_FIXEDSIZE
)
230 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
232 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
234 bandInfo
.fMask
|= RBBIM_COLORS
;
235 bandInfo
.clrFore
= CLR_DEFAULT
;
236 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
238 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
239 bandInfo
.hwndChild
= fChildWindow
;
240 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
241 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
242 bandInfo
.wID
= fBandID
;
243 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
244 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
245 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
246 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
247 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
251 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
255 *lphwnd
= fRebarWindow
;
259 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
264 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
269 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
274 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
279 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
284 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
285 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
290 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
291 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
293 TCHAR textBuffer
[40];
294 REBARBANDINFOW bandInfo
;
298 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
302 case DBID_BANDINFOCHANGED
:
303 if (fInitialized
== false)
305 if (V_VT(pvaIn
) != VT_I4
)
307 if (V_I4(pvaIn
) != fBandID
)
309 // deskband information changed
310 // call GetBandInfo and refresh information in rebar
311 memset(&bandInfo
, 0, sizeof(bandInfo
));
312 bandInfo
.cbSize
= sizeof(bandInfo
);
313 bandInfo
.lpText
= textBuffer
;
314 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
315 hResult
= GetRBBandInfo(bandInfo
);
318 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
319 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
326 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
328 CComPtr
<IServiceProvider
> serviceProvider
;
331 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
332 return this->QueryInterface(riid
, ppvObject
);
333 hResult
= fToolbar
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
336 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
339 CMenuCallback::CMenuCallback()
343 CMenuCallback::~CMenuCallback()
347 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
349 CComPtr
<IShellMenu
> parentMenu
;
350 CComPtr
<IShellMenu
> newMenu
;
351 CComPtr
<IShellFolder
> favoritesFolder
;
352 LPITEMIDLIST favoritesPIDL
;
355 HMENU favoritesHMenu
;
359 static const TCHAR szFavoritesKey
[] =
360 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
362 if (!IsEqualIID(riid
, IID_IShellMenu
))
364 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
367 if (fFavoritesMenu
.p
== NULL
)
369 // create favorites menu
370 hResult
= psmd
->punk
->QueryInterface(IID_IShellMenu
, reinterpret_cast<void **>(&parentMenu
));
373 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
376 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
377 if (favoritesHMenu
== NULL
)
379 #if USE_CUSTOM_MENUBAND
380 HMODULE hrs
= LoadLibrary(L
"rshell.dll");
382 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hrs
, "CMenuBand_Constructor");
385 hResult
= func(IID_PPV_ARG(IShellMenu
, &newMenu
));
389 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
390 IID_IShellMenu
, reinterpret_cast<void **>(&newMenu
));
393 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
394 IID_IShellMenu
, reinterpret_cast<void **>(&newMenu
));
398 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
401 hResult
= newMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
404 hResult
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &favoritesPIDL
);
407 hResult
= SHBindToFolder(favoritesPIDL
, &favoritesFolder
);
410 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
411 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
412 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| 0x18);
413 ILFree(favoritesPIDL
);
414 if (SUCCEEDED(hResult
))
415 fFavoritesMenu
.Attach(newMenu
.Detach());
417 if (fFavoritesMenu
.p
== NULL
)
419 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
422 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
434 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
435 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
437 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
439 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
443 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
446 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
453 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
454 case SMC_GETSFOBJECT
:
458 case SMC_SFSELECTITEM
:
471 case SMC_DEFAULTICON
:
475 case SMC_CHEVRONEXPAND
:
477 case SMC_DISPLAYCHEVRONTIP
:
479 case SMC_SETSFOBJECT
:
481 case SMC_SHCHANGENOTIFY
:
483 case SMC_CHEVRONGETTIP
:
485 case SMC_SFDDRESTRICTED
:
497 CInternetToolbar::CInternetToolbar()
501 fMenuBandWindow
= NULL
;
502 fNavigationWindow
= NULL
;
503 fMenuCallback
.AddRef();
504 fToolbarWindow
= NULL
;
508 CInternetToolbar::~CInternetToolbar()
510 fMenuCallback
.Release();
513 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
517 newSite
= new CComObject
<CDockSite
>;
519 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
522 HRESULT
CInternetToolbar::ReserveBorderSpace()
524 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
525 RECT availableBorderSpace
;
526 RECT neededBorderSpace
;
529 hResult
= fSite
->QueryInterface(IID_IDockingWindowSite
, reinterpret_cast<void **>(&dockingWindowSite
));
532 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
535 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
536 neededBorderSpace
.left
= 0;
537 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
539 neededBorderSpace
.top
+= 3;
540 neededBorderSpace
.right
= 0;
541 neededBorderSpace
.bottom
= 0;
542 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
548 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**menuBar
)
550 CComPtr
<IOleCommandTarget
> siteCommandTarget
;
551 CComPtr
<IOleWindow
> oleWindow
;
552 CComPtr
<IOleCommandTarget
> commandTarget
;
553 CComPtr
<IShellMenuCallback
> callback
;
558 #if USE_CUSTOM_MENUBAND
559 HMODULE hrs
= LoadLibraryW(L
"rshell.dll");
563 DbgPrint("Failed: %d\n", GetLastError());
567 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hrs
, "CMenuBand_Constructor");
570 hResult
= func(IID_PPV_ARG(IShellMenu
, menuBar
));
574 DbgPrint("Failed: %d\n", GetLastError());
580 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
581 IID_IShellMenu
, reinterpret_cast<void **>(menuBar
));
584 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
585 IID_IShellMenu
, reinterpret_cast<void **>(menuBar
));
589 hResult
= fMenuCallback
.QueryInterface(IID_IShellMenuCallback
, reinterpret_cast<void **>(&callback
));
592 hResult
= (*menuBar
)->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
595 hResult
= fSite
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
598 hResult
= oleWindow
->GetWindow(&ownerWindow
);
601 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&siteCommandTarget
));
604 hResult
= siteCommandTarget
->Exec(&CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
607 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
609 hResult
= (*menuBar
)->SetMenu((HMENU
)V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
612 hResult
= (*menuBar
)->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
615 hResult
= commandTarget
->Exec(&CGID_MenuBand
, 3, 1, NULL
, NULL
);
621 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
623 CComPtr
<IUnknown
> tempBand
;
627 hResult
= ::CreateBrandBand(IID_IUnknown
, reinterpret_cast<void **>(logoBar
));
629 hResult
= CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
,
630 reinterpret_cast<void **>(logoBar
));
637 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
641 hResult
= ::CreateToolsBar(IID_IUnknown
, reinterpret_cast<void **>(toolsBar
));
647 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
649 CComPtr
<IAddressBand
> addressBand
;
653 hResult
= ::CreateAddressBand(IID_IUnknown
, reinterpret_cast<void **>(toolsBar
));
655 hResult
= CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
,
656 reinterpret_cast<void **>(toolsBar
));
660 hResult
= (*toolsBar
)->QueryInterface(IID_IAddressBand
, reinterpret_cast<void **>(&addressBand
));
664 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
666 REBARBANDINFOW rebarBandInfo
;
671 if (locked
!= fLocked
)
674 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
675 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
676 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
677 for (INT x
= 0; x
< bandCount
; x
++)
679 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
680 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
681 if (dockSite
!= NULL
)
683 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
684 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
685 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
686 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
687 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
688 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
691 hResult
= ReserveBorderSpace();
696 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
704 // loop through buttons
705 //for buttons in CLSID_CommonButtons
706 // if up, QueryStatus for up state and update it
708 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
712 hResult
= SetState(&CLSID_CommonButtons
, gForwardCommandID
, newValue
? TBSTATE_ENABLED
: 0);
716 hResult
= SetState(&CLSID_CommonButtons
, gBackCommandID
, newValue
? TBSTATE_ENABLED
: 0);
722 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
724 CComPtr
<IServiceProvider
> serviceProvider
;
727 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
730 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_IBandProxy
, reinterpret_cast<void **>(&fBandProxy
));
733 hResult
= CreateBandProxy(IID_IBandProxy
, reinterpret_cast<void **>(&fBandProxy
));
736 hResult
= fBandProxy
->SetSite(fSite
);
743 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
748 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
753 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
758 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
766 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
771 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
773 CComPtr
<IDockingWindow
> dockingWindow
;
777 hResult
= ReserveBorderSpace();
778 hResult
= fMenuBar
->QueryInterface(IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
779 hResult
= dockingWindow
->ShowDW(fShow
);
783 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
788 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
789 IUnknown
*punkToolbarSite
, BOOL fReserved
)
794 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
796 if (pClassID
== NULL
)
798 *pClassID
= CLSID_InternetToolbar
;
802 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
807 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
812 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
817 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
822 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
824 CComPtr
<IShellMenu
> menuBar
;
825 //CComPtr<IUnknown> logoBar;
826 CComPtr
<IUnknown
> toolsBar
;
827 CComPtr
<IUnknown
> navigationBar
;
828 CComPtr
<IOleWindow
> menuOleWindow
;
829 CComPtr
<IOleWindow
> toolbarOleWindow
;
830 CComPtr
<IOleWindow
> navigationOleWindow
;
833 hResult
= CreateMenuBar(&menuBar
);
836 AddDockItem(menuBar
, ITBBID_MENUBAND
,
837 CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
839 hResult
= menuBar
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&menuOleWindow
));
840 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
841 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
844 hResult = CreateBrandBand(&logoBar);
847 AddDockItem(logoBar, ITBBID_BRANDBAND,
848 CDockSite::ITF_NOGRIPPER | CDockSite::ITF_NOTITLE | CDockSite::ITF_FIXEDSIZE);
849 fLogoBar.Attach(logoBar.Detach()); // transfer the ref count
852 hResult
= CreateToolsBar(&toolsBar
);
855 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
);
856 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
857 hResult
= fControlsBar
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&toolbarOleWindow
));
860 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
864 hResult
= CreateAddressBand(&navigationBar
);
867 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
);
868 hResult
= navigationBar
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&navigationOleWindow
));
869 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
870 fNavigationBar
.Attach(navigationBar
.Detach());
875 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
876 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
878 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
882 switch (prgCmds
->cmdID
)
884 case ITID_TEXTLABELS
: // Text Labels state
885 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
887 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
888 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
890 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
891 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
893 case ITID_LINKSBANDSHOWN
: // links bar visibility
896 case ITID_MENUBANDSHOWN
: // Menubar band visibility
899 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
902 case ITID_CUSTOMIZEENABLED
: // customize enabled
903 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
905 case ITID_TOOLBARLOCKED
: // lock toolbars
906 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
908 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
922 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
923 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
925 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
930 // what do I do here?
932 case ITID_TEXTLABELS
:
933 // toggle text labels
935 case ITID_TOOLBARBANDSHOWN
:
936 // toggle toolbar band visibility
938 case ITID_ADDRESSBANDSHOWN
:
939 // toggle address band visibility
941 case ITID_LINKSBANDSHOWN
:
942 // toggle links band visibility
944 case ITID_CUSTOMIZEENABLED
:
947 case ITID_TOOLBARLOCKED
:
948 return LockUnlockToolbars(!fLocked
);
954 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
959 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
964 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
965 LCID lcid
, DISPID
*rgDispId
)
970 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
971 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
977 case DISPID_BEFORENAVIGATE
:
980 case DISPID_DOWNLOADCOMPLETE
:
983 case DISPID_COMMANDSTATECHANGE
:
984 if (pDispParams
->cArgs
!= 2)
986 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
988 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
989 V_I4(&pDispParams
->rgvarg
[1]));
990 case DISPID_DOWNLOADBEGIN
:
993 case DISPID_NAVIGATECOMPLETE2
:
996 case DISPID_DOCUMENTCOMPLETE
:
1003 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1007 fCommandTarget
.Release();
1008 hResult
= theTarget
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&fCommandTarget
));
1009 if (FAILED(hResult
))
1011 fCommandCategory
= *category
;
1015 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1020 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1025 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1026 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1030 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1031 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1038 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1043 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1045 if (theState
== NULL
)
1047 // map the command id
1048 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1052 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1054 // map the command id
1055 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1059 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1060 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1065 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1069 *paramC
= MAKELONG(24, 24);
1073 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1074 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1079 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1080 HIMAGELIST param14
, HIMAGELIST param18
)
1085 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1090 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1095 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1097 CComPtr
<IBrowserService
> browserService
;
1098 CComPtr
<IServiceProvider
> serviceProvider
;
1099 CComPtr
<IOleWindow
> oleWindow
;
1105 if (pUnkSite
== NULL
)
1107 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1108 ::DestroyWindow(fMainReBar
);
1114 // get window handle of owner
1115 hResult
= pUnkSite
->QueryInterface(IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
1116 if (FAILED(hResult
))
1118 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1119 if (FAILED(hResult
))
1121 if (ownerWindow
== NULL
)
1124 // create dock container
1126 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1127 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1128 if (dockContainer
== NULL
)
1130 SubclassWindow(dockContainer
);
1132 // create rebar in dock container
1133 style
= WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
| RBS_VARHEIGHT
|
1134 RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1135 fMainReBar
= CreateWindow(REBARCLASSNAMEW
, NULL
, style
,
1136 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1137 if (fMainReBar
== NULL
)
1140 // take advice to watch events
1141 hResult
= pUnkSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1142 hResult
= serviceProvider
->QueryService(
1143 SID_SShellBrowser
, IID_IBrowserService
, reinterpret_cast<void **>(&browserService
));
1144 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1149 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1151 if (ppvSite
== NULL
)
1153 if (fSite
.p
!= NULL
)
1154 return fSite
->QueryInterface(riid
, ppvSite
);
1159 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1161 CComPtr
<IServiceProvider
> serviceProvider
;
1164 if (IsEqualIID(guidService
, IID_IBandSite
))
1165 return this->QueryInterface(riid
, ppvObject
);
1166 if (IsEqualIID(guidService
, SID_IBandProxy
))
1168 if (fBandProxy
.p
== NULL
)
1170 hResult
= CreateAndInitBandProxy();
1171 if (FAILED(hResult
))
1174 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1176 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1177 if (FAILED(hResult
))
1179 return serviceProvider
->QueryService(guidService
, riid
, ppvObject
);
1182 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1183 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1185 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1190 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&menuWinEventHandler
));
1191 if (menuWinEventHandler
->IsWindowOwner(hWnd
))
1193 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1200 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1205 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1210 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1215 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1216 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1220 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1221 return fMenuBar
->QueryInterface(IID_IDeskBand
, reinterpret_cast<void **>(ppstb
));
1222 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1223 // return fLogoBar->QueryInterface(IID_IDeskBand, reinterpret_cast<void **>(ppstb));
1228 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1233 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1238 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1243 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1248 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1253 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1255 CComPtr
<IServiceProvider
> serviceProvider
;
1256 CComPtr
<IWebBrowser
> webBrowser
;
1259 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1260 if (FAILED(hResult
))
1262 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1263 IID_IWebBrowser
, reinterpret_cast<void **>(&webBrowser
));
1264 if (FAILED(hResult
))
1266 hResult
= webBrowser
->GoBack();
1270 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1272 CComPtr
<IServiceProvider
> serviceProvider
;
1273 CComPtr
<IWebBrowser
> webBrowser
;
1276 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1277 if (FAILED(hResult
))
1279 hResult
= serviceProvider
->QueryService(
1280 SID_SShellBrowser
, IID_IWebBrowser
, reinterpret_cast<void **>(&webBrowser
));
1281 if (FAILED(hResult
))
1283 hResult
= webBrowser
->GoForward();
1287 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1289 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1292 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1293 if (FAILED(hResult
))
1295 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1299 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1301 CComPtr
<IObjectWithSite
> objectWithSite
;
1302 CComPtr
<IContextMenu
> contextMenu
;
1303 CMINVOKECOMMANDINFO commandInfo
;
1304 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1307 // TODO: Query shell if this command is enabled first
1309 memset(&commandInfo
, 0, sizeof(commandInfo
));
1310 commandInfo
.cbSize
= sizeof(commandInfo
);
1311 commandInfo
.hwnd
= m_hWnd
;
1312 commandInfo
.lpParameters
= searchGUID
;
1313 commandInfo
.nShow
= SW_SHOWNORMAL
;
1315 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1316 IID_IContextMenu
, reinterpret_cast<void **>(&contextMenu
));
1317 if (FAILED(hResult
))
1319 hResult
= contextMenu
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1320 if (FAILED(hResult
))
1322 hResult
= objectWithSite
->SetSite(fSite
);
1323 if (FAILED(hResult
))
1325 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1326 hResult
= objectWithSite
->SetSite(NULL
);
1330 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1332 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1335 hResult
= fSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1336 if (FAILED(hResult
))
1338 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1342 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1346 if (fCommandTarget
.p
!= NULL
)
1348 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1353 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1355 CComPtr
<IServiceProvider
> serviceProvider
;
1356 CComPtr
<IBrowserService
> browserService
;
1357 CComPtr
<IOleCommandTarget
> commandTarget
;
1358 CComPtr
<ITravelLog
> travelLog
;
1359 NMTOOLBARW
*notifyInfo
;
1368 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1369 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1371 // not from the toolbar, keep looking for a message handler
1375 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1376 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1377 switch (notifyInfo
->iItem
)
1379 case gBackCommandID
:
1380 newMenu
= CreatePopupMenu();
1381 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1382 hResult
= serviceProvider
->QueryService(
1383 SID_SShellBrowser
, IID_IBrowserService
, reinterpret_cast<void **>(&browserService
));
1384 hResult
= browserService
->GetTravelLog(&travelLog
);
1385 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1386 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
1387 commandInfo
.cmdID
= 0x1d;
1388 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1389 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1390 travelLog
->CountEntries(browserService
) > 1)
1392 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1393 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1395 params
.cbSize
= sizeof (params
);
1396 params
.rcExclude
= bounds
;
1397 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1398 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1399 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1401 V_VT(&parmIn
) = VT_I4
;
1403 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1405 else if (selectedItem
!= 0)
1406 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1407 DestroyMenu(newMenu
);
1409 case gForwardCommandID
:
1410 newMenu
= CreatePopupMenu();
1411 hResult
= fSite
->QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1412 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_IBrowserService
,
1413 reinterpret_cast<void **>(&browserService
));
1414 hResult
= browserService
->GetTravelLog(&travelLog
);
1415 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1416 hResult
= browserService
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
1417 commandInfo
.cmdID
= 0x1d;
1418 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1419 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1420 travelLog
->CountEntries(browserService
) > 1)
1422 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1423 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1425 params
.cbSize
= sizeof (params
);
1426 params
.rcExclude
= bounds
;
1427 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1428 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1429 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1431 V_VT(&parmIn
) = VT_I4
;
1433 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1435 else if (selectedItem
!= 0)
1436 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1437 DestroyMenu(newMenu
);
1439 case gViewsCommandID
:
1441 CComVariant outValue
;
1444 V_VT(&inValue
) = VT_INT_PTR
;
1445 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1447 if (fCommandTarget
.p
!= NULL
)
1448 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1449 // pvaOut is VT_I4 with value 0x403
1452 return TBDDRET_DEFAULT
;
1455 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1460 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1465 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1467 HMENU contextMenuBar
;
1469 POINT clickLocation
;
1471 RBHITTESTINFO hitTestInfo
;
1472 REBARBANDINFOW rebarBandInfo
;
1475 clickLocation
.x
= LOWORD(lParam
);
1476 clickLocation
.y
= HIWORD(lParam
);
1477 hitTestInfo
.pt
= clickLocation
;
1478 ScreenToClient(&hitTestInfo
.pt
);
1479 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1480 if (hitTestInfo
.iBand
== -1)
1482 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1483 rebarBandInfo
.fMask
= RBBIM_ID
;
1484 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1485 bandID
= rebarBandInfo
.wID
;
1486 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1487 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1490 case ITBBID_MENUBAND
: // menu band
1491 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1492 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1493 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1495 case ITBBID_BRANDBAND
: // brand band
1496 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1497 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1498 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1500 case ITBBID_TOOLSBAND
: // tools band
1501 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1502 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1504 case ITBBID_ADDRESSBAND
: // navigation band
1505 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1506 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1511 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1512 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1513 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1516 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1518 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1520 case IDM_TOOLBARS_LINKSBAR
: // links
1522 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1523 LockUnlockToolbars(!fLocked
);
1525 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1526 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1532 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1534 if (wParam
!= SIZE_MINIMIZED
)
1536 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1537 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1542 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1544 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1549 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1553 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1555 CComPtr
<IBrowserService
> browserService
;
1556 CComPtr
<ITravelLog
> travelLog
;
1557 TOOLTIPTEXTW
*pTTTW
;
1559 wchar_t tempString
[300];
1562 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1563 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1564 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1566 nID
= (UINT
)pNMHDR
->idFrom
;
1570 if (nID
== (UINT
)gBackCommandID
|| nID
== (UINT
)gForwardCommandID
)
1572 // TODO: Should this call QueryService?
1573 hResult
= fSite
->QueryInterface(IID_IBrowserService
, reinterpret_cast<void **>(&browserService
));
1574 hResult
= browserService
->GetTravelLog(&travelLog
);
1575 hResult
= travelLog
->GetToolTipText(browserService
,
1576 (nID
== (UINT
)gBackCommandID
) ? TLOG_BACK
: TLOG_FORE
,
1577 0, tempString
, 299);
1578 if (FAILED(hResult
))
1586 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1587 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1588 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1594 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1598 HWND target
= (HWND
) lParam
;
1602 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1603 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&menuWinEventHandler
));
1604 if (SUCCEEDED(hResult
))
1606 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1608 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1609 return FAILED(hResult
) ? 0 : theResult
;
1616 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1617 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&menuWinEventHandler
));
1618 if (SUCCEEDED(hResult
))
1620 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1622 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1623 return FAILED(hResult
) ? 0 : theResult
;
1630 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1632 NMHDR
*notifyHeader
;
1636 notifyHeader
= (NMHDR
*) lParam
;
1640 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1641 hResult
= fMenuBar
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&menuWinEventHandler
));
1642 if (SUCCEEDED(hResult
))
1644 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1646 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1647 return FAILED(hResult
) ? 0 : theResult
;
1654 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1655 hResult
= fNavigationBar
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&menuWinEventHandler
));
1656 if (SUCCEEDED(hResult
))
1658 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1660 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1661 return FAILED(hResult
) ? 0 : theResult
;
1669 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1671 CComObject
<CInternetToolbar
> *theToolbar
;
1677 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1678 if (theToolbar
== NULL
)
1679 return E_OUTOFMEMORY
;
1680 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
1681 if (FAILED(hResult
))