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 TRACE("SetCommandTarget %p category %s param %d\n", theTarget
, wine_dbgstr_guid(category
), param14
);
1292 fCommandTarget
.Release();
1293 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1294 if (FAILED_UNEXPECTEDLY(hResult
))
1296 fCommandCategory
= *category
;
1300 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1305 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1310 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1311 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1315 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1316 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1323 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1328 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1330 if (theState
== NULL
)
1332 // map the command id
1333 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1337 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1339 // map the command id
1340 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1344 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1345 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1350 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1354 *paramC
= MAKELONG(24, 24);
1358 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1359 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1364 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1365 HIMAGELIST param14
, HIMAGELIST param18
)
1370 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1375 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1380 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1382 CComPtr
<IBrowserService
> browserService
;
1383 CComPtr
<IServiceProvider
> serviceProvider
;
1384 CComPtr
<IOleWindow
> oleWindow
;
1389 if (pUnkSite
== NULL
)
1391 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1392 ::DestroyWindow(fMainReBar
);
1398 // get window handle of owner
1399 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1400 if (FAILED_UNEXPECTEDLY(hResult
))
1402 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1403 if (FAILED_UNEXPECTEDLY(hResult
))
1405 if (ownerWindow
== NULL
)
1408 // create dock container
1410 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1411 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1412 if (dockContainer
== NULL
)
1414 SubclassWindow(dockContainer
);
1416 // create rebar in dock container
1417 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1418 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1419 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1420 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1421 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1422 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1423 if (fMainReBar
== NULL
)
1426 // take advice to watch events
1427 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1428 hResult
= serviceProvider
->QueryService(
1429 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1430 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1435 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1437 if (ppvSite
== NULL
)
1439 if (fSite
.p
!= NULL
)
1440 return fSite
->QueryInterface(riid
, ppvSite
);
1445 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1447 CComPtr
<IServiceProvider
> serviceProvider
;
1450 if (IsEqualIID(guidService
, IID_IBandSite
))
1451 return this->QueryInterface(riid
, ppvObject
);
1452 if (IsEqualIID(guidService
, SID_IBandProxy
))
1454 if (fBandProxy
.p
== NULL
)
1456 hResult
= CreateAndInitBandProxy();
1457 if (FAILED_UNEXPECTEDLY(hResult
))
1460 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1462 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1465 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1466 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1472 hResult
= IUnknown_RelayWinEvent(fMenuBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1473 if (hResult
!= S_FALSE
)
1479 hResult
= IUnknown_RelayWinEvent(fNavigationBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1480 if (hResult
!= S_FALSE
)
1486 hResult
= IUnknown_RelayWinEvent(fLogoBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1487 if (hResult
!= S_FALSE
)
1494 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1500 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1506 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1512 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1513 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1517 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1518 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1519 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1520 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1525 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1531 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1537 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1543 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1549 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1555 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1557 CComPtr
<IServiceProvider
> serviceProvider
;
1558 CComPtr
<IWebBrowser
> webBrowser
;
1561 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1562 if (FAILED_UNEXPECTEDLY(hResult
))
1564 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1565 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1566 if (FAILED_UNEXPECTEDLY(hResult
))
1568 hResult
= webBrowser
->GoBack();
1572 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1574 CComPtr
<IServiceProvider
> serviceProvider
;
1575 CComPtr
<IWebBrowser
> webBrowser
;
1578 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1579 if (FAILED_UNEXPECTEDLY(hResult
))
1581 hResult
= serviceProvider
->QueryService(
1582 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1583 if (FAILED_UNEXPECTEDLY(hResult
))
1585 hResult
= webBrowser
->GoForward();
1589 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1591 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1594 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1595 if (FAILED_UNEXPECTEDLY(hResult
))
1597 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1601 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1603 CComPtr
<IObjectWithSite
> objectWithSite
;
1604 CComPtr
<IContextMenu
> contextMenu
;
1605 CMINVOKECOMMANDINFO commandInfo
;
1606 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1609 // TODO: Query shell if this command is enabled first
1611 memset(&commandInfo
, 0, sizeof(commandInfo
));
1612 commandInfo
.cbSize
= sizeof(commandInfo
);
1613 commandInfo
.hwnd
= m_hWnd
;
1614 commandInfo
.lpParameters
= searchGUID
;
1615 commandInfo
.nShow
= SW_SHOWNORMAL
;
1617 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1618 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1619 if (FAILED_UNEXPECTEDLY(hResult
))
1621 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1622 if (FAILED_UNEXPECTEDLY(hResult
))
1624 hResult
= objectWithSite
->SetSite(fSite
);
1625 if (FAILED_UNEXPECTEDLY(hResult
))
1627 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1628 hResult
= objectWithSite
->SetSite(NULL
);
1632 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1634 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1637 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1638 if (FAILED_UNEXPECTEDLY(hResult
))
1640 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1644 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1648 if (fCommandTarget
.p
!= NULL
)
1650 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1655 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1657 CComPtr
<IServiceProvider
> serviceProvider
;
1658 CComPtr
<IBrowserService
> browserService
;
1659 CComPtr
<IOleCommandTarget
> commandTarget
;
1660 CComPtr
<ITravelLog
> travelLog
;
1661 NMTOOLBARW
*notifyInfo
;
1670 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1671 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1673 // not from the toolbar, keep looking for a message handler
1677 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1678 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1679 switch (notifyInfo
->iItem
)
1682 newMenu
= CreatePopupMenu();
1683 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1684 hResult
= serviceProvider
->QueryService(
1685 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1686 hResult
= browserService
->GetTravelLog(&travelLog
);
1687 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1688 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1689 commandInfo
.cmdID
= 0x1d;
1690 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1691 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1692 travelLog
->CountEntries(browserService
) > 1)
1694 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1695 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1697 params
.cbSize
= sizeof (params
);
1698 params
.rcExclude
= bounds
;
1699 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1700 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1701 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1703 V_VT(&parmIn
) = VT_I4
;
1705 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1707 else if (selectedItem
!= 0)
1708 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1709 DestroyMenu(newMenu
);
1711 case IDM_GOTO_FORWARD
:
1712 newMenu
= CreatePopupMenu();
1713 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1714 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1715 hResult
= browserService
->GetTravelLog(&travelLog
);
1716 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1717 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1718 commandInfo
.cmdID
= 0x1d;
1719 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1720 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1721 travelLog
->CountEntries(browserService
) > 1)
1723 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1724 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1726 params
.cbSize
= sizeof (params
);
1727 params
.rcExclude
= bounds
;
1728 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1729 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1730 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1732 V_VT(&parmIn
) = VT_I4
;
1734 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1736 else if (selectedItem
!= 0)
1737 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1738 DestroyMenu(newMenu
);
1740 case gViewsCommandID
:
1742 CComVariant outValue
;
1745 V_VT(&inValue
) = VT_INT_PTR
;
1746 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1748 if (fCommandTarget
.p
!= NULL
)
1749 hResult
= fCommandTarget
->Exec(&fCommandCategory
, FCIDM_SHVIEW_AUTOARRANGE
, 1, &inValue
, &outValue
);
1750 // pvaOut is VT_I4 with value 0x403
1753 return TBDDRET_DEFAULT
;
1756 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1761 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1766 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1768 HMENU contextMenuBar
;
1770 POINT clickLocation
;
1772 RBHITTESTINFO hitTestInfo
;
1773 REBARBANDINFOW rebarBandInfo
;
1776 clickLocation
.x
= LOWORD(lParam
);
1777 clickLocation
.y
= HIWORD(lParam
);
1778 hitTestInfo
.pt
= clickLocation
;
1779 ScreenToClient(&hitTestInfo
.pt
);
1780 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1781 if (hitTestInfo
.iBand
== -1)
1783 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1784 rebarBandInfo
.fMask
= RBBIM_ID
;
1785 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1786 bandID
= rebarBandInfo
.wID
;
1787 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1788 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1791 case ITBBID_MENUBAND
: // menu band
1792 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1793 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1794 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1796 case ITBBID_BRANDBAND
: // brand band
1797 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1798 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1799 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1801 case ITBBID_TOOLSBAND
: // tools band
1802 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1803 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1805 case ITBBID_ADDRESSBAND
: // navigation band
1806 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1807 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1814 mii
.cbSize
= sizeof(mii
);
1815 mii
.fMask
= MIIM_STATE
;
1816 mii
.fState
= fLocked
? MFS_CHECKED
: MFS_UNCHECKED
;
1817 SetMenuItemInfo(contextMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, FALSE
, &mii
);
1819 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1820 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1821 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1824 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1826 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1828 case IDM_TOOLBARS_LINKSBAR
: // links
1830 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1831 LockUnlockToolbars(!fLocked
);
1833 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1834 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1838 DestroyMenu(contextMenuBar
);
1842 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1844 if (wParam
!= SIZE_MINIMIZED
)
1846 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1847 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1852 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1854 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1859 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1863 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1865 CComPtr
<IBrowserService
> browserService
;
1866 CComPtr
<ITravelLog
> travelLog
;
1867 TOOLTIPTEXTW
*pTTTW
;
1869 wchar_t tempString
[300];
1872 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1873 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1874 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1876 nID
= (UINT
)pNMHDR
->idFrom
;
1880 if (nID
== (UINT
)IDM_GOTO_BACK
|| nID
== (UINT
)IDM_GOTO_FORWARD
)
1882 // TODO: Should this call QueryService?
1883 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1884 hResult
= browserService
->GetTravelLog(&travelLog
);
1885 hResult
= travelLog
->GetToolTipText(browserService
,
1886 (nID
== (UINT
)IDM_GOTO_BACK
) ? TLOG_BACK
: TLOG_FORE
,
1887 0, tempString
, 299);
1888 if (FAILED_UNEXPECTEDLY(hResult
))
1896 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1897 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1898 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1904 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1909 hResult
= OnWinEvent((HWND
) lParam
, uMsg
, wParam
, lParam
, &theResult
);
1911 bHandled
= hResult
== S_OK
;
1913 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1915 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1917 NMHDR
*notifyHeader
;
1921 notifyHeader
= reinterpret_cast<NMHDR
*>(lParam
);
1923 hResult
= OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1925 bHandled
= hResult
== S_OK
;
1927 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1930 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1936 if (wParam
& MK_CONTROL
)
1941 DWORD msgp
= GetMessagePos();
1943 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1944 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1947 GetWindowRect(m_hWnd
, &rc
);
1949 fStartHeight
= rc
.bottom
- rc
.top
;
1957 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1963 DWORD msgp
= GetMessagePos();
1966 pt
.x
= GET_X_LPARAM(msgp
);
1967 pt
.y
= GET_Y_LPARAM(msgp
);
1969 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
1975 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1981 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
1990 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
1992 CInternetToolbar
*theToolbar
;
1998 ATLTRY (theToolbar
= new CComObject
<CInternetToolbar
>);
1999 if (theToolbar
== NULL
)
2000 return E_OUTOFMEMORY
;
2001 hResult
= theToolbar
->QueryInterface (riid
, reinterpret_cast<void **>(ppv
));
2002 if (FAILED_UNEXPECTEDLY(hResult
))