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 #define USE_CUSTOM_EXPLORERBAND 1
29 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
31 #include "newatlinterfaces.h"
35 **Provide implementation of new and delete that use LocalAlloc
36 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
37 view doesn't restore the selection correctly.
38 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
39 **Add brand band bitmaps to shell32.dll
40 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
41 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
42 current state overwrites the wrong entry's contents. This needs to be changed.
43 ****Fix close of browser window to release all objects
44 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
45 **When a new bar is added to base bar site, how is base bar told so it can resize?
46 **Does the base bar site have a classid?
47 **What should refresh command send to views to make them refresh?
48 **When new bar is created, what status notifications need to be fired?
49 **How does keyboard filtering dispatch?
50 **For deferred persist history load, how does the view connect up and get the state?
51 How does context menu send open, cut, rename commands to its site (the shell view)?
52 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
54 **Route View->Toolbars commands to internet toolbar
55 **Handle travel log items in View->Go
56 **Fix ShowBrowserBar to pass correct size on when bar is shown
57 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
58 ****Make ShowToolbar check if bar is already created before creating it again
59 ****Shell should fill in the list of explorer bars in the View submenus
60 **Add folder menu in the file menu
61 **Fix CShellBrowser::GetBorderDW to compute available size correctly
62 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
63 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
64 Make folders toolbar item update state appropriately
65 Read list of bands from registry on launch
66 Read list of bars from registry on launch
67 If the folders or search bars don't exist, disable the toolbar buttons
68 If the favorites or history bars don't exist, disable the toolbar butons
69 Fix Apply to all Folders in Folder Options
70 Implement close command
71 Add explorer band context menu to file menu
72 Add code to allow restore of internet toolbar from registry
73 Fix code that calls FireNavigateComplete to pass the correct new path
75 What are the other command ids for QueryStatus/FireCommandStateChange?
77 Add handler for cabinet settings change
78 Add handler for system metrics change (renegotiate border space?)
79 Add handler for theme change and forward to contained windows
81 When folders are shown, the status bar text should change
82 Add code to save/restore shell view settings
83 Implement tabbing between frames
84 Fix handling of focus everywhere
85 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
87 The status bar doesn't show help text for items owned by frame during menu tracking
88 Stub out frame command handlers
89 "Arrange icons by" group is not checked properly
91 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
92 the icon is always an open folder with magnifying glass
93 Fix bars to calculate height correctly
94 Hookup policies for everything...
95 Investigate toolbar message WM_USER+93
96 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
98 Vertical Explorer Bar CATID_InfoBand
99 Horizontal Explorer Bar CATID_CommBand
100 Desk Band CATID_DeskBand
103 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
104 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
106 create key here with CLSID of bar to register tool band
107 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
112 #pragma comment(linker, \
113 "\"/manifestdependency:type='Win32' "\
114 "name='Microsoft.Windows.Common-Controls' "\
115 "version='6.0.0.0' "\
116 "processorArchitecture='*' "\
117 "publicKeyToken='6595b64144ccf1df' "\
121 struct categoryCacheHeader
123 long dwSize
; // size of header only
124 long version
; // currently 1
125 SYSTEMTIME writeTime
; // time we were written to registry
126 long classCount
; // number of classes following
129 static const unsigned int folderOptionsPageCountMax
= 20;
130 static const long BTP_UPDATE_CUR_HISTORY
= 1;
131 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
133 BOOL createNewStuff
= false;
136 // this class is private to browseui.dll and is not registered externally?
137 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
140 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
141 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
142 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
145 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
147 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
149 MENUITEMINFO menuItemInfo
;
153 menuItemCount
= GetMenuItemCount(theMenu
);
155 while (curIndex
< menuItemCount
)
157 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
158 menuItemInfo
.fMask
= MIIM_ID
;
159 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
160 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
162 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
170 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
172 CComPtr
<IShellFolder
> desktop
;
174 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
175 if (FAILED_UNEXPECTEDLY(hr
))
177 if (path
== NULL
|| path
->mkid
.cb
== 0)
179 *newFolder
= desktop
;
180 desktop
.p
->AddRef ();
183 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
186 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
187 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
192 class CToolbarProxy
:
193 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
196 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
198 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
203 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
204 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
206 BEGIN_MSG_MAP(CToolbarProxy
)
207 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
208 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
212 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
217 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
218 if (myWindow
!= NULL
)
220 SubclassWindow(myWindow
);
221 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
222 hResult
= explorerToolbar
->QueryInterface(
223 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
227 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
233 if (fExplorerToolbar
.p
!= NULL
)
235 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
236 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
237 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
238 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
243 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
249 if (fExplorerToolbar
.p
!= NULL
)
250 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
255 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
256 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
260 class CShellBrowser
:
261 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
262 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
263 public IShellBrowser
,
265 public IServiceProvider
,
266 public IProfferServiceImpl
<CShellBrowser
>,
267 public IShellBrowserService
,
269 public ITravelLogClient
,
270 public IPersistHistory
,
271 public IDockingWindowSite
,
272 public IOleCommandTarget
,
273 public IBrowserService2
,
274 public IConnectionPointContainerImpl
<CShellBrowser
>,
275 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
276 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
283 CComPtr
<IUnknown
> clientBar
;
286 static const int BIInternetToolbar
= 0;
287 static const int BIVerticalBaseBar
= 1;
288 static const int BIHorizontalBaseBar
= 2;
290 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
291 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
292 CComPtr
<IShellView
> fCurrentShellView
; //
293 LPITEMIDLIST fCurrentDirectoryPIDL
; //
295 bool fStatusBarVisible
;
296 CToolbarProxy fToolbarProxy
;
297 barInfo fClientBars
[3];
298 CComPtr
<ITravelLog
> fTravelLog
;
299 HMENU fCurrentMenuBar
;
300 CABINETSTATE fCabinetState
;
301 // The next three fields support persisted history for shell views.
302 // They do not need to be reference counted.
303 IOleObject
*fHistoryObject
;
304 IStream
*fHistoryStream
;
305 IBindCtx
*fHistoryBindContext
;
309 ULONG
InternalAddRef()
311 OutputDebugString(_T("AddRef\n"));
312 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
314 ULONG
InternalRelease()
316 OutputDebugString(_T("Release\n"));
317 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
323 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
325 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
326 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
327 FOLDERSETTINGS
*folderSettings
, long flags
);
328 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
329 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
330 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
331 HRESULT
NavigateToParent();
332 HRESULT
DoFolderOptions();
333 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
334 void RepositionBars();
335 virtual WNDPROC
GetWindowProc()
339 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
340 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
341 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
342 HRESULT
FireCommandStateChangeAll();
343 HRESULT
UpdateForwardBackState();
344 void UpdateGotoMenu(HMENU theMenu
);
345 void UpdateViewMenu(HMENU theMenu
);
347 /* // *** IDockingWindowFrame methods ***
348 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
349 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
350 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
353 // *** IDockingWindowSite methods ***
354 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
355 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
356 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
358 // *** IOleCommandTarget methods ***
359 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
360 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
361 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
362 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
364 // *** IOleWindow methods ***
365 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
366 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
368 // *** IShellBrowser methods ***
369 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
370 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
371 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
372 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
373 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
374 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
375 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
376 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
377 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
378 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
379 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
380 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
381 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
383 // *** IDropTarget methods ***
384 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
385 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
386 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
387 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
389 // *** IServiceProvider methods ***
390 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
392 // *** IShellBowserService methods ***
393 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
395 // *** IDispatch methods ***
396 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
397 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
398 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
399 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
400 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
401 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
403 // *** IBrowserService methods ***
404 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
405 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
406 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
407 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
408 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
409 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
410 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
411 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
412 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
413 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
414 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
415 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
416 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
417 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
418 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
419 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
420 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
421 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
422 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
423 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
424 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
425 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
426 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
427 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
428 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
429 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
430 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
431 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
432 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
433 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
435 // *** IBrowserService2 methods ***
436 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
437 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
438 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
439 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
440 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
441 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
442 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
443 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
444 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
445 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
446 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
447 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
448 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
449 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
450 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
451 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
452 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
453 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
454 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
455 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
456 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
457 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
458 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
459 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
460 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
461 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
462 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
463 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
464 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
465 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
466 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
467 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
468 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
469 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
470 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
471 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
472 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
473 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
474 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
475 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
476 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
477 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
478 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
479 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
480 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
481 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
482 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
483 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
484 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
485 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
486 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
487 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
488 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
489 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
490 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
491 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
492 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
493 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
494 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
495 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
496 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
497 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
498 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
499 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
500 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
502 // *** IWebBrowser methods ***
503 virtual HRESULT STDMETHODCALLTYPE
GoBack();
504 virtual HRESULT STDMETHODCALLTYPE
GoForward();
505 virtual HRESULT STDMETHODCALLTYPE
GoHome();
506 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
507 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
508 VARIANT
*PostData
, VARIANT
*Headers
);
509 virtual HRESULT STDMETHODCALLTYPE
Refresh();
510 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
511 virtual HRESULT STDMETHODCALLTYPE
Stop();
512 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
513 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
514 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
515 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
516 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
517 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
518 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
519 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
520 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
521 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
522 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
523 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
524 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
525 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
526 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
527 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
528 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
530 // *** IWebBrowserApp methods ***
531 virtual HRESULT STDMETHODCALLTYPE
Quit();
532 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
533 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
534 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
535 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
536 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
537 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
538 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
539 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
540 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
541 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
542 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
543 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
544 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
545 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
546 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
547 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
548 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
549 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
550 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
552 // *** IWebBrowser2 methods ***
553 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
554 VARIANT
*PostData
, VARIANT
*Headers
);
555 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
556 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
557 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
558 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
559 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
560 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
561 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
562 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
563 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
564 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
565 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
566 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
567 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
568 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
569 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
570 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
571 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
572 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
573 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
575 // *** ITravelLogClient methods ***
576 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
577 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
578 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
580 // *** IPersist methods ***
581 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
583 // *** IPersistHistory methods ***
584 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
585 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
586 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
587 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
590 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
591 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
592 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
593 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
594 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
595 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
596 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
597 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
598 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
599 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
600 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
601 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
602 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
603 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
604 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
605 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
606 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
607 LRESULT
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
608 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
609 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
610 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
611 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
612 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
613 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
614 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
615 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
616 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
618 static ATL::CWndClassInfo
& GetWndClassInfo()
620 static ATL::CWndClassInfo wc
=
622 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
623 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
624 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
625 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
630 BEGIN_MSG_MAP(CShellBrowser
)
631 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
632 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
633 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
634 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
635 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
636 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
637 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
638 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
639 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
640 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
641 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
642 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
643 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
644 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
645 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
646 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
647 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
648 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
649 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
650 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
651 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
652 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
653 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
654 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
655 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
656 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
657 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
658 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
659 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
662 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
663 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
664 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
665 END_CONNECTION_POINT_MAP()
667 BEGIN_COM_MAP(CShellBrowser
)
668 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
669 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
670 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
671 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
672 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
673 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
674 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
675 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
676 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
677 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
678 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
679 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
680 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
681 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
682 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
683 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
684 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
685 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
689 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
691 CShellBrowser::CShellBrowser()
693 fCurrentShellViewWindow
= NULL
;
694 fCurrentDirectoryPIDL
= NULL
;
696 fStatusBarVisible
= true;
697 memset(fClientBars
, 0, sizeof(fClientBars
));
698 fCurrentMenuBar
= NULL
;
699 fHistoryObject
= NULL
;
700 fHistoryStream
= NULL
;
701 fHistoryBindContext
= NULL
;
704 CShellBrowser::~CShellBrowser()
708 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
710 CComPtr
<IPersistStreamInit
> persistStreamInit
;
712 CComPtr
<IUnknown
> clientBar
;
714 _AtlInitialConstruct();
716 fCabinetState
.cLength
= sizeof(fCabinetState
);
717 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
722 Create(HWND_DESKTOP
);
727 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
728 if (FAILED_UNEXPECTEDLY(hResult
))
731 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &clientBar
));
732 if (FAILED_UNEXPECTEDLY(hResult
))
736 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
739 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
740 if (FAILED_UNEXPECTEDLY(hResult
))
743 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
744 if (FAILED_UNEXPECTEDLY(hResult
))
747 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
748 if (FAILED_UNEXPECTEDLY(hResult
))
751 // TODO: create settingsStream from registry entry
752 //if (settingsStream.p)
754 // hResult = persistStreamInit->Load(settingsStream);
755 // if (FAILED_UNEXPECTEDLY(hResult))
760 hResult
= persistStreamInit
->InitNew();
761 if (FAILED_UNEXPECTEDLY(hResult
))
765 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
766 if (FAILED_UNEXPECTEDLY(hResult
))
769 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
773 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
774 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
775 _AtlBaseModule
.GetModuleInstance(), 0);
776 fStatusBarVisible
= true;
780 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
781 if (FAILED_UNEXPECTEDLY(hResult
))
784 ShowWindow(SW_SHOWNORMAL
);
789 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
791 CComPtr
<IShellFolder
> newFolder
;
792 FOLDERSETTINGS newFolderSettings
;
795 // called by shell view to browse to new folder
796 // also called by explorer band to navigate to new folder
797 hResult
= SHBindToFolder(pidl
, &newFolder
);
798 if (FAILED_UNEXPECTEDLY(hResult
))
801 newFolderSettings
.ViewMode
= FVM_ICON
;
802 newFolderSettings
.fFlags
= 0;
803 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
804 if (FAILED_UNEXPECTEDLY(hResult
))
809 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
811 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
814 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
816 LPCITEMIDLIST pidlnext
;
821 if (! _ILIsDesktop(pidl
))
823 length
= pidl
->mkid
.cb
;
825 reinterpret_cast<LPCITEMIDLIST
>(
826 reinterpret_cast<const BYTE
*>(pidl
) + length
);
827 if (pidlnext
->mkid
.cb
!= 0)
833 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
834 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
836 CComPtr
<IShellFolder
> psf
;
837 LPITEMIDLIST pidlChild
;
838 LPITEMIDLIST pidlParent
;
845 if (ppidlLast
!= NULL
)
847 if (_ILIsPidlSimple(pidl
))
849 if (ppidlLast
!= NULL
)
850 *ppidlLast
= ILClone(pidl
);
851 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
855 pidlChild
= ILClone(ILFindLastID(pidl
));
856 pidlParent
= ILClone(pidl
);
857 ILRemoveLastID(pidlParent
);
858 hResult
= SHGetDesktopFolder(&psf
);
859 if (SUCCEEDED(hResult
))
860 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
861 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
862 *ppidlLast
= pidlChild
;
870 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
871 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
873 CComPtr
<IShellFolder
> parentFolder
;
874 LPITEMIDLIST childPIDL
= NULL
;
878 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
882 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
886 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
889 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
902 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
904 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
907 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
908 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
910 CComPtr
<IObjectWithSite
> objectWithSite
;
911 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
912 CComPtr
<IShellView
> saveCurrentShellView
;
913 CComPtr
<IShellView
> newShellView
;
914 CComPtr
<ITravelLog
> travelLog
;
915 HWND newShellViewWindow
;
916 BOOL windowUpdateIsLocked
;
917 RECT shellViewWindowBounds
;
920 wchar_t newTitle
[MAX_PATH
];
924 if (newShellFolder
== NULL
)
927 hResult
= GetTravelLog(&travelLog
);
928 if (FAILED_UNEXPECTEDLY(hResult
))
932 if (flags
& BTP_UPDATE_CUR_HISTORY
)
934 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
935 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
936 // what to do with error? Do we want to halt browse because state save failed?
939 if (fCurrentShellView
)
941 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
944 // create view object
945 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
946 if (FAILED_UNEXPECTEDLY(hResult
))
948 previousView
= fCurrentShellViewWindow
;
950 // enter updating section
951 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
952 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
953 if (fCurrentShellView
!= NULL
)
954 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
957 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
959 // update folder and view
960 saveCurrentShellFolder
= fCurrentShellFolder
;
961 saveCurrentShellView
= fCurrentShellView
;
962 fCurrentShellFolder
= newShellFolder
;
963 fCurrentShellView
= newShellView
;
966 if (previousView
!= NULL
)
967 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
969 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
970 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
972 // create view window
973 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
974 this, &shellViewWindowBounds
, &newShellViewWindow
);
975 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
977 fCurrentShellView
= saveCurrentShellView
;
978 fCurrentShellFolder
= saveCurrentShellFolder
;
979 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
980 if (windowUpdateIsLocked
)
981 LockWindowUpdate(FALSE
);
982 SetCursor(saveCursor
);
986 if (objectWithSite
.p
!= NULL
)
987 hResult
= objectWithSite
->SetSite(NULL
);
989 // update current pidl
990 ILFree(fCurrentDirectoryPIDL
);
991 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
993 // update view window
994 if (saveCurrentShellView
!= NULL
)
995 saveCurrentShellView
->DestroyViewWindow();
996 fCurrentShellViewWindow
= newShellViewWindow
;
999 saveCurrentShellView
.Release();
1000 saveCurrentShellFolder
.Release();
1002 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1004 // leave updating section
1005 if (windowUpdateIsLocked
)
1006 LockWindowUpdate(FALSE
);
1007 SetCursor(saveCursor
);
1010 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1012 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1013 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1017 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1018 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1019 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1020 if (SUCCEEDED(hResult
))
1022 FireNavigateComplete(newTitle
);
1026 FireNavigateComplete(L
"ERROR");
1029 if (fCabinetState
.fFullPathTitle
)
1030 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1032 nameFlags
= SHGDN_FORADDRESSBAR
;
1033 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1034 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1035 if (SUCCEEDED(hResult
))
1037 SetWindowText(newTitle
);
1039 LPCITEMIDLIST pidlChild
;
1040 INT index
, indexOpen
;
1041 HIMAGELIST himlSmall
, himlLarge
;
1043 CComPtr
<IShellFolder
> sf
;
1044 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1046 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1048 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1050 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1051 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1053 /* Hack to make it possible to release the old icons */
1054 /* Something seems to go wrong with WM_SETICON */
1055 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1056 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1058 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1059 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1061 DestroyIcon(oldSmall
);
1062 DestroyIcon(oldLarge
);
1065 FireCommandStateChangeAll();
1066 hResult
= UpdateForwardBackState();
1070 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1072 CComPtr
<IBandSite
> bandSite
;
1073 CComPtr
<IDeskBand
> deskBand
;
1076 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1079 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1080 if (FAILED_UNEXPECTEDLY(hResult
))
1083 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1084 if (FAILED_UNEXPECTEDLY(hResult
))
1087 return deskBand
->QueryInterface(riid
, shellMenu
);
1090 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1092 CComPtr
<IUnknown
> newBaseBar
;
1093 CComPtr
<IDeskBar
> deskBar
;
1094 CComPtr
<IUnknown
> newBaseBarSite
;
1095 CComPtr
<IDeskBarClient
> deskBarClient
;
1100 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1102 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1105 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1106 if (FAILED_UNEXPECTEDLY(hResult
))
1108 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1109 if (FAILED_UNEXPECTEDLY(hResult
))
1112 // tell the new base bar about the shell browser
1113 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1114 if (FAILED_UNEXPECTEDLY(hResult
))
1117 // tell the new base bar about the new base bar site
1118 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1119 if (FAILED_UNEXPECTEDLY(hResult
))
1121 hResult
= deskBar
->SetClient(newBaseBarSite
);
1122 if (FAILED_UNEXPECTEDLY(hResult
))
1125 // tell the new base bar site about the new base bar
1126 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1127 if (FAILED_UNEXPECTEDLY(hResult
))
1129 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1130 if (FAILED_UNEXPECTEDLY(hResult
))
1133 *cache
= newBaseBar
.Detach();
1135 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1138 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1140 CComPtr
<IDockingWindow
> dockingWindow
;
1141 CComPtr
<IUnknown
> baseBarSite
;
1142 CComPtr
<IUnknown
> newBand
;
1143 CComPtr
<IUnknown
> theBaseBar
;
1144 CComPtr
<IDeskBar
> deskBar
;
1148 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1149 if (FAILED_UNEXPECTEDLY(hResult
))
1152 #if USE_CUSTOM_EXPLORERBAND
1153 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1154 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1156 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1157 hResult
= CExplorerBand_Constructor(IID_PPV_ARG(IUnknown
, &newBand
));
1158 if (FAILED_UNEXPECTEDLY(hResult
))
1164 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1165 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1166 if (FAILED_UNEXPECTEDLY(hResult
))
1169 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1170 if (FAILED_UNEXPECTEDLY(hResult
))
1172 hResult
= deskBar
->GetClient(&baseBarSite
);
1173 if (FAILED_UNEXPECTEDLY(hResult
))
1175 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1176 if (FAILED_UNEXPECTEDLY(hResult
))
1178 V_VT(&vaIn
) = VT_UNKNOWN
;
1179 V_UNKNOWN(&vaIn
) = newBand
.p
;
1180 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1181 if (FAILED_UNEXPECTEDLY(hResult
))
1183 hResult
= dockingWindow
->ShowDW(TRUE
);
1184 if (FAILED_UNEXPECTEDLY(hResult
))
1190 HRESULT
CShellBrowser::NavigateToParent()
1192 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1193 if (newDirectory
== NULL
)
1194 return E_OUTOFMEMORY
;
1195 ILRemoveLastID(newDirectory
);
1196 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1197 ILFree(newDirectory
);
1198 if (FAILED_UNEXPECTEDLY(hResult
))
1203 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1205 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1206 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1208 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1209 sheetInfo
->nPages
++;
1213 HRESULT
CShellBrowser::DoFolderOptions()
1215 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1216 PROPSHEETHEADER m_PropSheet
;
1217 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1218 // CComPtr<IGlobalFolderSettings> globalSettings;
1219 // SHELLSTATE2 shellState;
1222 memset(m_psp
, 0, sizeof(m_psp
));
1223 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1225 // create sheet object
1226 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1227 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1228 if (FAILED_UNEXPECTEDLY(hResult
))
1231 // must set site in order for Apply to all Folders on Advanced page to be enabled
1232 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1233 m_PropSheet
.phpage
= m_psp
;
1236 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1237 if (FAILED_UNEXPECTEDLY(hResult
))
1239 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1240 if (FAILED_UNEXPECTEDLY(hResult
))
1245 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1246 if (FAILED_UNEXPECTEDLY(hResult
))
1249 if (fCurrentShellView
!= NULL
)
1251 hResult
= fCurrentShellView
->AddPropertySheetPages(
1252 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1253 if (FAILED_UNEXPECTEDLY(hResult
))
1258 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1259 m_PropSheet
.dwFlags
= 0;
1260 m_PropSheet
.hwndParent
= m_hWnd
;
1261 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1262 m_PropSheet
.pszCaption
= _T("Folder Options");
1263 m_PropSheet
.nStartPage
= 0;
1264 PropertySheet(&m_PropSheet
);
1268 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1270 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1271 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1273 const _ATL_MSG
*previousMessage
;
1275 WNDPROC saveWindowProc
;
1278 hWnd
= pThis
->m_hWnd
;
1279 previousMessage
= pThis
->m_pCurrentMsg
;
1280 pThis
->m_pCurrentMsg
= &msg
;
1282 CComPtr
<IMenuBand
> menuBand
;
1283 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1284 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1286 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1287 if (hResult
== S_OK
)
1290 wParam
= msg
.wParam
;
1291 lParam
= msg
.lParam
;
1295 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1296 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1297 if (handled
== FALSE
)
1299 if (uMsg
== WM_NCDESTROY
)
1301 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1302 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1303 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1304 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1305 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1308 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1310 pThis
->m_pCurrentMsg
= previousMessage
;
1311 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1313 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1314 pThis
->m_hWnd
= NULL
;
1315 pThis
->OnFinalMessage(hWnd
);
1320 void CShellBrowser::RepositionBars()
1326 GetClientRect(&clientRect
);
1328 if (fStatusBarVisible
&& fStatusBar
)
1330 ::GetWindowRect(fStatusBar
, &statusRect
);
1331 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1332 clientRect
.right
- clientRect
.left
,
1333 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1334 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1337 for (x
= 0; x
< 3; x
++)
1339 HWND hwnd
= fClientBars
[x
].hwnd
;
1340 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1341 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1343 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1344 fClientBars
[x
].hwnd
= hwnd
;
1348 RECT toolbarRect
= clientRect
;
1349 if (borderSpace
.top
!= 0)
1351 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1353 else if (borderSpace
.bottom
!= 0)
1355 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1357 else if (borderSpace
.left
!= 0)
1359 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1361 else if (borderSpace
.right
!= 0)
1363 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1366 ::SetWindowPos(hwnd
, NULL
,
1369 toolbarRect
.right
- toolbarRect
.left
,
1370 toolbarRect
.bottom
- toolbarRect
.top
,
1371 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1373 if (borderSpace
.top
!= 0)
1375 clientRect
.top
= toolbarRect
.bottom
;
1377 else if (borderSpace
.bottom
!= 0)
1379 clientRect
.bottom
= toolbarRect
.top
;
1381 else if (borderSpace
.left
!= 0)
1383 clientRect
.left
= toolbarRect
.right
;
1385 else if (borderSpace
.right
!= 0)
1387 clientRect
.right
= toolbarRect
.left
;
1391 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1392 clientRect
.right
- clientRect
.left
,
1393 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1396 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1399 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1400 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1403 params
.rgvarg
= arguments
;
1404 params
.rgdispidNamedArgs
= NULL
;
1405 params
.cArgs
= argCount
;
1406 params
.cNamedArgs
= 0;
1407 IUnknown
** pp
= vec
.begin();
1408 while (pp
< vec
.end())
1412 CComPtr
<IDispatch
> theDispatch
;
1414 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1415 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1420 while (pp
< vec2
.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
);
1434 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1436 // these two variants intentionally to do use CComVariant because it would double free/release
1437 // or does not need to dispose at all
1440 CComBSTR
tempString(newDirectory
);
1442 V_VT(&varArgs
) = VT_BSTR
;
1443 V_BSTR(&varArgs
) = tempString
.m_str
;
1445 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1446 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1447 V_VT(&varArg
[1]) = VT_DISPATCH
;
1448 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1450 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1453 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1457 V_VT(&varArg
[0]) = VT_BOOL
;
1458 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1459 V_VT(&varArg
[1]) = VT_I4
;
1460 V_I4(&varArg
[1]) = commandID
;
1462 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1465 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1467 return FireCommandStateChange(false, -1);
1470 HRESULT
CShellBrowser::UpdateForwardBackState()
1472 CComPtr
<ITravelLog
> travelLog
;
1473 CComPtr
<ITravelEntry
> unusedEntry
;
1479 canGoForward
= false;
1480 hResult
= GetTravelLog(&travelLog
);
1481 if (FAILED_UNEXPECTEDLY(hResult
))
1483 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1484 if (SUCCEEDED(hResult
))
1487 unusedEntry
.Release();
1489 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1490 if (SUCCEEDED(hResult
))
1492 canGoForward
= true;
1493 unusedEntry
.Release();
1495 hResult
= FireCommandStateChange(canGoBack
, 2);
1496 hResult
= FireCommandStateChange(canGoForward
, 1);
1500 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1502 CComPtr
<ITravelLog
> travelLog
;
1504 MENUITEMINFO menuItemInfo
;
1507 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1509 position
= GetMenuItemCount(theMenu
);
1510 hResult
= GetTravelLog(&travelLog
);
1511 if (FAILED_UNEXPECTEDLY(hResult
))
1513 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1514 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1515 if (SUCCEEDED(hResult
))
1517 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1518 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1519 menuItemInfo
.fType
= MF_SEPARATOR
;
1520 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1521 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1525 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1527 CComPtr
<ITravelLog
> travelLog
;
1529 OLECMD commandList
[5];
1530 HMENU toolbarMenuBar
;
1532 MENUITEMINFO menuItemInfo
;
1535 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1536 if (gotoMenu
!= NULL
)
1537 UpdateGotoMenu(gotoMenu
);
1539 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1540 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1541 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1542 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1543 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1545 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1546 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1547 if (FAILED_UNEXPECTEDLY(hResult
))
1548 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1551 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1552 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1553 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1554 DestroyMenu(menuItemInfo
.hSubMenu
);
1556 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1557 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1558 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1559 DestroyMenu(toolbarMenuBar
);
1562 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1563 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1564 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1565 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1567 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1568 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1569 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1570 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1571 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1572 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1573 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1574 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1576 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1577 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1578 menuItemInfo
.hSubMenu
= toolbarMenu
;
1579 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1581 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1584 SHEnableMenuItem(theMenu
, IDM_VIEW_EXPLORERBAR
, FALSE
);
1587 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1589 CComPtr
<IUnknown
> int1Retry
;
1590 CComPtr
<IUnknown
> int2Retry
;
1595 if (int1
== NULL
|| int2
== NULL
)
1597 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1598 if (FAILED_UNEXPECTEDLY(hResult
))
1600 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1601 if (FAILED_UNEXPECTEDLY(hResult
))
1603 if (int1Retry
== int2Retry
)
1608 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1610 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1612 RECT availableBounds
;
1614 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1615 for (INT x
= 0; x
< 3; x
++)
1617 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1619 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1620 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1621 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1622 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1625 *prcBorder
= availableBounds
;
1629 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1634 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1636 for (INT x
= 0; x
< 3; x
++)
1638 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1640 fClientBars
[x
].borderSpace
= *pbw
;
1641 // if this bar changed size, it cascades and forces all subsequent bars to resize
1646 return E_INVALIDARG
;
1649 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1650 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1652 CComPtr
<IOleCommandTarget
> commandTarget
;
1655 if (prgCmds
== NULL
)
1656 return E_INVALIDARG
;
1657 if (pguidCmdGroup
== NULL
)
1659 if (fCurrentShellView
.p
!= NULL
)
1661 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1662 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1663 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1672 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1676 switch (prgCmds
->cmdID
)
1678 case 0x1c: // search
1679 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1681 case 0x1d: // history
1682 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1684 case 0x1e: // favorites
1685 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1687 case 0x23: // folders
1688 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1698 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1702 switch (prgCmds
->cmdID
)
1704 case 0xa022: // up level
1705 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1706 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1707 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1717 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1718 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1722 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1727 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1730 if (nCmdexecopt
== 1)
1732 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1736 // update zones part of the status bar
1739 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1740 V_VT(pvaOut
) = VT_INT_PTR
;
1741 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1742 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1745 // indicate if this cabinet was opened as a browser
1751 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1760 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1765 // what is theater mode and why do we receive this?
1769 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1774 // initialize favorites menu
1778 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1783 // refresh on toolbar clicked
1786 // tell the view if it should hide the task pane or not
1787 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1790 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1795 return NavigateToParent();
1798 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1803 return DoFolderOptions();
1806 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1811 // Reset All Folders option in Folder Options
1822 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1830 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1835 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1837 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1839 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1841 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1844 DestroyMenu(mainMenu
);
1846 lpMenuWidths
->width
[0] = 2;
1847 lpMenuWidths
->width
[2] = 3;
1848 lpMenuWidths
->width
[4] = 1;
1852 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1854 CComPtr
<IShellMenu
> shellMenu
;
1857 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
1859 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1860 if (FAILED_UNEXPECTEDLY(hResult
))
1865 // FIXME: Figure out the proper way to do this.
1866 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
1869 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
1873 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
1874 if (FAILED_UNEXPECTEDLY(hResult
))
1876 fCurrentMenuBar
= hmenuShared
;
1880 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1882 if (hmenuShared
== fCurrentMenuBar
)
1884 //DestroyMenu(fCurrentMenuBar);
1885 SetMenuSB(NULL
, NULL
, NULL
);
1890 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1895 ::SetWindowText(fStatusBar
, pszStatusText
);
1904 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1909 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1911 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1916 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1918 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1921 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1926 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1934 *lphwnd
= fToolbarProxy
.m_hWnd
;
1937 *lphwnd
= fStatusBar
;
1940 // find the directory browser and return it
1941 // this should be used only to determine if a tree is present
1944 // is this a progress dialog?
1950 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1951 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1960 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1965 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1973 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1977 *ppshv
= fCurrentShellView
;
1978 if (fCurrentShellView
.p
!= NULL
)
1979 fCurrentShellView
.p
->AddRef();
1983 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1988 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1993 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1994 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1999 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2004 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2009 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2010 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2015 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2017 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2018 // the returned interface has a method GetPropertyBag on it
2019 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2020 return this->QueryInterface(riid
, ppvObject
);
2021 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2022 return this->QueryInterface(riid
, ppvObject
);
2023 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2024 return this->QueryInterface(riid
, ppvObject
);
2025 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2026 return this->QueryInterface(riid
, ppvObject
);
2027 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2028 return this->QueryInterface(riid
, ppvObject
);
2029 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2030 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2031 if (IsEqualIID(riid
, IID_IShellBrowser
))
2032 return this->QueryInterface(riid
, ppvObject
);
2033 return E_NOINTERFACE
;
2036 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2038 if (ppvObject
== NULL
)
2044 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2049 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2054 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2055 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2060 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2061 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2066 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2071 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2076 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2081 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2086 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2090 // called by toolbar when displaying tooltips
2095 if (fTravelLog
.p
== NULL
)
2097 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2098 if (FAILED_UNEXPECTEDLY(hResult
))
2101 *pptl
= fTravelLog
.p
;
2102 fTravelLog
.p
->AddRef();
2106 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2111 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2116 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2121 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2126 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2131 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2136 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2141 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2146 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2151 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2156 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2161 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2166 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2171 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2176 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2178 // called by explorer bar to get current pidl
2181 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2185 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2190 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2195 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2200 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2202 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2203 return E_INVALIDARG
;
2204 *ppole
= fHistoryObject
;
2205 if (fHistoryObject
!= NULL
)
2206 fHistoryObject
->AddRef();
2207 *pstm
= fHistoryStream
;
2208 if (fHistoryStream
!= NULL
)
2209 fHistoryStream
->AddRef();
2210 *ppbc
= fHistoryBindContext
;
2211 if (fHistoryBindContext
!= NULL
)
2212 fHistoryBindContext
->AddRef();
2213 fHistoryObject
= NULL
;
2214 fHistoryStream
= NULL
;
2215 fHistoryBindContext
= NULL
;
2221 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2226 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2231 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2236 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2237 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2242 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2247 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2252 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2257 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2262 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2267 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2272 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2274 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2278 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2283 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2288 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2293 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2298 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2303 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2308 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2313 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2314 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2319 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2324 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2329 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2334 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2339 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2344 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2349 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2354 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2359 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2364 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2369 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2374 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2379 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2384 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2389 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2394 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2399 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2404 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2409 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2414 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2419 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2424 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2425 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2430 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2431 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2436 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2441 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2446 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2451 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2456 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2461 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2466 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2471 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2476 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2481 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2486 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2491 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2496 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2501 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2506 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2511 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2516 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2521 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2526 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2531 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2532 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2537 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2542 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2547 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2552 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2554 for (int i
= 0; i
< 3; i
++)
2556 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2560 if (!fCurrentShellView
)
2563 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2566 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2571 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2576 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2578 CComPtr
<ITravelLog
> travelLog
;
2579 HRESULT hResult
= GetTravelLog(&travelLog
);
2580 if (FAILED_UNEXPECTEDLY(hResult
))
2582 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2585 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2587 CComPtr
<ITravelLog
> travelLog
;
2588 HRESULT hResult
= GetTravelLog(&travelLog
);
2589 if (FAILED_UNEXPECTEDLY(hResult
))
2591 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2594 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2599 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2604 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2605 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2610 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2614 V_VT(&level
) = VT_I4
;
2616 return Refresh2(&level
);
2619 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2621 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2624 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2625 if (FAILED_UNEXPECTEDLY(hResult
))
2627 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2630 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2635 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2640 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2645 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2650 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2655 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2660 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2667 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2672 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2677 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2682 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2687 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2692 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2697 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2702 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2709 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2714 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2719 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2724 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2729 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2734 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2739 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2744 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2749 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2754 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2759 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2764 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2769 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2774 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2779 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2784 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2789 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2794 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2799 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2804 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2809 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2814 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2819 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2824 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2825 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2827 // called from drive combo box to navigate to a directory
2828 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2829 return E_INVALIDARG
;
2830 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2831 return E_INVALIDARG
;
2833 LPITEMIDLIST pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
2834 HRESULT hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2835 if (FAILED_UNEXPECTEDLY(hResult
))
2840 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2845 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2846 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2851 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2856 // called to show search bar
2857 if (V_VT(pvaClsid
) != VT_BSTR
)
2858 return E_INVALIDARG
;
2859 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2860 // TODO: properly compute the value of vertical
2862 return ShowBand(classID
, vertical
);
2865 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2870 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2875 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2880 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2885 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2890 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2895 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2900 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2905 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2910 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2915 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2920 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2925 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2930 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2935 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2940 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2945 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2947 if (pWinData
== NULL
)
2950 pWinData
->dwWindowID
= -1;
2952 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2953 pWinData
->lpszUrl
= NULL
;
2954 pWinData
->lpszUrlLocation
= NULL
;
2955 pWinData
->lpszTitle
= NULL
;
2959 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2964 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2969 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2971 CComPtr
<IPersistHistory
> viewPersistHistory
;
2972 CComPtr
<IOleObject
> viewHistoryObject
;
2973 persistState oldState
;
2978 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2979 if (FAILED_UNEXPECTEDLY(hResult
))
2981 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2983 if (oldState
.browseType
!= 2)
2985 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2987 return E_OUTOFMEMORY
;
2988 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2989 if (FAILED_UNEXPECTEDLY(hResult
))
2994 if (numRead
!= oldState
.pidlSize
)
2999 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3000 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3001 fHistoryObject
= viewHistoryObject
;
3002 fHistoryStream
= pStream
;
3003 fHistoryBindContext
= pbc
;
3004 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
3005 fHistoryObject
= NULL
;
3006 fHistoryStream
= NULL
;
3007 fHistoryBindContext
= NULL
;
3009 if (FAILED_UNEXPECTEDLY(hResult
))
3014 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3016 CComPtr
<IPersistHistory
> viewPersistHistory
;
3017 persistState newState
;
3020 hResult
= fCurrentShellView
->GetItemObject(
3021 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3022 memset(&newState
, 0, sizeof(newState
));
3023 newState
.dwSize
= sizeof(newState
);
3024 newState
.browseType
= 2;
3025 newState
.browserIndex
= GetBrowserIndex();
3026 if (viewPersistHistory
.p
!= NULL
)
3028 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3029 if (FAILED_UNEXPECTEDLY(hResult
))
3032 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3033 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3034 if (FAILED_UNEXPECTEDLY(hResult
))
3036 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3037 if (FAILED_UNEXPECTEDLY(hResult
))
3039 if (viewPersistHistory
.p
!= NULL
)
3041 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3042 if (FAILED_UNEXPECTEDLY(hResult
))
3048 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3053 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3058 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3060 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3064 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3067 // TODO: rip down everything
3069 fCurrentShellView
->DestroyViewWindow();
3070 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3071 ReleaseCComPtrExpectZero(fCurrentShellView
);
3073 for (int i
= 0; i
< 3; i
++)
3075 if (fClientBars
[i
].clientBar
== NULL
)
3077 IDockingWindow
* pdw
;
3078 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3079 if (FAILED_UNEXPECTEDLY(hr
))
3084 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3086 ReleaseCComPtrExpectZero(fTravelLog
);
3088 fCurrentShellFolder
.Release();
3089 ILFree(fCurrentDirectoryPIDL
);
3090 ::DestroyWindow(fStatusBar
);
3091 DestroyMenu(fCurrentMenuBar
);
3097 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3099 CComPtr
<IDockingWindow
> dockingWindow
;
3100 RECT availableBounds
;
3101 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3104 if (wParam
!= SIZE_MINIMIZED
)
3106 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3107 for (INT x
= 0; x
< 3; x
++)
3109 if (fClientBars
[x
].clientBar
!= NULL
)
3111 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3112 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3113 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3115 hResult
= dockingWindow
->ResizeBorderDW(
3116 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3126 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3129 LPARAM menuIndex
= lParam
;
3131 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3133 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3137 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3141 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3143 UpdateViewMenu(theMenu
);
3146 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3150 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3152 // FIXME: Remove once implemented
3153 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3154 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3155 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3156 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
);
3159 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3164 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3169 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3171 ::SetFocus(fCurrentShellViewWindow
);
3175 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3177 if (fCurrentShellViewWindow
!= NULL
)
3178 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3182 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3184 return SendMessage(WM_CLOSE
);
3187 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3189 HRESULT hResult
= DoFolderOptions();
3190 if (FAILED(hResult
))
3191 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3195 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3198 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3199 #endif /* __REACTOS__ */
3203 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3206 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3207 #endif /* __REACTOS__ */
3211 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3213 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3217 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3219 HRESULT hResult
= GoBack();
3220 if (FAILED(hResult
))
3221 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3225 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3227 HRESULT hResult
= GoForward();
3228 if (FAILED(hResult
))
3229 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3233 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3235 HRESULT hResult
= NavigateToParent();
3236 if (FAILED(hResult
))
3237 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3241 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3243 HRESULT hResult
= GoHome();
3244 if (FAILED(hResult
))
3245 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3249 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3251 // FIXME: This does not appear to be what windows does.
3252 HRESULT hResult
= NavigateToParent();
3253 if (FAILED(hResult
))
3254 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3258 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3260 CComPtr
<IShellFolder
> psfDesktop
;
3261 LPITEMIDLIST pidlFavs
;
3263 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3266 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3271 hr
= SHGetDesktopFolder(&psfDesktop
);
3272 if (FAILED_UNEXPECTEDLY(hr
))
3275 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3276 if (FAILED_UNEXPECTEDLY(hr
))
3282 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3284 /* TODO: Implement properly */
3286 LPCWSTR strSite
= L
"https://www.reactos.org/user-faq";
3288 /* TODO: Make localizable */
3289 LPCWSTR strCaption
= L
"Sorry";
3290 LPCWSTR strMessage
= L
"ReactOS could not browse to '%s' (error %d). Please make sure there is a web browser installed.";
3291 WCHAR tmpMessage
[512];
3293 /* TODO: Read from the registry */
3294 LPCWSTR strVerb
= NULL
; /* default */
3295 LPCWSTR strPath
= strSite
;
3296 LPCWSTR strParams
= NULL
;
3298 /* The return value is defined as HINSTANCE for backwards compatibility only, the cast is needed */
3299 int result
= (int) ShellExecuteW(m_hWnd
, strVerb
, strPath
, strParams
, NULL
, SW_SHOWNORMAL
);
3302 StringCchPrintfW(tmpMessage
, 512, strMessage
, strSite
, result
);
3303 MessageBoxExW(m_hWnd
, tmpMessage
, strCaption
, MB_OK
, 0);
3309 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3311 fStatusBarVisible
= !fStatusBarVisible
;
3314 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3320 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3323 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3324 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3328 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3331 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3332 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3336 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3339 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3340 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3344 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3347 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3348 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3352 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3355 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3356 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3360 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3363 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3364 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3368 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3373 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3375 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3376 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3380 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3382 CComPtr
<CShellBrowser
> theCabinet
;
3387 // Tell the thread ref we are using it.
3388 if (parameters
&& parameters
->offsetF8
)
3389 parameters
->offsetF8
->AddRef();
3391 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3392 if (theCabinet
== NULL
)
3394 return E_OUTOFMEMORY
;
3397 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3398 if (FAILED_UNEXPECTEDLY(hResult
))
3399 return E_OUTOFMEMORY
;
3401 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3405 // Error: continue or exit?
3409 if (Msg
.message
== WM_QUIT
)
3412 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3414 TranslateMessage(&Msg
);
3415 DispatchMessage(&Msg
);
3419 int nrc
= theCabinet
->Release();
3422 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3425 theCabinet
.Detach();
3427 // Tell the thread ref we are not using it anymore.
3428 if (parameters
&& parameters
->offsetF8
)
3429 parameters
->offsetF8
->Release();
3434 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3437 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3439 OleInitialize(NULL
);
3441 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3445 SHDestroyIETHREADPARAM(parameters
);