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
27 BOOL WINAPI
Shell_GetImageLists(
28 _Out_ HIMAGELIST
*phiml
,
29 _Out_ HIMAGELIST
*phimlSmall
32 #include "newatlinterfaces.h"
36 **Provide implementation of new and delete that use LocalAlloc
37 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
38 view doesn't restore the selection correctly.
39 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
40 **Add brand band bitmaps to shell32.dll
41 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
42 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
43 current state overwrites the wrong entry's contents. This needs to be changed.
44 ****Fix close of browser window to release all objects
45 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
46 **When a new bar is added to base bar site, how is base bar told so it can resize?
47 **Does the base bar site have a classid?
48 **What should refresh command send to views to make them refresh?
49 **When new bar is created, what status notifications need to be fired?
50 **How does keyboard filtering dispatch?
51 **For deferred persist history load, how does the view connect up and get the state?
52 How does context menu send open, cut, rename commands to its site (the shell view)?
53 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
55 **Route View->Toolbars commands to internet toolbar
56 **Handle travel log items in View->Go
57 **Fix ShowBrowserBar to pass correct size on when bar is shown
58 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
59 ****Make ShowToolbar check if bar is already created before creating it again
60 ****Shell should fill in the list of explorer bars in the View submenus
61 **Add folder menu in the file menu
62 **Fix CShellBrowser::GetBorderDW to compute available size correctly
63 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
64 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
65 Make folders toolbar item update state appropriately
66 Read list of bands from registry on launch
67 Read list of bars from registry on launch
68 If the folders or search bars don't exist, disable the toolbar buttons
69 If the favorites or history bars don't exist, disable the toolbar butons
70 Fix Apply to all Folders in Folder Options
71 Implement close command
72 Add explorer band context menu to file menu
73 Add code to allow restore of internet toolbar from registry
74 Fix code that calls FireNavigateComplete to pass the correct new path
76 What are the other command ids for QueryStatus/FireCommandStateChange?
78 Add handler for cabinet settings change
79 Add handler for system metrics change (renegotiate border space?)
80 Add handler for theme change and forward to contained windows
82 When folders are shown, the status bar text should change
83 Add code to save/restore shell view settings
84 Implement tabbing between frames
85 Fix handling of focus everywhere
86 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
88 The status bar doesn't show help text for items owned by frame during menu tracking
89 Stub out frame command handlers
90 "Arrange icons by" group is not checked properly
92 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
93 the icon is always an open folder with magnifying glass
94 Fix bars to calculate height correctly
95 Hookup policies for everything...
96 Investigate toolbar message WM_USER+93
97 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
99 Vertical Explorer Bar CATID_InfoBand
100 Horizontal Explorer Bar CATID_CommBand
101 Desk Band CATID_DeskBand
104 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
105 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
107 create key here with CLSID of bar to register tool band
108 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
113 #pragma comment(linker, \
114 "\"/manifestdependency:type='Win32' "\
115 "name='Microsoft.Windows.Common-Controls' "\
116 "version='6.0.0.0' "\
117 "processorArchitecture='*' "\
118 "publicKeyToken='6595b64144ccf1df' "\
122 struct categoryCacheHeader
124 long dwSize
; // size of header only
125 long version
; // currently 1
126 SYSTEMTIME writeTime
; // time we were written to registry
127 long classCount
; // number of classes following
130 static const unsigned int folderOptionsPageCountMax
= 20;
131 static const long BTP_UPDATE_CUR_HISTORY
= 1;
132 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
134 BOOL createNewStuff
= false;
137 // this class is private to browseui.dll and is not registered externally?
138 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
141 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
142 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
143 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
146 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
149 HMENU
SHGetMenuFromID(HMENU topMenu
, int theID
)
151 MENUITEMINFO menuItemInfo
;
153 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
154 menuItemInfo
.fMask
= MIIM_SUBMENU
;
155 if (!GetMenuItemInfo(topMenu
, theID
, FALSE
, &menuItemInfo
))
157 return menuItemInfo
.hSubMenu
;
160 void SHCheckMenuItem(HMENU theMenu
, int theID
, BOOL checked
)
162 MENUITEMINFO menuItemInfo
;
164 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
165 menuItemInfo
.fMask
= MIIM_STATE
;
166 if (GetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
))
169 menuItemInfo
.fState
|= MF_CHECKED
;
171 menuItemInfo
.fState
&= ~MF_CHECKED
;
172 SetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
);
176 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
178 MENUITEMINFO menuItemInfo
;
182 menuItemCount
= GetMenuItemCount(theMenu
);
184 while (curIndex
< menuItemCount
)
186 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
187 menuItemInfo
.fMask
= MIIM_ID
;
188 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
189 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
191 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
199 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
201 CComPtr
<IShellFolder
> desktop
;
203 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
206 if (path
== NULL
|| path
->mkid
.cb
== 0)
208 *newFolder
= desktop
;
209 desktop
.p
->AddRef ();
212 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
215 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
216 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
221 class CToolbarProxy
:
222 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
225 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
227 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
232 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
233 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
235 BEGIN_MSG_MAP(CToolbarProxy
)
236 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
237 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
241 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
246 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
247 if (myWindow
!= NULL
)
249 SubclassWindow(myWindow
);
250 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
251 hResult
= explorerToolbar
->QueryInterface(
252 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
256 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
262 if (fExplorerToolbar
.p
!= NULL
)
264 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
265 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
266 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
267 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
272 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
278 if (fExplorerToolbar
.p
!= NULL
)
279 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
284 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
285 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
289 class CShellBrowser
:
290 public CWindowImpl
<CShellBrowser
, CWindow
, CControlWinTraits
>,
291 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
292 public IShellBrowser
,
294 public IServiceProvider
,
295 public IProfferServiceImpl
<CShellBrowser
>,
296 public IShellBrowserService
,
298 public ITravelLogClient
,
299 public IPersistHistory
,
300 public IDockingWindowSite
,
301 public IOleCommandTarget
,
302 public IBrowserService2
,
303 public IConnectionPointContainerImpl
<CShellBrowser
>,
304 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
305 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
312 CComPtr
<IUnknown
> clientBar
;
315 static const int BIInternetToolbar
= 0;
316 static const int BIVerticalBaseBar
= 1;
317 static const int BIHorizontalBaseBar
= 2;
319 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
320 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
321 CComPtr
<IShellView
> fCurrentShellView
; //
322 LPITEMIDLIST fCurrentDirectoryPIDL
; //
324 bool fStatusBarVisible
;
325 CToolbarProxy fToolbarProxy
;
326 barInfo fClientBars
[3];
327 CComPtr
<ITravelLog
> fTravelLog
;
328 HMENU fCurrentMenuBar
;
329 CABINETSTATE fCabinetState
;
330 // The next three fields support persisted history for shell views.
331 // They do not need to be reference counted.
332 IOleObject
*fHistoryObject
;
333 IStream
*fHistoryStream
;
334 IBindCtx
*fHistoryBindContext
;
337 ULONG
InternalAddRef()
339 OutputDebugString(_T("AddRef\n"));
340 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
342 ULONG
InternalRelease()
344 OutputDebugString(_T("Release\n"));
345 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
351 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
353 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
354 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
355 FOLDERSETTINGS
*folderSettings
, long flags
);
356 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
357 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
358 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
359 HRESULT
NavigateToParent();
360 HRESULT
DoFolderOptions();
361 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
362 void RepositionBars();
363 virtual WNDPROC
GetWindowProc()
367 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
368 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
369 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
370 HRESULT
FireCommandStateChangeAll();
371 HRESULT
UpdateForwardBackState();
372 void UpdateGotoMenu(HMENU theMenu
);
373 void UpdateViewMenu(HMENU theMenu
);
375 /* // *** IDockingWindowFrame methods ***
376 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
377 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
378 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
381 // *** IDockingWindowSite methods ***
382 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
383 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
384 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
386 // *** IOleCommandTarget methods ***
387 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
388 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
389 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
390 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
392 // *** IOleWindow methods ***
393 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
394 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
396 // *** IShellBrowser methods ***
397 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
398 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
399 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
400 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
401 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
402 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
403 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
404 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
405 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
406 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
407 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
408 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
409 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
411 // *** IDropTarget methods ***
412 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
413 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
414 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
415 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
417 // *** IServiceProvider methods ***
418 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
420 // *** IShellBowserService methods ***
421 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
423 // *** IDispatch methods ***
424 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
425 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
426 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
427 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
428 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
429 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
431 // *** IBrowserService methods ***
432 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
433 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
434 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
435 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
436 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
437 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
438 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
439 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
440 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
441 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
442 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
443 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
444 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
445 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
446 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
447 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
448 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
449 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
450 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
451 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
452 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
453 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
454 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
455 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
456 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
457 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
458 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
459 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
460 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
461 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
463 // *** IBrowserService2 methods ***
464 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
465 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
466 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
467 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
468 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
469 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
470 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
471 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
472 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
473 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
474 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
475 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
476 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
477 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
478 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
479 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
480 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
481 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
482 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
483 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
484 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
485 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
486 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
487 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
488 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
489 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
490 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
491 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
492 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
493 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
494 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
495 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
496 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
497 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
498 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
499 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
500 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
501 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
502 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
503 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
504 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
505 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
506 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
507 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
508 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
509 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
510 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
511 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
512 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
513 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
514 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
515 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
516 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
517 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
518 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
519 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
520 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
521 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
522 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
523 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
524 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
525 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
526 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
527 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
528 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
530 // *** IWebBrowser methods ***
531 virtual HRESULT STDMETHODCALLTYPE
GoBack();
532 virtual HRESULT STDMETHODCALLTYPE
GoForward();
533 virtual HRESULT STDMETHODCALLTYPE
GoHome();
534 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
535 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
536 VARIANT
*PostData
, VARIANT
*Headers
);
537 virtual HRESULT STDMETHODCALLTYPE
Refresh();
538 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
539 virtual HRESULT STDMETHODCALLTYPE
Stop();
540 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
541 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
542 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
543 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
544 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
545 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
546 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
547 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
548 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
549 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
550 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
551 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
552 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
553 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
554 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
555 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
556 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
558 // *** IWebBrowserApp methods ***
559 virtual HRESULT STDMETHODCALLTYPE
Quit();
560 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
561 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
562 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
563 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
564 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
565 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
566 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
567 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
568 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
569 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
570 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
571 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
572 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
573 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
574 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
575 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
576 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
577 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
578 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
580 // *** IWebBrowser2 methods ***
581 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
582 VARIANT
*PostData
, VARIANT
*Headers
);
583 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
584 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
585 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
586 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
587 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
588 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
589 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
590 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
591 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
592 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
593 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
594 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
595 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
596 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
597 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
598 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
599 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
600 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
601 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
603 // *** ITravelLogClient methods ***
604 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
605 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
606 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
608 // *** IPersist methods ***
609 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
611 // *** IPersistHistory methods ***
612 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
613 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
614 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
615 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
618 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
619 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
620 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
621 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
622 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
623 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
624 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
625 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
626 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
627 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
628 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
629 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
630 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
631 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
632 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
633 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
634 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
635 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
636 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
637 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
638 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
639 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
640 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
642 static ATL::CWndClassInfo
& GetWndClassInfo()
644 static ATL::CWndClassInfo wc
=
646 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
647 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
648 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
649 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
654 BEGIN_MSG_MAP(CShellBrowser
)
655 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
656 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
657 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
658 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
659 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
660 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
661 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
662 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
663 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
664 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
665 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
666 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
667 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
668 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
669 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
670 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
671 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
672 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
673 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
674 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
675 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
676 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
677 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
678 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
679 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
682 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
683 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
684 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
685 END_CONNECTION_POINT_MAP()
687 BEGIN_COM_MAP(CShellBrowser
)
688 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
689 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
690 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
691 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
692 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
693 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
694 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
695 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
696 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
697 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
698 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
699 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
700 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
701 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
702 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
703 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
704 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
705 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
709 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
711 CShellBrowser::CShellBrowser()
713 fCurrentShellViewWindow
= NULL
;
714 fCurrentDirectoryPIDL
= NULL
;
716 fStatusBarVisible
= true;
717 memset(fClientBars
, 0, sizeof(fClientBars
));
718 fCurrentMenuBar
= NULL
;
719 fHistoryObject
= NULL
;
720 fHistoryStream
= NULL
;
721 fHistoryBindContext
= NULL
;
724 CShellBrowser::~CShellBrowser()
728 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
730 CComPtr
<IDockingWindow
> dockingWindow
;
731 CComPtr
<IStream
> settingsStream
;
732 CComPtr
<IPersistStreamInit
> persistStreamInit
;
733 CComPtr
<IOleCommandTarget
> commandTarget
;
734 CComPtr
<IObjectWithSite
> objectSite
;
735 RECT bounds
= {0, 0, 800, 591};
738 _AtlInitialConstruct();
740 fCabinetState
.cLength
= sizeof(fCabinetState
);
741 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
746 Create(HWND_DESKTOP
, bounds
, NULL
, WS_OVERLAPPEDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, 0, 0U);
751 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
755 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
761 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
762 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
765 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
766 IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
769 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
770 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
773 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
774 IID_PPV_ARG(IObjectWithSite
, &objectSite
));
778 hResult
= objectSite
->SetSite(static_cast<IShellBrowser
*>(this));
782 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
786 // TODO: create settingsStream from registry entry
787 if (settingsStream
.p
== NULL
)
789 hResult
= persistStreamInit
->InitNew();
795 hResult
= persistStreamInit
->Load(settingsStream
);
799 hResult
= dockingWindow
->ShowDW(TRUE
);
803 fToolbarProxy
.Initialize(m_hWnd
, fClientBars
[BIInternetToolbar
].clientBar
);
806 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
807 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
808 _AtlBaseModule
.GetModuleInstance(), 0);
809 fStatusBarVisible
= true;
811 FOLDERSETTINGS newFolderSettings
;
814 newFolderSettings
.ViewMode
= FVM_LIST
;
815 newFolderSettings
.fFlags
= 0;
816 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
820 ShowWindow(SW_SHOWNORMAL
);
825 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
827 CComPtr
<IShellFolder
> newFolder
;
828 FOLDERSETTINGS newFolderSettings
;
831 // called by shell view to browse to new folder
832 // also called by explorer band to navigate to new folder
833 hResult
= SHBindToFolder(pidl
, &newFolder
);
834 newFolderSettings
.ViewMode
= FVM_LIST
;
835 newFolderSettings
.fFlags
= 0;
836 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
842 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
844 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
847 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
849 LPCITEMIDLIST pidlnext
;
854 if (! _ILIsDesktop(pidl
))
856 length
= pidl
->mkid
.cb
;
858 reinterpret_cast<LPCITEMIDLIST
>(
859 reinterpret_cast<const BYTE
*>(pidl
) + length
);
860 if (pidlnext
->mkid
.cb
!= 0)
866 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
867 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
869 CComPtr
<IShellFolder
> psf
;
870 LPITEMIDLIST pidlChild
;
871 LPITEMIDLIST pidlParent
;
878 if (ppidlLast
!= NULL
)
880 if (_ILIsPidlSimple(pidl
))
882 if (ppidlLast
!= NULL
)
883 *ppidlLast
= ILClone(pidl
);
884 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
888 pidlChild
= ILClone(ILFindLastID(pidl
));
889 pidlParent
= ILClone(pidl
);
890 ILRemoveLastID(pidlParent
);
891 hResult
= SHGetDesktopFolder(&psf
);
892 if (SUCCEEDED(hResult
))
893 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
894 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
895 *ppidlLast
= pidlChild
;
903 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
904 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
906 CComPtr
<IShellFolder
> parentFolder
;
907 LPITEMIDLIST childPIDL
;
911 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
912 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
913 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
915 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
920 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
922 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
925 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
926 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
928 CComPtr
<IObjectWithSite
> objectWithSite
;
929 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
930 CComPtr
<IShellView
> saveCurrentShellView
;
931 CComPtr
<IShellView
> newShellView
;
932 CComPtr
<ITravelLog
> travelLog
;
933 HWND newShellViewWindow
;
934 BOOL windowUpdateIsLocked
;
935 RECT shellViewWindowBounds
;
938 wchar_t newTitle
[MAX_PATH
];
942 if (newShellFolder
== NULL
)
945 hResult
= GetTravelLog(&travelLog
);
950 if (flags
& BTP_UPDATE_CUR_HISTORY
)
952 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
953 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
954 // what to do with error? Do we want to halt browse because state save failed?
957 // create view object
958 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
961 previousView
= fCurrentShellViewWindow
;
963 // enter updating section
964 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
965 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
966 if (fCurrentShellView
!= NULL
)
967 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
970 hResult
= newShellView
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
971 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
972 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
974 // update folder and view
975 saveCurrentShellFolder
= fCurrentShellFolder
;
976 saveCurrentShellView
= fCurrentShellView
;
977 fCurrentShellFolder
= newShellFolder
;
978 fCurrentShellView
= newShellView
;
981 if (previousView
!= NULL
)
982 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
984 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
985 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
987 // create view window
988 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
989 this, &shellViewWindowBounds
, &newShellViewWindow
);
990 if (FAILED(hResult
) || newShellViewWindow
== NULL
)
992 fCurrentShellView
= saveCurrentShellView
;
993 fCurrentShellFolder
= saveCurrentShellFolder
;
994 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
995 if (windowUpdateIsLocked
)
996 LockWindowUpdate(FALSE
);
997 SetCursor(saveCursor
);
1001 if (objectWithSite
.p
!= NULL
)
1002 hResult
= objectWithSite
->SetSite(NULL
);
1004 // update current pidl
1005 ILFree(fCurrentDirectoryPIDL
);
1006 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1008 // update view window
1009 if (saveCurrentShellView
!= NULL
)
1010 saveCurrentShellView
->DestroyViewWindow();
1011 fCurrentShellViewWindow
= newShellViewWindow
;
1014 saveCurrentShellView
.Release();
1015 saveCurrentShellFolder
.Release();
1017 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1019 // leave updating section
1020 if (windowUpdateIsLocked
)
1021 LockWindowUpdate(FALSE
);
1022 SetCursor(saveCursor
);
1025 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1027 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1028 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1032 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1033 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1034 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1035 if (SUCCEEDED(hResult
))
1037 FireNavigateComplete(newTitle
);
1041 FireNavigateComplete(L
"ERROR");
1044 if (fCabinetState
.fFullPathTitle
)
1045 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1047 nameFlags
= SHGDN_FORADDRESSBAR
;
1048 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1049 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1050 if (SUCCEEDED(hResult
))
1052 SetWindowText(newTitle
);
1054 LPCITEMIDLIST pidlChild
;
1055 INT index
, indexOpen
;
1056 HIMAGELIST himlSmall
, himlLarge
;
1058 CComPtr
<IShellFolder
> sf
;
1059 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1061 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1063 Shell_GetImageLists(&himlSmall
, &himlLarge
);
1065 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1066 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1068 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1069 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1072 // TODO: Update the window icon
1074 FireCommandStateChangeAll();
1075 hResult
= UpdateForwardBackState();
1079 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1081 CComPtr
<IServiceProvider
> serviceProvider
;
1082 CComPtr
<IBandSite
> bandSite
;
1083 CComPtr
<IDeskBand
> deskBand
;
1086 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
1088 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1089 IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1090 if (FAILED(hResult
))
1092 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1093 if (FAILED(hResult
))
1095 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1096 if (FAILED(hResult
))
1098 return deskBand
->QueryInterface(riid
, shellMenu
);
1101 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1103 CComPtr
<IUnknown
> newBaseBar
;
1104 CComPtr
<IDeskBar
> deskBar
;
1105 CComPtr
<IUnknown
> newBaseBarSite
;
1106 CComPtr
<IObjectWithSite
> objectWithSite
;
1107 CComPtr
<IDeskBarClient
> deskBarClient
;
1112 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1114 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1117 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1118 if (FAILED(hResult
))
1120 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1121 if (FAILED(hResult
))
1124 // tell the new base bar about the shell browser
1125 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1126 if (FAILED(hResult
))
1128 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1129 if (FAILED(hResult
))
1132 // tell the new base bar about the new base bar site
1133 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1134 if (FAILED(hResult
))
1136 hResult
= deskBar
->SetClient(newBaseBarSite
);
1137 if (FAILED(hResult
))
1140 // tell the new base bar site about the new base bar
1141 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1142 if (FAILED(hResult
))
1144 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1145 if (FAILED(hResult
))
1148 *cache
= newBaseBar
.Detach();
1150 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1153 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1155 CComPtr
<IDockingWindow
> dockingWindow
;
1156 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1157 CComPtr
<IUnknown
> baseBarSite
;
1158 CComPtr
<IUnknown
> newBand
;
1159 CComPtr
<IUnknown
> theBaseBar
;
1160 CComPtr
<IDeskBar
> deskBar
;
1166 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1167 if (FAILED(hResult
))
1169 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1170 if (FAILED(hResult
))
1172 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1173 if (FAILED(hResult
))
1175 hResult
= deskBar
->GetClient(&baseBarSite
);
1176 if (FAILED(hResult
))
1178 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1179 if (FAILED(hResult
))
1181 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1182 if (FAILED(hResult
))
1184 V_VT(&vaIn
) = VT_UNKNOWN
;
1185 V_UNKNOWN(&vaIn
) = newBand
.p
;
1186 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1187 if (FAILED(hResult
))
1189 hResult
= dockingWindow
->ShowDW(TRUE
);
1190 if (FAILED(hResult
))
1195 HRESULT
CShellBrowser::NavigateToParent()
1197 LPITEMIDLIST newDirectory
;
1200 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1201 if (newDirectory
== NULL
)
1202 return E_OUTOFMEMORY
;
1203 ILRemoveLastID(newDirectory
);
1204 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1205 ILFree(newDirectory
);
1206 if (FAILED(hResult
))
1211 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1213 PROPSHEETHEADER
*sheetInfo
;
1215 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1216 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1218 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1219 sheetInfo
->nPages
++;
1223 HRESULT
CShellBrowser::DoFolderOptions()
1225 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1226 CComPtr
<IObjectWithSite
> objectWithSite
;
1227 PROPSHEETHEADER m_PropSheet
;
1228 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1229 // CComPtr<IGlobalFolderSettings> globalSettings;
1230 // SHELLSTATE2 shellState;
1233 memset(m_psp
, 0, sizeof(m_psp
));
1234 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1236 // create sheet object
1237 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1238 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1239 if (FAILED(hResult
))
1242 // must set site in order for Apply to all Folders on Advanced page to be enabled
1243 hResult
= folderOptionsSheet
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1244 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1245 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1246 m_PropSheet
.phpage
= m_psp
;
1249 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1250 if (FAILED(hResult
))
1252 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1253 if (FAILED(hResult
))
1258 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1259 if (FAILED(hResult
))
1262 if (fCurrentShellView
!= NULL
)
1264 hResult
= fCurrentShellView
->AddPropertySheetPages(
1265 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1266 if (FAILED(hResult
))
1271 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1272 m_PropSheet
.dwFlags
= 0;
1273 m_PropSheet
.hwndParent
= m_hWnd
;
1274 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1275 m_PropSheet
.pszCaption
= _T("Folder Options");
1276 m_PropSheet
.nStartPage
= 0;
1277 PropertySheet(&m_PropSheet
);
1281 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1283 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1284 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1286 CComPtr
<IMenuBand
> menuBand
;
1287 const _ATL_MSG
*previousMessage
;
1289 WNDPROC saveWindowProc
;
1292 hWnd
= pThis
->m_hWnd
;
1293 previousMessage
= pThis
->m_pCurrentMsg
;
1294 pThis
->m_pCurrentMsg
= &msg
;
1296 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1297 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1299 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1300 if (hResult
== S_OK
)
1303 wParam
= msg
.wParam
;
1304 lParam
= msg
.lParam
;
1307 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1308 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1309 if (handled
== FALSE
)
1311 if (uMsg
== WM_NCDESTROY
)
1313 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1314 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1315 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1316 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1317 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1320 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1322 pThis
->m_pCurrentMsg
= previousMessage
;
1323 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1325 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1326 pThis
->m_hWnd
= NULL
;
1327 pThis
->OnFinalMessage(hWnd
);
1332 void CShellBrowser::RepositionBars()
1338 GetClientRect(&clientRect
);
1340 if (fStatusBarVisible
&& fStatusBar
)
1342 ::GetWindowRect(fStatusBar
, &statusRect
);
1343 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1344 clientRect
.right
- clientRect
.left
,
1345 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1346 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1349 for (x
= 0; x
< 3; x
++)
1351 HWND hwnd
= fClientBars
[x
].hwnd
;
1352 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1353 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1355 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1356 fClientBars
[x
].hwnd
= hwnd
;
1360 RECT toolbarRect
= clientRect
;
1361 if (borderSpace
.top
!= 0)
1363 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1365 else if (borderSpace
.bottom
!= 0)
1367 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1369 else if (borderSpace
.left
!= 0)
1371 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1373 else if (borderSpace
.right
!= 0)
1375 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1378 ::SetWindowPos(hwnd
, NULL
,
1381 toolbarRect
.right
- toolbarRect
.left
,
1382 toolbarRect
.bottom
- toolbarRect
.top
,
1383 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1385 if (borderSpace
.top
!= 0)
1387 clientRect
.top
= toolbarRect
.bottom
;
1389 else if (borderSpace
.bottom
!= 0)
1391 clientRect
.bottom
= toolbarRect
.top
;
1393 else if (borderSpace
.left
!= 0)
1395 clientRect
.left
= toolbarRect
.right
;
1397 else if (borderSpace
.right
!= 0)
1399 clientRect
.right
= toolbarRect
.left
;
1403 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1404 clientRect
.right
- clientRect
.left
,
1405 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1408 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1411 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1412 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1415 params
.rgvarg
= arguments
;
1416 params
.rgdispidNamedArgs
= NULL
;
1417 params
.cArgs
= argCount
;
1418 params
.cNamedArgs
= 0;
1419 IUnknown
** pp
= vec
.begin();
1420 while (pp
< vec
.end())
1424 CComPtr
<IDispatch
> theDispatch
;
1426 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1427 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1432 while (pp
< vec2
.end())
1436 CComPtr
<IDispatch
> theDispatch
;
1438 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1439 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1446 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1448 // these two variants intentionally to do use CComVariant because it would double free/release
1449 // or does not need to dispose at all
1452 CComBSTR
tempString(newDirectory
);
1454 V_VT(&varArgs
) = VT_BSTR
;
1455 V_BSTR(&varArgs
) = tempString
.m_str
;
1457 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1458 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1459 V_VT(&varArg
[1]) = VT_DISPATCH
;
1460 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1462 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1465 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1469 V_VT(&varArg
[0]) = VT_BOOL
;
1470 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1471 V_VT(&varArg
[1]) = VT_I4
;
1472 V_I4(&varArg
[1]) = commandID
;
1474 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1477 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1479 return FireCommandStateChange(false, -1);
1482 HRESULT
CShellBrowser::UpdateForwardBackState()
1484 CComPtr
<ITravelLog
> travelLog
;
1485 CComPtr
<ITravelEntry
> unusedEntry
;
1491 canGoForward
= false;
1492 hResult
= GetTravelLog(&travelLog
);
1493 if (FAILED(hResult
))
1495 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1496 if (SUCCEEDED(hResult
))
1499 unusedEntry
.Release();
1501 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1502 if (SUCCEEDED(hResult
))
1504 canGoForward
= true;
1505 unusedEntry
.Release();
1507 hResult
= FireCommandStateChange(canGoBack
, 2);
1508 hResult
= FireCommandStateChange(canGoForward
, 1);
1512 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1514 CComPtr
<ITravelLog
> travelLog
;
1516 MENUITEMINFO menuItemInfo
;
1519 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1521 position
= GetMenuItemCount(theMenu
);
1522 hResult
= GetTravelLog(&travelLog
);
1523 if (FAILED(hResult
))
1525 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1526 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1527 if (SUCCEEDED(hResult
))
1529 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1530 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1531 menuItemInfo
.fType
= MF_SEPARATOR
;
1532 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1533 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1537 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1539 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1540 CComPtr
<ITravelLog
> travelLog
;
1542 OLECMD commandList
[5];
1543 HMENU toolbarMenuBar
;
1545 MENUITEMINFO menuItemInfo
;
1548 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1549 if (gotoMenu
!= NULL
)
1550 UpdateGotoMenu(gotoMenu
);
1552 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1553 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1554 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1555 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1556 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1558 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1559 IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1560 if (SUCCEEDED(hResult
))
1561 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1562 if (FAILED(hResult
))
1563 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1566 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1567 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1569 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1570 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1571 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1572 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1573 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1574 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1575 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1576 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1578 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1579 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1580 menuItemInfo
.hSubMenu
= toolbarMenu
;
1581 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1583 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1586 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1588 CComPtr
<IUnknown
> int1Retry
;
1589 CComPtr
<IUnknown
> int2Retry
;
1594 if (int1
== NULL
|| int2
== NULL
)
1596 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1597 if (FAILED(hResult
))
1599 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1600 if (FAILED(hResult
))
1602 if (int1Retry
== int2Retry
)
1607 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1609 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1611 RECT availableBounds
;
1613 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1614 for (INT x
= 0; x
< 3; x
++)
1616 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1618 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1619 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1620 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1621 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1624 *prcBorder
= availableBounds
;
1628 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1633 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1635 for (INT x
= 0; x
< 3; x
++)
1637 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1639 fClientBars
[x
].borderSpace
= *pbw
;
1640 // if this bar changed size, it cascades and forces all subsequent bars to resize
1645 return E_INVALIDARG
;
1648 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1649 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1651 CComPtr
<IOleCommandTarget
> commandTarget
;
1654 if (prgCmds
== NULL
)
1655 return E_INVALIDARG
;
1656 if (pguidCmdGroup
== NULL
)
1658 if (fCurrentShellView
.p
!= NULL
)
1660 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1661 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1662 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1671 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1675 switch (prgCmds
->cmdID
)
1677 case 0x1c: // search
1678 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1680 case 0x1d: // history
1681 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1683 case 0x1e: // favorites
1684 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1686 case 0x23: // folders
1687 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1697 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1701 switch (prgCmds
->cmdID
)
1703 case 0xa022: // up level
1704 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1705 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1706 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1716 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1717 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1721 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1726 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1729 if (nCmdexecopt
== 1)
1731 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1735 // update zones part of the status bar
1738 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1739 V_VT(pvaOut
) = VT_INT_PTR
;
1740 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1741 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1744 // indicate if this cabinet was opened as a browser
1750 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1759 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1764 // what is theater mode and why do we receive this?
1768 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1773 // initialize favorites menu
1777 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1782 // refresh on toolbar clicked
1785 // tell the view if it should hide the task pane or not
1786 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1789 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1794 return NavigateToParent();
1797 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1802 return DoFolderOptions();
1805 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1810 // Reset All Folders option in Folder Options
1821 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1829 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1834 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1836 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1837 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1839 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1842 lpMenuWidths
->width
[0] = 2;
1843 lpMenuWidths
->width
[2] = 3;
1844 lpMenuWidths
->width
[4] = 1;
1848 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1850 CComPtr
<IShellMenu
> shellMenu
;
1853 if (IsMenu(hmenuShared
) == FALSE
)
1855 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1856 if (FAILED(hResult
))
1858 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1859 if (FAILED(hResult
))
1861 fCurrentMenuBar
= hmenuShared
;
1865 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1867 if (hmenuShared
== fCurrentMenuBar
)
1868 fCurrentMenuBar
= NULL
;
1872 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1877 ::SetWindowText(fStatusBar
, pszStatusText
);
1886 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1891 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1896 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1898 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1901 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1906 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1914 *lphwnd
= fToolbarProxy
.m_hWnd
;
1917 *lphwnd
= fStatusBar
;
1920 // find the directory browser and return it
1921 // this should be used only to determine if a tree is present
1924 // is this a progress dialog?
1930 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1931 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1940 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1945 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1953 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1957 *ppshv
= fCurrentShellView
;
1958 if (fCurrentShellView
.p
!= NULL
)
1959 fCurrentShellView
.p
->AddRef();
1963 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1968 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1973 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1974 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1979 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1984 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
1989 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
1990 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1995 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1997 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
1998 // the returned interface has a method GetPropertyBag on it
1999 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2000 return this->QueryInterface(riid
, ppvObject
);
2001 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2002 return this->QueryInterface(riid
, ppvObject
);
2003 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2004 return this->QueryInterface(riid
, ppvObject
);
2005 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2006 return this->QueryInterface(riid
, ppvObject
);
2007 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2008 return this->QueryInterface(riid
, ppvObject
);
2009 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2010 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2011 if (IsEqualIID(riid
, IID_IShellBrowser
))
2012 return this->QueryInterface(riid
, ppvObject
);
2013 return E_NOINTERFACE
;
2016 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2018 if (ppvObject
== NULL
)
2024 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2029 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2034 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2035 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2040 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2041 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2046 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2051 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2056 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2061 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2066 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2070 // called by toolbar when displaying tooltips
2075 if (fTravelLog
.p
== NULL
)
2077 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2078 if (FAILED(hResult
))
2081 *pptl
= fTravelLog
.p
;
2082 fTravelLog
.p
->AddRef();
2086 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2091 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2096 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2101 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2106 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2111 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2116 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2121 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2126 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2131 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2136 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2141 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2146 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2151 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2156 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2158 // called by explorer bar to get current pidl
2161 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2165 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2170 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2180 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2182 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2183 return E_INVALIDARG
;
2184 *ppole
= fHistoryObject
;
2185 if (fHistoryObject
!= NULL
)
2186 fHistoryObject
->AddRef();
2187 *pstm
= fHistoryStream
;
2188 if (fHistoryStream
!= NULL
)
2189 fHistoryStream
->AddRef();
2190 *ppbc
= fHistoryBindContext
;
2191 if (fHistoryBindContext
!= NULL
)
2192 fHistoryBindContext
->AddRef();
2193 fHistoryObject
= NULL
;
2194 fHistoryStream
= NULL
;
2195 fHistoryBindContext
= NULL
;
2201 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2206 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2211 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2216 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2217 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2222 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2227 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2232 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2237 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2242 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2247 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2252 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2257 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2262 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2267 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2272 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2277 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2282 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2292 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2293 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2298 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2303 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2308 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2313 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2318 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2323 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2328 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2333 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2338 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2343 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2353 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2358 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2363 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2368 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2373 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2378 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2383 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2388 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2398 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2403 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2404 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2409 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2410 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2415 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2420 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2425 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2430 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2435 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2440 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2445 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2450 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2455 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2460 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2465 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2470 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2475 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2480 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2485 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2490 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2495 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2500 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2505 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2510 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2511 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2516 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2521 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2526 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2531 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2536 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2541 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2546 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2548 CComPtr
<ITravelLog
> travelLog
;
2551 hResult
= GetTravelLog(&travelLog
);
2552 if (FAILED(hResult
))
2554 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2557 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2559 CComPtr
<ITravelLog
> travelLog
;
2562 hResult
= GetTravelLog(&travelLog
);
2563 if (FAILED(hResult
))
2565 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2568 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2573 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2578 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2579 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2584 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2588 V_VT(&level
) = VT_I4
;
2590 return Refresh2(&level
);
2593 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2595 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2598 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2599 if (FAILED(hResult
))
2601 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2604 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2609 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2614 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2619 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2624 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2629 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2634 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2641 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2646 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2651 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2656 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2661 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2666 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2671 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2676 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2683 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2688 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2693 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2698 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2703 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2708 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2713 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2718 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2723 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2728 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2733 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2738 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2743 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2748 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2753 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2758 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2763 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2768 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2773 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2778 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2783 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2788 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2793 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2798 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2799 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2804 // called from drive combo box to navigate to a directory
2805 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2806 return E_INVALIDARG
;
2807 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2808 return E_INVALIDARG
;
2809 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2810 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2811 if (FAILED(hResult
))
2816 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2821 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2822 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2827 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2832 // called to show search bar
2833 if (V_VT(pvaClsid
) != VT_BSTR
)
2834 return E_INVALIDARG
;
2835 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2836 // TODO: properly compute the value of vertical
2838 return ShowBand(classID
, vertical
);
2841 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2846 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2851 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2856 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2861 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2866 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2871 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2876 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2881 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2886 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2891 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2896 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2901 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2906 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2911 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2916 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2921 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2923 if (pWinData
== NULL
)
2926 pWinData
->dwWindowID
= -1;
2928 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2929 pWinData
->lpszUrl
= NULL
;
2930 pWinData
->lpszUrlLocation
= NULL
;
2931 pWinData
->lpszTitle
= NULL
;
2935 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2940 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2945 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2947 CComPtr
<IPersistHistory
> viewPersistHistory
;
2948 CComPtr
<IOleObject
> viewHistoryObject
;
2949 persistState oldState
;
2954 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2955 if (FAILED(hResult
))
2957 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2959 if (oldState
.browseType
!= 2)
2961 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2963 return E_OUTOFMEMORY
;
2964 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2965 if (FAILED(hResult
))
2970 if (numRead
!= oldState
.pidlSize
)
2975 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
2976 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
2977 fHistoryObject
= viewHistoryObject
;
2978 fHistoryStream
= pStream
;
2979 fHistoryBindContext
= pbc
;
2980 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
2981 fHistoryObject
= NULL
;
2982 fHistoryStream
= NULL
;
2983 fHistoryBindContext
= NULL
;
2985 if (FAILED(hResult
))
2990 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
2992 CComPtr
<IPersistHistory
> viewPersistHistory
;
2993 persistState newState
;
2996 hResult
= fCurrentShellView
->GetItemObject(
2997 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
2998 memset(&newState
, 0, sizeof(newState
));
2999 newState
.dwSize
= sizeof(newState
);
3000 newState
.browseType
= 2;
3001 newState
.browserIndex
= GetBrowserIndex();
3002 if (viewPersistHistory
.p
!= NULL
)
3004 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3005 if (FAILED(hResult
))
3008 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3009 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3010 if (FAILED(hResult
))
3012 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3013 if (FAILED(hResult
))
3015 if (viewPersistHistory
.p
!= NULL
)
3017 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3018 if (FAILED(hResult
))
3024 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3029 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3034 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3036 // TODO: rip down everything
3041 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3043 CComPtr
<IDockingWindow
> dockingWindow
;
3044 RECT availableBounds
;
3045 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3048 if (wParam
!= SIZE_MINIMIZED
)
3050 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3051 for (INT x
= 0; x
< 3; x
++)
3053 if (fClientBars
[x
].clientBar
!= NULL
)
3055 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3056 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3057 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3059 hResult
= dockingWindow
->ResizeBorderDW(
3060 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3070 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3074 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3075 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3076 UpdateViewMenu(theMenu
);
3077 return RelayMsgToShellView(uMsg
, wParam
, lParam
, bHandled
);
3080 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3082 if (fCurrentShellViewWindow
!= NULL
)
3083 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3087 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3092 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3096 hResult
= DoFolderOptions();
3100 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3103 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3104 #endif /* __REACTOS__ */
3108 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3111 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3112 #endif /* __REACTOS__ */
3116 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3118 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3122 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3130 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3134 hResult
= GoForward();
3138 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3142 hResult
= NavigateToParent();
3146 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3154 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3158 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3159 PSHOpenNewFrame Func
;
3162 hShlwapi
= LoadLibrary(TEXT("browseui.dll"));
3163 if (hShlwapi
!= NULL
)
3164 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(hShlwapi
, (LPCSTR
)103));
3169 LPITEMIDLIST desktopPIDL
;
3171 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3172 if (SUCCEEDED(hResult
))
3174 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3180 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3182 fStatusBarVisible
= !fStatusBarVisible
;
3183 // TODO: trigger a relayout of contained items
3187 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3189 CComPtr
<IOleCommandTarget
> commandTarget
;
3192 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3193 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3194 if (FAILED(hResult
))
3196 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3200 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3202 CComPtr
<IOleCommandTarget
> commandTarget
;
3205 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3206 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3207 if (FAILED(hResult
))
3209 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3213 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3215 CComPtr
<IOleCommandTarget
> commandTarget
;
3218 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3219 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3220 if (FAILED(hResult
))
3222 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3226 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3228 CComPtr
<IOleCommandTarget
> commandTarget
;
3231 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3232 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3233 if (FAILED(hResult
))
3235 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3239 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3241 CComPtr
<IOleCommandTarget
> commandTarget
;
3244 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3245 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3246 if (FAILED(hResult
))
3248 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3252 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3254 CComPtr
<IOleCommandTarget
> commandTarget
;
3257 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3258 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3259 if (FAILED(hResult
))
3261 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3265 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3270 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3272 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3273 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3277 //static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
3279 // return DefWindowProc(hwnd, uMsg, wParam, lParam);
3282 static void ExplorerMessageLoop()
3289 Ret
= (GetMessage(&Msg
, NULL
, 0, 0) != 0);
3296 TranslateMessage(&Msg
);
3297 DispatchMessage(&Msg
);
3299 if (Msg
.message
== WM_QUIT
)
3305 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3307 CComPtr
<IShellBrowser
> shellBrowser
;
3308 CComObject
<CShellBrowser
> *theCabinet
;
3309 IEThreadParamBlock
*parameters
;
3312 parameters
= (IEThreadParamBlock
*)lpThreadParameter
;
3313 OleInitialize(NULL
);
3314 ATLTRY (theCabinet
= new CComObject
<CShellBrowser
>);
3315 if (theCabinet
== NULL
)
3316 return E_OUTOFMEMORY
;
3317 hResult
= theCabinet
->QueryInterface(IID_PPV_ARG(IShellBrowser
, &shellBrowser
));
3318 if (FAILED(hResult
))
3323 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3324 if (FAILED(hResult
))
3326 ExplorerMessageLoop();