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
33 HMODULE g_hRShell
= NULL
;
36 // TODO: declare these GUIDs and interfaces in the right place (whatever that may be)
38 IID IID_IAugmentedShellFolder
= { 0x91EA3F8C, 0xC99B, 0x11D0, { 0x98, 0x15, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0x72 } };
39 CLSID CLSID_MergedFolder
= { 0x26FDC864, 0xBE88, 0x46E7, { 0x92, 0x35, 0x03, 0x2D, 0x8E, 0xA5, 0x16, 0x2E } };
41 interface IAugmentedShellFolder
: public IShellFolder
43 virtual HRESULT STDMETHODCALLTYPE
AddNameSpace(LPGUID
, IShellFolder
*, LPCITEMIDLIST
, ULONG
) = 0;
44 virtual HRESULT STDMETHODCALLTYPE
GetNameSpaceID(LPCITEMIDLIST
, LPGUID
) = 0;
45 virtual HRESULT STDMETHODCALLTYPE
QueryNameSpace(ULONG
, LPGUID
, IShellFolder
**) = 0;
46 virtual HRESULT STDMETHODCALLTYPE
EnumNameSpace(ULONG
, PULONG
) = 0;
51 // navigation controls and menubar just send a message to parent window
54 ****Implement BandProxy methods
55 ****Add QueryStatus handler for built-in bands
56 ****Enable/Disable up, search, and folders commands appropriately
57 **Why are explorer toolbar separators a nonstandard width?
58 **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM
59 **Chevron menu on menuband doesn't work
60 **Fix CInternetToolbar::QueryBand to be generic
62 ****Fix context menu to strip divider when menu shown for menu band
63 ****Fix context menu to have items checked appropriately
64 ****Implement -1 command id update
65 ****When bands are rearranged, resize the internet toolbar and fix height of brand band
66 ****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus
67 Implement show/hide of bands
68 Why is the background color of my toolbars different from explorer?
69 Internet Toolbar command handler should get the target for the command and call Exec on the target.
70 For commands built in to the Internet Toolbar, its Exec handles the command
71 When window width is changed, brand band flashes badly
72 Add all bands with correct ids (system bands now add with correct ids)
74 Implement remaining IExplorerToolbar methods
75 Fix toolbar buttons to enable/disable correctly
76 After toolbar is customized, it may be necessary to patch the widths of separators
78 Check sizes and spacing of toolbars against Explorer
79 Implement resizing of the dock bar
80 Add missing icons for toolbar items
81 Draw History item in forward/back dropdown menus with icon
82 Fix toolbar customize dialog to not include separators as possible selections
83 Implement save/restore of toolbar state
84 Refactor drop down menu code to use a common function since code is so similar
87 extern HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
);
88 extern HRESULT
CreateToolsBar(REFIID riid
, void **ppv
);
89 extern HRESULT
CreateBrandBand(REFIID riid
, void **ppv
);
90 extern HRESULT
CreateBandProxy(REFIID riid
, void **ppv
);
91 extern HRESULT
CreateAddressBand(REFIID riid
, void **ppv
);
93 typedef HRESULT(WINAPI
* PMENUBAND_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
94 typedef HRESULT(WINAPI
* PMERGEDFOLDER_CONSTRUCTOR
)(REFIID riid
, void **ppv
);
96 HMODULE hRShell
= NULL
;
97 PMERGEDFOLDER_CONSTRUCTOR pCMergedFolder_Constructor
= NULL
;
98 PMENUBAND_CONSTRUCTOR pCMenuBand_Constructor
= NULL
;
100 HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
)
102 CComPtr
<IInputObject
> pio
;
104 hr
= punk
->QueryInterface(IID_PPV_ARG(IInputObject
, &pio
));
105 if (FAILED_UNEXPECTEDLY(hr
))
107 return pio
->HasFocusIO();
110 HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
)
112 CComPtr
<IInputObject
> pio
;
116 hr
= punk
->QueryInterface(IID_PPV_ARG(IInputObject
, &pio
));
117 if (FAILED_UNEXPECTEDLY(hr
))
119 return pio
->TranslateAcceleratorIO(pmsg
);
122 HRESULT
IUnknown_RelayWinEvent(IUnknown
* punk
, HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
124 CComPtr
<IWinEventHandler
> menuWinEventHandler
;
125 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IWinEventHandler
, &menuWinEventHandler
));
126 if (FAILED_UNEXPECTEDLY(hResult
))
128 hResult
= menuWinEventHandler
->IsWindowOwner(hWnd
);
129 if (FAILED_UNEXPECTEDLY(hResult
))
132 return menuWinEventHandler
->OnWinEvent(hWnd
, uMsg
, wParam
, lParam
, theResult
);
136 HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
)
138 CComPtr
<IDockingWindow
> dockingWindow
;
139 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
140 if (FAILED_UNEXPECTEDLY(hResult
))
142 hResult
= dockingWindow
->ShowDW(fShow
);
143 if (FAILED_UNEXPECTEDLY(hResult
))
148 HRESULT
IUnknown_CloseDW(IUnknown
* punk
, DWORD dwReserved
)
150 CComPtr
<IDockingWindow
> dockingWindow
;
151 HRESULT hResult
= punk
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
152 if (FAILED_UNEXPECTEDLY(hResult
))
154 hResult
= dockingWindow
->CloseDW(dwReserved
);
155 if (FAILED_UNEXPECTEDLY(hResult
))
160 class CInternetToolbar
;
163 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
164 public IDockingWindowSite
,
165 public IInputObjectSite
,
166 public IOleCommandTarget
,
167 public IServiceProvider
173 ITF_NEWBANDALWAYS
= 4,
174 ITF_GRIPPERALWAYS
= 8,
178 CComPtr
<IUnknown
> fContainedBand
; // the band inside us
179 CInternetToolbar
*fToolbar
; // our browser
187 // fields of DESKBANDINFO must be preserved between calls to GetBandInfo
188 DESKBANDINFO fDeskBandInfo
;
192 HRESULT
Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
);
193 HRESULT
GetRBBandInfo(REBARBANDINFOW
&bandInfo
);
196 // *** IOleWindow methods ***
197 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
198 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
200 // *** IDockingWindow methods ***
201 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
202 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
203 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
205 // *** IInputObjectSite specific methods ***
206 virtual HRESULT STDMETHODCALLTYPE
OnFocusChangeIS(IUnknown
*punkObj
, BOOL fSetFocus
);
208 // *** IOleCommandTarget specific methods ***
209 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
210 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
211 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
212 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
214 // *** IServiceProvider methods ***
215 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
217 BEGIN_COM_MAP(CDockSite
)
218 COM_INTERFACE_ENTRY_IID(IID_IOleWindow
, IOleWindow
)
219 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
220 COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite
, IInputObjectSite
)
221 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
222 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
226 CDockSite::CDockSite()
233 fInitialized
= false;
234 memset(&fDeskBandInfo
, 0, sizeof(fDeskBandInfo
));
237 CDockSite::~CDockSite()
241 HRESULT
CDockSite::Initialize(IUnknown
*containedBand
, CInternetToolbar
*browser
, HWND hwnd
, int bandID
, int flags
)
243 TCHAR textBuffer
[40];
244 REBARBANDINFOW bandInfo
;
247 fContainedBand
= containedBand
;
252 hResult
= IUnknown_SetSite(containedBand
, static_cast<IOleWindow
*>(this));
253 if (FAILED_UNEXPECTEDLY(hResult
))
255 hResult
= IUnknown_GetWindow(containedBand
, &fChildWindow
);
256 if (FAILED_UNEXPECTEDLY(hResult
))
259 memset(&bandInfo
, 0, sizeof(bandInfo
));
260 bandInfo
.cbSize
= sizeof(bandInfo
);
261 bandInfo
.lpText
= textBuffer
;
262 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
263 hResult
= GetRBBandInfo(bandInfo
);
265 SendMessage(fRebarWindow
, RB_GETBANDCOUNT
, 0, 0);
266 SendMessage(fRebarWindow
, RB_INSERTBANDW
, -1, (LPARAM
)&bandInfo
);
271 HRESULT
CDockSite::GetRBBandInfo(REBARBANDINFOW
&bandInfo
)
273 CComPtr
<IDeskBand
> deskBand
;
276 hResult
= fContainedBand
->QueryInterface(IID_PPV_ARG(IDeskBand
, &deskBand
));
277 if (FAILED_UNEXPECTEDLY(hResult
))
280 fDeskBandInfo
.dwMask
= DBIM_BKCOLOR
| DBIM_MODEFLAGS
| DBIM_TITLE
| DBIM_ACTUAL
|
281 DBIM_INTEGRAL
| DBIM_MAXSIZE
| DBIM_MINSIZE
;
282 hResult
= deskBand
->GetBandInfo(fBandID
, 0, &fDeskBandInfo
);
283 // result of call is ignored
285 bandInfo
.fMask
= RBBIM_LPARAM
| RBBIM_IDEALSIZE
| RBBIM_ID
| RBBIM_CHILDSIZE
| RBBIM_CHILD
|
286 RBBIM_TEXT
| RBBIM_STYLE
;
288 bandInfo
.fStyle
= RBBS_FIXEDBMP
;
289 if (fDeskBandInfo
.dwModeFlags
& DBIMF_VARIABLEHEIGHT
)
290 bandInfo
.fStyle
|= RBBS_VARIABLEHEIGHT
;
291 if (fDeskBandInfo
.dwModeFlags
& DBIMF_USECHEVRON
)
292 bandInfo
.fStyle
|= RBBS_USECHEVRON
;
293 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BREAK
)
294 bandInfo
.fStyle
|= RBBS_BREAK
;
295 if (fDeskBandInfo
.dwModeFlags
& DBIMF_TOPALIGN
)
296 bandInfo
.fStyle
|= RBBS_TOPALIGN
;
297 if (fFlags
& ITF_NOGRIPPER
|| fToolbar
->fLocked
)
298 bandInfo
.fStyle
|= RBBS_NOGRIPPER
;
299 if (fFlags
& ITF_NOTITLE
)
300 bandInfo
.fStyle
|= RBBS_HIDETITLE
;
301 if (fFlags
& ITF_GRIPPERALWAYS
&& !fToolbar
->fLocked
)
302 bandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
303 if (fFlags
& ITF_FIXEDSIZE
)
304 bandInfo
.fStyle
|= RBBS_FIXEDSIZE
;
306 if (fDeskBandInfo
.dwModeFlags
& DBIMF_BKCOLOR
)
308 bandInfo
.fMask
|= RBBIM_COLORS
;
309 bandInfo
.clrFore
= CLR_DEFAULT
;
310 bandInfo
.clrBack
= fDeskBandInfo
.crBkgnd
;
312 wcsncpy(bandInfo
.lpText
, fDeskBandInfo
.wszTitle
, bandInfo
.cch
);
313 bandInfo
.hwndChild
= fChildWindow
;
314 bandInfo
.cxMinChild
= fDeskBandInfo
.ptMinSize
.x
;
315 bandInfo
.cyMinChild
= fDeskBandInfo
.ptMinSize
.y
;
316 bandInfo
.wID
= fBandID
;
317 bandInfo
.cyChild
= fDeskBandInfo
.ptActual
.y
;
318 bandInfo
.cyMaxChild
= fDeskBandInfo
.ptMaxSize
.y
;
319 bandInfo
.cyIntegral
= fDeskBandInfo
.ptIntegral
.y
;
320 bandInfo
.cxIdeal
= fDeskBandInfo
.ptActual
.x
;
321 bandInfo
.lParam
= reinterpret_cast<LPARAM
>(this);
325 HRESULT STDMETHODCALLTYPE
CDockSite::GetWindow(HWND
*lphwnd
)
329 *lphwnd
= fRebarWindow
;
333 HRESULT STDMETHODCALLTYPE
CDockSite::ContextSensitiveHelp(BOOL fEnterMode
)
338 HRESULT STDMETHODCALLTYPE
CDockSite::GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
)
343 HRESULT STDMETHODCALLTYPE
CDockSite::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
348 HRESULT STDMETHODCALLTYPE
CDockSite::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
353 HRESULT STDMETHODCALLTYPE
CDockSite::OnFocusChangeIS (IUnknown
*punkObj
, BOOL fSetFocus
)
358 HRESULT STDMETHODCALLTYPE
CDockSite::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
359 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
364 HRESULT STDMETHODCALLTYPE
CDockSite::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
,
365 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
367 TCHAR textBuffer
[40];
368 REBARBANDINFOW bandInfo
;
372 if (IsEqualIID(*pguidCmdGroup
, CGID_DeskBand
))
376 case DBID_BANDINFOCHANGED
:
377 if (fInitialized
== false)
379 if (V_VT(pvaIn
) != VT_I4
)
381 if (V_I4(pvaIn
) != fBandID
)
383 // deskband information changed
384 // call GetBandInfo and refresh information in rebar
385 memset(&bandInfo
, 0, sizeof(bandInfo
));
386 bandInfo
.cbSize
= sizeof(bandInfo
);
387 bandInfo
.lpText
= textBuffer
;
388 bandInfo
.cch
= sizeof(textBuffer
) / sizeof(TCHAR
);
389 hResult
= GetRBBandInfo(bandInfo
);
390 if (FAILED_UNEXPECTEDLY(hResult
))
392 index
= (int)SendMessage(fRebarWindow
, RB_IDTOINDEX
, fBandID
, 0);
393 SendMessage(fRebarWindow
, RB_SETBANDINFOW
, index
, (LPARAM
)&bandInfo
);
400 HRESULT STDMETHODCALLTYPE
CDockSite::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
402 if (IsEqualIID(guidService
, SID_SMenuBandParent
))
403 return this->QueryInterface(riid
, ppvObject
);
405 return fToolbar
->QueryService(guidService
, riid
, ppvObject
);
408 CMenuCallback::CMenuCallback()
412 CMenuCallback::~CMenuCallback()
416 static HRESULT
BindToDesktop(LPCITEMIDLIST pidl
, IShellFolder
** ppsfResult
)
419 CComPtr
<IShellFolder
> psfDesktop
;
423 hr
= SHGetDesktopFolder(&psfDesktop
);
427 hr
= psfDesktop
->BindToObject(pidl
, NULL
, IID_PPV_ARG(IShellFolder
, ppsfResult
));
432 static HRESULT
GetFavoritesFolder(IShellFolder
** ppsfFavorites
, LPITEMIDLIST
* ppidl
)
435 LPITEMIDLIST pidlUserFavorites
;
436 LPITEMIDLIST pidlCommonFavorites
;
437 CComPtr
<IShellFolder
> psfUserFavorites
;
438 CComPtr
<IShellFolder
> psfCommonFavorites
;
439 CComPtr
<IAugmentedShellFolder
> pasf
;
442 *ppsfFavorites
= NULL
;
447 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_FAVORITES
, &pidlUserFavorites
);
450 WARN("Failed to get the USER favorites folder. Trying to run with just the COMMON one.\n");
452 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_COMMON_FAVORITES
, &pidlCommonFavorites
);
453 if (FAILED_UNEXPECTEDLY(hr
))
456 TRACE("COMMON favorites obtained.\n");
457 *ppidl
= pidlCommonFavorites
;
458 hr
= BindToDesktop(pidlCommonFavorites
, ppsfFavorites
);
462 hr
= SHGetSpecialFolderLocation(NULL
, CSIDL_COMMON_FAVORITES
, &pidlCommonFavorites
);
463 if (FAILED_UNEXPECTEDLY(hr
))
465 WARN("Failed to get the COMMON favorites folder. Will use only the USER contents.\n");
466 *ppidl
= pidlCommonFavorites
;
467 hr
= BindToDesktop(pidlUserFavorites
, ppsfFavorites
);
471 TRACE("Both COMMON and USER favorites folders obtained, merging them...\n");
473 hr
= BindToDesktop(pidlUserFavorites
, &psfUserFavorites
);
474 if (FAILED_UNEXPECTEDLY(hr
))
477 hr
= BindToDesktop(pidlCommonFavorites
, &psfCommonFavorites
);
478 if (FAILED_UNEXPECTEDLY(hr
))
484 hRShell
= GetModuleHandle(L
"rshell.dll");
486 hRShell
= LoadLibrary(L
"rshell.dll");
489 if (!pCMergedFolder_Constructor
)
490 pCMergedFolder_Constructor
= (PMERGEDFOLDER_CONSTRUCTOR
) GetProcAddress(hRShell
, "CMergedFolder_Constructor");
492 if (pCMergedFolder_Constructor
)
494 hr
= pCMergedFolder_Constructor(IID_PPV_ARG(IAugmentedShellFolder
, &pasf
));
501 hr
= CoCreateInstance(CLSID_MergedFolder
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IAugmentedShellFolder
, &pasf
));
503 if (FAILED_UNEXPECTEDLY(hr
))
505 *ppsfFavorites
= psfUserFavorites
.Detach();
506 *ppidl
= pidlUserFavorites
;
507 ILFree(pidlCommonFavorites
);
511 hr
= pasf
->AddNameSpace(NULL
, psfUserFavorites
, pidlUserFavorites
, 0xFF00);
512 if (FAILED_UNEXPECTEDLY(hr
))
515 hr
= pasf
->AddNameSpace(NULL
, psfCommonFavorites
, pidlCommonFavorites
, 0);
516 if (FAILED_UNEXPECTEDLY(hr
))
519 hr
= pasf
->QueryInterface(IID_PPV_ARG(IShellFolder
, ppsfFavorites
));
522 // TODO: obtain the folder's PIDL
524 ILFree(pidlCommonFavorites
);
525 ILFree(pidlUserFavorites
);
530 HRESULT STDMETHODCALLTYPE
CMenuCallback::GetObject(LPSMDATA psmd
, REFIID riid
, void **ppvObject
)
532 CComPtr
<IShellMenu
> parentMenu
;
533 CComPtr
<IShellMenu
> newMenu
;
534 CComPtr
<IShellFolder
> favoritesFolder
;
535 LPITEMIDLIST favoritesPIDL
;
538 HMENU favoritesHMenu
;
542 static const TCHAR szFavoritesKey
[] =
543 _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites");
545 if (!IsEqualIID(riid
, IID_IShellMenu
))
547 if (psmd
->uId
!= FCIDM_MENU_FAVORITES
)
550 // create favorites menu
551 hResult
= psmd
->punk
->QueryInterface(IID_PPV_ARG(IShellMenu
, &parentMenu
));
552 if (FAILED_UNEXPECTEDLY(hResult
))
554 hResult
= parentMenu
->GetMenu(&parentHMenu
, &ownerWindow
, NULL
);
555 if (FAILED_UNEXPECTEDLY(hResult
))
557 favoritesHMenu
= GetSubMenu(parentHMenu
, 3);
558 if (favoritesHMenu
== NULL
)
561 if (fFavoritesMenu
.p
== NULL
)
563 #if USE_CUSTOM_MENUBAND
566 hRShell
= GetModuleHandle(L
"rshell.dll");
568 hRShell
= LoadLibrary(L
"rshell.dll");
571 if (!pCMenuBand_Constructor
)
572 pCMenuBand_Constructor
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(hRShell
, "CMenuBand_Constructor");
574 if (pCMenuBand_Constructor
)
576 hResult
= pCMenuBand_Constructor(IID_PPV_ARG(IShellMenu
, &newMenu
));
580 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
581 IID_PPV_ARG(IShellMenu
, &newMenu
));
584 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
585 IID_PPV_ARG(IShellMenu
, &newMenu
));
587 if (FAILED_UNEXPECTEDLY(hResult
))
589 hResult
= newMenu
->Initialize(this, FCIDM_MENU_FAVORITES
, -1, SMINIT_VERTICAL
| SMINIT_CACHED
);
590 if (FAILED_UNEXPECTEDLY(hResult
))
593 RegCreateKeyEx(HKEY_CURRENT_USER
, szFavoritesKey
,
594 0, NULL
, 0, KEY_READ
| KEY_WRITE
, NULL
, &orderRegKey
, &disposition
);
596 hResult
= GetFavoritesFolder(&favoritesFolder
, &favoritesPIDL
);
597 if (FAILED_UNEXPECTEDLY(hResult
))
600 hResult
= newMenu
->SetShellFolder(favoritesFolder
, favoritesPIDL
, orderRegKey
, SMSET_BOTTOM
| SMINIT_CACHED
| SMINV_ID
);
602 ILFree(favoritesPIDL
);
607 fFavoritesMenu
= newMenu
;
610 hResult
= fFavoritesMenu
->SetMenu(favoritesHMenu
, ownerWindow
, SMSET_TOP
| SMSET_DONTOWN
);
611 if (FAILED_UNEXPECTEDLY(hResult
))
614 return fFavoritesMenu
->QueryInterface(riid
, ppvObject
);
617 HRESULT STDMETHODCALLTYPE
CMenuCallback::CallbackSM(LPSMDATA psmd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
629 SMINFO
*infoPtr
= reinterpret_cast<SMINFO
*>(lParam
);
630 if ((infoPtr
->dwMask
& SMIM_FLAGS
) != 0)
632 if (psmd
->uId
== FCIDM_MENU_FAVORITES
)
634 infoPtr
->dwFlags
|= SMIF_DROPCASCADE
;
638 infoPtr
->dwFlags
|= SMIF_TRACKPOPUP
;
641 if ((infoPtr
->dwMask
& SMIM_ICON
) != 0)
648 return GetObject(psmd
, *reinterpret_cast<IID
*>(wParam
), reinterpret_cast<void **>(lParam
));
649 case SMC_GETSFOBJECT
:
652 PostMessageW(psmd
->hwnd
, WM_COMMAND
, psmd
->uId
, 0);
655 SHInvokeDefaultCommand(psmd
->hwnd
, psmd
->psf
, psmd
->pidlItem
);
657 case SMC_SFSELECTITEM
:
670 case SMC_DEFAULTICON
:
674 case SMC_CHEVRONEXPAND
:
676 case SMC_DISPLAYCHEVRONTIP
:
678 case SMC_SETSFOBJECT
:
680 case SMC_SHCHANGENOTIFY
:
682 case SMC_CHEVRONGETTIP
:
684 case SMC_SFDDRESTRICTED
:
696 CInternetToolbar::CInternetToolbar()
700 fMenuBandWindow
= NULL
;
701 fNavigationWindow
= NULL
;
702 fMenuCallback
= new CComObject
<CMenuCallback
>();
703 fToolbarWindow
= NULL
;
706 fMenuCallback
->AddRef();
709 CInternetToolbar::~CInternetToolbar()
713 void CInternetToolbar::AddDockItem(IUnknown
*newItem
, int bandID
, int flags
)
715 CComPtr
<CDockSite
> newSite
;
717 newSite
= new CComObject
<CDockSite
>;
718 newSite
->Initialize(newItem
, this, fMainReBar
, bandID
, flags
);
721 HRESULT
CInternetToolbar::ReserveBorderSpace(LONG maxHeight
)
723 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
724 RECT availableBorderSpace
;
726 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
727 if (FAILED_UNEXPECTEDLY(hResult
))
729 hResult
= dockingWindowSite
->GetBorderDW(static_cast<IDockingWindow
*>(this), &availableBorderSpace
);
730 if (FAILED_UNEXPECTEDLY(hResult
))
733 if (availableBorderSpace
.top
> maxHeight
)
735 availableBorderSpace
.top
= maxHeight
;
738 return ResizeBorderDW(&availableBorderSpace
, fSite
, FALSE
);
741 HRESULT
CInternetToolbar::CreateMenuBar(IShellMenu
**pMenuBar
)
743 CComPtr
<IShellMenu
> menubar
;
744 CComPtr
<IShellMenuCallback
> callback
;
755 #if USE_CUSTOM_MENUBAND
756 if (!g_hRShell
) g_hRShell
= GetModuleHandleW(L
"rshell.dll");
758 if (!g_hRShell
) g_hRShell
= LoadLibraryW(L
"rshell.dll");
762 PMENUBAND_CONSTRUCTOR func
= (PMENUBAND_CONSTRUCTOR
) GetProcAddress(g_hRShell
, "CMenuBand_Constructor");
765 hResult
= func(IID_PPV_ARG(IShellMenu
, &menubar
));
770 if (FAILED_UNEXPECTEDLY(hResult
))
772 hResult
= CoCreateInstance(CLSID_MenuBand
, NULL
, CLSCTX_INPROC_SERVER
,
773 IID_PPV_ARG(IShellMenu
, &menubar
));
774 if (FAILED_UNEXPECTEDLY(hResult
))
778 hResult
= fMenuCallback
->QueryInterface(IID_PPV_ARG(IShellMenuCallback
, &callback
));
779 if (FAILED_UNEXPECTEDLY(hResult
))
782 hResult
= menubar
->Initialize(callback
, -1, ANCESTORDEFAULT
, SMINIT_HORIZONTAL
| SMINIT_TOPLEVEL
);
783 if (FAILED_UNEXPECTEDLY(hResult
))
788 hResult
= IUnknown_Exec(fSite
, CGID_Explorer
, 0x35, 0, NULL
, &menuOut
);
789 if (FAILED_UNEXPECTEDLY(hResult
))
792 if (V_VT(&menuOut
) != VT_INT_PTR
|| V_INTREF(&menuOut
) == NULL
)
795 hResult
= IUnknown_GetWindow(fSite
, &ownerWindow
);
796 if (FAILED_UNEXPECTEDLY(hResult
))
799 HMENU hMenuBar
= (HMENU
) V_INTREF(&menuOut
);
801 // FIXME: Figure out the proper way to do this.
802 HMENU hMenuFavs
= GetSubMenu(hMenuBar
, 3);
805 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
808 hResult
= menubar
->SetMenu(hMenuBar
, ownerWindow
, SMSET_DONTOWN
);
809 if (FAILED_UNEXPECTEDLY(hResult
))
813 hResult
= IUnknown_Exec(menubar
, CGID_MenuBand
, 3, 1, NULL
, NULL
);
814 if (FAILED_UNEXPECTEDLY(hResult
))
817 *pMenuBar
= menubar
.Detach();
822 HRESULT
CInternetToolbar::CreateBrandBand(IUnknown
**logoBar
)
825 return ::CreateBrandBand(IID_PPV_ARG(IUnknown
, logoBar
));
827 return CoCreateInstance(CLSID_BrandBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, logoBar
));
831 HRESULT
CInternetToolbar::CreateToolsBar(IUnknown
**toolsBar
)
833 return ::CreateToolsBar(IID_PPV_ARG(IUnknown
, toolsBar
));
836 HRESULT
CInternetToolbar::CreateAddressBand(IUnknown
**toolsBar
)
839 return ::CreateAddressBand(IID_PPV_ARG(IUnknown
, toolsBar
));
841 return CoCreateInstance(CLSID_SH_AddressBand
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, toolsBar
));
845 HRESULT
CInternetToolbar::LockUnlockToolbars(bool locked
)
847 REBARBANDINFOW rebarBandInfo
;
852 if (locked
!= fLocked
)
855 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
856 rebarBandInfo
.fMask
= RBBIM_STYLE
| RBBIM_LPARAM
;
857 bandCount
= (int)SendMessage(fMainReBar
, RB_GETBANDCOUNT
, 0, 0);
858 for (INT x
= 0; x
< bandCount
; x
++)
860 SendMessage(fMainReBar
, RB_GETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
861 dockSite
= reinterpret_cast<CDockSite
*>(rebarBandInfo
.lParam
);
862 if (dockSite
!= NULL
)
864 rebarBandInfo
.fStyle
&= ~(RBBS_NOGRIPPER
| RBBS_GRIPPERALWAYS
);
865 if (dockSite
->fFlags
& CDockSite::ITF_NOGRIPPER
|| fLocked
)
866 rebarBandInfo
.fStyle
|= RBBS_NOGRIPPER
;
867 if (dockSite
->fFlags
& CDockSite::ITF_GRIPPERALWAYS
&& !fLocked
)
868 rebarBandInfo
.fStyle
|= RBBS_GRIPPERALWAYS
;
869 SendMessage(fMainReBar
, RB_SETBANDINFOW
, x
, (LPARAM
)&rebarBandInfo
);
872 hResult
= ReserveBorderSpace();
874 // TODO: refresh view menu?
879 HRESULT
CInternetToolbar::CommandStateChanged(bool newValue
, int commandID
)
887 // loop through buttons
888 //for buttons in CLSID_CommonButtons
889 // if up, QueryStatus for up state and update it
891 //for buttons in fCommandCategory, update with QueryStatus of fCommandTarget
895 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_FORWARD
, newValue
? TBSTATE_ENABLED
: 0);
899 hResult
= SetState(&CLSID_CommonButtons
, IDM_GOTO_BACK
, newValue
? TBSTATE_ENABLED
: 0);
905 HRESULT
CInternetToolbar::CreateAndInitBandProxy()
907 CComPtr
<IServiceProvider
> serviceProvider
;
910 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
911 if (FAILED_UNEXPECTEDLY(hResult
))
913 hResult
= serviceProvider
->QueryService(SID_IBandProxy
, IID_PPV_ARG(IBandProxy
, &fBandProxy
));
914 if (FAILED_UNEXPECTEDLY(hResult
))
916 hResult
= CreateBandProxy(IID_PPV_ARG(IBandProxy
, &fBandProxy
));
917 if (FAILED_UNEXPECTEDLY(hResult
))
919 hResult
= fBandProxy
->SetSite(fSite
);
920 if (FAILED_UNEXPECTEDLY(hResult
))
926 HRESULT STDMETHODCALLTYPE
CInternetToolbar::UIActivateIO(BOOL fActivate
, LPMSG lpMsg
)
931 HRESULT STDMETHODCALLTYPE
CInternetToolbar::HasFocusIO()
933 HRESULT hr
= S_FALSE
;
936 hr
= IUnknown_HasFocusIO(fMenuBar
);
941 hr
= IUnknown_HasFocusIO(fControlsBar
);
946 hr
= IUnknown_HasFocusIO(fNavigationBar
);
953 HRESULT STDMETHODCALLTYPE
CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg
)
955 HRESULT hr
= S_FALSE
;
958 hr
= IUnknown_TranslateAcceleratorIO(fMenuBar
, lpMsg
);
963 hr
= IUnknown_TranslateAcceleratorIO(fControlsBar
, lpMsg
);
968 hr
= IUnknown_TranslateAcceleratorIO(fNavigationBar
, lpMsg
);
975 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetWindow(HWND
*lphwnd
)
983 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode
)
988 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ShowDW(BOOL fShow
)
995 hResult
= ReserveBorderSpace();
996 if (FAILED_UNEXPECTEDLY(hResult
))
1002 hResult
= IUnknown_ShowDW(fMenuBar
, fShow
);
1003 if (FAILED_UNEXPECTEDLY(hResult
))
1009 hResult
= IUnknown_ShowDW(fControlsBar
, fShow
);
1010 if (FAILED_UNEXPECTEDLY(hResult
))
1015 hResult
= IUnknown_ShowDW(fNavigationBar
, fShow
);
1016 if (FAILED_UNEXPECTEDLY(hResult
))
1021 hResult
= IUnknown_ShowDW(fLogoBar
, fShow
);
1022 if (FAILED_UNEXPECTEDLY(hResult
))
1028 HRESULT STDMETHODCALLTYPE
CInternetToolbar::CloseDW(DWORD dwReserved
)
1034 hResult
= IUnknown_CloseDW(fMenuBar
, dwReserved
);
1035 if (FAILED_UNEXPECTEDLY(hResult
))
1037 ReleaseCComPtrExpectZero(fMenuBar
);
1041 hResult
= IUnknown_CloseDW(fControlsBar
, dwReserved
);
1042 if (FAILED_UNEXPECTEDLY(hResult
))
1044 ReleaseCComPtrExpectZero(fControlsBar
);
1048 hResult
= IUnknown_CloseDW(fNavigationBar
, dwReserved
);
1049 if (FAILED_UNEXPECTEDLY(hResult
))
1051 ReleaseCComPtrExpectZero(fNavigationBar
);
1055 hResult
= IUnknown_CloseDW(fLogoBar
, dwReserved
);
1056 if (FAILED_UNEXPECTEDLY(hResult
))
1058 ReleaseCComPtrExpectZero(fLogoBar
);
1063 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder
,
1064 IUnknown
*punkToolbarSite
, BOOL fReserved
)
1066 RECT neededBorderSpace
;
1067 RECT availableBorderSpace
= *prcBorder
;
1069 SendMessage(fMainReBar
, RB_SIZETORECT
, RBSTR_CHANGERECT
, reinterpret_cast<LPARAM
>(&availableBorderSpace
));
1071 // RBSTR_CHANGERECT does not seem to set the proper size in the rect.
1072 // Let's make sure we fetch the actual size properly.
1073 GetWindowRect(fMainReBar
, &availableBorderSpace
);
1074 neededBorderSpace
.left
= 0;
1075 neededBorderSpace
.top
= availableBorderSpace
.bottom
- availableBorderSpace
.top
;
1077 neededBorderSpace
.top
+= 3;
1078 neededBorderSpace
.right
= 0;
1079 neededBorderSpace
.bottom
= 0;
1081 CComPtr
<IDockingWindowSite
> dockingWindowSite
;
1083 HRESULT hResult
= fSite
->QueryInterface(IID_PPV_ARG(IDockingWindowSite
, &dockingWindowSite
));
1084 if (FAILED_UNEXPECTEDLY(hResult
))
1087 hResult
= dockingWindowSite
->RequestBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
1088 if (FAILED_UNEXPECTEDLY(hResult
))
1091 hResult
= dockingWindowSite
->SetBorderSpaceDW(static_cast<IDockingWindow
*>(this), &neededBorderSpace
);
1092 if (FAILED_UNEXPECTEDLY(hResult
))
1098 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetClassID(CLSID
*pClassID
)
1100 if (pClassID
== NULL
)
1102 *pClassID
= CLSID_InternetToolbar
;
1106 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsDirty()
1111 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Load(IStream
*pStm
)
1116 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Save(IStream
*pStm
, BOOL fClearDirty
)
1121 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSizeMax(ULARGE_INTEGER
*pcbSize
)
1126 HRESULT STDMETHODCALLTYPE
CInternetToolbar::InitNew()
1128 CComPtr
<IShellMenu
> menuBar
;
1129 CComPtr
<IUnknown
> logoBar
;
1130 CComPtr
<IUnknown
> toolsBar
;
1131 CComPtr
<IUnknown
> navigationBar
;
1134 /* Create and attach the menubar to the rebar */
1135 hResult
= CreateMenuBar(&menuBar
);
1136 if (FAILED_UNEXPECTEDLY(hResult
))
1138 AddDockItem(menuBar
, ITBBID_MENUBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1140 hResult
= IUnknown_GetWindow(menuBar
, &fMenuBandWindow
);
1141 fMenuBar
.Attach(menuBar
.Detach()); // transfer the ref count
1143 // FIXME: The ros Rebar does not properly support fixed-size items such as the brandband,
1144 // and it will put them in their own row, sized to take up the whole row.
1146 /* Create and attach the brand/logo to the rebar */
1147 hResult
= CreateBrandBand(&logoBar
);
1148 if (FAILED_UNEXPECTEDLY(hResult
))
1150 AddDockItem(logoBar
, ITBBID_BRANDBAND
, CDockSite::ITF_NOGRIPPER
| CDockSite::ITF_NOTITLE
| CDockSite::ITF_FIXEDSIZE
);
1151 fLogoBar
.Attach(logoBar
.Detach()); // transfer the ref count
1154 /* Create and attach the standard toolbar to the rebar */
1155 hResult
= CreateToolsBar(&toolsBar
);
1156 if (FAILED_UNEXPECTEDLY(hResult
))
1158 AddDockItem(toolsBar
, ITBBID_TOOLSBAND
, CDockSite::ITF_NOTITLE
| CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1159 fControlsBar
.Attach(toolsBar
.Detach()); // transfer the ref count
1160 hResult
= IUnknown_GetWindow(fControlsBar
, &fToolbarWindow
);
1161 if (FAILED_UNEXPECTEDLY(hResult
))
1164 /* Create and attach the address/navigation toolbar to the rebar */
1165 hResult
= CreateAddressBand(&navigationBar
);
1166 if (FAILED_UNEXPECTEDLY(hResult
))
1168 AddDockItem(navigationBar
, ITBBID_ADDRESSBAND
, CDockSite::ITF_NEWBANDALWAYS
| CDockSite::ITF_GRIPPERALWAYS
);
1169 fNavigationBar
.Attach(navigationBar
.Detach());
1170 hResult
= IUnknown_GetWindow(fNavigationBar
, &fNavigationWindow
);
1175 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryStatus(const GUID
*pguidCmdGroup
,
1176 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1178 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1182 switch (prgCmds
->cmdID
)
1184 case ITID_TEXTLABELS
: // Text Labels state
1185 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1187 case ITID_TOOLBARBANDSHOWN
: // toolbar visibility
1188 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1190 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1192 case ITID_ADDRESSBANDSHOWN
: // address bar visibility
1193 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1195 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1197 case ITID_LINKSBANDSHOWN
: // links bar visibility
1200 case ITID_MENUBANDSHOWN
: // Menubar band visibility
1201 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1203 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1205 case ITID_AUTOHIDEENABLED
: // Auto hide enabled/disabled
1208 case ITID_CUSTOMIZEENABLED
: // customize enabled
1209 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1211 case ITID_TOOLBARLOCKED
: // lock toolbars
1212 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1214 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1228 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1229 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1231 if (IsEqualIID(*pguidCmdGroup
, CGID_PrivCITCommands
))
1236 // what do I do here?
1238 case ITID_TEXTLABELS
:
1239 // toggle text labels
1241 case ITID_TOOLBARBANDSHOWN
:
1242 // toggle toolbar band visibility
1244 case ITID_ADDRESSBANDSHOWN
:
1245 // toggle address band visibility
1247 case ITID_LINKSBANDSHOWN
:
1248 // toggle links band visibility
1250 case ITID_CUSTOMIZEENABLED
:
1253 case ITID_TOOLBARLOCKED
:
1254 return LockUnlockToolbars(!fLocked
);
1260 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfoCount(UINT
*pctinfo
)
1265 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1270 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
,
1271 LCID lcid
, DISPID
*rgDispId
)
1276 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1277 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1281 switch(dispIdMember
)
1283 case DISPID_BEFORENAVIGATE
:
1286 case DISPID_DOWNLOADCOMPLETE
:
1289 case DISPID_COMMANDSTATECHANGE
:
1290 if (pDispParams
->cArgs
!= 2)
1291 return E_INVALIDARG
;
1292 if (V_VT(&pDispParams
->rgvarg
[0]) != VT_BOOL
|| V_VT(&pDispParams
->rgvarg
[1]) != VT_I4
)
1293 return E_INVALIDARG
;
1294 return CommandStateChanged(V_BOOL(&pDispParams
->rgvarg
[0]) != VARIANT_FALSE
,
1295 V_I4(&pDispParams
->rgvarg
[1]));
1296 case DISPID_DOWNLOADBEGIN
:
1299 case DISPID_NAVIGATECOMPLETE2
:
1302 case DISPID_DOCUMENTCOMPLETE
:
1309 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetCommandTarget(IUnknown
*theTarget
, GUID
*category
, long param14
)
1313 TRACE("SetCommandTarget %p category %s param %d\n", theTarget
, wine_dbgstr_guid(category
), param14
);
1315 fCommandTarget
.Release();
1316 hResult
= theTarget
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &fCommandTarget
));
1317 if (FAILED_UNEXPECTEDLY(hResult
))
1319 fCommandCategory
= *category
;
1323 HRESULT STDMETHODCALLTYPE
CInternetToolbar::Unknown1()
1328 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddButtons(const GUID
*pguidCmdGroup
, long buttonCount
, TBBUTTON
*buttons
)
1333 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddString(const GUID
*pguidCmdGroup
,
1334 HINSTANCE param10
, LPCTSTR param14
, long *param18
)
1338 result
= (long)::SendMessage(fToolbarWindow
, TB_ADDSTRINGW
,
1339 reinterpret_cast<WPARAM
>(param10
), reinterpret_cast<LPARAM
>(param14
));
1346 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1351 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetState(const GUID
*pguidCmdGroup
, long commandID
, long *theState
)
1353 if (theState
== NULL
)
1355 // map the command id
1356 *theState
= (long)::SendMessage(fToolbarWindow
, TB_GETSTATE
, commandID
, 0);
1360 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetState(const GUID
*pguidCmdGroup
, long commandID
, long theState
)
1362 // map the command id
1363 ::SendMessage(fToolbarWindow
, TB_SETSTATE
, commandID
, MAKELONG(theState
, 0));
1367 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBitmap(const GUID
*pguidCmdGroup
, long param10
, long buttonCount
,
1368 TBADDBITMAP
*lParam
, long *newIndex
, COLORREF param20
)
1373 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBitmapSize(long *paramC
)
1377 *paramC
= MAKELONG(24, 24);
1381 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SendToolbarMsg(const GUID
*pguidCmdGroup
, UINT uMsg
,
1382 WPARAM wParam
, LPARAM lParam
, LRESULT
*result
)
1387 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetImageList(const GUID
*pguidCmdGroup
, HIMAGELIST param10
,
1388 HIMAGELIST param14
, HIMAGELIST param18
)
1393 HRESULT STDMETHODCALLTYPE
CInternetToolbar::ModifyButton(const GUID
*pguidCmdGroup
, long param10
, long param14
)
1398 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnChange(LONG lEvent
, LPCITEMIDLIST pidl1
, LPCITEMIDLIST pidl2
)
1403 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetSite(IUnknown
*pUnkSite
)
1405 CComPtr
<IBrowserService
> browserService
;
1406 CComPtr
<IServiceProvider
> serviceProvider
;
1407 CComPtr
<IOleWindow
> oleWindow
;
1412 if (pUnkSite
== NULL
)
1414 hResult
= AtlUnadvise(fSite
, DIID_DWebBrowserEvents
, fAdviseCookie
);
1415 ::DestroyWindow(fMainReBar
);
1421 // get window handle of owner
1422 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IOleWindow
, &oleWindow
));
1423 if (FAILED_UNEXPECTEDLY(hResult
))
1425 hResult
= oleWindow
->GetWindow(&ownerWindow
);
1426 if (FAILED_UNEXPECTEDLY(hResult
))
1428 if (ownerWindow
== NULL
)
1431 // create dock container
1433 dockContainer
= SHCreateWorkerWindowW(0, ownerWindow
, 0,
1434 WS_VISIBLE
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, NULL
, 0);
1435 if (dockContainer
== NULL
)
1437 SubclassWindow(dockContainer
);
1439 // create rebar in dock container
1440 DWORD style
= WS_VISIBLE
| WS_BORDER
| WS_CHILD
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
|
1441 RBS_VARHEIGHT
| RBS_BANDBORDERS
| RBS_REGISTERDROP
| RBS_AUTOSIZE
| RBS_DBLCLKTOGGLE
|
1442 CCS_NODIVIDER
| CCS_NOPARENTALIGN
| CCS_TOP
;
1443 DWORD exStyle
= WS_EX_LEFT
| WS_EX_LTRREADING
| WS_EX_RIGHTSCROLLBAR
| WS_EX_TOOLWINDOW
;
1444 fMainReBar
= CreateWindowEx(exStyle
, REBARCLASSNAMEW
, NULL
, style
,
1445 0, 0, 700, 60, dockContainer
, NULL
, _AtlBaseModule
.GetModuleInstance(), NULL
);
1446 if (fMainReBar
== NULL
)
1449 // take advice to watch events
1450 hResult
= pUnkSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1451 hResult
= serviceProvider
->QueryService(
1452 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1453 hResult
= AtlAdvise(browserService
, static_cast<IDispatch
*>(this), DIID_DWebBrowserEvents
, &fAdviseCookie
);
1458 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetSite(REFIID riid
, void **ppvSite
)
1460 if (ppvSite
== NULL
)
1462 if (fSite
.p
!= NULL
)
1463 return fSite
->QueryInterface(riid
, ppvSite
);
1468 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1470 CComPtr
<IServiceProvider
> serviceProvider
;
1473 if (IsEqualIID(guidService
, IID_IBandSite
))
1474 return this->QueryInterface(riid
, ppvObject
);
1475 if (IsEqualIID(guidService
, SID_IBandProxy
))
1477 if (fBandProxy
.p
== NULL
)
1479 hResult
= CreateAndInitBandProxy();
1480 if (FAILED_UNEXPECTEDLY(hResult
))
1483 return fBandProxy
->QueryInterface(riid
, ppvObject
);
1485 return IUnknown_QueryService(fSite
, guidService
, riid
, ppvObject
);
1488 HRESULT STDMETHODCALLTYPE
CInternetToolbar::OnWinEvent(
1489 HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*theResult
)
1495 hResult
= IUnknown_RelayWinEvent(fMenuBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1496 if (hResult
!= S_FALSE
)
1502 hResult
= IUnknown_RelayWinEvent(fNavigationBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1503 if (hResult
!= S_FALSE
)
1509 hResult
= IUnknown_RelayWinEvent(fLogoBar
, hWnd
, uMsg
, wParam
, lParam
, theResult
);
1510 if (hResult
!= S_FALSE
)
1517 HRESULT STDMETHODCALLTYPE
CInternetToolbar::IsWindowOwner(HWND hWnd
)
1523 HRESULT STDMETHODCALLTYPE
CInternetToolbar::AddBand(IUnknown
*punk
)
1529 HRESULT STDMETHODCALLTYPE
CInternetToolbar::EnumBands(UINT uBand
, DWORD
*pdwBandID
)
1535 HRESULT STDMETHODCALLTYPE
CInternetToolbar::QueryBand(DWORD dwBandID
,
1536 IDeskBand
**ppstb
, DWORD
*pdwState
, LPWSTR pszName
, int cchName
)
1540 if (dwBandID
== ITBBID_MENUBAND
&& fMenuBar
.p
!= NULL
)
1541 return fMenuBar
->QueryInterface(IID_PPV_ARG(IDeskBand
, ppstb
));
1542 //if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL)
1543 // return fLogoBar->QueryInterface(IID_PPV_ARG(IDeskBand, ppstb));
1548 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandState(DWORD dwBandID
, DWORD dwMask
, DWORD dwState
)
1554 HRESULT STDMETHODCALLTYPE
CInternetToolbar::RemoveBand(DWORD dwBandID
)
1560 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandObject(DWORD dwBandID
, REFIID riid
, void **ppv
)
1566 HRESULT STDMETHODCALLTYPE
CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO
*pbsinfo
)
1572 HRESULT STDMETHODCALLTYPE
CInternetToolbar::GetBandSiteInfo(BANDSITEINFO
*pbsinfo
)
1578 LRESULT
CInternetToolbar::OnTravelBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1580 CComPtr
<IServiceProvider
> serviceProvider
;
1581 CComPtr
<IWebBrowser
> webBrowser
;
1584 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1585 if (FAILED_UNEXPECTEDLY(hResult
))
1587 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
,
1588 IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1589 if (FAILED_UNEXPECTEDLY(hResult
))
1591 hResult
= webBrowser
->GoBack();
1595 LRESULT
CInternetToolbar::OnTravelForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1597 CComPtr
<IServiceProvider
> serviceProvider
;
1598 CComPtr
<IWebBrowser
> webBrowser
;
1601 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1602 if (FAILED_UNEXPECTEDLY(hResult
))
1604 hResult
= serviceProvider
->QueryService(
1605 SID_SShellBrowser
, IID_PPV_ARG(IWebBrowser
, &webBrowser
));
1606 if (FAILED_UNEXPECTEDLY(hResult
))
1608 hResult
= webBrowser
->GoForward();
1612 LRESULT
CInternetToolbar::OnUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1614 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1617 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1618 if (FAILED_UNEXPECTEDLY(hResult
))
1620 hResult
= oleCommandTarget
->Exec(&CGID_ShellBrowser
, IDM_GOTO_UPONELEVEL
, 0, NULL
, NULL
);
1624 LRESULT
CInternetToolbar::OnSearch(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1626 CComPtr
<IObjectWithSite
> objectWithSite
;
1627 CComPtr
<IContextMenu
> contextMenu
;
1628 CMINVOKECOMMANDINFO commandInfo
;
1629 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1632 // TODO: Query shell if this command is enabled first
1634 memset(&commandInfo
, 0, sizeof(commandInfo
));
1635 commandInfo
.cbSize
= sizeof(commandInfo
);
1636 commandInfo
.hwnd
= m_hWnd
;
1637 commandInfo
.lpParameters
= searchGUID
;
1638 commandInfo
.nShow
= SW_SHOWNORMAL
;
1640 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1641 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1642 if (FAILED_UNEXPECTEDLY(hResult
))
1644 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1645 if (FAILED_UNEXPECTEDLY(hResult
))
1647 hResult
= objectWithSite
->SetSite(fSite
);
1648 if (FAILED_UNEXPECTEDLY(hResult
))
1650 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1651 hResult
= objectWithSite
->SetSite(NULL
);
1655 LRESULT
CInternetToolbar::OnFolders(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1657 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1660 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1661 if (FAILED_UNEXPECTEDLY(hResult
))
1663 hResult
= oleCommandTarget
->Exec(&CGID_Explorer
, 0x23, 0, NULL
, NULL
);
1667 LRESULT
CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
1671 if (fCommandTarget
.p
!= NULL
)
1673 hResult
= fCommandTarget
->Exec(&fCommandCategory
, wID
, 0, NULL
, NULL
);
1678 LRESULT
CInternetToolbar::OnMenuDropDown(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1680 CComPtr
<IServiceProvider
> serviceProvider
;
1681 CComPtr
<IBrowserService
> browserService
;
1682 CComPtr
<IOleCommandTarget
> commandTarget
;
1683 CComPtr
<ITravelLog
> travelLog
;
1684 NMTOOLBARW
*notifyInfo
;
1693 notifyInfo
= (NMTOOLBARW
*)pNMHDR
;
1694 if (notifyInfo
->hdr
.hwndFrom
!= fToolbarWindow
)
1696 // not from the toolbar, keep looking for a message handler
1700 SendMessage(fToolbarWindow
, TB_GETRECT
, notifyInfo
->iItem
, reinterpret_cast<LPARAM
>(&bounds
));
1701 ::MapWindowPoints(fToolbarWindow
, NULL
, reinterpret_cast<POINT
*>(&bounds
), 2);
1702 switch (notifyInfo
->iItem
)
1705 newMenu
= CreatePopupMenu();
1706 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1707 hResult
= serviceProvider
->QueryService(
1708 SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1709 hResult
= browserService
->GetTravelLog(&travelLog
);
1710 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_BACK
);
1711 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1712 commandInfo
.cmdID
= 0x1d;
1713 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1714 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1715 travelLog
->CountEntries(browserService
) > 1)
1717 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1718 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1720 params
.cbSize
= sizeof (params
);
1721 params
.rcExclude
= bounds
;
1722 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1723 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1724 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1726 V_VT(&parmIn
) = VT_I4
;
1728 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1730 else if (selectedItem
!= 0)
1731 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1732 DestroyMenu(newMenu
);
1734 case IDM_GOTO_FORWARD
:
1735 newMenu
= CreatePopupMenu();
1736 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1737 hResult
= serviceProvider
->QueryService(SID_SShellBrowser
, IID_PPV_ARG(IBrowserService
, &browserService
));
1738 hResult
= browserService
->GetTravelLog(&travelLog
);
1739 hResult
= travelLog
->InsertMenuEntries(browserService
, newMenu
, 0, 1, 9, TLMENUF_FORE
);
1740 hResult
= browserService
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1741 commandInfo
.cmdID
= 0x1d;
1742 hResult
= commandTarget
->QueryStatus(&CGID_Explorer
, 1, &commandInfo
, NULL
);
1743 if ((commandInfo
.cmdf
& (OLECMDF_ENABLED
| OLECMDF_LATCHED
)) == OLECMDF_ENABLED
&&
1744 travelLog
->CountEntries(browserService
) > 1)
1746 AppendMenu(newMenu
, MF_SEPARATOR
, -1, L
"");
1747 AppendMenu(newMenu
, MF_STRING
/* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY
, L
"&History\tCtrl+H");
1749 params
.cbSize
= sizeof (params
);
1750 params
.rcExclude
= bounds
;
1751 selectedItem
= TrackPopupMenuEx(newMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RETURNCMD
,
1752 bounds
.left
, bounds
.bottom
, m_hWnd
, ¶ms
);
1753 if (selectedItem
== IDM_EXPLORERBAR_HISTORY
)
1755 V_VT(&parmIn
) = VT_I4
;
1757 Exec(&CGID_Explorer
, 0x1d, 2, &parmIn
, NULL
);
1759 else if (selectedItem
!= 0)
1760 hResult
= travelLog
->Travel(browserService
, -selectedItem
);
1761 DestroyMenu(newMenu
);
1763 case gViewsCommandID
:
1765 CComVariant outValue
;
1768 V_VT(&inValue
) = VT_INT_PTR
;
1769 V_INTREF(&inValue
) = reinterpret_cast<INT
*>(&bounds
);
1771 if (fCommandTarget
.p
!= NULL
)
1772 hResult
= fCommandTarget
->Exec(&fCommandCategory
, FCIDM_SHVIEW_AUTOARRANGE
, 1, &inValue
, &outValue
);
1773 // pvaOut is VT_I4 with value 0x403
1776 return TBDDRET_DEFAULT
;
1779 LRESULT
CInternetToolbar::OnQueryInsert(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1784 LRESULT
CInternetToolbar::OnQueryDelete(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1789 LRESULT
CInternetToolbar::OnContextMenu(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1791 HMENU contextMenuBar
;
1793 POINT clickLocation
;
1795 RBHITTESTINFO hitTestInfo
;
1796 REBARBANDINFOW rebarBandInfo
;
1799 clickLocation
.x
= LOWORD(lParam
);
1800 clickLocation
.y
= HIWORD(lParam
);
1801 hitTestInfo
.pt
= clickLocation
;
1802 ScreenToClient(&hitTestInfo
.pt
);
1803 SendMessage(fMainReBar
, RB_HITTEST
, 0, (LPARAM
)&hitTestInfo
);
1804 if (hitTestInfo
.iBand
== -1)
1806 rebarBandInfo
.cbSize
= sizeof(rebarBandInfo
);
1807 rebarBandInfo
.fMask
= RBBIM_ID
;
1808 SendMessage(fMainReBar
, RB_GETBANDINFOW
, hitTestInfo
.iBand
, (LPARAM
)&rebarBandInfo
);
1809 bandID
= rebarBandInfo
.wID
;
1810 contextMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1811 contextMenu
= GetSubMenu(contextMenuBar
, 0);
1814 case ITBBID_MENUBAND
: // menu band
1815 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1816 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1817 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1819 case ITBBID_BRANDBAND
: // brand band
1820 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1821 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1822 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1824 case ITBBID_TOOLSBAND
: // tools band
1825 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1826 DeleteMenu(contextMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1828 case ITBBID_ADDRESSBAND
: // navigation band
1829 DeleteMenu(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1830 DeleteMenu(contextMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1836 // TODO: Implement show/hide toolbars
1837 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, FALSE
);
1838 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_ADDRESSBAR
, FALSE
);
1839 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_LINKSBAR
, FALSE
);
1840 SHEnableMenuItem(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, FALSE
);
1842 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, fControlsBar
!= NULL
);
1843 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_ADDRESSBAR
, fNavigationBar
!= NULL
);
1844 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_LINKSBAR
, FALSE
);
1845 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_CUSTOMIZE
, FALSE
);
1846 SHCheckMenuItem(contextMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, fLocked
);
1848 // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment
1849 command
= TrackPopupMenu(contextMenu
, TPM_LEFTALIGN
| TPM_TOPALIGN
| TPM_RIGHTBUTTON
| TPM_RETURNCMD
,
1850 clickLocation
.x
, clickLocation
.y
, 0, m_hWnd
, NULL
);
1853 case IDM_TOOLBARS_STANDARDBUTTONS
: // standard buttons
1855 case IDM_TOOLBARS_ADDRESSBAR
: // address bar
1857 case IDM_TOOLBARS_LINKSBAR
: // links
1859 case IDM_TOOLBARS_LOCKTOOLBARS
: // lock the toolbars
1860 LockUnlockToolbars(!fLocked
);
1862 case IDM_TOOLBARS_CUSTOMIZE
: // customize
1863 SendMessage(fToolbarWindow
, TB_CUSTOMIZE
, 0, 0);
1867 DestroyMenu(contextMenuBar
);
1871 LRESULT
CInternetToolbar::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1873 if (wParam
!= SIZE_MINIMIZED
)
1875 ::SetWindowPos(fMainReBar
, NULL
, 0, 0, LOWORD(lParam
), HIWORD(lParam
),
1876 SWP_NOOWNERZORDER
| SWP_NOZORDER
| SWP_NOMOVE
);
1881 LRESULT
CInternetToolbar::OnSetCursor(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1883 if ((short)lParam
!= HTCLIENT
|| (HWND
)wParam
!= m_hWnd
)
1888 SetCursor(LoadCursor(NULL
, IDC_SIZENS
));
1892 LRESULT
CInternetToolbar::OnTipText(UINT idControl
, NMHDR
*pNMHDR
, BOOL
&bHandled
)
1894 CComPtr
<IBrowserService
> browserService
;
1895 CComPtr
<ITravelLog
> travelLog
;
1896 TOOLTIPTEXTW
*pTTTW
;
1898 wchar_t tempString
[300];
1901 pTTTW
= reinterpret_cast<TOOLTIPTEXTW
*>(pNMHDR
);
1902 if ((pTTTW
->uFlags
& TTF_IDISHWND
) != 0)
1903 nID
= ::GetDlgCtrlID((HWND
)pNMHDR
->idFrom
);
1905 nID
= (UINT
)pNMHDR
->idFrom
;
1909 if (nID
== (UINT
)IDM_GOTO_BACK
|| nID
== (UINT
)IDM_GOTO_FORWARD
)
1911 // TODO: Should this call QueryService?
1912 hResult
= fSite
->QueryInterface(IID_PPV_ARG(IBrowserService
, &browserService
));
1913 hResult
= browserService
->GetTravelLog(&travelLog
);
1914 hResult
= travelLog
->GetToolTipText(browserService
,
1915 (nID
== (UINT
)IDM_GOTO_BACK
) ? TLOG_BACK
: TLOG_FORE
,
1916 0, tempString
, 299);
1917 if (FAILED_UNEXPECTEDLY(hResult
))
1925 wcsncpy (pTTTW
->szText
, tempString
, sizeof (pTTTW
->szText
) / sizeof (wchar_t));
1926 ::SetWindowPos(pNMHDR
->hwndFrom
, HWND_TOP
, 0, 0, 0, 0,
1927 SWP_NOOWNERZORDER
| SWP_NOACTIVATE
| SWP_NOMOVE
| SWP_NOSIZE
);
1933 LRESULT
CInternetToolbar::OnCommand(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1938 hResult
= OnWinEvent((HWND
) lParam
, uMsg
, wParam
, lParam
, &theResult
);
1940 bHandled
= hResult
== S_OK
;
1942 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1944 LRESULT
CInternetToolbar::OnNotify(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1946 NMHDR
*notifyHeader
;
1950 notifyHeader
= reinterpret_cast<NMHDR
*>(lParam
);
1952 hResult
= OnWinEvent(notifyHeader
->hwndFrom
, uMsg
, wParam
, lParam
, &theResult
);
1954 bHandled
= hResult
== S_OK
;
1956 return FAILED_UNEXPECTEDLY(hResult
) ? 0 : theResult
;
1959 LRESULT
CInternetToolbar::OnLDown(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1965 if (wParam
& MK_CONTROL
)
1970 DWORD msgp
= GetMessagePos();
1972 fStartPosition
.x
= GET_X_LPARAM(msgp
);
1973 fStartPosition
.y
= GET_Y_LPARAM(msgp
);
1976 GetWindowRect(m_hWnd
, &rc
);
1978 fStartHeight
= rc
.bottom
- rc
.top
;
1986 LRESULT
CInternetToolbar::OnMouseMove(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
1992 DWORD msgp
= GetMessagePos();
1995 pt
.x
= GET_X_LPARAM(msgp
);
1996 pt
.y
= GET_Y_LPARAM(msgp
);
1998 ReserveBorderSpace(fStartHeight
- fStartPosition
.y
+ pt
.y
);
2004 LRESULT
CInternetToolbar::OnLUp(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2010 OnMouseMove(uMsg
, wParam
, lParam
, bHandled
);
2019 HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
)
2021 return ShellObjectCreator
<CInternetToolbar
>(riid
, ppv
);