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
> child
;
162 CComPtr
<IOleWindow
> oleWindow
;
163 CComPtr
<IDeskBand
> deskBand
;
164 TCHAR textBuffer
[40];
165 REBARBANDINFOW bandInfo
;
168 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &child
));
171 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
174 hResult
= containedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
177 fContainedBand
= containedBand
;
182 hResult
= child
->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();
684 // TODO: refresh view menu?
689 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
697 // loop through buttons
698 //for buttons in CLSID_CommonButtons
699 // if up, QueryStatus for up state and update it
701 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
705 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_FORWARD
, newValue
? TBSTATE_ENABLED
: 0);
709 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_BACK
, newValue
? TBSTATE_ENABLED
: 0);
715 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
717 CComPtr
<IServiceProvider
> serviceProvider
;
720 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
723 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
726 hResult
= CreateBandProxy(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
729 hResult
= fBandProxy
->SetSite(fSite
);
736 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
741 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
746 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
751 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
759 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
764 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
766 CComPtr
<IDockingWindow
> dockingWindow
;
770 hResult
= ReserveBorderSpace();
771 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
772 hResult
= dockingWindow
->ShowDW(fShow
);
776 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
781 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
782 IUnknown
*punkToolbarSite
, BOOL fReserved
)
784 RECT neededBorderSpace
;
785 RECT availableBorderSpace
= *prcBorder
;
787 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
789 // RBSTR_CHANGERECT does not seem to set the proper size in the rect.
790 // Let's make sure we fetch the actual size properly.
791 GetWindowRect(fMainReBar
, &availableBorderSpace
);
792 neededBorderSpace
.left
= 0;
793 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
795 neededBorderSpace
.top
+= 3;
796 neededBorderSpace
.right
= 0;
797 neededBorderSpace
.bottom
= 0;
799 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
801 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
805 hResult
= dockingWindowSite
->RequestBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
809 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
816 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
818 if (pClassID
== NULL
)
820 *pClassID
= CLSID_InternetToolbar
;
824 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
829 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
834 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
839 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
844 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
846 CComPtr
<IShellMenu
> menuBar
;
847 CComPtr
<IUnknown
> logoBar
;
848 CComPtr
<IUnknown
> toolsBar
;
849 CComPtr
<IUnknown
> navigationBar
;
850 CComPtr
<IOleWindow
> menuOleWindow
;
851 CComPtr
<IOleWindow
> toolbarOleWindow
;
852 CComPtr
<IOleWindow
> navigationOleWindow
;
855 /* Create and attach the menubar to the rebar */
856 hResult
= CreateMenuBar(&menuBar
);
859 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
861 hResult
= menuBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &menuOleWindow
));
862 hResult
= menuOleWindow
->GetWindow(&fMenuBandWindow
);
863 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
865 // FIXME: The ros Rebar does not properly support fixed-size items such as the brandband,
866 // and it will put them in their own row, sized to take up the whole row.
868 /* Create and attach the brand/logo to the rebar */
869 hResult
= CreateBrandBand(&logoBar
);
872 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
873 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
876 /* Create and attach the standard toolbar to the rebar */
877 hResult
= CreateToolsBar(&toolsBar
);
880 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
881 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
882 hResult
= fControlsBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &toolbarOleWindow
));
885 hResult
= toolbarOleWindow
->GetWindow(&fToolbarWindow
);
889 /* Create and attach the address/navigation toolbar to the rebar */
890 hResult
= CreateAddressBand(&navigationBar
);
893 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
894 hResult
= navigationBar
->QueryInterface(IID_PPV_ARG(IOleWindow
, &navigationOleWindow
));
895 hResult
= navigationOleWindow
->GetWindow(&fNavigationWindow
);
896 fNavigationBar
.Attach(navigationBar
.Detach());
901 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
902 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
904 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
908 switch (prgCmds
->cmdID
)
910 case ITID_TEXTLABELS
: // Text Labels state
911 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
913 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
914 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
916 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
917 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
919 case ITID_LINKSBANDSHOWN
: // links bar visibility
922 case ITID_MENUBANDSHOWN
: // Menubar band visibility
925 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
928 case ITID_CUSTOMIZEENABLED
: // customize enabled
929 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
931 case ITID_TOOLBARLOCKED
: // lock toolbars
932 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
934 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
948 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
949 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
951 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
956 // what do I do here?
958 case ITID_TEXTLABELS
:
959 // toggle text labels
961 case ITID_TOOLBARBANDSHOWN
:
962 // toggle toolbar band visibility
964 case ITID_ADDRESSBANDSHOWN
:
965 // toggle address band visibility
967 case ITID_LINKSBANDSHOWN
:
968 // toggle links band visibility
970 case ITID_CUSTOMIZEENABLED
:
973 case ITID_TOOLBARLOCKED
:
974 return LockUnlockToolbars(!fLocked
);
980 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
985 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
990 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
991 LCID lcid
, DISPID
*rgDispId
)
996 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
997 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1001 switch(dispIdMember
)
1003 case DISPID_BEFORENAVIGATE
:
1006 case DISPID_DOWNLOADCOMPLETE
:
1009 case DISPID_COMMANDSTATECHANGE
:
1010 if (pDispParams
->cArgs
!= 2)
1011 return E_INVALIDARG
;
1012 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
1013 return E_INVALIDARG
;
1014 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
1015 V_I4(&pDispParams
->rgvarg
[1]));
1016 case DISPID_DOWNLOADBEGIN
:
1019 case DISPID_NAVIGATECOMPLETE2
:
1022 case DISPID_DOCUMENTCOMPLETE
:
1029 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1033 fCommandTarget
.Release();
1034 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1035 if (FAILED(hResult
))
1037 fCommandCategory
= *category
;
1041 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1046 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1051 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1052 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1056 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1057 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1064 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1069 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1071 if (theState
== NULL
)
1073 // map the command id
1074 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1078 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1080 // map the command id
1081 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1085 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1086 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1091 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1095 *paramC
= MAKELONG(24, 24);
1099 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1100 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1105 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1106 HIMAGELIST param14
, HIMAGELIST param18
)
1111 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1116 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1121 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1123 CComPtr
<IBrowserService
> browserService
;
1124 CComPtr
<IServiceProvider
> serviceProvider
;
1125 CComPtr
<IOleWindow
> oleWindow
;
1130 if (pUnkSite
== NULL
)
1132 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1133 ::DestroyWindow(fMainReBar
);
1139 // get window handle of owner
1140 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1141 if (FAILED(hResult
))
1143 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1144 if (FAILED(hResult
))
1146 if (ownerWindow
== NULL
)
1149 // create dock container
1151 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1152 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1153 if (dockContainer
== NULL
)
1155 SubclassWindow(dockContainer
);
1157 // create rebar in dock container
1158 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1159 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1160 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1161 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1162 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1163 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1164 if (fMainReBar
== NULL
)
1167 // take advice to watch events
1168 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1169 hResult
= serviceProvider
->QueryService(
1170 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1171 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1176 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1178 if (ppvSite
== NULL
)
1180 if (fSite
.p
!= NULL
)
1181 return fSite
->QueryInterface(riid
, ppvSite
);
1186 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1188 CComPtr
<IServiceProvider
> serviceProvider
;
1191 if (IsEqualIID(guidService
, IID_IBandSite
))
1192 return this->QueryInterface(riid
, ppvObject
);
1193 if (IsEqualIID(guidService
, SID_IBandProxy
))
1195 if (fBandProxy
.p
== NULL
)
1197 hResult
= CreateAndInitBandProxy();
1198 if (FAILED(hResult
))
1201 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1203 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1206 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1207 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1209 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1214 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1215 if (menuWinEventHandler
->IsWindowOwner(hWnd
) == S_OK
)
1217 return menuWinEventHandler
->OnWinEvent(fMenuBandWindow
, uMsg
, wParam
, lParam
, theResult
);
1224 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1229 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1234 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1239 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1240 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1244 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1245 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1246 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1247 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1252 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1257 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1262 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1267 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1272 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1277 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1279 CComPtr
<IServiceProvider
> serviceProvider
;
1280 CComPtr
<IWebBrowser
> webBrowser
;
1283 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1284 if (FAILED(hResult
))
1286 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1287 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1288 if (FAILED(hResult
))
1290 hResult
= webBrowser
->GoBack();
1294 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1296 CComPtr
<IServiceProvider
> serviceProvider
;
1297 CComPtr
<IWebBrowser
> webBrowser
;
1300 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1301 if (FAILED(hResult
))
1303 hResult
= serviceProvider
->QueryService(
1304 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1305 if (FAILED(hResult
))
1307 hResult
= webBrowser
->GoForward();
1311 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1313 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1316 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1317 if (FAILED(hResult
))
1319 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1323 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1325 CComPtr
<IObjectWithSite
> objectWithSite
;
1326 CComPtr
<IContextMenu
> contextMenu
;
1327 CMINVOKECOMMANDINFO commandInfo
;
1328 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1331 // TODO: Query shell if this command is enabled first
1333 memset(&commandInfo
, 0, sizeof(commandInfo
));
1334 commandInfo
.cbSize
= sizeof(commandInfo
);
1335 commandInfo
.hwnd
= m_hWnd
;
1336 commandInfo
.lpParameters
= searchGUID
;
1337 commandInfo
.nShow
= SW_SHOWNORMAL
;
1339 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1340 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1341 if (FAILED(hResult
))
1343 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1344 if (FAILED(hResult
))
1346 hResult
= objectWithSite
->SetSite(fSite
);
1347 if (FAILED(hResult
))
1349 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1350 hResult
= objectWithSite
->SetSite(NULL
);
1354 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1356 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1359 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1360 if (FAILED(hResult
))
1362 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1366 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1370 if (fCommandTarget
.p
!= NULL
)
1372 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1377 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1379 CComPtr
<IServiceProvider
> serviceProvider
;
1380 CComPtr
<IBrowserService
> browserService
;
1381 CComPtr
<IOleCommandTarget
> commandTarget
;
1382 CComPtr
<ITravelLog
> travelLog
;
1383 NMTOOLBARW
*notifyInfo
;
1392 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1393 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1395 // not from the toolbar, keep looking for a message handler
1399 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1400 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1401 switch (notifyInfo
->iItem
)
1404 newMenu
= CreatePopupMenu();
1405 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1406 hResult
= serviceProvider
->QueryService(
1407 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1408 hResult
= browserService
->GetTravelLog(&travelLog
);
1409 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1410 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1411 commandInfo
.cmdID
= 0x1d;
1412 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1413 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1414 travelLog
->CountEntries(browserService
) > 1)
1416 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1417 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1419 params
.cbSize
= sizeof (params
);
1420 params
.rcExclude
= bounds
;
1421 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1422 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1423 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1425 V_VT(&parmIn
) = VT_I4
;
1427 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1429 else if (selectedItem
!= 0)
1430 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1431 DestroyMenu(newMenu
);
1433 case IDM_GOTO_FORWARD
:
1434 newMenu
= CreatePopupMenu();
1435 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1436 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1437 hResult
= browserService
->GetTravelLog(&travelLog
);
1438 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1439 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1440 commandInfo
.cmdID
= 0x1d;
1441 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1442 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1443 travelLog
->CountEntries(browserService
) > 1)
1445 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1446 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1448 params
.cbSize
= sizeof (params
);
1449 params
.rcExclude
= bounds
;
1450 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1451 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1452 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1454 V_VT(&parmIn
) = VT_I4
;
1456 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1458 else if (selectedItem
!= 0)
1459 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1460 DestroyMenu(newMenu
);
1462 case gViewsCommandID
:
1464 CComVariant outValue
;
1467 V_VT(&inValue
) = VT_INT_PTR
;
1468 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1470 if (fCommandTarget
.p
!= NULL
)
1471 hResult
= fCommandTarget
->Exec(&fCommandCategory
, 0x7031, 1, &inValue
, &outValue
);
1472 // pvaOut is VT_I4 with value 0x403
1475 return TBDDRET_DEFAULT
;
1478 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1483 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1488 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1490 HMENU contextMenuBar
;
1492 POINT clickLocation
;
1494 RBHITTESTINFO hitTestInfo
;
1495 REBARBANDINFOW rebarBandInfo
;
1498 clickLocation
.x
= LOWORD(lParam
);
1499 clickLocation
.y
= HIWORD(lParam
);
1500 hitTestInfo
.pt
= clickLocation
;
1501 ScreenToClient(&hitTestInfo
.pt
);
1502 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1503 if (hitTestInfo
.iBand
== -1)
1505 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1506 rebarBandInfo
.fMask
= RBBIM_ID
;
1507 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1508 bandID
= rebarBandInfo
.wID
;
1509 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1510 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1513 case ITBBID_MENUBAND
: // menu band
1514 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1515 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1516 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1518 case ITBBID_BRANDBAND
: // brand band
1519 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1520 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1521 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1523 case ITBBID_TOOLSBAND
: // tools band
1524 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1525 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1527 case ITBBID_ADDRESSBAND
: // navigation band
1528 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1529 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1536 mii
.cbSize
= sizeof(mii
);
1537 mii
.fMask
= MIIM_STATE
;
1538 mii
.fState
= fLocked
? MFS_CHECKED
: MFS_UNCHECKED
;
1539 command
= SetMenuItemInfo(contextMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, FALSE
, &mii
);
1541 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1542 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1543 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1546 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1548 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1550 case IDM_TOOLBARS_LINKSBAR
: // links
1552 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1553 LockUnlockToolbars(!fLocked
);
1555 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1556 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1562 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1564 if (wParam
!= SIZE_MINIMIZED
)
1566 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1567 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1572 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1574 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1579 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1583 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1585 CComPtr
<IBrowserService
> browserService
;
1586 CComPtr
<ITravelLog
> travelLog
;
1587 TOOLTIPTEXTW
*pTTTW
;
1589 wchar_t tempString
[300];
1592 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1593 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1594 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1596 nID
= (UINT
)pNMHDR
->idFrom
;
1600 if (nID
== (UINT
)IDM_GOTO_BACK
|| nID
== (UINT
)IDM_GOTO_FORWARD
)
1602 // TODO: Should this call QueryService?
1603 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1604 hResult
= browserService
->GetTravelLog(&travelLog
);
1605 hResult
= travelLog
->GetToolTipText(browserService
,
1606 (nID
== (UINT
)IDM_GOTO_BACK
) ? TLOG_BACK
: TLOG_FORE
,
1607 0, tempString
, 299);
1608 if (FAILED(hResult
))
1616 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1617 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1618 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1624 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1628 HWND target
= (HWND
) lParam
;
1632 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1633 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1634 if (SUCCEEDED(hResult
))
1636 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1638 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1639 return FAILED(hResult
) ? 0 : theResult
;
1646 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1647 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1648 if (SUCCEEDED(hResult
))
1650 if (menuWinEventHandler
->IsWindowOwner(target
) == S_OK
)
1652 hResult
= menuWinEventHandler
->OnWinEvent(target
, uMsg
, wParam
, lParam
, &theResult
);
1653 return FAILED(hResult
) ? 0 : theResult
;
1660 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1662 NMHDR
*notifyHeader
;
1666 notifyHeader
= (NMHDR
*) lParam
;
1670 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1671 hResult
= fMenuBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1672 if (SUCCEEDED(hResult
))
1674 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1676 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1677 return FAILED(hResult
) ? 0 : theResult
;
1684 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
1685 hResult
= fNavigationBar
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
1686 if (SUCCEEDED(hResult
))
1688 if (menuWinEventHandler
->IsWindowOwner(notifyHeader
->hwndFrom
) == S_OK
)
1690 hResult
= menuWinEventHandler
->OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1691 return FAILED(hResult
) ? 0 : theResult
;
1699 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1705 if (wParam
& MK_CONTROL
)
1710 DWORD msgp
= GetMessagePos();
1712 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1713 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1716 GetWindowRect(m_hWnd
, &rc
);
1718 fStartHeight
= rc
.bottom
- rc
.top
;
1726 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1732 DWORD msgp
= GetMessagePos();
1735 pt
.x
= GET_X_LPARAM(msgp
);
1736 pt
.y
= GET_Y_LPARAM(msgp
);
1738 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
1744 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1750 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
1759 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1761 CComObject
<CInternetToolbar
> *theToolbar
;
1767 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1768 if (theToolbar
== NULL
)
1769 return E_OUTOFMEMORY
;
1770 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
1771 if (FAILED(hResult
))