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
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
823 LPCITEMIDLIST pidlnext
;
828 if (! _ILIsDesktop(pidl
))
830 length
= pidl
->mkid
.cb
;
832 reinterpret_cast<LPCITEMIDLIST
>(
833 reinterpret_cast<const BYTE
*>(pidl
) + length
);
834 if (pidlnext
->mkid
.cb
!= 0)
840 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
841 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
843 CComPtr
<IShellFolder
> psf
;
844 LPITEMIDLIST pidlChild
;
845 LPITEMIDLIST pidlParent
;
852 if (ppidlLast
!= NULL
)
854 if (_ILIsPidlSimple(pidl
))
856 if (ppidlLast
!= NULL
)
857 *ppidlLast
= ILClone(pidl
);
858 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
862 pidlChild
= ILClone(ILFindLastID(pidl
));
863 pidlParent
= ILClone(pidl
);
864 ILRemoveLastID(pidlParent
);
865 hResult
= SHGetDesktopFolder(&psf
);
866 if (SUCCEEDED(hResult
))
867 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
868 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
869 *ppidlLast
= pidlChild
;
877 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
878 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
880 CComPtr
<IShellFolder
> parentFolder
;
881 LPITEMIDLIST childPIDL
= NULL
;
885 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
889 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
893 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
896 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
909 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
911 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
914 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
915 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
917 CComPtr
<IObjectWithSite
> objectWithSite
;
918 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
919 CComPtr
<IShellView
> saveCurrentShellView
;
920 CComPtr
<IShellView
> newShellView
;
921 CComPtr
<ITravelLog
> travelLog
;
922 HWND newShellViewWindow
;
923 BOOL windowUpdateIsLocked
;
924 RECT shellViewWindowBounds
;
927 wchar_t newTitle
[MAX_PATH
];
931 if (newShellFolder
== NULL
)
934 hResult
= GetTravelLog(&travelLog
);
935 if (FAILED_UNEXPECTEDLY(hResult
))
939 if (flags
& BTP_UPDATE_CUR_HISTORY
)
941 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
942 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
943 // what to do with error? Do we want to halt browse because state save failed?
946 if (fCurrentShellView
)
948 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
951 // create view object
952 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
953 if (FAILED_UNEXPECTEDLY(hResult
))
955 previousView
= fCurrentShellViewWindow
;
957 // enter updating section
958 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
959 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
960 if (fCurrentShellView
!= NULL
)
961 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
964 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
966 // update folder and view
967 saveCurrentShellFolder
= fCurrentShellFolder
;
968 saveCurrentShellView
= fCurrentShellView
;
969 fCurrentShellFolder
= newShellFolder
;
970 fCurrentShellView
= newShellView
;
973 if (previousView
!= NULL
)
974 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
976 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
977 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
979 // create view window
980 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
981 this, &shellViewWindowBounds
, &newShellViewWindow
);
982 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
984 fCurrentShellView
= saveCurrentShellView
;
985 fCurrentShellFolder
= saveCurrentShellFolder
;
986 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
987 if (windowUpdateIsLocked
)
988 LockWindowUpdate(FALSE
);
989 SetCursor(saveCursor
);
993 if (objectWithSite
.p
!= NULL
)
994 hResult
= objectWithSite
->SetSite(NULL
);
996 // update current pidl
997 ILFree(fCurrentDirectoryPIDL
);
998 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1000 // update view window
1001 if (saveCurrentShellView
!= NULL
)
1002 saveCurrentShellView
->DestroyViewWindow();
1003 fCurrentShellViewWindow
= newShellViewWindow
;
1006 saveCurrentShellView
.Release();
1007 saveCurrentShellFolder
.Release();
1009 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1011 // leave updating section
1012 if (windowUpdateIsLocked
)
1013 LockWindowUpdate(FALSE
);
1014 SetCursor(saveCursor
);
1017 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1019 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1020 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1024 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1025 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1026 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1027 if (SUCCEEDED(hResult
))
1029 FireNavigateComplete(newTitle
);
1033 FireNavigateComplete(L
"ERROR");
1036 if (fCabinetState
.fFullPathTitle
)
1037 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1039 nameFlags
= SHGDN_FORADDRESSBAR
;
1040 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1041 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1042 if (SUCCEEDED(hResult
))
1044 SetWindowText(newTitle
);
1046 LPCITEMIDLIST pidlChild
;
1047 INT index
, indexOpen
;
1048 HIMAGELIST himlSmall
, himlLarge
;
1050 CComPtr
<IShellFolder
> sf
;
1051 hResult
= SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1052 if (SUCCEEDED(hResult
))
1054 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1056 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1058 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1059 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1061 /* Hack to make it possible to release the old icons */
1062 /* Something seems to go wrong with WM_SETICON */
1063 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1064 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1066 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1067 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1069 DestroyIcon(oldSmall
);
1070 DestroyIcon(oldLarge
);
1074 FireCommandStateChangeAll();
1075 hResult
= UpdateForwardBackState();
1076 hResult
= UpdateUpState();
1080 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1082 CComPtr
<IBandSite
> bandSite
;
1083 CComPtr
<IDeskBand
> deskBand
;
1086 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1089 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1090 if (FAILED_UNEXPECTEDLY(hResult
))
1093 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1094 if (FAILED_UNEXPECTEDLY(hResult
))
1097 return deskBand
->QueryInterface(riid
, shellMenu
);
1100 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, REFIID riid
, void **theBaseBar
)
1102 CComPtr
<IUnknown
> newBaseBar
;
1103 CComPtr
<IDeskBar
> deskBar
;
1104 CComPtr
<IUnknown
> newBaseBarSite
;
1105 CComPtr
<IDeskBarClient
> deskBarClient
;
1110 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1112 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1115 hResult
= CBaseBar_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBar
), vertical
);
1116 if (FAILED_UNEXPECTEDLY(hResult
))
1118 hResult
= CBaseBarSite_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBarSite
), vertical
);
1119 if (FAILED_UNEXPECTEDLY(hResult
))
1122 // we have to store our basebar into cache now
1123 *cache
= newBaseBar
;
1124 newBaseBar
->AddRef();
1126 // tell the new base bar about the shell browser
1127 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1128 if (FAILED_UNEXPECTEDLY(hResult
))
1131 // tell the new base bar about the new base bar site
1132 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1133 if (FAILED_UNEXPECTEDLY(hResult
))
1135 hResult
= deskBar
->SetClient(newBaseBarSite
);
1136 if (FAILED_UNEXPECTEDLY(hResult
))
1139 // tell the new base bar site about the new base bar
1140 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1141 if (FAILED_UNEXPECTEDLY(hResult
))
1143 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1144 if (FAILED_UNEXPECTEDLY(hResult
))
1148 return (*cache
)->QueryInterface(riid
, theBaseBar
);
1151 BOOL
CShellBrowser::IsBandLoaded(const CLSID clsidBand
, bool vertical
, DWORD
*pdwBandID
)
1154 CComPtr
<IDeskBar
> deskBar
;
1155 CComPtr
<IUnknown
> baseBarSite
;
1156 CComPtr
<IBandSite
> bandSite
;
1162 /* Get our basebarsite to be able to enumerate bands */
1163 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1164 if (FAILED_UNEXPECTEDLY(hResult
))
1166 hResult
= deskBar
->GetClient(&baseBarSite
);
1167 if (FAILED_UNEXPECTEDLY(hResult
))
1169 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &bandSite
));
1170 if (FAILED_UNEXPECTEDLY(hResult
))
1173 hResult
= bandSite
->EnumBands(-1, &numBands
);
1174 if (FAILED_UNEXPECTEDLY(hResult
))
1177 for(i
= 0; i
< numBands
; i
++)
1179 CComPtr
<IPersist
> bandPersist
;
1181 hResult
= bandSite
->EnumBands(i
, &dwBandID
);
1182 if (FAILED_UNEXPECTEDLY(hResult
))
1185 hResult
= bandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IPersist
, &bandPersist
));
1186 if (FAILED_UNEXPECTEDLY(hResult
))
1188 hResult
= bandPersist
->GetClassID(&clsidTmp
);
1189 if (FAILED_UNEXPECTEDLY(hResult
))
1191 if (IsEqualGUID(clsidBand
, clsidTmp
))
1193 if (pdwBandID
) *pdwBandID
= dwBandID
;
1200 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1202 CComPtr
<IDockingWindow
> dockingWindow
;
1203 CComPtr
<IUnknown
> baseBarSite
;
1204 CComPtr
<IUnknown
> newBand
;
1205 CComPtr
<IDeskBar
> deskBar
;
1210 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1211 if (FAILED_UNEXPECTEDLY(hResult
))
1214 hResult
= deskBar
->GetClient(&baseBarSite
);
1215 if (FAILED_UNEXPECTEDLY(hResult
))
1218 hResult
= deskBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1219 if (FAILED_UNEXPECTEDLY(hResult
))
1222 if (!IsBandLoaded(classID
, vertical
, &dwBandID
))
1224 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1225 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1227 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1228 hResult
= CExplorerBand_CreateInstance(IID_PPV_ARG(IUnknown
, &newBand
));
1229 if (FAILED_UNEXPECTEDLY(hResult
))
1234 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1235 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1236 if (FAILED_UNEXPECTEDLY(hResult
))
1242 CComPtr
<IBandSite
> pBandSite
;
1244 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &pBandSite
));
1245 if (!SUCCEEDED(hResult
))
1247 ERR("Can't get IBandSite interface\n");
1250 hResult
= pBandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IUnknown
, &newBand
));
1251 if (!SUCCEEDED(hResult
))
1253 ERR("Can't find band object\n");
1257 // It's hackish, but we should be able to show the wanted band until we
1258 // find the proper way to do this (but it seems to work to add a new band)
1259 // Here we'll just re-add the existing band to the site, causing it to display.
1261 V_VT(&vaIn
) = VT_UNKNOWN
;
1262 V_UNKNOWN(&vaIn
) = newBand
.p
;
1263 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1264 if (FAILED_UNEXPECTEDLY(hResult
))
1269 hResult
= dockingWindow
->ShowDW(TRUE
);
1270 if (FAILED_UNEXPECTEDLY(hResult
))
1276 HRESULT
CShellBrowser::NavigateToParent()
1278 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1279 if (newDirectory
== NULL
)
1280 return E_OUTOFMEMORY
;
1281 if (_ILIsDesktop(newDirectory
))
1283 ILFree(newDirectory
);
1284 return E_INVALIDARG
;
1286 ILRemoveLastID(newDirectory
);
1287 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1288 ILFree(newDirectory
);
1289 if (FAILED_UNEXPECTEDLY(hResult
))
1294 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1296 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1297 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1299 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1300 sheetInfo
->nPages
++;
1304 HRESULT
CShellBrowser::DoFolderOptions()
1306 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1307 PROPSHEETHEADER m_PropSheet
;
1308 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1309 // CComPtr<IGlobalFolderSettings> globalSettings;
1310 // SHELLSTATE2 shellState;
1313 memset(m_psp
, 0, sizeof(m_psp
));
1314 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1316 // create sheet object
1317 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1318 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1319 if (FAILED_UNEXPECTEDLY(hResult
))
1322 // must set site in order for Apply to all Folders on Advanced page to be enabled
1323 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1324 m_PropSheet
.phpage
= m_psp
;
1327 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1328 if (FAILED_UNEXPECTEDLY(hResult
))
1330 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1331 if (FAILED_UNEXPECTEDLY(hResult
))
1336 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1337 if (FAILED_UNEXPECTEDLY(hResult
))
1340 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1341 // It returns 'E_NOTIMPL'
1343 if (fCurrentShellView
!= NULL
)
1345 hResult
= fCurrentShellView
->AddPropertySheetPages(
1346 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1347 if (FAILED_UNEXPECTEDLY(hResult
))
1353 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1354 m_PropSheet
.dwFlags
= 0;
1355 m_PropSheet
.hwndParent
= m_hWnd
;
1356 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1357 m_PropSheet
.pszCaption
= _T("Folder Options");
1358 m_PropSheet
.nStartPage
= 0;
1359 PropertySheet(&m_PropSheet
);
1363 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1365 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1366 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1368 const _ATL_MSG
*previousMessage
;
1370 WNDPROC saveWindowProc
;
1373 hWnd
= pThis
->m_hWnd
;
1374 previousMessage
= pThis
->m_pCurrentMsg
;
1375 pThis
->m_pCurrentMsg
= &msg
;
1377 /* If the shell browser is initialized, let the menu band preprocess the messages */
1378 if (pThis
->fCurrentDirectoryPIDL
)
1380 CComPtr
<IMenuBand
> menuBand
;
1381 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1382 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1384 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1385 if (hResult
== S_OK
)
1388 wParam
= msg
.wParam
;
1389 lParam
= msg
.lParam
;
1394 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1395 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1396 if (handled
== FALSE
)
1398 if (uMsg
== WM_NCDESTROY
)
1400 saveWindowProc
= reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1401 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1402 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1403 ::SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1404 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1407 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1409 pThis
->m_pCurrentMsg
= previousMessage
;
1410 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1412 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1413 pThis
->m_hWnd
= NULL
;
1414 pThis
->OnFinalMessage(hWnd
);
1419 void CShellBrowser::RepositionBars()
1425 GetClientRect(&clientRect
);
1427 if (fStatusBarVisible
&& fStatusBar
)
1429 ::GetWindowRect(fStatusBar
, &statusRect
);
1430 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1431 clientRect
.right
- clientRect
.left
,
1432 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1433 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1436 for (x
= 0; x
< 3; x
++)
1438 HWND hwnd
= fClientBars
[x
].hwnd
;
1439 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1440 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1442 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1443 fClientBars
[x
].hwnd
= hwnd
;
1447 RECT toolbarRect
= clientRect
;
1448 if (borderSpace
.top
!= 0)
1450 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1452 else if (borderSpace
.bottom
!= 0)
1454 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1456 else if (borderSpace
.left
!= 0)
1458 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1460 else if (borderSpace
.right
!= 0)
1462 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1465 ::SetWindowPos(hwnd
, NULL
,
1468 toolbarRect
.right
- toolbarRect
.left
,
1469 toolbarRect
.bottom
- toolbarRect
.top
,
1470 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1472 if (borderSpace
.top
!= 0)
1474 clientRect
.top
= toolbarRect
.bottom
;
1476 else if (borderSpace
.bottom
!= 0)
1478 clientRect
.bottom
= toolbarRect
.top
;
1480 else if (borderSpace
.left
!= 0)
1482 clientRect
.left
= toolbarRect
.right
;
1484 else if (borderSpace
.right
!= 0)
1486 clientRect
.right
= toolbarRect
.left
;
1490 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1491 clientRect
.right
- clientRect
.left
,
1492 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1495 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1498 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1499 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1502 params
.rgvarg
= arguments
;
1503 params
.rgdispidNamedArgs
= NULL
;
1504 params
.cArgs
= argCount
;
1505 params
.cNamedArgs
= 0;
1506 IUnknown
** pp
= vec
.begin();
1507 while (pp
< vec
.end())
1511 CComPtr
<IDispatch
> theDispatch
;
1513 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1514 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1519 while (pp
< vec2
.end())
1523 CComPtr
<IDispatch
> theDispatch
;
1525 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1526 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1533 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1535 // these two variants intentionally to do use CComVariant because it would double free/release
1536 // or does not need to dispose at all
1539 CComBSTR
tempString(newDirectory
);
1541 V_VT(&varArgs
) = VT_BSTR
;
1542 V_BSTR(&varArgs
) = tempString
.m_str
;
1544 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1545 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1546 V_VT(&varArg
[1]) = VT_DISPATCH
;
1547 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1549 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1552 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1556 V_VT(&varArg
[0]) = VT_BOOL
;
1557 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1558 V_VT(&varArg
[1]) = VT_I4
;
1559 V_I4(&varArg
[1]) = commandID
;
1561 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1564 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1566 return FireCommandStateChange(false, -1);
1569 HRESULT
CShellBrowser::UpdateForwardBackState()
1571 CComPtr
<ITravelLog
> travelLog
;
1572 CComPtr
<ITravelEntry
> unusedEntry
;
1578 canGoForward
= false;
1579 hResult
= GetTravelLog(&travelLog
);
1580 if (FAILED_UNEXPECTEDLY(hResult
))
1582 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1583 if (SUCCEEDED(hResult
))
1586 unusedEntry
.Release();
1588 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1589 if (SUCCEEDED(hResult
))
1591 canGoForward
= true;
1592 unusedEntry
.Release();
1594 hResult
= FireCommandStateChange(canGoBack
, 2);
1595 hResult
= FireCommandStateChange(canGoForward
, 1);
1599 HRESULT
CShellBrowser::UpdateUpState()
1605 if (_ILIsDesktop(fCurrentDirectoryPIDL
))
1607 hResult
= FireCommandStateChange(canGoUp
, 3);
1611 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1613 CComPtr
<ITravelLog
> travelLog
;
1614 CComPtr
<ITravelEntry
> unusedEntry
;
1616 MENUITEMINFO menuItemInfo
;
1619 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1621 position
= GetMenuItemCount(theMenu
);
1622 hResult
= GetTravelLog(&travelLog
);
1623 if (FAILED_UNEXPECTEDLY(hResult
))
1626 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1630 if (SUCCEEDED(hResult
))
1632 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, TRUE
);
1633 unusedEntry
.Release();
1636 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, FALSE
);
1638 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1642 if (SUCCEEDED(hResult
))
1644 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, TRUE
);
1645 unusedEntry
.Release();
1648 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, FALSE
);
1650 SHEnableMenuItem(theMenu
,
1651 IDM_GOTO_UPONELEVEL
,
1652 !_ILIsDesktop(fCurrentDirectoryPIDL
));
1654 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1655 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1656 if (SUCCEEDED(hResult
))
1658 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1659 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1660 menuItemInfo
.fType
= MF_SEPARATOR
;
1661 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1662 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1666 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1668 CComPtr
<ITravelLog
> travelLog
;
1670 OLECMD commandList
[5];
1671 HMENU toolbarMenuBar
;
1673 MENUITEMINFO menuItemInfo
;
1676 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1677 if (gotoMenu
!= NULL
)
1678 UpdateGotoMenu(gotoMenu
);
1680 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1681 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1682 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1683 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1684 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1686 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1687 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1688 if (FAILED_UNEXPECTEDLY(hResult
))
1689 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1692 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1693 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1694 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1695 DestroyMenu(menuItemInfo
.hSubMenu
);
1697 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1698 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1699 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1700 DestroyMenu(toolbarMenuBar
);
1703 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1704 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1705 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1706 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1708 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1709 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1710 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1711 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1712 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1713 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1714 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1715 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1717 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1718 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1719 menuItemInfo
.hSubMenu
= toolbarMenu
;
1720 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1722 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1725 HRESULT
CShellBrowser::BuildExplorerBandMenu()
1730 hBandsMenu
= SHGetMenuFromID(fCurrentMenuBar
, IDM_VIEW_EXPLORERBAR
);
1733 OutputDebugString(L
"No menu !\n");
1736 DSA_DeleteAllItems(menuDsa
);
1737 BuildExplorerBandCategory(hBandsMenu
, CATID_InfoBand
, 4, NULL
);
1738 BuildExplorerBandCategory(hBandsMenu
, CATID_CommBand
, 20, &nbFound
);
1742 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_SEPARATOR
, MF_BYCOMMAND
);
1744 // Remove media menu since XP does it (according to API Monitor)
1745 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_MEDIA
, MF_BYCOMMAND
);
1749 HRESULT
CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
)
1752 CComPtr
<IEnumGUID
> pEnumGUID
;
1753 WCHAR wszBandName
[MAX_PATH
];
1754 WCHAR wszBandGUID
[MAX_PATH
];
1755 WCHAR wRegKey
[MAX_PATH
];
1762 mbi
.fVertical
= IsEqualGUID(category
, CATID_InfoBand
);
1764 hr
= SHEnumClassesOfCategories(1, &category
, 0, NULL
, &pEnumGUID
);
1765 if (FAILED_UNEXPECTEDLY(hr
))
1771 pEnumGUID
->Next(1, &iter
, &dwRead
);
1774 // Get the band name
1775 if (IsBuiltinBand(iter
))
1777 if (!StringFromGUID2(iter
, wszBandGUID
, MAX_PATH
))
1779 StringCchPrintfW(wRegKey
, MAX_PATH
, L
"CLSID\\%s", wszBandGUID
);
1780 dwDataSize
= MAX_PATH
;
1781 SHGetValue(HKEY_CLASSES_ROOT
, wRegKey
, NULL
, NULL
, wszBandName
, &dwDataSize
);
1784 InsertMenu(hBandsMenu
, dwPos
+ cBands
, MF_BYPOSITION
, IDM_EXPLORERBAND_BEGINCUSTOM
+ DSA_GetItemCount(menuDsa
), wszBandName
);
1785 DSA_AppendItem(menuDsa
, &mbi
);
1795 BOOL
CShellBrowser::IsBuiltinBand(CLSID
&bandID
)
1797 if (IsEqualCLSID(bandID
, CLSID_ExplorerBand
))
1799 if (IsEqualCLSID(bandID
, CLSID_SH_SearchBand
) || IsEqualCLSID(bandID
, CLSID_SearchBand
))
1801 if (IsEqualCLSID(bandID
, CLSID_IE_SearchBand
) || IsEqualCLSID(bandID
, CLSID_FileSearchBand
))
1803 if (IsEqualCLSID(bandID
, CLSID_SH_HistBand
))
1805 if (IsEqualCLSID(bandID
, CLSID_SH_FavBand
))
1807 if (IsEqualCLSID(bandID
, CLSID_ChannelsBand
))
1812 HRESULT
CShellBrowser::OnSearch()
1814 CComPtr
<IObjectWithSite
> objectWithSite
;
1815 CComPtr
<IContextMenu
> contextMenu
;
1816 CMINVOKECOMMANDINFO commandInfo
;
1817 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1820 // TODO: Query shell if this command is enabled first
1822 memset(&commandInfo
, 0, sizeof(commandInfo
));
1823 commandInfo
.cbSize
= sizeof(commandInfo
);
1824 commandInfo
.hwnd
= m_hWnd
;
1825 commandInfo
.lpParameters
= searchGUID
;
1826 commandInfo
.nShow
= SW_SHOWNORMAL
;
1828 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1829 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1830 if (FAILED_UNEXPECTEDLY(hResult
))
1832 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1833 if (FAILED_UNEXPECTEDLY(hResult
))
1835 hResult
= objectWithSite
->SetSite(dynamic_cast<IShellBrowser
*>(this));
1836 if (FAILED_UNEXPECTEDLY(hResult
))
1838 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1839 hResult
= objectWithSite
->SetSite(NULL
);
1843 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1845 CComPtr
<IUnknown
> int1Retry
;
1846 CComPtr
<IUnknown
> int2Retry
;
1851 if (int1
== NULL
|| int2
== NULL
)
1853 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1854 if (FAILED_UNEXPECTEDLY(hResult
))
1856 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1857 if (FAILED_UNEXPECTEDLY(hResult
))
1859 if (int1Retry
== int2Retry
)
1864 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1866 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1868 RECT availableBounds
;
1870 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1871 for (INT x
= 0; x
< 3; x
++)
1873 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1875 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1876 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1877 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1878 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1881 *prcBorder
= availableBounds
;
1885 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1890 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1892 for (INT x
= 0; x
< 3; x
++)
1894 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1896 fClientBars
[x
].borderSpace
= *pbw
;
1897 // if this bar changed size, it cascades and forces all subsequent bars to resize
1902 return E_INVALIDARG
;
1905 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1906 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1908 CComPtr
<IOleCommandTarget
> commandTarget
;
1911 if (prgCmds
== NULL
)
1912 return E_INVALIDARG
;
1913 if (pguidCmdGroup
== NULL
)
1915 if (fCurrentShellView
.p
!= NULL
)
1917 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1918 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1919 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1928 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1932 switch (prgCmds
->cmdID
)
1934 case 0x1c: // search
1935 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1937 case 0x1d: // history
1938 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1940 case 0x1e: // favorites
1941 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1943 case 0x23: // folders
1944 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1954 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1958 switch (prgCmds
->cmdID
)
1960 case 0xa022: // up level
1961 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1962 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1963 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1973 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1974 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1980 TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
1983 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1988 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1991 if (nCmdexecopt
== 1)
1993 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1997 // update zones part of the status bar
2000 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
2001 V_VT(pvaOut
) = VT_INT_PTR
;
2002 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
2003 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
2006 // indicate if this cabinet was opened as a browser
2012 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
2021 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
2026 // what is theater mode and why do we receive this?
2030 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
2035 // initialize favorites menu
2039 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
2044 // refresh on toolbar clicked
2047 // called for unknown bands ?
2050 // tell the view if it should hide the task pane or not
2051 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
2054 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
2059 return NavigateToParent();
2062 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
2067 return DoFolderOptions();
2070 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
2075 // Reset All Folders option in Folder Options
2079 else if (IsEqualIID(*pguidCmdGroup
, CLSID_CommonButtons
))
2081 // Windows seems to use this as proxy for toolbar buttons.
2082 // We use it for search band for now to remove code duplication,
2083 // let's see if it could be useful in the future.
2087 // Show search band from toolbar
2100 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
2108 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
2113 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2115 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2117 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
2119 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
2122 DestroyMenu(mainMenu
);
2124 lpMenuWidths
->width
[0] = 2;
2125 lpMenuWidths
->width
[2] = 3;
2126 lpMenuWidths
->width
[4] = 1;
2130 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
2132 CComPtr
<IShellMenu
> shellMenu
;
2135 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
2137 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
2138 if (FAILED_UNEXPECTEDLY(hResult
))
2143 hmenuShared
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2145 // FIXME: Figure out the proper way to do this.
2146 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
2149 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
2152 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
2153 if (FAILED_UNEXPECTEDLY(hResult
))
2155 fCurrentMenuBar
= hmenuShared
;
2156 BuildExplorerBandMenu();
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
2162 if (hmenuShared
== fCurrentMenuBar
)
2164 //DestroyMenu(fCurrentMenuBar);
2165 SetMenuSB(NULL
, NULL
, NULL
);
2170 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
2175 ::SetWindowText(fStatusBar
, pszStatusText
);
2184 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
2189 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
2191 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
2196 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
2198 if ((wFlags
& SBSP_EXPLOREMODE
) != NULL
)
2199 ShowBand(CLSID_ExplorerBand
, true);
2201 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2204 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
2209 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
2217 *lphwnd
= fToolbarProxy
.m_hWnd
;
2220 *lphwnd
= fStatusBar
;
2223 // find the directory browser and return it
2224 // this should be used only to determine if a tree is present
2227 // is this a progress dialog?
2233 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
2234 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
2243 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
2248 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
2256 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
2260 *ppshv
= fCurrentShellView
;
2261 if (fCurrentShellView
.p
!= NULL
)
2262 fCurrentShellView
.p
->AddRef();
2266 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2271 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2276 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2277 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2282 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2292 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2293 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2298 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2300 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2301 // the returned interface has a method GetPropertyBag on it
2302 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2303 return this->QueryInterface(riid
, ppvObject
);
2304 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2305 return this->QueryInterface(riid
, ppvObject
);
2306 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2307 return this->QueryInterface(riid
, ppvObject
);
2308 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2309 return this->QueryInterface(riid
, ppvObject
);
2310 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2311 return this->QueryInterface(riid
, ppvObject
);
2312 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2313 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2314 if (IsEqualIID(riid
, IID_IShellBrowser
))
2315 return this->QueryInterface(riid
, ppvObject
);
2316 return E_NOINTERFACE
;
2319 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2321 if (ppvObject
== NULL
)
2327 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2332 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2337 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2338 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2343 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2344 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2349 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2354 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2359 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2364 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2369 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2373 // called by toolbar when displaying tooltips
2378 if (fTravelLog
.p
== NULL
)
2380 hResult
= CTravelLog_CreateInstance(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2381 if (FAILED_UNEXPECTEDLY(hResult
))
2384 *pptl
= fTravelLog
.p
;
2385 fTravelLog
.p
->AddRef();
2389 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2394 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2399 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2404 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2409 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2414 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2419 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2424 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2429 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2434 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2439 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2444 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2449 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2454 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2459 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2461 // called by explorer bar to get current pidl
2464 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2468 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2473 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2478 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2483 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2485 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2486 return E_INVALIDARG
;
2487 *ppole
= fHistoryObject
;
2488 if (fHistoryObject
!= NULL
)
2489 fHistoryObject
->AddRef();
2490 *pstm
= fHistoryStream
;
2491 if (fHistoryStream
!= NULL
)
2492 fHistoryStream
->AddRef();
2493 *ppbc
= fHistoryBindContext
;
2494 if (fHistoryBindContext
!= NULL
)
2495 fHistoryBindContext
->AddRef();
2496 fHistoryObject
= NULL
;
2497 fHistoryStream
= NULL
;
2498 fHistoryBindContext
= NULL
;
2504 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2509 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2514 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2519 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2520 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2525 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2530 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2535 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2540 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2545 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2550 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2555 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2557 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2561 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2566 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2571 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2576 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2581 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2586 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2591 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2596 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2597 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2602 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2607 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2612 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2617 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2622 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2627 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2632 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2637 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2642 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2647 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2652 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2657 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2662 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2667 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2672 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2677 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2682 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2687 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2692 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2697 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2702 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2707 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2708 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2713 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2714 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2719 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2724 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2729 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2734 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2739 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2744 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2749 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2754 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2759 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2764 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2769 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2774 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2779 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2784 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2789 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2794 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2799 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2804 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2809 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2814 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2815 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2820 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2825 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2830 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2835 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2837 for (int i
= 0; i
< 3; i
++)
2839 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2843 if (!fCurrentShellView
)
2846 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2849 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2854 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2859 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2861 CComPtr
<ITravelLog
> travelLog
;
2862 HRESULT hResult
= GetTravelLog(&travelLog
);
2863 if (FAILED_UNEXPECTEDLY(hResult
))
2865 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2868 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2870 CComPtr
<ITravelLog
> travelLog
;
2871 HRESULT hResult
= GetTravelLog(&travelLog
);
2872 if (FAILED_UNEXPECTEDLY(hResult
))
2874 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2877 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2882 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2887 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2888 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2890 CComHeapPtr
<ITEMIDLIST
> pidl
;
2892 CComPtr
<IShellFolder
> pDesktop
;
2894 hResult
= SHGetDesktopFolder(&pDesktop
);
2895 if (FAILED_UNEXPECTEDLY(hResult
))
2897 hResult
= pDesktop
->ParseDisplayName(NULL
, NULL
, URL
, NULL
, &pidl
, NULL
);
2898 if (FAILED_UNEXPECTEDLY(hResult
))
2900 return BrowseObject(pidl
, 1);
2903 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2907 V_VT(&level
) = VT_I4
;
2909 return Refresh2(&level
);
2912 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2914 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2917 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2918 if (FAILED_UNEXPECTEDLY(hResult
))
2920 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2923 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2928 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2933 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2938 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2943 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2948 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2953 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2960 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2965 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2970 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2975 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2980 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2985 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2990 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2995 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
3002 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
3007 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
3012 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
3017 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
3022 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
3027 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
3032 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
3037 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
3042 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
3047 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
3052 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
3057 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
3062 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
3067 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
3072 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
3077 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
3082 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
3087 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
3092 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
3097 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
3102 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
3107 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
3112 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
3117 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
3118 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
3120 LPITEMIDLIST pidl
= NULL
;
3122 // called from drive combo box to navigate to a directory
3123 // Also called by search band to display shell results folder view
3125 if (V_VT(URL
) == VT_BSTR
)
3127 return this->Navigate(V_BSTR(URL
), Flags
, TargetFrameName
, PostData
, Headers
);
3129 if (V_VT(URL
) == (VT_ARRAY
| VT_UI1
))
3131 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
3132 return E_INVALIDARG
;
3134 pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
3136 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
3137 if (FAILED_UNEXPECTEDLY(hResult
))
3142 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
3147 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
3148 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3153 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
3158 // called to show search bar
3159 if (V_VT(pvaClsid
) != VT_BSTR
)
3160 return E_INVALIDARG
;
3161 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
3162 // TODO: properly compute the value of vertical
3164 return ShowBand(classID
, vertical
);
3167 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
3172 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
3177 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
3182 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
3187 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
3192 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
3197 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
3202 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
3207 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
3212 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
3217 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
3222 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
3227 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
3232 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
3237 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
3242 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
3247 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
3249 if (pWinData
== NULL
)
3252 pWinData
->dwWindowID
= -1;
3254 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
3255 pWinData
->lpszUrl
= NULL
;
3256 pWinData
->lpszUrlLocation
= NULL
;
3257 pWinData
->lpszTitle
= NULL
;
3261 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
3266 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
3271 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
3273 CComPtr
<IPersistHistory
> viewPersistHistory
;
3274 CComPtr
<IOleObject
> viewHistoryObject
;
3275 persistState oldState
;
3280 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
3281 if (FAILED_UNEXPECTEDLY(hResult
))
3283 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3285 if (oldState
.browseType
!= 2)
3287 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3289 return E_OUTOFMEMORY
;
3290 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3291 if (FAILED_UNEXPECTEDLY(hResult
))
3296 if (numRead
!= oldState
.pidlSize
)
3301 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3302 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3303 fHistoryObject
= viewHistoryObject
;
3304 fHistoryStream
= pStream
;
3305 fHistoryBindContext
= pbc
;
3306 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3307 fHistoryObject
= NULL
;
3308 fHistoryStream
= NULL
;
3309 fHistoryBindContext
= NULL
;
3311 if (FAILED_UNEXPECTEDLY(hResult
))
3316 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3318 CComPtr
<IPersistHistory
> viewPersistHistory
;
3319 persistState newState
;
3322 hResult
= fCurrentShellView
->GetItemObject(
3323 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3324 memset(&newState
, 0, sizeof(newState
));
3325 newState
.dwSize
= sizeof(newState
);
3326 newState
.browseType
= 2;
3327 newState
.browserIndex
= GetBrowserIndex();
3328 if (viewPersistHistory
.p
!= NULL
)
3330 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3331 if (FAILED_UNEXPECTEDLY(hResult
))
3334 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3335 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3336 if (FAILED_UNEXPECTEDLY(hResult
))
3338 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3339 if (FAILED_UNEXPECTEDLY(hResult
))
3341 if (viewPersistHistory
.p
!= NULL
)
3343 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3344 if (FAILED_UNEXPECTEDLY(hResult
))
3350 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3355 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3360 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3362 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3366 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3370 /* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
3371 OleFlushClipboard();
3373 // TODO: rip down everything
3375 fToolbarProxy
.Destroy();
3377 fCurrentShellView
->DestroyViewWindow();
3378 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3380 for (int i
= 0; i
< 3; i
++)
3382 CComPtr
<IDockingWindow
> pdw
;
3383 CComPtr
<IDeskBar
> bar
;
3384 CComPtr
<IUnknown
> pBarSite
;
3385 CComPtr
<IDeskBarClient
> pClient
;
3387 if (fClientBars
[i
].clientBar
== NULL
)
3390 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3391 if (FAILED_UNEXPECTEDLY(hr
))
3394 /* We should destroy our basebarsite too */
3395 hr
= pdw
->QueryInterface(IID_PPV_ARG(IDeskBar
, &bar
));
3398 hr
= bar
->GetClient(&pBarSite
);
3399 if (SUCCEEDED(hr
) && pBarSite
)
3401 hr
= pBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &pClient
));
3403 pClient
->SetDeskBarSite(NULL
);
3412 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3414 ReleaseCComPtrExpectZero(fCurrentShellView
);
3415 ReleaseCComPtrExpectZero(fTravelLog
);
3417 fCurrentShellFolder
.Release();
3418 ILFree(fCurrentDirectoryPIDL
);
3419 ::DestroyWindow(fStatusBar
);
3420 DestroyMenu(fCurrentMenuBar
);
3426 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3428 CComPtr
<IDockingWindow
> dockingWindow
;
3429 RECT availableBounds
;
3430 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3433 if (wParam
!= SIZE_MINIMIZED
)
3435 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3436 for (INT x
= 0; x
< 3; x
++)
3438 if (fClientBars
[x
].clientBar
!= NULL
)
3440 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3441 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3442 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3444 hResult
= dockingWindow
->ResizeBorderDW(
3445 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3455 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3458 LPARAM menuIndex
= lParam
;
3460 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3462 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3466 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3470 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3472 UpdateViewMenu(theMenu
);
3475 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3479 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3481 // FIXME: Remove once implemented
3482 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3483 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3484 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3485 FIXME("Folder options dialog is stubbed: CORE-11141\n");
3486 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
); // Remove when CORE-11141 is fixed.
3489 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3494 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3499 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3501 ::SetFocus(fCurrentShellViewWindow
);
3505 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3507 if (fCurrentShellViewWindow
!= NULL
)
3508 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3512 LRESULT
CShellBrowser::PropagateMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3514 SHPropagateMessage(m_hWnd
, uMsg
, wParam
, lParam
, TRUE
);
3518 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3520 return SendMessage(WM_CLOSE
);
3523 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3525 HRESULT hResult
= DoFolderOptions();
3526 if (FAILED(hResult
))
3527 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3531 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3534 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3535 #endif /* __REACTOS__ */
3539 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3542 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3543 #endif /* __REACTOS__ */
3547 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3549 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3553 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3555 HRESULT hResult
= GoBack();
3556 if (FAILED(hResult
))
3557 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3561 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3563 HRESULT hResult
= GoForward();
3564 if (FAILED(hResult
))
3565 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3569 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3571 HRESULT hResult
= NavigateToParent();
3572 if (FAILED(hResult
))
3573 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3577 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3579 HRESULT hResult
= GoHome();
3580 if (FAILED(hResult
))
3581 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3585 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3587 // FIXME: This does not appear to be what windows does.
3588 HRESULT hResult
= NavigateToParent();
3589 if (FAILED(hResult
))
3590 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3594 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3596 CComPtr
<IShellFolder
> psfDesktop
;
3597 LPITEMIDLIST pidlFavs
;
3599 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3602 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3607 hr
= SHGetDesktopFolder(&psfDesktop
);
3608 if (FAILED_UNEXPECTEDLY(hr
))
3611 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3612 if (FAILED_UNEXPECTEDLY(hr
))
3618 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3620 fStatusBarVisible
= !fStatusBarVisible
;
3623 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3629 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3632 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3633 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3637 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3640 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3641 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3645 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3648 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3649 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3653 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3656 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3657 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3661 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3664 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3665 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3669 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3672 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3673 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3677 LRESULT
CShellBrowser::OnRefresh(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3679 if (fCurrentShellView
)
3680 fCurrentShellView
->Refresh();
3684 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3689 LRESULT
CShellBrowser::OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3691 // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3692 if (wID
>= IDM_EXPLORERBAND_BEGINCUSTOM
&& wID
<= IDM_EXPLORERBAND_ENDCUSTOM
)
3695 mbi
= (MenuBandInfo
*)DSA_GetItemPtr(menuDsa
, (wID
- IDM_EXPLORERBAND_BEGINCUSTOM
));
3698 ShowBand(mbi
->barGuid
, mbi
->fVertical
);
3704 case IDM_EXPLORERBAR_SEARCH
:
3705 Exec(&CLSID_CommonButtons
, 0x123, 1, NULL
, NULL
);
3707 case IDM_EXPLORERBAR_FOLDERS
:
3708 ShowBand(CLSID_ExplorerBand
, true);
3710 case IDM_EXPLORERBAR_HISTORY
:
3711 ShowBand(CLSID_SH_HistBand
, true);
3713 case IDM_EXPLORERBAR_FAVORITES
:
3714 ShowBand(CLSID_SH_FavBand
, true);
3717 WARN("Unknown id %x\n", wID
);
3723 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3725 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3726 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3730 HRESULT
CShellBrowser_CreateInstance(LPITEMIDLIST pidl
, DWORD dwFlags
, REFIID riid
, void **ppv
)
3732 return ShellObjectCreatorInit
<CShellBrowser
>(pidl
, dwFlags
, riid
, ppv
);