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 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
29 #include "newatlinterfaces.h"
33 **Provide implementation of new and delete that use LocalAlloc
34 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
35 view doesn't restore the selection correctly.
36 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
37 **Add brand band bitmaps to shell32.dll
38 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
39 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
40 current state overwrites the wrong entry's contents. This needs to be changed.
41 ****Fix close of browser window to release all objects
42 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
43 **When a new bar is added to base bar site, how is base bar told so it can resize?
44 **Does the base bar site have a classid?
45 **What should refresh command send to views to make them refresh?
46 **When new bar is created, what status notifications need to be fired?
47 **How does keyboard filtering dispatch?
48 **For deferred persist history load, how does the view connect up and get the state?
49 How does context menu send open, cut, rename commands to its site (the shell view)?
50 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
52 **Route View->Toolbars commands to internet toolbar
53 **Handle travel log items in View->Go
54 **Fix ShowBrowserBar to pass correct size on when bar is shown
55 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
56 ****Make ShowToolbar check if bar is already created before creating it again
57 ****Shell should fill in the list of explorer bars in the View submenus
58 **Add folder menu in the file menu
59 **Fix CShellBrowser::GetBorderDW to compute available size correctly
60 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
61 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
62 Make folders toolbar item update state appropriately
63 Read list of bands from registry on launch
64 Read list of bars from registry on launch
65 If the folders or search bars don't exist, disable the toolbar buttons
66 If the favorites or history bars don't exist, disable the toolbar butons
67 Fix Apply to all Folders in Folder Options
68 Implement close command
69 Add explorer band context menu to file menu
70 Add code to allow restore of internet toolbar from registry
71 Fix code that calls FireNavigateComplete to pass the correct new path
73 What are the other command ids for QueryStatus/FireCommandStateChange?
75 Add handler for cabinet settings change
76 Add handler for system metrics change (renegotiate border space?)
77 Add handler for theme change and forward to contained windows
79 When folders are shown, the status bar text should change
80 Add code to save/restore shell view settings
81 Implement tabbing between frames
82 Fix handling of focus everywhere
83 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
85 The status bar doesn't show help text for items owned by frame during menu tracking
86 Stub out frame command handlers
87 "Arrange icons by" group is not checked properly
89 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
90 the icon is always an open folder with magnifying glass
91 Fix bars to calculate height correctly
92 Hookup policies for everything...
93 Investigate toolbar message WM_USER+93
94 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
96 Vertical Explorer Bar CATID_InfoBand
97 Horizontal Explorer Bar CATID_CommBand
98 Desk Band CATID_DeskBand
101 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
102 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
104 create key here with CLSID of bar to register tool band
105 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
110 #pragma comment(linker, \
111 "\"/manifestdependency:type='Win32' "\
112 "name='Microsoft.Windows.Common-Controls' "\
113 "version='6.0.0.0' "\
114 "processorArchitecture='*' "\
115 "publicKeyToken='6595b64144ccf1df' "\
119 static const unsigned int folderOptionsPageCountMax
= 20;
120 static const long BTP_DONT_UPDATE_HISTORY
= 0;
121 static const long BTP_UPDATE_CUR_HISTORY
= 1;
122 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
124 BOOL createNewStuff
= false;
127 // this class is private to browseui.dll and is not registered externally?
128 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
130 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
132 MENUITEMINFO menuItemInfo
;
136 menuItemCount
= GetMenuItemCount(theMenu
);
138 while (curIndex
< menuItemCount
)
140 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
141 menuItemInfo
.fMask
= MIIM_ID
;
142 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
143 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
145 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
153 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
155 CComPtr
<IShellFolder
> desktop
;
157 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
158 if (FAILED_UNEXPECTEDLY(hr
))
160 if (path
== NULL
|| path
->mkid
.cb
== 0)
162 *newFolder
= desktop
;
163 desktop
.p
->AddRef ();
166 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
169 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClass");
170 //static const TCHAR szExploreWndClass[] = TEXT("ExploreWClass");
175 class CToolbarProxy
:
176 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
179 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
181 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
186 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
187 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
189 BEGIN_MSG_MAP(CToolbarProxy
)
190 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
191 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
195 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
200 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
201 if (myWindow
!= NULL
)
203 SubclassWindow(myWindow
);
204 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
205 hResult
= explorerToolbar
->QueryInterface(
206 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
210 void CToolbarProxy::Destroy()
213 fExplorerToolbar
= NULL
;
216 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
222 if (fExplorerToolbar
.p
!= NULL
)
224 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
225 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
226 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
227 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
232 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
238 if (fExplorerToolbar
.p
!= NULL
)
239 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
244 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
245 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
249 struct MenuBandInfo
{
254 class CShellBrowser
:
255 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
256 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
257 public IShellBrowser
,
259 public IServiceProvider
,
260 public IProfferServiceImpl
<CShellBrowser
>,
261 public IShellBrowserService
,
263 public ITravelLogClient
,
264 public IPersistHistory
,
265 public IDockingWindowSite
,
266 public IOleCommandTarget
,
267 public IBrowserService2
,
268 public IConnectionPointContainerImpl
<CShellBrowser
>,
269 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
270 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
277 CComPtr
<IUnknown
> clientBar
;
280 static const int BIInternetToolbar
= 0;
281 static const int BIVerticalBaseBar
= 1;
282 static const int BIHorizontalBaseBar
= 2;
284 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
285 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
286 CComPtr
<IShellView
> fCurrentShellView
; //
287 LPITEMIDLIST fCurrentDirectoryPIDL
; //
289 bool fStatusBarVisible
;
290 CToolbarProxy fToolbarProxy
;
291 barInfo fClientBars
[3];
292 CComPtr
<ITravelLog
> fTravelLog
;
293 HMENU fCurrentMenuBar
;
294 CABINETSTATE fCabinetState
;
295 // The next three fields support persisted history for shell views.
296 // They do not need to be reference counted.
297 IOleObject
*fHistoryObject
;
298 IStream
*fHistoryStream
;
299 IBindCtx
*fHistoryBindContext
;
304 ULONG
InternalAddRef()
306 OutputDebugString(_T("AddRef\n"));
307 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
309 ULONG
InternalRelease()
311 OutputDebugString(_T("Release\n"));
312 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
318 HRESULT
Initialize(LPITEMIDLIST pidl
, DWORD dwFlags
);
320 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
321 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
322 FOLDERSETTINGS
*folderSettings
, long flags
);
323 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
324 HRESULT
GetBaseBar(bool vertical
, REFIID riid
, void **theBaseBar
);
325 BOOL
IsBandLoaded(const CLSID clsidBand
, bool verticali
, DWORD
*pdwBandID
);
326 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
327 HRESULT
NavigateToParent();
328 HRESULT
DoFolderOptions();
329 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
330 void RepositionBars();
331 HRESULT
BuildExplorerBandMenu();
332 HRESULT
BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
);
333 BOOL
IsBuiltinBand(CLSID
&bandID
);
334 virtual WNDPROC
GetWindowProc()
338 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
339 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
340 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
341 HRESULT
FireCommandStateChangeAll();
342 HRESULT
UpdateForwardBackState();
343 HRESULT
UpdateUpState();
344 void UpdateGotoMenu(HMENU theMenu
);
345 void UpdateViewMenu(HMENU theMenu
);
347 /* // *** IDockingWindowFrame methods ***
348 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
349 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
350 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
353 // *** IDockingWindowSite methods ***
354 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
355 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
356 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
358 // *** IOleCommandTarget methods ***
359 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
360 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
361 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
362 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
364 // *** IOleWindow methods ***
365 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
366 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
368 // *** IShellBrowser methods ***
369 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
370 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
371 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
372 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
373 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
374 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
375 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
376 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
377 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
378 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
379 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
380 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
381 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
383 // *** IDropTarget methods ***
384 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
385 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
386 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
387 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
389 // *** IServiceProvider methods ***
390 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
392 // *** IShellBowserService methods ***
393 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
395 // *** IDispatch methods ***
396 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
397 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
398 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
399 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
400 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
401 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
403 // *** IBrowserService methods ***
404 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
405 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
406 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
407 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
408 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
409 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
410 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
411 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
412 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
413 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
414 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
415 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
416 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
417 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
418 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
419 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
420 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
421 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
422 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
423 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
424 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
425 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
426 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
427 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
428 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
429 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
430 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
431 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
432 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
433 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
435 // *** IBrowserService2 methods ***
436 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
437 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
438 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
439 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
440 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
441 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
442 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
443 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
444 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
445 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
446 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
447 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
448 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
449 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
450 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
451 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
452 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
453 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
454 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
455 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
456 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
457 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
458 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
459 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
460 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
461 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
462 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
463 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
464 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
465 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
466 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
467 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
468 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
469 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
470 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
471 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
472 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
473 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
474 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
475 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
476 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
477 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
478 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
479 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
480 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
481 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
482 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
483 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
484 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
485 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
486 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
487 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
488 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
489 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
490 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
491 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
492 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
493 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
494 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
495 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
496 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
497 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
498 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
499 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
500 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
502 // *** IWebBrowser methods ***
503 virtual HRESULT STDMETHODCALLTYPE
GoBack();
504 virtual HRESULT STDMETHODCALLTYPE
GoForward();
505 virtual HRESULT STDMETHODCALLTYPE
GoHome();
506 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
507 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
508 VARIANT
*PostData
, VARIANT
*Headers
);
509 virtual HRESULT STDMETHODCALLTYPE
Refresh();
510 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
511 virtual HRESULT STDMETHODCALLTYPE
Stop();
512 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
513 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
514 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
515 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
516 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
517 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
518 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
519 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
520 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
521 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
522 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
523 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
524 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
525 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
526 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
527 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
528 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
530 // *** IWebBrowserApp methods ***
531 virtual HRESULT STDMETHODCALLTYPE
Quit();
532 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
533 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
534 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
535 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
536 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
537 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
538 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
539 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
540 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
541 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
542 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
543 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
544 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
545 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
546 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
547 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
548 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
549 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
550 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
552 // *** IWebBrowser2 methods ***
553 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
554 VARIANT
*PostData
, VARIANT
*Headers
);
555 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
556 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
557 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
558 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
559 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
560 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
561 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
562 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
563 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
564 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
565 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
566 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
567 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
568 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
569 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
570 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
571 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
572 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
573 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
575 // *** ITravelLogClient methods ***
576 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
577 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
578 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
580 // *** IPersist methods ***
581 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
583 // *** IPersistHistory methods ***
584 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
585 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
586 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
587 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
590 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
591 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
592 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
593 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
594 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
595 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
596 LRESULT
PropagateMessage(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
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
608 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
609 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
610 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
611 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
612 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
613 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
614 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
615 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
616 LRESULT
OnRefresh(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
617 LRESULT
OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
618 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
621 static ATL::CWndClassInfo
& GetWndClassInfo()
623 static ATL::CWndClassInfo wc
=
625 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
626 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
627 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
628 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
633 BEGIN_MSG_MAP(CShellBrowser
)
634 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
635 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
636 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
637 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
638 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
639 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
640 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
641 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
642 MESSAGE_HANDLER(WM_WININICHANGE
, PropagateMessage
)
643 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
644 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
645 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
646 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
647 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
648 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
649 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
650 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
651 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
652 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
653 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
654 COMMAND_ID_HANDLER(IDM_VIEW_REFRESH
, OnRefresh
)
655 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
656 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
657 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
658 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
659 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
660 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
661 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH
, OnExplorerBar
)
662 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS
, OnExplorerBar
)
663 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY
, OnExplorerBar
)
664 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES
, OnExplorerBar
)
665 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
666 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
667 COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM
, IDM_EXPLORERBAND_ENDCUSTOM
, OnExplorerBar
)
668 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
671 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
672 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
673 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
674 END_CONNECTION_POINT_MAP()
676 BEGIN_COM_MAP(CShellBrowser
)
677 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
678 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
679 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
680 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
681 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
682 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
683 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
684 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
685 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
686 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
687 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
688 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
689 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
690 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
691 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
692 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
693 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
694 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
698 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
700 CShellBrowser::CShellBrowser()
702 fCurrentShellViewWindow
= NULL
;
703 fCurrentDirectoryPIDL
= NULL
;
705 fStatusBarVisible
= true;
706 memset(fClientBars
, 0, sizeof(fClientBars
));
707 fCurrentMenuBar
= NULL
;
708 fHistoryObject
= NULL
;
709 fHistoryStream
= NULL
;
710 fHistoryBindContext
= NULL
;
713 CShellBrowser::~CShellBrowser()
716 DSA_Destroy(menuDsa
);
719 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, DWORD dwFlags
)
721 CComPtr
<IPersistStreamInit
> persistStreamInit
;
723 CComPtr
<IUnknown
> clientBar
;
725 _AtlInitialConstruct();
727 menuDsa
= DSA_Create(sizeof(MenuBandInfo
), 5);
729 return E_OUTOFMEMORY
;
731 fCabinetState
.cLength
= sizeof(fCabinetState
);
732 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
737 Create(HWND_DESKTOP
);
741 hResult
= CInternetToolbar_CreateInstance(IID_PPV_ARG(IUnknown
, &clientBar
));
742 if (FAILED_UNEXPECTEDLY(hResult
))
745 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
748 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
749 if (FAILED_UNEXPECTEDLY(hResult
))
752 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
753 if (FAILED_UNEXPECTEDLY(hResult
))
756 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
757 if (FAILED_UNEXPECTEDLY(hResult
))
760 // TODO: create settingsStream from registry entry
761 //if (settingsStream.p)
763 // hResult = persistStreamInit->Load(settingsStream);
764 // if (FAILED_UNEXPECTEDLY(hResult))
769 hResult
= persistStreamInit
->InitNew();
770 if (FAILED_UNEXPECTEDLY(hResult
))
774 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
775 if (FAILED_UNEXPECTEDLY(hResult
))
778 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
782 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
783 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
784 _AtlBaseModule
.GetModuleInstance(), 0);
785 fStatusBarVisible
= true;
789 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
790 if (FAILED_UNEXPECTEDLY(hResult
))
793 if ((dwFlags
& SBSP_EXPLOREMODE
) != NULL
)
794 ShowBand(CLSID_ExplorerBand
, true);
796 ShowWindow(SW_SHOWNORMAL
);
801 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
803 CComPtr
<IShellFolder
> newFolder
;
804 FOLDERSETTINGS newFolderSettings
;
807 // called by shell view to browse to new folder
808 // also called by explorer band to navigate to new folder
809 hResult
= SHBindToFolder(pidl
, &newFolder
);
810 if (FAILED_UNEXPECTEDLY(hResult
))
813 newFolderSettings
.ViewMode
= FVM_ICON
;
814 newFolderSettings
.fFlags
= 0;
815 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
816 if (FAILED_UNEXPECTEDLY(hResult
))
821 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
823 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
826 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
828 LPCITEMIDLIST pidlnext
;
833 if (! _ILIsDesktop(pidl
))
835 length
= pidl
->mkid
.cb
;
837 reinterpret_cast<LPCITEMIDLIST
>(
838 reinterpret_cast<const BYTE
*>(pidl
) + length
);
839 if (pidlnext
->mkid
.cb
!= 0)
845 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
846 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
848 CComPtr
<IShellFolder
> psf
;
849 LPITEMIDLIST pidlChild
;
850 LPITEMIDLIST pidlParent
;
857 if (ppidlLast
!= NULL
)
859 if (_ILIsPidlSimple(pidl
))
861 if (ppidlLast
!= NULL
)
862 *ppidlLast
= ILClone(pidl
);
863 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
867 pidlChild
= ILClone(ILFindLastID(pidl
));
868 pidlParent
= ILClone(pidl
);
869 ILRemoveLastID(pidlParent
);
870 hResult
= SHGetDesktopFolder(&psf
);
871 if (SUCCEEDED(hResult
))
872 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
873 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
874 *ppidlLast
= pidlChild
;
882 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
883 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
885 CComPtr
<IShellFolder
> parentFolder
;
886 LPITEMIDLIST childPIDL
= NULL
;
890 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
894 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
898 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
901 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
914 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
916 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
919 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
920 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
922 CComPtr
<IObjectWithSite
> objectWithSite
;
923 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
924 CComPtr
<IShellView
> saveCurrentShellView
;
925 CComPtr
<IShellView
> newShellView
;
926 CComPtr
<ITravelLog
> travelLog
;
927 HWND newShellViewWindow
;
928 BOOL windowUpdateIsLocked
;
929 RECT shellViewWindowBounds
;
932 wchar_t newTitle
[MAX_PATH
];
936 if (newShellFolder
== NULL
)
939 hResult
= GetTravelLog(&travelLog
);
940 if (FAILED_UNEXPECTEDLY(hResult
))
944 if (flags
& BTP_UPDATE_CUR_HISTORY
)
946 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
947 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
948 // what to do with error? Do we want to halt browse because state save failed?
951 if (fCurrentShellView
)
953 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
956 // create view object
957 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
958 if (FAILED_UNEXPECTEDLY(hResult
))
960 previousView
= fCurrentShellViewWindow
;
962 // enter updating section
963 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
964 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
965 if (fCurrentShellView
!= NULL
)
966 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
969 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
971 // update folder and view
972 saveCurrentShellFolder
= fCurrentShellFolder
;
973 saveCurrentShellView
= fCurrentShellView
;
974 fCurrentShellFolder
= newShellFolder
;
975 fCurrentShellView
= newShellView
;
978 if (previousView
!= NULL
)
979 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
981 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
982 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
984 // create view window
985 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
986 this, &shellViewWindowBounds
, &newShellViewWindow
);
987 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
989 fCurrentShellView
= saveCurrentShellView
;
990 fCurrentShellFolder
= saveCurrentShellFolder
;
991 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
992 if (windowUpdateIsLocked
)
993 LockWindowUpdate(FALSE
);
994 SetCursor(saveCursor
);
998 if (objectWithSite
.p
!= NULL
)
999 hResult
= objectWithSite
->SetSite(NULL
);
1001 // update current pidl
1002 ILFree(fCurrentDirectoryPIDL
);
1003 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1005 // update view window
1006 if (saveCurrentShellView
!= NULL
)
1007 saveCurrentShellView
->DestroyViewWindow();
1008 fCurrentShellViewWindow
= newShellViewWindow
;
1011 saveCurrentShellView
.Release();
1012 saveCurrentShellFolder
.Release();
1014 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1016 // leave updating section
1017 if (windowUpdateIsLocked
)
1018 LockWindowUpdate(FALSE
);
1019 SetCursor(saveCursor
);
1022 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1024 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1025 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1029 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1030 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1031 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1032 if (SUCCEEDED(hResult
))
1034 FireNavigateComplete(newTitle
);
1038 FireNavigateComplete(L
"ERROR");
1041 if (fCabinetState
.fFullPathTitle
)
1042 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1044 nameFlags
= SHGDN_FORADDRESSBAR
;
1045 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1046 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1047 if (SUCCEEDED(hResult
))
1049 SetWindowText(newTitle
);
1051 LPCITEMIDLIST pidlChild
;
1052 INT index
, indexOpen
;
1053 HIMAGELIST himlSmall
, himlLarge
;
1055 CComPtr
<IShellFolder
> sf
;
1056 hResult
= SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1057 if (SUCCEEDED(hResult
))
1059 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1061 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1063 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1064 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1066 /* Hack to make it possible to release the old icons */
1067 /* Something seems to go wrong with WM_SETICON */
1068 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1069 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1071 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1072 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1074 DestroyIcon(oldSmall
);
1075 DestroyIcon(oldLarge
);
1079 FireCommandStateChangeAll();
1080 hResult
= UpdateForwardBackState();
1081 hResult
= UpdateUpState();
1085 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1087 CComPtr
<IBandSite
> bandSite
;
1088 CComPtr
<IDeskBand
> deskBand
;
1091 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1094 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1095 if (FAILED_UNEXPECTEDLY(hResult
))
1098 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1099 if (FAILED_UNEXPECTEDLY(hResult
))
1102 return deskBand
->QueryInterface(riid
, shellMenu
);
1105 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, REFIID riid
, void **theBaseBar
)
1107 CComPtr
<IUnknown
> newBaseBar
;
1108 CComPtr
<IDeskBar
> deskBar
;
1109 CComPtr
<IUnknown
> newBaseBarSite
;
1110 CComPtr
<IDeskBarClient
> deskBarClient
;
1115 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1117 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1120 hResult
= CBaseBar_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBar
), vertical
);
1121 if (FAILED_UNEXPECTEDLY(hResult
))
1123 hResult
= CBaseBarSite_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBarSite
), vertical
);
1124 if (FAILED_UNEXPECTEDLY(hResult
))
1127 // we have to store our basebar into cache now
1128 *cache
= newBaseBar
;
1129 newBaseBar
->AddRef();
1131 // tell the new base bar about the shell browser
1132 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1133 if (FAILED_UNEXPECTEDLY(hResult
))
1136 // tell the new base bar about the new base bar site
1137 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1138 if (FAILED_UNEXPECTEDLY(hResult
))
1140 hResult
= deskBar
->SetClient(newBaseBarSite
);
1141 if (FAILED_UNEXPECTEDLY(hResult
))
1144 // tell the new base bar site about the new base bar
1145 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1146 if (FAILED_UNEXPECTEDLY(hResult
))
1148 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1149 if (FAILED_UNEXPECTEDLY(hResult
))
1153 return (*cache
)->QueryInterface(riid
, theBaseBar
);
1156 BOOL
CShellBrowser::IsBandLoaded(const CLSID clsidBand
, bool vertical
, DWORD
*pdwBandID
)
1159 CComPtr
<IDeskBar
> deskBar
;
1160 CComPtr
<IUnknown
> baseBarSite
;
1161 CComPtr
<IBandSite
> bandSite
;
1167 /* Get our basebarsite to be able to enumerate bands */
1168 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1169 if (FAILED_UNEXPECTEDLY(hResult
))
1171 hResult
= deskBar
->GetClient(&baseBarSite
);
1172 if (FAILED_UNEXPECTEDLY(hResult
))
1174 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &bandSite
));
1175 if (FAILED_UNEXPECTEDLY(hResult
))
1178 hResult
= bandSite
->EnumBands(-1, &numBands
);
1179 if (FAILED_UNEXPECTEDLY(hResult
))
1182 for(i
= 0; i
< numBands
; i
++)
1184 CComPtr
<IPersist
> bandPersist
;
1186 hResult
= bandSite
->EnumBands(i
, &dwBandID
);
1187 if (FAILED_UNEXPECTEDLY(hResult
))
1190 hResult
= bandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IPersist
, &bandPersist
));
1191 if (FAILED_UNEXPECTEDLY(hResult
))
1193 hResult
= bandPersist
->GetClassID(&clsidTmp
);
1194 if (FAILED_UNEXPECTEDLY(hResult
))
1196 if (IsEqualGUID(clsidBand
, clsidTmp
))
1198 if (pdwBandID
) *pdwBandID
= dwBandID
;
1205 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1207 CComPtr
<IDockingWindow
> dockingWindow
;
1208 CComPtr
<IUnknown
> baseBarSite
;
1209 CComPtr
<IUnknown
> newBand
;
1210 CComPtr
<IDeskBar
> deskBar
;
1215 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1216 if (FAILED_UNEXPECTEDLY(hResult
))
1219 hResult
= deskBar
->GetClient(&baseBarSite
);
1220 if (FAILED_UNEXPECTEDLY(hResult
))
1223 hResult
= deskBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1224 if (FAILED_UNEXPECTEDLY(hResult
))
1227 if (!IsBandLoaded(classID
, vertical
, &dwBandID
))
1229 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1230 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1232 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1233 hResult
= CExplorerBand_CreateInstance(IID_PPV_ARG(IUnknown
, &newBand
));
1234 if (FAILED_UNEXPECTEDLY(hResult
))
1239 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1240 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1241 if (FAILED_UNEXPECTEDLY(hResult
))
1247 CComPtr
<IBandSite
> pBandSite
;
1249 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &pBandSite
));
1250 if (!SUCCEEDED(hResult
))
1252 ERR("Can't get IBandSite interface\n");
1255 hResult
= pBandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IUnknown
, &newBand
));
1256 if (!SUCCEEDED(hResult
))
1258 ERR("Can't find band object\n");
1262 // It's hackish, but we should be able to show the wanted band until we
1263 // find the proper way to do this (but it seems to work to add a new band)
1264 // Here we'll just re-add the existing band to the site, causing it to display.
1266 V_VT(&vaIn
) = VT_UNKNOWN
;
1267 V_UNKNOWN(&vaIn
) = newBand
.p
;
1268 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1269 if (FAILED_UNEXPECTEDLY(hResult
))
1274 hResult
= dockingWindow
->ShowDW(TRUE
);
1275 if (FAILED_UNEXPECTEDLY(hResult
))
1281 HRESULT
CShellBrowser::NavigateToParent()
1283 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1284 if (newDirectory
== NULL
)
1285 return E_OUTOFMEMORY
;
1286 if (_ILIsDesktop(newDirectory
))
1288 ILFree(newDirectory
);
1289 return E_INVALIDARG
;
1291 ILRemoveLastID(newDirectory
);
1292 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1293 ILFree(newDirectory
);
1294 if (FAILED_UNEXPECTEDLY(hResult
))
1299 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1301 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1302 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1304 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1305 sheetInfo
->nPages
++;
1309 HRESULT
CShellBrowser::DoFolderOptions()
1311 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1312 PROPSHEETHEADER m_PropSheet
;
1313 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1314 // CComPtr<IGlobalFolderSettings> globalSettings;
1315 // SHELLSTATE2 shellState;
1318 memset(m_psp
, 0, sizeof(m_psp
));
1319 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1321 // create sheet object
1322 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1323 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1324 if (FAILED_UNEXPECTEDLY(hResult
))
1327 // must set site in order for Apply to all Folders on Advanced page to be enabled
1328 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1329 m_PropSheet
.phpage
= m_psp
;
1332 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1333 if (FAILED_UNEXPECTEDLY(hResult
))
1335 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1336 if (FAILED_UNEXPECTEDLY(hResult
))
1341 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1342 if (FAILED_UNEXPECTEDLY(hResult
))
1345 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1346 // It returns 'E_NOTIMPL'
1348 if (fCurrentShellView
!= NULL
)
1350 hResult
= fCurrentShellView
->AddPropertySheetPages(
1351 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1352 if (FAILED_UNEXPECTEDLY(hResult
))
1358 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1359 m_PropSheet
.dwFlags
= 0;
1360 m_PropSheet
.hwndParent
= m_hWnd
;
1361 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1362 m_PropSheet
.pszCaption
= _T("Folder Options");
1363 m_PropSheet
.nStartPage
= 0;
1364 PropertySheet(&m_PropSheet
);
1368 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1370 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1371 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1373 const _ATL_MSG
*previousMessage
;
1375 WNDPROC saveWindowProc
;
1378 hWnd
= pThis
->m_hWnd
;
1379 previousMessage
= pThis
->m_pCurrentMsg
;
1380 pThis
->m_pCurrentMsg
= &msg
;
1382 /* If the shell browser is initialized, let the menu band preprocess the messages */
1383 if (pThis
->fCurrentDirectoryPIDL
)
1385 CComPtr
<IMenuBand
> menuBand
;
1386 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1387 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1389 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1390 if (hResult
== S_OK
)
1393 wParam
= msg
.wParam
;
1394 lParam
= msg
.lParam
;
1399 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1400 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1401 if (handled
== FALSE
)
1403 if (uMsg
== WM_NCDESTROY
)
1405 saveWindowProc
= reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1406 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1407 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1408 ::SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1409 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1412 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1414 pThis
->m_pCurrentMsg
= previousMessage
;
1415 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1417 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1418 pThis
->m_hWnd
= NULL
;
1419 pThis
->OnFinalMessage(hWnd
);
1424 void CShellBrowser::RepositionBars()
1430 GetClientRect(&clientRect
);
1432 if (fStatusBarVisible
&& fStatusBar
)
1434 ::GetWindowRect(fStatusBar
, &statusRect
);
1435 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1436 clientRect
.right
- clientRect
.left
,
1437 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1438 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1441 for (x
= 0; x
< 3; x
++)
1443 HWND hwnd
= fClientBars
[x
].hwnd
;
1444 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1445 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1447 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1448 fClientBars
[x
].hwnd
= hwnd
;
1452 RECT toolbarRect
= clientRect
;
1453 if (borderSpace
.top
!= 0)
1455 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1457 else if (borderSpace
.bottom
!= 0)
1459 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1461 else if (borderSpace
.left
!= 0)
1463 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1465 else if (borderSpace
.right
!= 0)
1467 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1470 ::SetWindowPos(hwnd
, NULL
,
1473 toolbarRect
.right
- toolbarRect
.left
,
1474 toolbarRect
.bottom
- toolbarRect
.top
,
1475 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1477 if (borderSpace
.top
!= 0)
1479 clientRect
.top
= toolbarRect
.bottom
;
1481 else if (borderSpace
.bottom
!= 0)
1483 clientRect
.bottom
= toolbarRect
.top
;
1485 else if (borderSpace
.left
!= 0)
1487 clientRect
.left
= toolbarRect
.right
;
1489 else if (borderSpace
.right
!= 0)
1491 clientRect
.right
= toolbarRect
.left
;
1495 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1496 clientRect
.right
- clientRect
.left
,
1497 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1500 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1503 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1504 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1507 params
.rgvarg
= arguments
;
1508 params
.rgdispidNamedArgs
= NULL
;
1509 params
.cArgs
= argCount
;
1510 params
.cNamedArgs
= 0;
1511 IUnknown
** pp
= vec
.begin();
1512 while (pp
< vec
.end())
1516 CComPtr
<IDispatch
> theDispatch
;
1518 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1519 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1524 while (pp
< vec2
.end())
1528 CComPtr
<IDispatch
> theDispatch
;
1530 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1531 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1538 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1540 // these two variants intentionally to do use CComVariant because it would double free/release
1541 // or does not need to dispose at all
1544 CComBSTR
tempString(newDirectory
);
1546 V_VT(&varArgs
) = VT_BSTR
;
1547 V_BSTR(&varArgs
) = tempString
.m_str
;
1549 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1550 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1551 V_VT(&varArg
[1]) = VT_DISPATCH
;
1552 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1554 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1557 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1561 V_VT(&varArg
[0]) = VT_BOOL
;
1562 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1563 V_VT(&varArg
[1]) = VT_I4
;
1564 V_I4(&varArg
[1]) = commandID
;
1566 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1569 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1571 return FireCommandStateChange(false, -1);
1574 HRESULT
CShellBrowser::UpdateForwardBackState()
1576 CComPtr
<ITravelLog
> travelLog
;
1577 CComPtr
<ITravelEntry
> unusedEntry
;
1583 canGoForward
= false;
1584 hResult
= GetTravelLog(&travelLog
);
1585 if (FAILED_UNEXPECTEDLY(hResult
))
1587 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1588 if (SUCCEEDED(hResult
))
1591 unusedEntry
.Release();
1593 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1594 if (SUCCEEDED(hResult
))
1596 canGoForward
= true;
1597 unusedEntry
.Release();
1599 hResult
= FireCommandStateChange(canGoBack
, 2);
1600 hResult
= FireCommandStateChange(canGoForward
, 1);
1604 HRESULT
CShellBrowser::UpdateUpState()
1610 if (_ILIsDesktop(fCurrentDirectoryPIDL
))
1612 hResult
= FireCommandStateChange(canGoUp
, 3);
1616 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1618 CComPtr
<ITravelLog
> travelLog
;
1619 CComPtr
<ITravelEntry
> unusedEntry
;
1621 MENUITEMINFO menuItemInfo
;
1624 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1626 position
= GetMenuItemCount(theMenu
);
1627 hResult
= GetTravelLog(&travelLog
);
1628 if (FAILED_UNEXPECTEDLY(hResult
))
1631 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1635 if (SUCCEEDED(hResult
))
1637 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, TRUE
);
1638 unusedEntry
.Release();
1641 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, FALSE
);
1643 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1647 if (SUCCEEDED(hResult
))
1649 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, TRUE
);
1650 unusedEntry
.Release();
1653 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, FALSE
);
1655 SHEnableMenuItem(theMenu
,
1656 IDM_GOTO_UPONELEVEL
,
1657 !_ILIsDesktop(fCurrentDirectoryPIDL
));
1659 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1660 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1661 if (SUCCEEDED(hResult
))
1663 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1664 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1665 menuItemInfo
.fType
= MF_SEPARATOR
;
1666 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1667 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1671 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1673 CComPtr
<ITravelLog
> travelLog
;
1675 OLECMD commandList
[5];
1676 HMENU toolbarMenuBar
;
1678 MENUITEMINFO menuItemInfo
;
1681 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1682 if (gotoMenu
!= NULL
)
1683 UpdateGotoMenu(gotoMenu
);
1685 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1686 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1687 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1688 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1689 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1691 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1692 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1693 if (FAILED_UNEXPECTEDLY(hResult
))
1694 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1697 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1698 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1699 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1700 DestroyMenu(menuItemInfo
.hSubMenu
);
1702 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1703 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1704 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1705 DestroyMenu(toolbarMenuBar
);
1708 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1709 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1710 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1711 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1713 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1714 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1715 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1716 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1717 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1718 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1719 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1720 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1722 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1723 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1724 menuItemInfo
.hSubMenu
= toolbarMenu
;
1725 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1727 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1730 HRESULT
CShellBrowser::BuildExplorerBandMenu()
1735 hBandsMenu
= SHGetMenuFromID(fCurrentMenuBar
, IDM_VIEW_EXPLORERBAR
);
1738 OutputDebugString(L
"No menu !\n");
1741 DSA_DeleteAllItems(menuDsa
);
1742 BuildExplorerBandCategory(hBandsMenu
, CATID_InfoBand
, 4, NULL
);
1743 BuildExplorerBandCategory(hBandsMenu
, CATID_CommBand
, 20, &nbFound
);
1747 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_SEPARATOR
, MF_BYCOMMAND
);
1749 // Remove media menu since XP does it (according to API Monitor)
1750 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_MEDIA
, MF_BYCOMMAND
);
1754 HRESULT
CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
)
1757 CComPtr
<IEnumGUID
> pEnumGUID
;
1758 WCHAR wszBandName
[MAX_PATH
];
1759 WCHAR wszBandGUID
[MAX_PATH
];
1760 WCHAR wRegKey
[MAX_PATH
];
1767 mbi
.fVertical
= IsEqualGUID(category
, CATID_InfoBand
);
1769 hr
= SHEnumClassesOfCategories(1, &category
, 0, NULL
, &pEnumGUID
);
1770 if (FAILED_UNEXPECTEDLY(hr
))
1776 pEnumGUID
->Next(1, &iter
, &dwRead
);
1779 // Get the band name
1780 if (IsBuiltinBand(iter
))
1782 if (!StringFromGUID2(iter
, wszBandGUID
, MAX_PATH
))
1784 StringCchPrintfW(wRegKey
, MAX_PATH
, L
"CLSID\\%s", wszBandGUID
);
1785 dwDataSize
= MAX_PATH
;
1786 SHGetValue(HKEY_CLASSES_ROOT
, wRegKey
, NULL
, NULL
, wszBandName
, &dwDataSize
);
1789 InsertMenu(hBandsMenu
, dwPos
+ cBands
, MF_BYPOSITION
, IDM_EXPLORERBAND_BEGINCUSTOM
+ DSA_GetItemCount(menuDsa
), wszBandName
);
1790 DSA_AppendItem(menuDsa
, &mbi
);
1800 BOOL
CShellBrowser::IsBuiltinBand(CLSID
&bandID
)
1802 if (IsEqualCLSID(bandID
, CLSID_ExplorerBand
))
1804 if (IsEqualCLSID(bandID
, CLSID_SH_SearchBand
) || IsEqualCLSID(bandID
, CLSID_SearchBand
))
1806 if (IsEqualCLSID(bandID
, CLSID_IE_SearchBand
) || IsEqualCLSID(bandID
, CLSID_FileSearchBand
))
1808 if (IsEqualCLSID(bandID
, CLSID_SH_HistBand
))
1810 if (IsEqualCLSID(bandID
, CLSID_SH_FavBand
))
1812 if (IsEqualCLSID(bandID
, CLSID_ChannelsBand
))
1817 HRESULT
CShellBrowser::OnSearch()
1819 CComPtr
<IObjectWithSite
> objectWithSite
;
1820 CComPtr
<IContextMenu
> contextMenu
;
1821 CMINVOKECOMMANDINFO commandInfo
;
1822 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1825 // TODO: Query shell if this command is enabled first
1827 memset(&commandInfo
, 0, sizeof(commandInfo
));
1828 commandInfo
.cbSize
= sizeof(commandInfo
);
1829 commandInfo
.hwnd
= m_hWnd
;
1830 commandInfo
.lpParameters
= searchGUID
;
1831 commandInfo
.nShow
= SW_SHOWNORMAL
;
1833 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1834 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1835 if (FAILED_UNEXPECTEDLY(hResult
))
1837 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1838 if (FAILED_UNEXPECTEDLY(hResult
))
1840 hResult
= objectWithSite
->SetSite(dynamic_cast<IShellBrowser
*>(this));
1841 if (FAILED_UNEXPECTEDLY(hResult
))
1843 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1844 hResult
= objectWithSite
->SetSite(NULL
);
1848 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1850 CComPtr
<IUnknown
> int1Retry
;
1851 CComPtr
<IUnknown
> int2Retry
;
1856 if (int1
== NULL
|| int2
== NULL
)
1858 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1859 if (FAILED_UNEXPECTEDLY(hResult
))
1861 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1862 if (FAILED_UNEXPECTEDLY(hResult
))
1864 if (int1Retry
== int2Retry
)
1869 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1871 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1873 RECT availableBounds
;
1875 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1876 for (INT x
= 0; x
< 3; x
++)
1878 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1880 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1881 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1882 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1883 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1886 *prcBorder
= availableBounds
;
1890 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1895 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1897 for (INT x
= 0; x
< 3; x
++)
1899 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1901 fClientBars
[x
].borderSpace
= *pbw
;
1902 // if this bar changed size, it cascades and forces all subsequent bars to resize
1907 return E_INVALIDARG
;
1910 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1911 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1913 CComPtr
<IOleCommandTarget
> commandTarget
;
1916 if (prgCmds
== NULL
)
1917 return E_INVALIDARG
;
1918 if (pguidCmdGroup
== NULL
)
1920 if (fCurrentShellView
.p
!= NULL
)
1922 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1923 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1924 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1933 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1937 switch (prgCmds
->cmdID
)
1939 case 0x1c: // search
1940 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1942 case 0x1d: // history
1943 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1945 case 0x1e: // favorites
1946 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1948 case 0x23: // folders
1949 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1959 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1963 switch (prgCmds
->cmdID
)
1965 case 0xa022: // up level
1966 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1967 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1968 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1978 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1979 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1985 TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
1988 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1993 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1996 if (nCmdexecopt
== 1)
1998 // pvaIn is a VT_UNKNOWN with a band that is being hidden
2002 // update zones part of the status bar
2005 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
2006 V_VT(pvaOut
) = VT_INT_PTR
;
2007 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
2008 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
2011 // indicate if this cabinet was opened as a browser
2017 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
2026 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
2031 // what is theater mode and why do we receive this?
2035 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
2040 // initialize favorites menu
2044 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
2049 // refresh on toolbar clicked
2052 // called for unknown bands ?
2055 // tell the view if it should hide the task pane or not
2056 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
2059 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
2064 return NavigateToParent();
2067 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
2072 return DoFolderOptions();
2075 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
2080 // Reset All Folders option in Folder Options
2084 else if (IsEqualIID(*pguidCmdGroup
, CLSID_CommonButtons
))
2086 // Windows seems to use this as proxy for toolbar buttons.
2087 // We use it for search band for now to remove code duplication,
2088 // let's see if it could be useful in the future.
2092 // Show search band from toolbar
2105 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
2113 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
2118 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2120 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2122 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
2124 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
2127 DestroyMenu(mainMenu
);
2129 lpMenuWidths
->width
[0] = 2;
2130 lpMenuWidths
->width
[2] = 3;
2131 lpMenuWidths
->width
[4] = 1;
2135 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
2137 CComPtr
<IShellMenu
> shellMenu
;
2140 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
2142 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
2143 if (FAILED_UNEXPECTEDLY(hResult
))
2148 hmenuShared
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2150 // FIXME: Figure out the proper way to do this.
2151 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
2154 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
2157 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
2158 if (FAILED_UNEXPECTEDLY(hResult
))
2160 fCurrentMenuBar
= hmenuShared
;
2161 BuildExplorerBandMenu();
2165 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
2167 if (hmenuShared
== fCurrentMenuBar
)
2169 //DestroyMenu(fCurrentMenuBar);
2170 SetMenuSB(NULL
, NULL
, NULL
);
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
2180 ::SetWindowText(fStatusBar
, pszStatusText
);
2189 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
2194 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
2196 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
2201 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
2203 if ((wFlags
& SBSP_EXPLOREMODE
) != NULL
)
2204 ShowBand(CLSID_ExplorerBand
, true);
2206 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2209 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
2214 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
2222 *lphwnd
= fToolbarProxy
.m_hWnd
;
2225 *lphwnd
= fStatusBar
;
2228 // find the directory browser and return it
2229 // this should be used only to determine if a tree is present
2232 // is this a progress dialog?
2238 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
2239 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
2248 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
2253 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
2261 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
2265 *ppshv
= fCurrentShellView
;
2266 if (fCurrentShellView
.p
!= NULL
)
2267 fCurrentShellView
.p
->AddRef();
2271 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2276 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2281 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2282 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2292 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2297 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2298 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2303 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2305 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2306 // the returned interface has a method GetPropertyBag on it
2307 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2308 return this->QueryInterface(riid
, ppvObject
);
2309 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2310 return this->QueryInterface(riid
, ppvObject
);
2311 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2312 return this->QueryInterface(riid
, ppvObject
);
2313 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2314 return this->QueryInterface(riid
, ppvObject
);
2315 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2316 return this->QueryInterface(riid
, ppvObject
);
2317 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2318 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2319 if (IsEqualIID(riid
, IID_IShellBrowser
))
2320 return this->QueryInterface(riid
, ppvObject
);
2321 return E_NOINTERFACE
;
2324 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2326 if (ppvObject
== NULL
)
2332 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2337 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2342 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2343 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2349 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2354 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2359 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2364 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2369 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2374 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2378 // called by toolbar when displaying tooltips
2383 if (fTravelLog
.p
== NULL
)
2385 hResult
= CTravelLog_CreateInstance(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2386 if (FAILED_UNEXPECTEDLY(hResult
))
2389 *pptl
= fTravelLog
.p
;
2390 fTravelLog
.p
->AddRef();
2394 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2399 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2404 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2409 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2414 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2419 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2424 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2429 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2434 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2439 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2444 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2449 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2454 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2459 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2464 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2466 // called by explorer bar to get current pidl
2469 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2473 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2478 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2483 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2488 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2490 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2491 return E_INVALIDARG
;
2492 *ppole
= fHistoryObject
;
2493 if (fHistoryObject
!= NULL
)
2494 fHistoryObject
->AddRef();
2495 *pstm
= fHistoryStream
;
2496 if (fHistoryStream
!= NULL
)
2497 fHistoryStream
->AddRef();
2498 *ppbc
= fHistoryBindContext
;
2499 if (fHistoryBindContext
!= NULL
)
2500 fHistoryBindContext
->AddRef();
2501 fHistoryObject
= NULL
;
2502 fHistoryStream
= NULL
;
2503 fHistoryBindContext
= NULL
;
2509 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2514 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2519 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2524 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2525 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2530 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2535 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2540 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2545 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2550 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2555 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2560 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2562 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2566 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2571 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2576 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2581 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2586 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2591 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2596 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2601 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2602 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2607 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2612 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2617 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2622 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2627 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2632 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2637 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2642 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2647 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2652 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2657 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2662 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2667 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2672 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2677 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2682 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2687 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2692 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2697 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2702 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2707 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2712 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2713 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2718 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2719 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2724 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2729 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2734 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2739 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2744 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2749 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2754 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2759 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2764 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2769 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2774 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2779 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2784 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2789 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2794 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2799 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2804 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2809 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2814 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2819 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2820 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2825 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2830 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2835 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2840 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2842 for (int i
= 0; i
< 3; i
++)
2844 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2848 if (!fCurrentShellView
)
2851 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2854 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2859 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2864 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2866 CComPtr
<ITravelLog
> travelLog
;
2867 HRESULT hResult
= GetTravelLog(&travelLog
);
2868 if (FAILED_UNEXPECTEDLY(hResult
))
2870 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2873 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2875 CComPtr
<ITravelLog
> travelLog
;
2876 HRESULT hResult
= GetTravelLog(&travelLog
);
2877 if (FAILED_UNEXPECTEDLY(hResult
))
2879 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2882 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2887 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2892 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2893 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2895 CComHeapPtr
<ITEMIDLIST
> pidl
;
2897 CComPtr
<IShellFolder
> pDesktop
;
2899 hResult
= SHGetDesktopFolder(&pDesktop
);
2900 if (FAILED_UNEXPECTEDLY(hResult
))
2902 hResult
= pDesktop
->ParseDisplayName(NULL
, NULL
, URL
, NULL
, &pidl
, NULL
);
2903 if (FAILED_UNEXPECTEDLY(hResult
))
2905 return BrowseObject(pidl
, 1);
2908 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2912 V_VT(&level
) = VT_I4
;
2914 return Refresh2(&level
);
2917 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2919 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2922 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2923 if (FAILED_UNEXPECTEDLY(hResult
))
2925 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2928 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2933 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2938 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2943 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2948 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2953 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2958 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2965 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2970 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2975 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2980 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2985 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2990 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2995 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
3000 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
3007 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
3012 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
3017 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
3022 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
3027 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
3032 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
3037 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
3042 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
3047 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
3052 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
3057 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
3062 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
3067 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
3072 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
3077 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
3082 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
3087 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
3092 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
3097 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
3102 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
3107 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
3112 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
3117 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
3122 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
3123 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
3125 LPITEMIDLIST pidl
= NULL
;
3127 // called from drive combo box to navigate to a directory
3128 // Also called by search band to display shell results folder view
3130 if (V_VT(URL
) == VT_BSTR
)
3132 return this->Navigate(V_BSTR(URL
), Flags
, TargetFrameName
, PostData
, Headers
);
3134 if (V_VT(URL
) == (VT_ARRAY
| VT_UI1
))
3136 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
3137 return E_INVALIDARG
;
3139 pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
3141 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
3142 if (FAILED_UNEXPECTEDLY(hResult
))
3147 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
3152 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
3153 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3158 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
3163 // called to show search bar
3164 if (V_VT(pvaClsid
) != VT_BSTR
)
3165 return E_INVALIDARG
;
3166 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
3167 // TODO: properly compute the value of vertical
3169 return ShowBand(classID
, vertical
);
3172 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
3177 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
3182 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
3187 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
3192 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
3197 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
3202 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
3207 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
3212 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
3217 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
3222 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
3227 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
3232 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
3237 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
3242 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
3247 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
3252 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
3254 if (pWinData
== NULL
)
3257 pWinData
->dwWindowID
= -1;
3259 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
3260 pWinData
->lpszUrl
= NULL
;
3261 pWinData
->lpszUrlLocation
= NULL
;
3262 pWinData
->lpszTitle
= NULL
;
3266 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
3271 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
3276 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
3278 CComPtr
<IPersistHistory
> viewPersistHistory
;
3279 CComPtr
<IOleObject
> viewHistoryObject
;
3280 persistState oldState
;
3285 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
3286 if (FAILED_UNEXPECTEDLY(hResult
))
3288 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3290 if (oldState
.browseType
!= 2)
3292 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3294 return E_OUTOFMEMORY
;
3295 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3296 if (FAILED_UNEXPECTEDLY(hResult
))
3301 if (numRead
!= oldState
.pidlSize
)
3306 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3307 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3308 fHistoryObject
= viewHistoryObject
;
3309 fHistoryStream
= pStream
;
3310 fHistoryBindContext
= pbc
;
3311 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3312 fHistoryObject
= NULL
;
3313 fHistoryStream
= NULL
;
3314 fHistoryBindContext
= NULL
;
3316 if (FAILED_UNEXPECTEDLY(hResult
))
3321 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3323 CComPtr
<IPersistHistory
> viewPersistHistory
;
3324 persistState newState
;
3327 hResult
= fCurrentShellView
->GetItemObject(
3328 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3329 memset(&newState
, 0, sizeof(newState
));
3330 newState
.dwSize
= sizeof(newState
);
3331 newState
.browseType
= 2;
3332 newState
.browserIndex
= GetBrowserIndex();
3333 if (viewPersistHistory
.p
!= NULL
)
3335 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3336 if (FAILED_UNEXPECTEDLY(hResult
))
3339 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3340 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3341 if (FAILED_UNEXPECTEDLY(hResult
))
3343 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3344 if (FAILED_UNEXPECTEDLY(hResult
))
3346 if (viewPersistHistory
.p
!= NULL
)
3348 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3349 if (FAILED_UNEXPECTEDLY(hResult
))
3355 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3360 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3365 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3367 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3371 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3375 /* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
3376 OleFlushClipboard();
3378 // TODO: rip down everything
3380 fToolbarProxy
.Destroy();
3382 fCurrentShellView
->DestroyViewWindow();
3383 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3385 for (int i
= 0; i
< 3; i
++)
3387 CComPtr
<IDockingWindow
> pdw
;
3388 CComPtr
<IDeskBar
> bar
;
3389 CComPtr
<IUnknown
> pBarSite
;
3390 CComPtr
<IDeskBarClient
> pClient
;
3392 if (fClientBars
[i
].clientBar
== NULL
)
3395 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3396 if (FAILED_UNEXPECTEDLY(hr
))
3399 /* We should destroy our basebarsite too */
3400 hr
= pdw
->QueryInterface(IID_PPV_ARG(IDeskBar
, &bar
));
3403 hr
= bar
->GetClient(&pBarSite
);
3404 if (SUCCEEDED(hr
) && pBarSite
)
3406 hr
= pBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &pClient
));
3408 pClient
->SetDeskBarSite(NULL
);
3417 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3419 ReleaseCComPtrExpectZero(fCurrentShellView
);
3420 ReleaseCComPtrExpectZero(fTravelLog
);
3422 fCurrentShellFolder
.Release();
3423 ILFree(fCurrentDirectoryPIDL
);
3424 ::DestroyWindow(fStatusBar
);
3425 DestroyMenu(fCurrentMenuBar
);
3431 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3433 CComPtr
<IDockingWindow
> dockingWindow
;
3434 RECT availableBounds
;
3435 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3438 if (wParam
!= SIZE_MINIMIZED
)
3440 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3441 for (INT x
= 0; x
< 3; x
++)
3443 if (fClientBars
[x
].clientBar
!= NULL
)
3445 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3446 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3447 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3449 hResult
= dockingWindow
->ResizeBorderDW(
3450 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3460 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3463 LPARAM menuIndex
= lParam
;
3465 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3467 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3471 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3475 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3477 UpdateViewMenu(theMenu
);
3480 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3484 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3486 // FIXME: Remove once implemented
3487 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3488 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3489 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3490 FIXME("Folder options dialog is stubbed: CORE-11141\n");
3491 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
); // Remove when CORE-11141 is fixed.
3494 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3499 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3504 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3506 ::SetFocus(fCurrentShellViewWindow
);
3510 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3512 if (fCurrentShellViewWindow
!= NULL
)
3513 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3517 LRESULT
CShellBrowser::PropagateMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3519 SHPropagateMessage(m_hWnd
, uMsg
, wParam
, lParam
, TRUE
);
3523 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3525 return SendMessage(WM_CLOSE
);
3528 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3530 HRESULT hResult
= DoFolderOptions();
3531 if (FAILED(hResult
))
3532 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3536 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3539 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3540 #endif /* __REACTOS__ */
3544 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3547 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3548 #endif /* __REACTOS__ */
3552 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3554 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3558 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3560 HRESULT hResult
= GoBack();
3561 if (FAILED(hResult
))
3562 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3566 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3568 HRESULT hResult
= GoForward();
3569 if (FAILED(hResult
))
3570 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3574 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3576 HRESULT hResult
= NavigateToParent();
3577 if (FAILED(hResult
))
3578 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3582 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3584 HRESULT hResult
= GoHome();
3585 if (FAILED(hResult
))
3586 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3590 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3592 // FIXME: This does not appear to be what windows does.
3593 HRESULT hResult
= NavigateToParent();
3594 if (FAILED(hResult
))
3595 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3599 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3601 CComPtr
<IShellFolder
> psfDesktop
;
3602 LPITEMIDLIST pidlFavs
;
3604 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3607 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3612 hr
= SHGetDesktopFolder(&psfDesktop
);
3613 if (FAILED_UNEXPECTEDLY(hr
))
3616 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3617 if (FAILED_UNEXPECTEDLY(hr
))
3623 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3625 fStatusBarVisible
= !fStatusBarVisible
;
3628 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3634 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3637 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3638 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3642 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3645 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3646 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3650 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3653 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3654 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3658 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3661 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3662 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3666 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3669 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3670 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3674 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3677 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3678 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3682 LRESULT
CShellBrowser::OnRefresh(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3684 if (fCurrentShellView
)
3685 fCurrentShellView
->Refresh();
3689 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3694 LRESULT
CShellBrowser::OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3696 // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3697 if (wID
>= IDM_EXPLORERBAND_BEGINCUSTOM
&& wID
<= IDM_EXPLORERBAND_ENDCUSTOM
)
3700 mbi
= (MenuBandInfo
*)DSA_GetItemPtr(menuDsa
, (wID
- IDM_EXPLORERBAND_BEGINCUSTOM
));
3703 ShowBand(mbi
->barGuid
, mbi
->fVertical
);
3709 case IDM_EXPLORERBAR_SEARCH
:
3710 Exec(&CLSID_CommonButtons
, 0x123, 1, NULL
, NULL
);
3712 case IDM_EXPLORERBAR_FOLDERS
:
3713 ShowBand(CLSID_ExplorerBand
, true);
3715 case IDM_EXPLORERBAR_HISTORY
:
3716 ShowBand(CLSID_SH_HistBand
, true);
3718 case IDM_EXPLORERBAR_FAVORITES
:
3719 ShowBand(CLSID_SH_FavBand
, true);
3722 WARN("Unknown id %x\n", wID
);
3728 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3730 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3731 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3735 HRESULT
CShellBrowser_CreateInstance(LPITEMIDLIST pidl
, DWORD dwFlags
, REFIID riid
, void **ppv
)
3737 return ShellObjectCreatorInit
<CShellBrowser
>(pidl
, dwFlags
, riid
, ppv
);