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
35 // TODO: declare these GUIDs and interfaces in the right place (whatever that may be)
37 IID IID_IAugmentedShellFolder
= { 0x91EA3F8C, 0xC99B, 0x11D0, { 0x98, 0x15, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0x72 } };
38 CLSID CLSID_MergedFolder
= { 0x26FDC864, 0xBE88, 0x46E7, { 0x92, 0x35, 0x03, 0x2D, 0x8E, 0xA5, 0x16, 0x2E } };
40 interface IAugmentedShellFolder
: public IShellFolder
42 virtual HRESULT STDMETHODCALLTYPE
AddNameSpace(LPGUID
, IShellFolder
*, LPCITEMIDLIST
, ULONG
) = 0;
43 virtual HRESULT STDMETHODCALLTYPE
GetNameSpaceID(LPCITEMIDLIST
, LPGUID
) = 0;
44 virtual HRESULT STDMETHODCALLTYPE
QueryNameSpace(ULONG
, LPGUID
, IShellFolder
**) = 0;
45 virtual HRESULT STDMETHODCALLTYPE
EnumNameSpace(ULONG
, PULONG
) = 0;
50 // navigation controls and menubar just send a message to parent window
53 ****Implement BandProxy methods
54 ****Add QueryStatus handler for built-in bands
55 ****Enable/Disable up, search, and folders commands appropriately
56 **Why are explorer toolbar separators a nonstandard width?
57 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
58 **Chevron menu on menuband doesn't work
59 **Fix CInternetToolbar::QueryBand to be generic
61 ****Fix context menu to strip divider when menu shown for menu band
62 ****Fix context menu to have items checked appropriately
63 ****Implement -1 command id update
64 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
65 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
66 Implement show/hide of bands
67 Why is the background color of my toolbars different from explorer?
68 Internet Toolbar command handler should get the target for the command and call Exec on the target.
69 For commands built in to the Internet Toolbar, its Exec handles the command
70 When window width is changed, brand band flashes badly
71 Add all bands with correct ids (system bands now add with correct ids)
73 Implement remaining IExplorerToolbar methods
74 Fix toolbar buttons to enable/disable correctly
75 After toolbar is customized, it may be necessary to patch the widths of separators
77 Check sizes and spacing of toolbars against Explorer
78 Implement resizing of the dock bar
79 Add missing icons for toolbar items
80 Draw History item in forward/back dropdown menus with icon
81 Fix toolbar customize dialog to not include separators as possible selections
82 Implement save/restore of toolbar state
83 Refactor drop down menu code to use a common function since code is so similar
86 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
87 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
88 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
89 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
90 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
92 typedef HRESULT(WINAPI
* PMENUBAND_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
93 typedef HRESULT(WINAPI
* PMERGEDFOLDER_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
95 HMODULE hRShell
= NULL
;
96 PMERGEDFOLDER_CONSTRUCTOR pCMergedFolder_Constructor
= NULL
;
97 PMENUBAND_CONSTRUCTOR pCMenuBand_Constructor
= NULL
;
99 HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
)
101 CComPtr
<IInputObject
> pio
;
103 hr
= punk
->QueryInterface(IID_PPV_ARG(IInputObject
, &pio
));
104 if (FAILED_UNEXPECTEDLY(hr
))
106 return pio
->HasFocusIO();
109 HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
)
111 CComPtr
<IInputObject
> pio
;
115 hr
= punk
->QueryInterface(IID_PPV_ARG(IInputObject
, &pio
));
116 if (FAILED_UNEXPECTEDLY(hr
))
118 return pio
->TranslateAcceleratorIO(pmsg
);
121 HRESULT
IUnknown_RelayWinEvent(IUnknown
* punk
, HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
123 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
124 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
125 if (FAILED_UNEXPECTEDLY(hResult
))
127 hResult
= menuWinEventHandler
->IsWindowOwner(hWnd
);
128 if (FAILED_UNEXPECTEDLY(hResult
))
131 return menuWinEventHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
135 HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
)
137 CComPtr
<IDockingWindow
> dockingWindow
;
138 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
139 if (FAILED_UNEXPECTEDLY(hResult
))
141 hResult
= dockingWindow
->ShowDW(fShow
);
142 if (FAILED_UNEXPECTEDLY(hResult
))
147 HRESULT
IUnknown_CloseDW(IUnknown
* punk
, DWORD dwReserved
)
149 CComPtr
<IDockingWindow
> dockingWindow
;
150 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
151 if (FAILED_UNEXPECTEDLY(hResult
))
153 hResult
= dockingWindow
->CloseDW(dwReserved
);
154 if (FAILED_UNEXPECTEDLY(hResult
))
159 class CInternetToolbar
;
162 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
163 public IDockingWindowSite
,
164 public IInputObjectSite
,
165 public IOleCommandTarget
,
166 public IServiceProvider
172 ITF_NEWBANDALWAYS
= 4,
173 ITF_GRIPPERALWAYS
= 8,
177 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
178 CInternetToolbar
*fToolbar
; // our browser
186 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
187 DESKBANDINFO fDeskBandInfo
;
191 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
192 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
195 // *** IOleWindow methods ***
196 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
197 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
199 // *** IDockingWindow methods ***
200 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
201 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
202 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
204 // *** IInputObjectSite specific methods ***
205 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
207 // *** IOleCommandTarget specific methods ***
208 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
209 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
210 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
211 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
213 // *** IServiceProvider methods ***
214 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
216 BEGIN_COM_MAP(CDockSite
)
217 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
218 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
219 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
220 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
221 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
225 CDockSite::CDockSite()
232 fInitialized
= false;
233 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
236 CDockSite::~CDockSite()
240 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
242 TCHAR textBuffer
[40];
243 REBARBANDINFOW bandInfo
;
246 fContainedBand
= containedBand
;
251 hResult
= IUnknown_SetSite(containedBand
, static_cast<IOleWindow
*>(this));
252 if (FAILED_UNEXPECTEDLY(hResult
))
254 hResult
= IUnknown_GetWindow(containedBand
, &fChildWindow
);
255 if (FAILED_UNEXPECTEDLY(hResult
))
258 memset(&bandInfo
, 0, sizeof(bandInfo
));
259 bandInfo
.cbSize
= sizeof(bandInfo
);
260 bandInfo
.lpText
= textBuffer
;
261 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
262 hResult
= GetRBBandInfo(bandInfo
);
264 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
265 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
270 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
272 CComPtr
<IDeskBand
> deskBand
;
275 hResult
= fContainedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
276 if (FAILED_UNEXPECTEDLY(hResult
))
279 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
280 DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
281 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
282 // result of call is ignored
284 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
|
285 RBBIM_TEXT
| RBBIM_STYLE
;
287 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
288 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
289 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
290 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
291 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
292 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
293 bandInfo
.fStyle
|= RBBS_BREAK
;
294 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
295 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
296 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
)
297 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
298 if (fFlags
& ITF_NOTITLE
)
299 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
300 if (fFlags
& ITF_GRIPPERALWAYS
&& !fToolbar
->fLocked
)
301 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
302 if (fFlags
& ITF_FIXEDSIZE
)
303 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
305 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
307 bandInfo
.fMask
|= RBBIM_COLORS
;
308 bandInfo
.clrFore
= CLR_DEFAULT
;
309 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
311 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
312 bandInfo
.hwndChild
= fChildWindow
;
313 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
314 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
315 bandInfo
.wID
= fBandID
;
316 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
317 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
318 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
319 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
320 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
324 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
328 *lphwnd
= fRebarWindow
;
332 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
337 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
342 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
347 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
352 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
357 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
358 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
363 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
364 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
366 TCHAR textBuffer
[40];
367 REBARBANDINFOW bandInfo
;
371 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
375 case DBID_BANDINFOCHANGED
:
376 if (fInitialized
== false)
378 if (V_VT(pvaIn
) != VT_I4
)
380 if (V_I4(pvaIn
) != fBandID
)
382 // deskband information changed
383 // call GetBandInfo and refresh information in rebar
384 memset(&bandInfo
, 0, sizeof(bandInfo
));
385 bandInfo
.cbSize
= sizeof(bandInfo
);
386 bandInfo
.lpText
= textBuffer
;
387 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
388 hResult
= GetRBBandInfo(bandInfo
);
389 if (FAILED_UNEXPECTEDLY(hResult
))
391 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
392 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
399 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
401 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
402 return this->QueryInterface(riid
, ppvObject
);
404 return fToolbar
->QueryService(guidService
, riid
, ppvObject
);
407 CMenuCallback::CMenuCallback()
411 CMenuCallback::~CMenuCallback()
415 static HRESULT
BindToDesktop(LPCITEMIDLIST pidl
, IShellFolder
** ppsfResult
)
418 CComPtr
<IShellFolder
> psfDesktop
;
422 hr
= SHGetDesktopFolder(&psfDesktop
);
426 hr
= psfDesktop
->BindToObject(pidl
, NULL
, IID_PPV_ARG(IShellFolder
, ppsfResult
));
431 static HRESULT
GetFavoritesFolder(IShellFolder
** ppsfFavorites
, LPITEMIDLIST
* ppidl
)
434 LPITEMIDLIST pidlUserFavorites
;
435 LPITEMIDLIST pidlCommonFavorites
;
436 CComPtr
<IShellFolder
> psfUserFavorites
;
437 CComPtr
<IShellFolder
> psfCommonFavorites
;
438 CComPtr
<IAugmentedShellFolder
> pasf
;
440 *ppsfFavorites
= NULL
;
442 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &pidlUserFavorites
);
446 if (FAILED(SHGetSpecialFolderLocation(NULL
, CSIDL_COMMON_FAVORITES
, &pidlCommonFavorites
)))
448 hr
= BindToDesktop(pidlUserFavorites
, ppsfFavorites
);
449 *ppidl
= pidlUserFavorites
;
453 hr
= BindToDesktop(pidlUserFavorites
, &psfUserFavorites
);
454 if (FAILED_UNEXPECTEDLY(hr
))
457 hr
= BindToDesktop(pidlCommonFavorites
, &psfCommonFavorites
);
458 if (FAILED_UNEXPECTEDLY(hr
))
464 hRShell
= GetModuleHandle(L
"rshell.dll");
466 hRShell
= LoadLibrary(L
"rshell.dll");
469 if (!pCMergedFolder_Constructor
)
470 pCMergedFolder_Constructor
= (PMERGEDFOLDER_CONSTRUCTOR
) GetProcAddress(hRShell
, "CMergedFolder_Constructor");
472 if (pCMergedFolder_Constructor
)
474 hr
= pCMergedFolder_Constructor(IID_PPV_ARG(IAugmentedShellFolder
, &pasf
));
481 hr
= CoCreateInstance(CLSID_MergedFolder
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IAugmentedShellFolder
, &pasf
));
483 if (FAILED_UNEXPECTEDLY(hr
))
485 *ppsfFavorites
= psfUserFavorites
.Detach();
486 *ppidl
= pidlUserFavorites
;
487 ILFree(pidlCommonFavorites
);
491 hr
= pasf
->AddNameSpace(NULL
, psfUserFavorites
, pidlUserFavorites
, 0xFF00);
492 if (FAILED_UNEXPECTEDLY(hr
))
495 hr
= pasf
->AddNameSpace(NULL
, psfCommonFavorites
, pidlCommonFavorites
, 0);
496 if (FAILED_UNEXPECTEDLY(hr
))
499 hr
= pasf
->QueryInterface(IID_PPV_ARG(IShellFolder
, ppsfFavorites
));
502 ILFree(pidlCommonFavorites
);
503 ILFree(pidlUserFavorites
);
508 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
510 CComPtr
<IShellMenu
> parentMenu
;
511 CComPtr
<IShellMenu
> newMenu
;
512 CComPtr
<IShellFolder
> favoritesFolder
;
513 LPITEMIDLIST favoritesPIDL
;
516 HMENU favoritesHMenu
;
520 static const TCHAR szFavoritesKey
[] =
521 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
523 if (!IsEqualIID(riid
, IID_IShellMenu
))
525 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
528 if (fFavoritesMenu
.p
== NULL
)
530 // create favorites menu
531 hResult
= psmd
->punk
->QueryInterface(IID_PPV_ARG(IShellMenu
, &parentMenu
));
532 if (FAILED_UNEXPECTEDLY(hResult
))
534 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
535 if (FAILED_UNEXPECTEDLY(hResult
))
537 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
538 if (favoritesHMenu
== NULL
)
540 #if USE_CUSTOM_MENUBAND
543 hRShell
= GetModuleHandle(L
"rshell.dll");
545 hRShell
= LoadLibrary(L
"rshell.dll");
548 if (!pCMenuBand_Constructor
)
549 pCMenuBand_Constructor
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hRShell
, "CMenuBand_Constructor");
551 if (pCMenuBand_Constructor
)
553 hResult
= pCMenuBand_Constructor(IID_PPV_ARG(IShellMenu
, &newMenu
));
557 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
558 IID_PPV_ARG(IShellMenu
, &newMenu
));
561 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
562 IID_PPV_ARG(IShellMenu
, &newMenu
));
564 if (FAILED_UNEXPECTEDLY(hResult
))
566 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
567 if (FAILED_UNEXPECTEDLY(hResult
))
569 hResult
= newMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
570 if (FAILED_UNEXPECTEDLY(hResult
))
573 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
574 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
576 hResult
= GetFavoritesFolder(&favoritesFolder
, &favoritesPIDL
);
577 if (FAILED_UNEXPECTEDLY(hResult
))
580 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| SMINIT_CACHED
| SMINV_ID
);
581 ILFree(favoritesPIDL
);
582 if (SUCCEEDED(hResult
))
583 fFavoritesMenu
.Attach(newMenu
.Detach());
585 if (fFavoritesMenu
.p
== NULL
)
587 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
590 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
602 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
603 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
605 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
607 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
611 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
614 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
621 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
622 case SMC_GETSFOBJECT
:
626 case SMC_SFSELECTITEM
:
639 case SMC_DEFAULTICON
:
643 case SMC_CHEVRONEXPAND
:
645 case SMC_DISPLAYCHEVRONTIP
:
647 case SMC_SETSFOBJECT
:
649 case SMC_SHCHANGENOTIFY
:
651 case SMC_CHEVRONGETTIP
:
653 case SMC_SFDDRESTRICTED
:
665 CInternetToolbar::CInternetToolbar()
669 fMenuBandWindow
= NULL
;
670 fNavigationWindow
= NULL
;
671 fMenuCallback
= new CComObject
<CMenuCallback
>();
672 fToolbarWindow
= NULL
;
675 fMenuCallback
->AddRef();
678 CInternetToolbar::~CInternetToolbar()
682 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
684 CComPtr
<CDockSite
> newSite
;
686 newSite
= new CComObject
<CDockSite
>;
687 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
690 HRESULT
CInternetToolbar::ReserveBorderSpace(LONG maxHeight
)
692 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
693 RECT availableBorderSpace
;
695 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
696 if (FAILED_UNEXPECTEDLY(hResult
))
698 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
699 if (FAILED_UNEXPECTEDLY(hResult
))
702 if (availableBorderSpace
.top
> maxHeight
)
704 availableBorderSpace
.top
= maxHeight
;
707 return ResizeBorderDW(&availableBorderSpace
, fSite
, FALSE
);
710 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**pMenuBar
)
712 CComPtr
<IShellMenu
> menubar
;
713 CComPtr
<IShellMenuCallback
> callback
;
724 #if USE_CUSTOM_MENUBAND
725 HMODULE hrs
= GetModuleHandleW(L
"rshell.dll");
727 if (!hrs
) hrs
= LoadLibraryW(L
"rshell.dll");
731 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hrs
, "CMenuBand_Constructor");
734 hResult
= func(IID_PPV_ARG(IShellMenu
, &menubar
));
741 if (FAILED_UNEXPECTEDLY(hResult
))
743 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
744 IID_PPV_ARG(IShellMenu
, &menubar
));
745 if (FAILED_UNEXPECTEDLY(hResult
))
749 hResult
= fMenuCallback
->QueryInterface(IID_PPV_ARG(IShellMenuCallback
, &callback
));
750 if (FAILED_UNEXPECTEDLY(hResult
))
753 hResult
= menubar
->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
754 if (FAILED_UNEXPECTEDLY(hResult
))
759 hResult
= IUnknown_Exec(fSite
, CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
760 if (FAILED_UNEXPECTEDLY(hResult
))
763 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
766 hResult
= IUnknown_GetWindow(fSite
, &ownerWindow
);
767 if (FAILED_UNEXPECTEDLY(hResult
))
770 hResult
= menubar
->SetMenu((HMENU
) V_INTREF(&menuOut
), ownerWindow
, SMSET_DONTOWN
);
771 if (FAILED_UNEXPECTEDLY(hResult
))
775 hResult
= IUnknown_Exec(menubar
, CGID_MenuBand
, 3, 1, NULL
, NULL
);
776 if (FAILED_UNEXPECTEDLY(hResult
))
779 *pMenuBar
= menubar
.Detach();
784 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
787 return ::CreateBrandBand(IID_PPV_ARG(IUnknown
, logoBar
));
789 return CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, logoBar
));
793 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
795 return ::CreateToolsBar(IID_PPV_ARG(IUnknown
, toolsBar
));
798 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
801 return ::CreateAddressBand(IID_PPV_ARG(IUnknown
, toolsBar
));
803 return CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, toolsBar
));
807 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
809 REBARBANDINFOW rebarBandInfo
;
814 if (locked
!= fLocked
)
817 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
818 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
819 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
820 for (INT x
= 0; x
< bandCount
; x
++)
822 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
823 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
824 if (dockSite
!= NULL
)
826 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
827 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
828 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
829 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
830 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
831 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
834 hResult
= ReserveBorderSpace();
836 // TODO: refresh view menu?
841 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
849 // loop through buttons
850 //for buttons in CLSID_CommonButtons
851 // if up, QueryStatus for up state and update it
853 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
857 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_FORWARD
, newValue
? TBSTATE_ENABLED
: 0);
861 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_BACK
, newValue
? TBSTATE_ENABLED
: 0);
867 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
869 CComPtr
<IServiceProvider
> serviceProvider
;
872 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
873 if (FAILED_UNEXPECTEDLY(hResult
))
875 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
876 if (FAILED_UNEXPECTEDLY(hResult
))
878 hResult
= CreateBandProxy(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
879 if (FAILED_UNEXPECTEDLY(hResult
))
881 hResult
= fBandProxy
->SetSite(fSite
);
882 if (FAILED_UNEXPECTEDLY(hResult
))
888 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
893 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
895 HRESULT hr
= S_FALSE
;
898 hr
= IUnknown_HasFocusIO(fMenuBar
);
903 hr
= IUnknown_HasFocusIO(fControlsBar
);
908 hr
= IUnknown_HasFocusIO(fNavigationBar
);
915 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
917 HRESULT hr
= S_FALSE
;
920 hr
= IUnknown_TranslateAcceleratorIO(fMenuBar
, lpMsg
);
925 hr
= IUnknown_TranslateAcceleratorIO(fControlsBar
, lpMsg
);
930 hr
= IUnknown_TranslateAcceleratorIO(fNavigationBar
, lpMsg
);
937 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
945 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
950 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
957 hResult
= ReserveBorderSpace();
958 if (FAILED_UNEXPECTEDLY(hResult
))
964 hResult
= IUnknown_ShowDW(fMenuBar
, fShow
);
965 if (FAILED_UNEXPECTEDLY(hResult
))
971 hResult
= IUnknown_ShowDW(fControlsBar
, fShow
);
972 if (FAILED_UNEXPECTEDLY(hResult
))
977 hResult
= IUnknown_ShowDW(fNavigationBar
, fShow
);
978 if (FAILED_UNEXPECTEDLY(hResult
))
983 hResult
= IUnknown_ShowDW(fLogoBar
, fShow
);
984 if (FAILED_UNEXPECTEDLY(hResult
))
991 void ReleaseCComPtrExpectZero(CComPtr
<T
>& cptr
, BOOL forceRelease
= FALSE
)
995 int nrc
= cptr
->Release();
998 DbgPrint("WARNING: Unexpected RefCount > 0 (%d)!\n", nrc
);
1003 nrc
= cptr
->Release();
1011 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
1017 hResult
= IUnknown_CloseDW(fMenuBar
, dwReserved
);
1018 if (FAILED_UNEXPECTEDLY(hResult
))
1020 ReleaseCComPtrExpectZero(fMenuBar
);
1024 hResult
= IUnknown_CloseDW(fControlsBar
, dwReserved
);
1025 if (FAILED_UNEXPECTEDLY(hResult
))
1027 ReleaseCComPtrExpectZero(fControlsBar
);
1031 hResult
= IUnknown_CloseDW(fNavigationBar
, dwReserved
);
1032 if (FAILED_UNEXPECTEDLY(hResult
))
1034 ReleaseCComPtrExpectZero(fNavigationBar
);
1038 hResult
= IUnknown_CloseDW(fLogoBar
, dwReserved
);
1039 if (FAILED_UNEXPECTEDLY(hResult
))
1041 ReleaseCComPtrExpectZero(fLogoBar
);
1046 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
1047 IUnknown
*punkToolbarSite
, BOOL fReserved
)
1049 RECT neededBorderSpace
;
1050 RECT availableBorderSpace
= *prcBorder
;
1052 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
1054 // RBSTR_CHANGERECT does not seem to set the proper size in the rect.
1055 // Let's make sure we fetch the actual size properly.
1056 GetWindowRect(fMainReBar
, &availableBorderSpace
);
1057 neededBorderSpace
.left
= 0;
1058 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
1060 neededBorderSpace
.top
+= 3;
1061 neededBorderSpace
.right
= 0;
1062 neededBorderSpace
.bottom
= 0;
1064 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
1066 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
1067 if (FAILED_UNEXPECTEDLY(hResult
))
1070 hResult
= dockingWindowSite
->RequestBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
1071 if (FAILED_UNEXPECTEDLY(hResult
))
1074 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
1075 if (FAILED_UNEXPECTEDLY(hResult
))
1081 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
1083 if (pClassID
== NULL
)
1085 *pClassID
= CLSID_InternetToolbar
;
1089 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
1094 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
1099 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
1104 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
1109 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
1111 CComPtr
<IShellMenu
> menuBar
;
1112 CComPtr
<IUnknown
> logoBar
;
1113 CComPtr
<IUnknown
> toolsBar
;
1114 CComPtr
<IUnknown
> navigationBar
;
1117 /* Create and attach the menubar to the rebar */
1118 hResult
= CreateMenuBar(&menuBar
);
1119 if (FAILED_UNEXPECTEDLY(hResult
))
1121 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1123 hResult
= IUnknown_GetWindow(menuBar
, &fMenuBandWindow
);
1124 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
1126 // FIXME: The ros Rebar does not properly support fixed-size items such as the brandband,
1127 // and it will put them in their own row, sized to take up the whole row.
1129 /* Create and attach the brand/logo to the rebar */
1130 hResult
= CreateBrandBand(&logoBar
);
1131 if (FAILED_UNEXPECTEDLY(hResult
))
1133 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
1134 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
1137 /* Create and attach the standard toolbar to the rebar */
1138 hResult
= CreateToolsBar(&toolsBar
);
1139 if (FAILED_UNEXPECTEDLY(hResult
))
1141 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1142 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
1143 hResult
= IUnknown_GetWindow(fControlsBar
, &fToolbarWindow
);
1144 if (FAILED_UNEXPECTEDLY(hResult
))
1147 /* Create and attach the address/navigation toolbar to the rebar */
1148 hResult
= CreateAddressBand(&navigationBar
);
1149 if (FAILED_UNEXPECTEDLY(hResult
))
1151 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1152 fNavigationBar
.Attach(navigationBar
.Detach());
1153 hResult
= IUnknown_GetWindow(fNavigationBar
, &fNavigationWindow
);
1158 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
1159 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1161 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1165 switch (prgCmds
->cmdID
)
1167 case ITID_TEXTLABELS
: // Text Labels state
1168 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1170 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
1171 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1173 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
1174 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1176 case ITID_LINKSBANDSHOWN
: // links bar visibility
1179 case ITID_MENUBANDSHOWN
: // Menubar band visibility
1182 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
1185 case ITID_CUSTOMIZEENABLED
: // customize enabled
1186 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1188 case ITID_TOOLBARLOCKED
: // lock toolbars
1189 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1191 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1205 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1206 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1208 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1213 // what do I do here?
1215 case ITID_TEXTLABELS
:
1216 // toggle text labels
1218 case ITID_TOOLBARBANDSHOWN
:
1219 // toggle toolbar band visibility
1221 case ITID_ADDRESSBANDSHOWN
:
1222 // toggle address band visibility
1224 case ITID_LINKSBANDSHOWN
:
1225 // toggle links band visibility
1227 case ITID_CUSTOMIZEENABLED
:
1230 case ITID_TOOLBARLOCKED
:
1231 return LockUnlockToolbars(!fLocked
);
1237 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
1242 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1247 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
1248 LCID lcid
, DISPID
*rgDispId
)
1253 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1254 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1258 switch(dispIdMember
)
1260 case DISPID_BEFORENAVIGATE
:
1263 case DISPID_DOWNLOADCOMPLETE
:
1266 case DISPID_COMMANDSTATECHANGE
:
1267 if (pDispParams
->cArgs
!= 2)
1268 return E_INVALIDARG
;
1269 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
1270 return E_INVALIDARG
;
1271 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
1272 V_I4(&pDispParams
->rgvarg
[1]));
1273 case DISPID_DOWNLOADBEGIN
:
1276 case DISPID_NAVIGATECOMPLETE2
:
1279 case DISPID_DOCUMENTCOMPLETE
:
1286 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1290 fCommandTarget
.Release();
1291 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1292 if (FAILED_UNEXPECTEDLY(hResult
))
1294 fCommandCategory
= *category
;
1298 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1303 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1308 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1309 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1313 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1314 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1321 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1326 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1328 if (theState
== NULL
)
1330 // map the command id
1331 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1335 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1337 // map the command id
1338 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1342 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1343 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1348 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1352 *paramC
= MAKELONG(24, 24);
1356 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1357 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1362 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1363 HIMAGELIST param14
, HIMAGELIST param18
)
1368 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1373 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1378 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1380 CComPtr
<IBrowserService
> browserService
;
1381 CComPtr
<IServiceProvider
> serviceProvider
;
1382 CComPtr
<IOleWindow
> oleWindow
;
1387 if (pUnkSite
== NULL
)
1389 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1390 ::DestroyWindow(fMainReBar
);
1396 // get window handle of owner
1397 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1398 if (FAILED_UNEXPECTEDLY(hResult
))
1400 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1401 if (FAILED_UNEXPECTEDLY(hResult
))
1403 if (ownerWindow
== NULL
)
1406 // create dock container
1408 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1409 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1410 if (dockContainer
== NULL
)
1412 SubclassWindow(dockContainer
);
1414 // create rebar in dock container
1415 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1416 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1417 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1418 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1419 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1420 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1421 if (fMainReBar
== NULL
)
1424 // take advice to watch events
1425 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1426 hResult
= serviceProvider
->QueryService(
1427 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1428 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1433 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1435 if (ppvSite
== NULL
)
1437 if (fSite
.p
!= NULL
)
1438 return fSite
->QueryInterface(riid
, ppvSite
);
1443 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1445 CComPtr
<IServiceProvider
> serviceProvider
;
1448 if (IsEqualIID(guidService
, IID_IBandSite
))
1449 return this->QueryInterface(riid
, ppvObject
);
1450 if (IsEqualIID(guidService
, SID_IBandProxy
))
1452 if (fBandProxy
.p
== NULL
)
1454 hResult
= CreateAndInitBandProxy();
1455 if (FAILED_UNEXPECTEDLY(hResult
))
1458 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1460 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1463 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1464 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1470 hResult
= IUnknown_RelayWinEvent(fMenuBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1471 if (hResult
!= S_FALSE
)
1477 hResult
= IUnknown_RelayWinEvent(fNavigationBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1478 if (hResult
!= S_FALSE
)
1484 hResult
= IUnknown_RelayWinEvent(fLogoBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1485 if (hResult
!= S_FALSE
)
1492 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1498 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1504 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1510 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1511 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1515 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1516 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1517 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1518 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1523 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1529 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1535 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1541 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1547 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1553 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1555 CComPtr
<IServiceProvider
> serviceProvider
;
1556 CComPtr
<IWebBrowser
> webBrowser
;
1559 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1560 if (FAILED_UNEXPECTEDLY(hResult
))
1562 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1563 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1564 if (FAILED_UNEXPECTEDLY(hResult
))
1566 hResult
= webBrowser
->GoBack();
1570 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1572 CComPtr
<IServiceProvider
> serviceProvider
;
1573 CComPtr
<IWebBrowser
> webBrowser
;
1576 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1577 if (FAILED_UNEXPECTEDLY(hResult
))
1579 hResult
= serviceProvider
->QueryService(
1580 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1581 if (FAILED_UNEXPECTEDLY(hResult
))
1583 hResult
= webBrowser
->GoForward();
1587 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1589 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1592 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1593 if (FAILED_UNEXPECTEDLY(hResult
))
1595 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1599 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1601 CComPtr
<IObjectWithSite
> objectWithSite
;
1602 CComPtr
<IContextMenu
> contextMenu
;
1603 CMINVOKECOMMANDINFO commandInfo
;
1604 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1607 // TODO: Query shell if this command is enabled first
1609 memset(&commandInfo
, 0, sizeof(commandInfo
));
1610 commandInfo
.cbSize
= sizeof(commandInfo
);
1611 commandInfo
.hwnd
= m_hWnd
;
1612 commandInfo
.lpParameters
= searchGUID
;
1613 commandInfo
.nShow
= SW_SHOWNORMAL
;
1615 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1616 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1617 if (FAILED_UNEXPECTEDLY(hResult
))
1619 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1620 if (FAILED_UNEXPECTEDLY(hResult
))
1622 hResult
= objectWithSite
->SetSite(fSite
);
1623 if (FAILED_UNEXPECTEDLY(hResult
))
1625 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1626 hResult
= objectWithSite
->SetSite(NULL
);
1630 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1632 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1635 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1636 if (FAILED_UNEXPECTEDLY(hResult
))
1638 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1642 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1646 if (fCommandTarget
.p
!= NULL
)
1648 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1653 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1655 CComPtr
<IServiceProvider
> serviceProvider
;
1656 CComPtr
<IBrowserService
> browserService
;
1657 CComPtr
<IOleCommandTarget
> commandTarget
;
1658 CComPtr
<ITravelLog
> travelLog
;
1659 NMTOOLBARW
*notifyInfo
;
1668 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1669 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1671 // not from the toolbar, keep looking for a message handler
1675 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1676 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1677 switch (notifyInfo
->iItem
)
1680 newMenu
= CreatePopupMenu();
1681 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1682 hResult
= serviceProvider
->QueryService(
1683 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1684 hResult
= browserService
->GetTravelLog(&travelLog
);
1685 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1686 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1687 commandInfo
.cmdID
= 0x1d;
1688 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1689 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1690 travelLog
->CountEntries(browserService
) > 1)
1692 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1693 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1695 params
.cbSize
= sizeof (params
);
1696 params
.rcExclude
= bounds
;
1697 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1698 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1699 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1701 V_VT(&parmIn
) = VT_I4
;
1703 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1705 else if (selectedItem
!= 0)
1706 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1707 DestroyMenu(newMenu
);
1709 case IDM_GOTO_FORWARD
:
1710 newMenu
= CreatePopupMenu();
1711 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1712 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1713 hResult
= browserService
->GetTravelLog(&travelLog
);
1714 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1715 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1716 commandInfo
.cmdID
= 0x1d;
1717 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1718 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1719 travelLog
->CountEntries(browserService
) > 1)
1721 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1722 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1724 params
.cbSize
= sizeof (params
);
1725 params
.rcExclude
= bounds
;
1726 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1727 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1728 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1730 V_VT(&parmIn
) = VT_I4
;
1732 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1734 else if (selectedItem
!= 0)
1735 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1736 DestroyMenu(newMenu
);
1738 case gViewsCommandID
:
1740 CComVariant outValue
;
1743 V_VT(&inValue
) = VT_INT_PTR
;
1744 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1746 if (fCommandTarget
.p
!= NULL
)
1747 hResult
= fCommandTarget
->Exec(&fCommandCategory
, FCIDM_SHVIEW_AUTOARRANGE
, 1, &inValue
, &outValue
);
1748 // pvaOut is VT_I4 with value 0x403
1751 return TBDDRET_DEFAULT
;
1754 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1759 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1764 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1766 HMENU contextMenuBar
;
1768 POINT clickLocation
;
1770 RBHITTESTINFO hitTestInfo
;
1771 REBARBANDINFOW rebarBandInfo
;
1774 clickLocation
.x
= LOWORD(lParam
);
1775 clickLocation
.y
= HIWORD(lParam
);
1776 hitTestInfo
.pt
= clickLocation
;
1777 ScreenToClient(&hitTestInfo
.pt
);
1778 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1779 if (hitTestInfo
.iBand
== -1)
1781 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1782 rebarBandInfo
.fMask
= RBBIM_ID
;
1783 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1784 bandID
= rebarBandInfo
.wID
;
1785 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1786 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1789 case ITBBID_MENUBAND
: // menu band
1790 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1791 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1792 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1794 case ITBBID_BRANDBAND
: // brand band
1795 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1796 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1797 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1799 case ITBBID_TOOLSBAND
: // tools band
1800 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1801 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1803 case ITBBID_ADDRESSBAND
: // navigation band
1804 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1805 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1812 mii
.cbSize
= sizeof(mii
);
1813 mii
.fMask
= MIIM_STATE
;
1814 mii
.fState
= fLocked
? MFS_CHECKED
: MFS_UNCHECKED
;
1815 SetMenuItemInfo(contextMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, FALSE
, &mii
);
1817 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1818 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1819 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1822 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1824 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1826 case IDM_TOOLBARS_LINKSBAR
: // links
1828 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1829 LockUnlockToolbars(!fLocked
);
1831 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1832 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1836 DestroyMenu(contextMenuBar
);
1840 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1842 if (wParam
!= SIZE_MINIMIZED
)
1844 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1845 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1850 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1852 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1857 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1861 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1863 CComPtr
<IBrowserService
> browserService
;
1864 CComPtr
<ITravelLog
> travelLog
;
1865 TOOLTIPTEXTW
*pTTTW
;
1867 wchar_t tempString
[300];
1870 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1871 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1872 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1874 nID
= (UINT
)pNMHDR
->idFrom
;
1878 if (nID
== (UINT
)IDM_GOTO_BACK
|| nID
== (UINT
)IDM_GOTO_FORWARD
)
1880 // TODO: Should this call QueryService?
1881 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1882 hResult
= browserService
->GetTravelLog(&travelLog
);
1883 hResult
= travelLog
->GetToolTipText(browserService
,
1884 (nID
== (UINT
)IDM_GOTO_BACK
) ? TLOG_BACK
: TLOG_FORE
,
1885 0, tempString
, 299);
1886 if (FAILED_UNEXPECTEDLY(hResult
))
1894 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1895 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1896 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1902 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1907 hResult
= OnWinEvent((HWND
) lParam
, uMsg
, wParam
, lParam
, &theResult
);
1909 bHandled
= hResult
== S_OK
;
1911 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1913 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1915 NMHDR
*notifyHeader
;
1919 notifyHeader
= reinterpret_cast<NMHDR
*>(lParam
);
1921 hResult
= OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1923 bHandled
= hResult
== S_OK
;
1925 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1928 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1934 if (wParam
& MK_CONTROL
)
1939 DWORD msgp
= GetMessagePos();
1941 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1942 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1945 GetWindowRect(m_hWnd
, &rc
);
1947 fStartHeight
= rc
.bottom
- rc
.top
;
1955 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1961 DWORD msgp
= GetMessagePos();
1964 pt
.x
= GET_X_LPARAM(msgp
);
1965 pt
.y
= GET_Y_LPARAM(msgp
);
1967 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
1973 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1979 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
1988 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1990 CInternetToolbar
*theToolbar
;
1996 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1997 if (theToolbar
== NULL
)
1998 return E_OUTOFMEMORY
;
1999 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
2000 if (FAILED_UNEXPECTEDLY(hResult
))