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_DONT_UPDATE_HISTORY
= 0;
131 static const long BTP_UPDATE_CUR_HISTORY
= 1;
132 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
134 BOOL createNewStuff
= false;
137 // this class is private to browseui.dll and is not registered externally?
138 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
141 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
142 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
143 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
146 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
148 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
150 MENUITEMINFO menuItemInfo
;
154 menuItemCount
= GetMenuItemCount(theMenu
);
156 while (curIndex
< menuItemCount
)
158 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
159 menuItemInfo
.fMask
= MIIM_ID
;
160 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
161 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
163 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
171 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
173 CComPtr
<IShellFolder
> desktop
;
175 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
176 if (FAILED_UNEXPECTEDLY(hr
))
178 if (path
== NULL
|| path
->mkid
.cb
== 0)
180 *newFolder
= desktop
;
181 desktop
.p
->AddRef ();
184 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
187 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
188 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
193 class CToolbarProxy
:
194 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
197 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
199 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
204 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
205 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
207 BEGIN_MSG_MAP(CToolbarProxy
)
208 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
209 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
213 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
218 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
219 if (myWindow
!= NULL
)
221 SubclassWindow(myWindow
);
222 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
223 hResult
= explorerToolbar
->QueryInterface(
224 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
228 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
234 if (fExplorerToolbar
.p
!= NULL
)
236 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
237 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
238 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
239 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
244 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
250 if (fExplorerToolbar
.p
!= NULL
)
251 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
256 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
257 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
261 class CShellBrowser
:
262 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
263 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
264 public IShellBrowser
,
266 public IServiceProvider
,
267 public IProfferServiceImpl
<CShellBrowser
>,
268 public IShellBrowserService
,
270 public ITravelLogClient
,
271 public IPersistHistory
,
272 public IDockingWindowSite
,
273 public IOleCommandTarget
,
274 public IBrowserService2
,
275 public IConnectionPointContainerImpl
<CShellBrowser
>,
276 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
277 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
284 CComPtr
<IUnknown
> clientBar
;
287 static const int BIInternetToolbar
= 0;
288 static const int BIVerticalBaseBar
= 1;
289 static const int BIHorizontalBaseBar
= 2;
291 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
292 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
293 CComPtr
<IShellView
> fCurrentShellView
; //
294 LPITEMIDLIST fCurrentDirectoryPIDL
; //
296 bool fStatusBarVisible
;
297 CToolbarProxy fToolbarProxy
;
298 barInfo fClientBars
[3];
299 CComPtr
<ITravelLog
> fTravelLog
;
300 HMENU fCurrentMenuBar
;
301 CABINETSTATE fCabinetState
;
302 // The next three fields support persisted history for shell views.
303 // They do not need to be reference counted.
304 IOleObject
*fHistoryObject
;
305 IStream
*fHistoryStream
;
306 IBindCtx
*fHistoryBindContext
;
310 ULONG
InternalAddRef()
312 OutputDebugString(_T("AddRef\n"));
313 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
315 ULONG
InternalRelease()
317 OutputDebugString(_T("Release\n"));
318 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
324 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
326 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
327 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
328 FOLDERSETTINGS
*folderSettings
, long flags
);
329 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
330 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
331 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
332 HRESULT
NavigateToParent();
333 HRESULT
DoFolderOptions();
334 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
335 void RepositionBars();
336 virtual WNDPROC
GetWindowProc()
340 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
341 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
342 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
343 HRESULT
FireCommandStateChangeAll();
344 HRESULT
UpdateForwardBackState();
345 void UpdateGotoMenu(HMENU theMenu
);
346 void UpdateViewMenu(HMENU theMenu
);
348 /* // *** IDockingWindowFrame methods ***
349 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
350 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
351 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
354 // *** IDockingWindowSite methods ***
355 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
356 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
357 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
359 // *** IOleCommandTarget methods ***
360 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
361 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
362 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
363 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
365 // *** IOleWindow methods ***
366 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
367 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
369 // *** IShellBrowser methods ***
370 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
371 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
372 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
373 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
374 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
375 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
376 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
377 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
378 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
379 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
380 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
381 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
382 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
384 // *** IDropTarget methods ***
385 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
386 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
387 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
388 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
390 // *** IServiceProvider methods ***
391 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
393 // *** IShellBowserService methods ***
394 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
396 // *** IDispatch methods ***
397 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
398 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
399 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
400 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
401 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
402 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
404 // *** IBrowserService methods ***
405 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
406 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
407 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
408 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
409 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
410 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
411 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
412 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
413 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
414 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
415 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
416 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
417 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
418 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
419 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
420 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
421 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
422 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
423 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
424 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
425 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
426 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
427 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
428 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
429 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
430 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
431 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
432 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
433 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
434 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
436 // *** IBrowserService2 methods ***
437 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
438 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
439 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
440 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
441 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
442 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
443 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
444 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
445 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
446 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
447 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
448 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
449 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
450 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
451 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
452 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
453 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
454 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
455 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
456 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
457 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
458 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
459 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
460 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
461 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
462 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
463 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
464 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
465 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
466 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
467 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
468 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
469 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
470 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
471 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
472 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
473 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
474 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
475 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
476 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
477 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
478 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
479 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
480 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
481 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
482 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
483 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
484 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
485 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
486 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
487 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
488 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
489 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
490 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
491 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
492 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
493 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
494 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
495 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
496 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
497 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
498 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
499 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
500 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
501 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
503 // *** IWebBrowser methods ***
504 virtual HRESULT STDMETHODCALLTYPE
GoBack();
505 virtual HRESULT STDMETHODCALLTYPE
GoForward();
506 virtual HRESULT STDMETHODCALLTYPE
GoHome();
507 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
508 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
509 VARIANT
*PostData
, VARIANT
*Headers
);
510 virtual HRESULT STDMETHODCALLTYPE
Refresh();
511 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
512 virtual HRESULT STDMETHODCALLTYPE
Stop();
513 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
514 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
515 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
516 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
517 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
518 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
519 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
520 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
521 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
522 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
523 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
524 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
525 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
526 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
527 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
528 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
529 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
531 // *** IWebBrowserApp methods ***
532 virtual HRESULT STDMETHODCALLTYPE
Quit();
533 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
534 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
535 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
536 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
537 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
538 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
539 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
540 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
541 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
542 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
543 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
544 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
545 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
546 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
547 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
548 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
549 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
550 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
551 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
553 // *** IWebBrowser2 methods ***
554 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
555 VARIANT
*PostData
, VARIANT
*Headers
);
556 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
557 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
558 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
559 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
560 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
561 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
562 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
563 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
564 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
565 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
566 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
567 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
568 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
569 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
570 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
571 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
572 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
573 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
574 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
576 // *** ITravelLogClient methods ***
577 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
578 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
579 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
581 // *** IPersist methods ***
582 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
584 // *** IPersistHistory methods ***
585 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
586 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
587 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
588 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
591 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
592 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
593 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
594 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
595 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
596 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
597 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
598 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
599 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
600 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
601 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
602 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
603 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
604 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
605 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
606 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
607 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
608 LRESULT
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
609 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
610 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
611 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
612 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
613 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
614 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
615 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
616 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
617 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
619 static ATL::CWndClassInfo
& GetWndClassInfo()
621 static ATL::CWndClassInfo wc
=
623 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
624 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
625 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
626 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
631 BEGIN_MSG_MAP(CShellBrowser
)
632 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
633 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
634 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
635 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
636 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
637 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
638 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
639 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
640 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
641 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
642 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
643 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
644 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
645 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
646 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
647 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
648 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
649 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
650 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
651 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
652 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
653 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
654 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
655 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
656 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
657 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
658 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
659 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
660 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
663 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
664 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
665 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
666 END_CONNECTION_POINT_MAP()
668 BEGIN_COM_MAP(CShellBrowser
)
669 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
670 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
671 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
672 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
673 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
674 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
675 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
676 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
677 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
678 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
679 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
680 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
681 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
682 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
683 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
684 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
685 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
686 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
690 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
692 CShellBrowser::CShellBrowser()
694 fCurrentShellViewWindow
= NULL
;
695 fCurrentDirectoryPIDL
= NULL
;
697 fStatusBarVisible
= true;
698 memset(fClientBars
, 0, sizeof(fClientBars
));
699 fCurrentMenuBar
= NULL
;
700 fHistoryObject
= NULL
;
701 fHistoryStream
= NULL
;
702 fHistoryBindContext
= NULL
;
705 CShellBrowser::~CShellBrowser()
709 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
711 CComPtr
<IPersistStreamInit
> persistStreamInit
;
713 CComPtr
<IUnknown
> clientBar
;
715 _AtlInitialConstruct();
717 fCabinetState
.cLength
= sizeof(fCabinetState
);
718 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
723 Create(HWND_DESKTOP
);
728 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
729 if (FAILED_UNEXPECTEDLY(hResult
))
732 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &clientBar
));
733 if (FAILED_UNEXPECTEDLY(hResult
))
737 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
740 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
741 if (FAILED_UNEXPECTEDLY(hResult
))
744 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
745 if (FAILED_UNEXPECTEDLY(hResult
))
748 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
749 if (FAILED_UNEXPECTEDLY(hResult
))
752 // TODO: create settingsStream from registry entry
753 //if (settingsStream.p)
755 // hResult = persistStreamInit->Load(settingsStream);
756 // if (FAILED_UNEXPECTEDLY(hResult))
761 hResult
= persistStreamInit
->InitNew();
762 if (FAILED_UNEXPECTEDLY(hResult
))
766 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
767 if (FAILED_UNEXPECTEDLY(hResult
))
770 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
774 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
775 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
776 _AtlBaseModule
.GetModuleInstance(), 0);
777 fStatusBarVisible
= true;
781 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
782 if (FAILED_UNEXPECTEDLY(hResult
))
785 ShowWindow(SW_SHOWNORMAL
);
790 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
792 CComPtr
<IShellFolder
> newFolder
;
793 FOLDERSETTINGS newFolderSettings
;
796 // called by shell view to browse to new folder
797 // also called by explorer band to navigate to new folder
798 hResult
= SHBindToFolder(pidl
, &newFolder
);
799 if (FAILED_UNEXPECTEDLY(hResult
))
802 newFolderSettings
.ViewMode
= FVM_ICON
;
803 newFolderSettings
.fFlags
= 0;
804 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
805 if (FAILED_UNEXPECTEDLY(hResult
))
810 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
812 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
815 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
817 LPCITEMIDLIST pidlnext
;
822 if (! _ILIsDesktop(pidl
))
824 length
= pidl
->mkid
.cb
;
826 reinterpret_cast<LPCITEMIDLIST
>(
827 reinterpret_cast<const BYTE
*>(pidl
) + length
);
828 if (pidlnext
->mkid
.cb
!= 0)
834 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
835 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
837 CComPtr
<IShellFolder
> psf
;
838 LPITEMIDLIST pidlChild
;
839 LPITEMIDLIST pidlParent
;
846 if (ppidlLast
!= NULL
)
848 if (_ILIsPidlSimple(pidl
))
850 if (ppidlLast
!= NULL
)
851 *ppidlLast
= ILClone(pidl
);
852 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
856 pidlChild
= ILClone(ILFindLastID(pidl
));
857 pidlParent
= ILClone(pidl
);
858 ILRemoveLastID(pidlParent
);
859 hResult
= SHGetDesktopFolder(&psf
);
860 if (SUCCEEDED(hResult
))
861 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
862 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
863 *ppidlLast
= pidlChild
;
871 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
872 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
874 CComPtr
<IShellFolder
> parentFolder
;
875 LPITEMIDLIST childPIDL
= NULL
;
879 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
883 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
887 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
890 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
903 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
905 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
908 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
909 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
911 CComPtr
<IObjectWithSite
> objectWithSite
;
912 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
913 CComPtr
<IShellView
> saveCurrentShellView
;
914 CComPtr
<IShellView
> newShellView
;
915 CComPtr
<ITravelLog
> travelLog
;
916 HWND newShellViewWindow
;
917 BOOL windowUpdateIsLocked
;
918 RECT shellViewWindowBounds
;
921 wchar_t newTitle
[MAX_PATH
];
925 if (newShellFolder
== NULL
)
928 hResult
= GetTravelLog(&travelLog
);
929 if (FAILED_UNEXPECTEDLY(hResult
))
933 if (flags
& BTP_UPDATE_CUR_HISTORY
)
935 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
936 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
937 // what to do with error? Do we want to halt browse because state save failed?
940 if (fCurrentShellView
)
942 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
945 // create view object
946 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
947 if (FAILED_UNEXPECTEDLY(hResult
))
949 previousView
= fCurrentShellViewWindow
;
951 // enter updating section
952 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
953 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
954 if (fCurrentShellView
!= NULL
)
955 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
958 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
960 // update folder and view
961 saveCurrentShellFolder
= fCurrentShellFolder
;
962 saveCurrentShellView
= fCurrentShellView
;
963 fCurrentShellFolder
= newShellFolder
;
964 fCurrentShellView
= newShellView
;
967 if (previousView
!= NULL
)
968 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
970 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
971 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
973 // create view window
974 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
975 this, &shellViewWindowBounds
, &newShellViewWindow
);
976 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
978 fCurrentShellView
= saveCurrentShellView
;
979 fCurrentShellFolder
= saveCurrentShellFolder
;
980 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
981 if (windowUpdateIsLocked
)
982 LockWindowUpdate(FALSE
);
983 SetCursor(saveCursor
);
987 if (objectWithSite
.p
!= NULL
)
988 hResult
= objectWithSite
->SetSite(NULL
);
990 // update current pidl
991 ILFree(fCurrentDirectoryPIDL
);
992 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
994 // update view window
995 if (saveCurrentShellView
!= NULL
)
996 saveCurrentShellView
->DestroyViewWindow();
997 fCurrentShellViewWindow
= newShellViewWindow
;
1000 saveCurrentShellView
.Release();
1001 saveCurrentShellFolder
.Release();
1003 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1005 // leave updating section
1006 if (windowUpdateIsLocked
)
1007 LockWindowUpdate(FALSE
);
1008 SetCursor(saveCursor
);
1011 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1013 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1014 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1018 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1019 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1020 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1021 if (SUCCEEDED(hResult
))
1023 FireNavigateComplete(newTitle
);
1027 FireNavigateComplete(L
"ERROR");
1030 if (fCabinetState
.fFullPathTitle
)
1031 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1033 nameFlags
= SHGDN_FORADDRESSBAR
;
1034 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1035 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1036 if (SUCCEEDED(hResult
))
1038 SetWindowText(newTitle
);
1040 LPCITEMIDLIST pidlChild
;
1041 INT index
, indexOpen
;
1042 HIMAGELIST himlSmall
, himlLarge
;
1044 CComPtr
<IShellFolder
> sf
;
1045 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1047 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1049 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1051 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1052 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1054 /* Hack to make it possible to release the old icons */
1055 /* Something seems to go wrong with WM_SETICON */
1056 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1057 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1059 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1060 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1062 DestroyIcon(oldSmall
);
1063 DestroyIcon(oldLarge
);
1066 FireCommandStateChangeAll();
1067 hResult
= UpdateForwardBackState();
1071 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1073 CComPtr
<IBandSite
> bandSite
;
1074 CComPtr
<IDeskBand
> deskBand
;
1077 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1080 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1081 if (FAILED_UNEXPECTEDLY(hResult
))
1084 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1085 if (FAILED_UNEXPECTEDLY(hResult
))
1088 return deskBand
->QueryInterface(riid
, shellMenu
);
1091 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1093 CComPtr
<IUnknown
> newBaseBar
;
1094 CComPtr
<IDeskBar
> deskBar
;
1095 CComPtr
<IUnknown
> newBaseBarSite
;
1096 CComPtr
<IDeskBarClient
> deskBarClient
;
1101 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1103 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1106 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1107 if (FAILED_UNEXPECTEDLY(hResult
))
1109 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1110 if (FAILED_UNEXPECTEDLY(hResult
))
1113 // tell the new base bar about the shell browser
1114 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1115 if (FAILED_UNEXPECTEDLY(hResult
))
1118 // tell the new base bar about the new base bar site
1119 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1120 if (FAILED_UNEXPECTEDLY(hResult
))
1122 hResult
= deskBar
->SetClient(newBaseBarSite
);
1123 if (FAILED_UNEXPECTEDLY(hResult
))
1126 // tell the new base bar site about the new base bar
1127 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1128 if (FAILED_UNEXPECTEDLY(hResult
))
1130 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1131 if (FAILED_UNEXPECTEDLY(hResult
))
1134 *cache
= newBaseBar
.Detach();
1136 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1139 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1141 CComPtr
<IDockingWindow
> dockingWindow
;
1142 CComPtr
<IUnknown
> baseBarSite
;
1143 CComPtr
<IUnknown
> newBand
;
1144 CComPtr
<IUnknown
> theBaseBar
;
1145 CComPtr
<IDeskBar
> deskBar
;
1149 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1150 if (FAILED_UNEXPECTEDLY(hResult
))
1153 #if USE_CUSTOM_EXPLORERBAND
1154 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1155 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1157 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1158 hResult
= CExplorerBand_Constructor(IID_PPV_ARG(IUnknown
, &newBand
));
1159 if (FAILED_UNEXPECTEDLY(hResult
))
1165 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1166 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1167 if (FAILED_UNEXPECTEDLY(hResult
))
1170 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1171 if (FAILED_UNEXPECTEDLY(hResult
))
1173 hResult
= deskBar
->GetClient(&baseBarSite
);
1174 if (FAILED_UNEXPECTEDLY(hResult
))
1176 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1177 if (FAILED_UNEXPECTEDLY(hResult
))
1179 V_VT(&vaIn
) = VT_UNKNOWN
;
1180 V_UNKNOWN(&vaIn
) = newBand
.p
;
1181 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1182 if (FAILED_UNEXPECTEDLY(hResult
))
1184 hResult
= dockingWindow
->ShowDW(TRUE
);
1185 if (FAILED_UNEXPECTEDLY(hResult
))
1191 HRESULT
CShellBrowser::NavigateToParent()
1193 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1194 if (newDirectory
== NULL
)
1195 return E_OUTOFMEMORY
;
1196 ILRemoveLastID(newDirectory
);
1197 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1198 ILFree(newDirectory
);
1199 if (FAILED_UNEXPECTEDLY(hResult
))
1204 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1206 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1207 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1209 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1210 sheetInfo
->nPages
++;
1214 HRESULT
CShellBrowser::DoFolderOptions()
1216 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1217 PROPSHEETHEADER m_PropSheet
;
1218 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1219 // CComPtr<IGlobalFolderSettings> globalSettings;
1220 // SHELLSTATE2 shellState;
1223 memset(m_psp
, 0, sizeof(m_psp
));
1224 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1226 // create sheet object
1227 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1228 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1229 if (FAILED_UNEXPECTEDLY(hResult
))
1232 // must set site in order for Apply to all Folders on Advanced page to be enabled
1233 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1234 m_PropSheet
.phpage
= m_psp
;
1237 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1238 if (FAILED_UNEXPECTEDLY(hResult
))
1240 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1241 if (FAILED_UNEXPECTEDLY(hResult
))
1246 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1247 if (FAILED_UNEXPECTEDLY(hResult
))
1250 if (fCurrentShellView
!= NULL
)
1252 hResult
= fCurrentShellView
->AddPropertySheetPages(
1253 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1254 if (FAILED_UNEXPECTEDLY(hResult
))
1259 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1260 m_PropSheet
.dwFlags
= 0;
1261 m_PropSheet
.hwndParent
= m_hWnd
;
1262 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1263 m_PropSheet
.pszCaption
= _T("Folder Options");
1264 m_PropSheet
.nStartPage
= 0;
1265 PropertySheet(&m_PropSheet
);
1269 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1271 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1272 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1274 const _ATL_MSG
*previousMessage
;
1276 WNDPROC saveWindowProc
;
1279 hWnd
= pThis
->m_hWnd
;
1280 previousMessage
= pThis
->m_pCurrentMsg
;
1281 pThis
->m_pCurrentMsg
= &msg
;
1283 CComPtr
<IMenuBand
> menuBand
;
1284 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1285 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1287 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1288 if (hResult
== S_OK
)
1291 wParam
= msg
.wParam
;
1292 lParam
= msg
.lParam
;
1296 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1297 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1298 if (handled
== FALSE
)
1300 if (uMsg
== WM_NCDESTROY
)
1302 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1303 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1304 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1305 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1306 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1309 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1311 pThis
->m_pCurrentMsg
= previousMessage
;
1312 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1314 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1315 pThis
->m_hWnd
= NULL
;
1316 pThis
->OnFinalMessage(hWnd
);
1321 void CShellBrowser::RepositionBars()
1327 GetClientRect(&clientRect
);
1329 if (fStatusBarVisible
&& fStatusBar
)
1331 ::GetWindowRect(fStatusBar
, &statusRect
);
1332 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1333 clientRect
.right
- clientRect
.left
,
1334 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1335 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1338 for (x
= 0; x
< 3; x
++)
1340 HWND hwnd
= fClientBars
[x
].hwnd
;
1341 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1342 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1344 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1345 fClientBars
[x
].hwnd
= hwnd
;
1349 RECT toolbarRect
= clientRect
;
1350 if (borderSpace
.top
!= 0)
1352 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1354 else if (borderSpace
.bottom
!= 0)
1356 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1358 else if (borderSpace
.left
!= 0)
1360 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1362 else if (borderSpace
.right
!= 0)
1364 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1367 ::SetWindowPos(hwnd
, NULL
,
1370 toolbarRect
.right
- toolbarRect
.left
,
1371 toolbarRect
.bottom
- toolbarRect
.top
,
1372 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1374 if (borderSpace
.top
!= 0)
1376 clientRect
.top
= toolbarRect
.bottom
;
1378 else if (borderSpace
.bottom
!= 0)
1380 clientRect
.bottom
= toolbarRect
.top
;
1382 else if (borderSpace
.left
!= 0)
1384 clientRect
.left
= toolbarRect
.right
;
1386 else if (borderSpace
.right
!= 0)
1388 clientRect
.right
= toolbarRect
.left
;
1392 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1393 clientRect
.right
- clientRect
.left
,
1394 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1397 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1400 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1401 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1404 params
.rgvarg
= arguments
;
1405 params
.rgdispidNamedArgs
= NULL
;
1406 params
.cArgs
= argCount
;
1407 params
.cNamedArgs
= 0;
1408 IUnknown
** pp
= vec
.begin();
1409 while (pp
< vec
.end())
1413 CComPtr
<IDispatch
> theDispatch
;
1415 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1416 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1421 while (pp
< vec2
.end())
1425 CComPtr
<IDispatch
> theDispatch
;
1427 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1428 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1435 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1437 // these two variants intentionally to do use CComVariant because it would double free/release
1438 // or does not need to dispose at all
1441 CComBSTR
tempString(newDirectory
);
1443 V_VT(&varArgs
) = VT_BSTR
;
1444 V_BSTR(&varArgs
) = tempString
.m_str
;
1446 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1447 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1448 V_VT(&varArg
[1]) = VT_DISPATCH
;
1449 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1451 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1454 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1458 V_VT(&varArg
[0]) = VT_BOOL
;
1459 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1460 V_VT(&varArg
[1]) = VT_I4
;
1461 V_I4(&varArg
[1]) = commandID
;
1463 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1466 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1468 return FireCommandStateChange(false, -1);
1471 HRESULT
CShellBrowser::UpdateForwardBackState()
1473 CComPtr
<ITravelLog
> travelLog
;
1474 CComPtr
<ITravelEntry
> unusedEntry
;
1480 canGoForward
= false;
1481 hResult
= GetTravelLog(&travelLog
);
1482 if (FAILED_UNEXPECTEDLY(hResult
))
1484 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1485 if (SUCCEEDED(hResult
))
1488 unusedEntry
.Release();
1490 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1491 if (SUCCEEDED(hResult
))
1493 canGoForward
= true;
1494 unusedEntry
.Release();
1496 hResult
= FireCommandStateChange(canGoBack
, 2);
1497 hResult
= FireCommandStateChange(canGoForward
, 1);
1501 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1503 CComPtr
<ITravelLog
> travelLog
;
1505 MENUITEMINFO menuItemInfo
;
1508 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1510 position
= GetMenuItemCount(theMenu
);
1511 hResult
= GetTravelLog(&travelLog
);
1512 if (FAILED_UNEXPECTEDLY(hResult
))
1514 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1515 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1516 if (SUCCEEDED(hResult
))
1518 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1519 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1520 menuItemInfo
.fType
= MF_SEPARATOR
;
1521 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1522 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1526 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1528 CComPtr
<ITravelLog
> travelLog
;
1530 OLECMD commandList
[5];
1531 HMENU toolbarMenuBar
;
1533 MENUITEMINFO menuItemInfo
;
1536 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1537 if (gotoMenu
!= NULL
)
1538 UpdateGotoMenu(gotoMenu
);
1540 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1541 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1542 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1543 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1544 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1546 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1547 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1548 if (FAILED_UNEXPECTEDLY(hResult
))
1549 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1552 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1553 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1554 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1555 DestroyMenu(menuItemInfo
.hSubMenu
);
1557 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1558 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1559 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1560 DestroyMenu(toolbarMenuBar
);
1563 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1564 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1565 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1566 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1568 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1569 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1570 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1571 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1572 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1573 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1574 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1575 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1577 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1578 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1579 menuItemInfo
.hSubMenu
= toolbarMenu
;
1580 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1582 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1585 SHEnableMenuItem(theMenu
, IDM_VIEW_EXPLORERBAR
, FALSE
);
1588 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1590 CComPtr
<IUnknown
> int1Retry
;
1591 CComPtr
<IUnknown
> int2Retry
;
1596 if (int1
== NULL
|| int2
== NULL
)
1598 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1599 if (FAILED_UNEXPECTEDLY(hResult
))
1601 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1602 if (FAILED_UNEXPECTEDLY(hResult
))
1604 if (int1Retry
== int2Retry
)
1609 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1611 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1613 RECT availableBounds
;
1615 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1616 for (INT x
= 0; x
< 3; x
++)
1618 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1620 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1621 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1622 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1623 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1626 *prcBorder
= availableBounds
;
1630 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1635 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1637 for (INT x
= 0; x
< 3; x
++)
1639 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1641 fClientBars
[x
].borderSpace
= *pbw
;
1642 // if this bar changed size, it cascades and forces all subsequent bars to resize
1647 return E_INVALIDARG
;
1650 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1651 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1653 CComPtr
<IOleCommandTarget
> commandTarget
;
1656 if (prgCmds
== NULL
)
1657 return E_INVALIDARG
;
1658 if (pguidCmdGroup
== NULL
)
1660 if (fCurrentShellView
.p
!= NULL
)
1662 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1663 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1664 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1673 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1677 switch (prgCmds
->cmdID
)
1679 case 0x1c: // search
1680 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1682 case 0x1d: // history
1683 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1685 case 0x1e: // favorites
1686 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1688 case 0x23: // folders
1689 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1699 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1703 switch (prgCmds
->cmdID
)
1705 case 0xa022: // up level
1706 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1707 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1708 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1718 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1719 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1723 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1728 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1731 if (nCmdexecopt
== 1)
1733 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1737 // update zones part of the status bar
1740 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1741 V_VT(pvaOut
) = VT_INT_PTR
;
1742 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1743 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1746 // indicate if this cabinet was opened as a browser
1752 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1761 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1766 // what is theater mode and why do we receive this?
1770 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1775 // initialize favorites menu
1779 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1784 // refresh on toolbar clicked
1787 // tell the view if it should hide the task pane or not
1788 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1791 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1796 return NavigateToParent();
1799 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1804 return DoFolderOptions();
1807 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1812 // Reset All Folders option in Folder Options
1823 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1831 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1836 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1838 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1840 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1842 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1845 DestroyMenu(mainMenu
);
1847 lpMenuWidths
->width
[0] = 2;
1848 lpMenuWidths
->width
[2] = 3;
1849 lpMenuWidths
->width
[4] = 1;
1853 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1855 CComPtr
<IShellMenu
> shellMenu
;
1858 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
1860 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1861 if (FAILED_UNEXPECTEDLY(hResult
))
1866 // FIXME: Figure out the proper way to do this.
1867 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
1870 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
1874 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
1875 if (FAILED_UNEXPECTEDLY(hResult
))
1877 fCurrentMenuBar
= hmenuShared
;
1881 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1883 if (hmenuShared
== fCurrentMenuBar
)
1885 //DestroyMenu(fCurrentMenuBar);
1886 SetMenuSB(NULL
, NULL
, NULL
);
1891 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1896 ::SetWindowText(fStatusBar
, pszStatusText
);
1905 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1910 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1912 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1917 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1919 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1922 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1927 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1935 *lphwnd
= fToolbarProxy
.m_hWnd
;
1938 *lphwnd
= fStatusBar
;
1941 // find the directory browser and return it
1942 // this should be used only to determine if a tree is present
1945 // is this a progress dialog?
1951 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1952 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1961 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1966 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1974 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1978 *ppshv
= fCurrentShellView
;
1979 if (fCurrentShellView
.p
!= NULL
)
1980 fCurrentShellView
.p
->AddRef();
1984 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1989 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1994 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1995 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2000 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2005 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2010 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2011 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2016 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2018 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2019 // the returned interface has a method GetPropertyBag on it
2020 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2021 return this->QueryInterface(riid
, ppvObject
);
2022 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2023 return this->QueryInterface(riid
, ppvObject
);
2024 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2025 return this->QueryInterface(riid
, ppvObject
);
2026 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2027 return this->QueryInterface(riid
, ppvObject
);
2028 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2029 return this->QueryInterface(riid
, ppvObject
);
2030 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2031 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2032 if (IsEqualIID(riid
, IID_IShellBrowser
))
2033 return this->QueryInterface(riid
, ppvObject
);
2034 return E_NOINTERFACE
;
2037 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2039 if (ppvObject
== NULL
)
2045 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2050 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2055 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2056 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2061 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2062 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2067 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2072 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2077 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2082 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2087 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2091 // called by toolbar when displaying tooltips
2096 if (fTravelLog
.p
== NULL
)
2098 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2099 if (FAILED_UNEXPECTEDLY(hResult
))
2102 *pptl
= fTravelLog
.p
;
2103 fTravelLog
.p
->AddRef();
2107 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2112 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2117 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2122 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2127 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2132 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2137 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2142 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2147 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2152 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2157 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2162 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2167 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2172 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2177 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2179 // called by explorer bar to get current pidl
2182 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2186 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2191 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2196 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2201 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2203 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2204 return E_INVALIDARG
;
2205 *ppole
= fHistoryObject
;
2206 if (fHistoryObject
!= NULL
)
2207 fHistoryObject
->AddRef();
2208 *pstm
= fHistoryStream
;
2209 if (fHistoryStream
!= NULL
)
2210 fHistoryStream
->AddRef();
2211 *ppbc
= fHistoryBindContext
;
2212 if (fHistoryBindContext
!= NULL
)
2213 fHistoryBindContext
->AddRef();
2214 fHistoryObject
= NULL
;
2215 fHistoryStream
= NULL
;
2216 fHistoryBindContext
= NULL
;
2222 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2227 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2232 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2237 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2238 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2243 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2248 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2253 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2258 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2263 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2268 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2273 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2275 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2279 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2284 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2289 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2294 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2299 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2304 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2309 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2314 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2315 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2320 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2325 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2330 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2335 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2340 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2345 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2350 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2355 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2360 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2365 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2370 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2375 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2380 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2385 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2390 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2395 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2400 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2405 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2410 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2415 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2420 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2425 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2426 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2431 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2432 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2437 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2442 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2447 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2452 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2457 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2462 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2467 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2472 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2477 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2482 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2487 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2492 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2497 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2502 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2507 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2512 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2517 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2522 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2527 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2532 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2533 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2538 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2543 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2548 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2553 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2555 for (int i
= 0; i
< 3; i
++)
2557 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2561 if (!fCurrentShellView
)
2564 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2567 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2572 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2577 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2579 CComPtr
<ITravelLog
> travelLog
;
2580 HRESULT hResult
= GetTravelLog(&travelLog
);
2581 if (FAILED_UNEXPECTEDLY(hResult
))
2583 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2586 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2588 CComPtr
<ITravelLog
> travelLog
;
2589 HRESULT hResult
= GetTravelLog(&travelLog
);
2590 if (FAILED_UNEXPECTEDLY(hResult
))
2592 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2595 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2600 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2605 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2606 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2611 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2615 V_VT(&level
) = VT_I4
;
2617 return Refresh2(&level
);
2620 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2622 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2625 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2626 if (FAILED_UNEXPECTEDLY(hResult
))
2628 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2631 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2636 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2641 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2646 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2651 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2656 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2661 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2668 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2673 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2678 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2683 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2688 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2693 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2698 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2703 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2710 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2715 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2720 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2725 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2730 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2735 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2740 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2745 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2750 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2755 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2760 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2765 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2770 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2775 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2780 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2785 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2790 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2795 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2800 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2805 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2810 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2815 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2820 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2825 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2826 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2828 // called from drive combo box to navigate to a directory
2829 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2830 return E_INVALIDARG
;
2831 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2832 return E_INVALIDARG
;
2834 LPITEMIDLIST pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
2835 HRESULT hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2836 if (FAILED_UNEXPECTEDLY(hResult
))
2841 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2846 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2847 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2852 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2857 // called to show search bar
2858 if (V_VT(pvaClsid
) != VT_BSTR
)
2859 return E_INVALIDARG
;
2860 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2861 // TODO: properly compute the value of vertical
2863 return ShowBand(classID
, vertical
);
2866 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2871 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2876 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2881 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2886 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2891 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2896 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2901 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2906 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2911 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2916 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2921 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2926 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2931 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2936 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2941 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2946 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2948 if (pWinData
== NULL
)
2951 pWinData
->dwWindowID
= -1;
2953 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2954 pWinData
->lpszUrl
= NULL
;
2955 pWinData
->lpszUrlLocation
= NULL
;
2956 pWinData
->lpszTitle
= NULL
;
2960 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2965 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2970 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2972 CComPtr
<IPersistHistory
> viewPersistHistory
;
2973 CComPtr
<IOleObject
> viewHistoryObject
;
2974 persistState oldState
;
2979 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2980 if (FAILED_UNEXPECTEDLY(hResult
))
2982 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2984 if (oldState
.browseType
!= 2)
2986 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2988 return E_OUTOFMEMORY
;
2989 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2990 if (FAILED_UNEXPECTEDLY(hResult
))
2995 if (numRead
!= oldState
.pidlSize
)
3000 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3001 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3002 fHistoryObject
= viewHistoryObject
;
3003 fHistoryStream
= pStream
;
3004 fHistoryBindContext
= pbc
;
3005 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3006 fHistoryObject
= NULL
;
3007 fHistoryStream
= NULL
;
3008 fHistoryBindContext
= NULL
;
3010 if (FAILED_UNEXPECTEDLY(hResult
))
3015 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3017 CComPtr
<IPersistHistory
> viewPersistHistory
;
3018 persistState newState
;
3021 hResult
= fCurrentShellView
->GetItemObject(
3022 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3023 memset(&newState
, 0, sizeof(newState
));
3024 newState
.dwSize
= sizeof(newState
);
3025 newState
.browseType
= 2;
3026 newState
.browserIndex
= GetBrowserIndex();
3027 if (viewPersistHistory
.p
!= NULL
)
3029 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3030 if (FAILED_UNEXPECTEDLY(hResult
))
3033 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3034 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3035 if (FAILED_UNEXPECTEDLY(hResult
))
3037 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3038 if (FAILED_UNEXPECTEDLY(hResult
))
3040 if (viewPersistHistory
.p
!= NULL
)
3042 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3043 if (FAILED_UNEXPECTEDLY(hResult
))
3049 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3054 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3059 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3061 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3065 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3068 // TODO: rip down everything
3070 fCurrentShellView
->DestroyViewWindow();
3071 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3072 ReleaseCComPtrExpectZero(fCurrentShellView
);
3074 for (int i
= 0; i
< 3; i
++)
3076 if (fClientBars
[i
].clientBar
== NULL
)
3078 IDockingWindow
* pdw
;
3079 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3080 if (FAILED_UNEXPECTEDLY(hr
))
3085 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3087 ReleaseCComPtrExpectZero(fTravelLog
);
3089 fCurrentShellFolder
.Release();
3090 ILFree(fCurrentDirectoryPIDL
);
3091 ::DestroyWindow(fStatusBar
);
3092 DestroyMenu(fCurrentMenuBar
);
3098 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3100 CComPtr
<IDockingWindow
> dockingWindow
;
3101 RECT availableBounds
;
3102 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3105 if (wParam
!= SIZE_MINIMIZED
)
3107 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3108 for (INT x
= 0; x
< 3; x
++)
3110 if (fClientBars
[x
].clientBar
!= NULL
)
3112 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3113 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3114 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3116 hResult
= dockingWindow
->ResizeBorderDW(
3117 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3127 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3130 LPARAM menuIndex
= lParam
;
3132 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3134 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3138 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3142 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3144 UpdateViewMenu(theMenu
);
3147 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3151 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3153 // FIXME: Remove once implemented
3154 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3155 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3156 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3157 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
);
3160 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3165 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3170 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3172 ::SetFocus(fCurrentShellViewWindow
);
3176 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3178 if (fCurrentShellViewWindow
!= NULL
)
3179 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3183 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3185 return SendMessage(WM_CLOSE
);
3188 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3190 HRESULT hResult
= DoFolderOptions();
3191 if (FAILED(hResult
))
3192 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3196 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3199 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3200 #endif /* __REACTOS__ */
3204 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3207 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3208 #endif /* __REACTOS__ */
3212 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3214 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3218 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3220 HRESULT hResult
= GoBack();
3221 if (FAILED(hResult
))
3222 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3226 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3228 HRESULT hResult
= GoForward();
3229 if (FAILED(hResult
))
3230 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3234 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3236 HRESULT hResult
= NavigateToParent();
3237 if (FAILED(hResult
))
3238 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3242 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3244 HRESULT hResult
= GoHome();
3245 if (FAILED(hResult
))
3246 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3250 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3252 // FIXME: This does not appear to be what windows does.
3253 HRESULT hResult
= NavigateToParent();
3254 if (FAILED(hResult
))
3255 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3259 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3261 CComPtr
<IShellFolder
> psfDesktop
;
3262 LPITEMIDLIST pidlFavs
;
3264 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3267 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3272 hr
= SHGetDesktopFolder(&psfDesktop
);
3273 if (FAILED_UNEXPECTEDLY(hr
))
3276 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3277 if (FAILED_UNEXPECTEDLY(hr
))
3283 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3285 /* TODO: Implement properly */
3287 LPCWSTR strSite
= L
"https://www.reactos.org/user-faq";
3289 /* TODO: Make localizable */
3290 LPCWSTR strCaption
= L
"Sorry";
3291 LPCWSTR strMessage
= L
"ReactOS could not browse to '%s' (error %d). Please make sure there is a web browser installed.";
3292 WCHAR tmpMessage
[512];
3294 /* TODO: Read from the registry */
3295 LPCWSTR strVerb
= NULL
; /* default */
3296 LPCWSTR strPath
= strSite
;
3297 LPCWSTR strParams
= NULL
;
3299 /* The return value is defined as HINSTANCE for backwards compatibility only, the cast is needed */
3300 int result
= (int) ShellExecuteW(m_hWnd
, strVerb
, strPath
, strParams
, NULL
, SW_SHOWNORMAL
);
3303 StringCchPrintfW(tmpMessage
, 512, strMessage
, strSite
, result
);
3304 MessageBoxExW(m_hWnd
, tmpMessage
, strCaption
, MB_OK
, 0);
3310 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3312 fStatusBarVisible
= !fStatusBarVisible
;
3315 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3321 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3324 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3325 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3329 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3332 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3333 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3337 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3340 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3341 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3345 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3348 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3349 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3353 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3356 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3357 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3361 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3364 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3365 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3369 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3374 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3376 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3377 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3381 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3383 CComPtr
<CShellBrowser
> theCabinet
;
3388 // Tell the thread ref we are using it.
3389 if (parameters
&& parameters
->offsetF8
)
3390 parameters
->offsetF8
->AddRef();
3392 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3393 if (theCabinet
== NULL
)
3395 return E_OUTOFMEMORY
;
3398 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3399 if (FAILED_UNEXPECTEDLY(hResult
))
3400 return E_OUTOFMEMORY
;
3402 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3406 // Error: continue or exit?
3410 if (Msg
.message
== WM_QUIT
)
3413 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3415 TranslateMessage(&Msg
);
3416 DispatchMessage(&Msg
);
3420 int nrc
= theCabinet
->Release();
3423 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3426 theCabinet
.Detach();
3428 // Tell the thread ref we are not using it anymore.
3429 if (parameters
&& parameters
->offsetF8
)
3430 parameters
->offsetF8
->Release();
3435 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3438 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3440 OleInitialize(NULL
);
3442 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3446 SHDestroyIETHREADPARAM(parameters
);