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
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
597 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
598 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
599 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
600 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
601 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
602 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
603 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
604 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
605 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
606 LRESULT
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
607 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
608 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
609 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
610 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
611 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
612 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
613 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
614 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
615 LRESULT
OnRefresh(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
616 LRESULT
OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
617 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
620 static ATL::CWndClassInfo
& GetWndClassInfo()
622 static ATL::CWndClassInfo wc
=
624 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
625 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
626 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
627 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
632 BEGIN_MSG_MAP(CShellBrowser
)
633 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
634 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
635 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
636 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
637 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
638 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
639 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
640 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
641 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
642 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
643 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
644 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
645 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
646 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
647 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
648 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
649 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
650 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
651 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
652 COMMAND_ID_HANDLER(IDM_VIEW_REFRESH
, OnRefresh
)
653 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
654 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
655 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
656 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
657 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
658 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
659 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH
, OnExplorerBar
)
660 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS
, OnExplorerBar
)
661 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY
, OnExplorerBar
)
662 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES
, OnExplorerBar
)
663 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
664 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
665 COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM
, IDM_EXPLORERBAND_ENDCUSTOM
, OnExplorerBar
)
666 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
669 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
670 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
671 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
672 END_CONNECTION_POINT_MAP()
674 BEGIN_COM_MAP(CShellBrowser
)
675 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
676 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
677 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
678 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
679 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
680 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
681 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
682 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
683 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
684 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
685 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
686 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
687 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
688 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
689 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
690 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
691 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
692 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
696 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
698 CShellBrowser::CShellBrowser()
700 fCurrentShellViewWindow
= NULL
;
701 fCurrentDirectoryPIDL
= NULL
;
703 fStatusBarVisible
= true;
704 memset(fClientBars
, 0, sizeof(fClientBars
));
705 fCurrentMenuBar
= NULL
;
706 fHistoryObject
= NULL
;
707 fHistoryStream
= NULL
;
708 fHistoryBindContext
= NULL
;
711 CShellBrowser::~CShellBrowser()
714 DSA_Destroy(menuDsa
);
717 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, DWORD dwFlags
)
719 CComPtr
<IPersistStreamInit
> persistStreamInit
;
721 CComPtr
<IUnknown
> clientBar
;
723 _AtlInitialConstruct();
725 menuDsa
= DSA_Create(sizeof(MenuBandInfo
), 5);
727 return E_OUTOFMEMORY
;
729 fCabinetState
.cLength
= sizeof(fCabinetState
);
730 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
735 Create(HWND_DESKTOP
);
739 hResult
= CInternetToolbar_CreateInstance(IID_PPV_ARG(IUnknown
, &clientBar
));
740 if (FAILED_UNEXPECTEDLY(hResult
))
743 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
746 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
747 if (FAILED_UNEXPECTEDLY(hResult
))
750 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
751 if (FAILED_UNEXPECTEDLY(hResult
))
754 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
755 if (FAILED_UNEXPECTEDLY(hResult
))
758 // TODO: create settingsStream from registry entry
759 //if (settingsStream.p)
761 // hResult = persistStreamInit->Load(settingsStream);
762 // if (FAILED_UNEXPECTEDLY(hResult))
767 hResult
= persistStreamInit
->InitNew();
768 if (FAILED_UNEXPECTEDLY(hResult
))
772 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
773 if (FAILED_UNEXPECTEDLY(hResult
))
776 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
780 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
781 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
782 _AtlBaseModule
.GetModuleInstance(), 0);
783 fStatusBarVisible
= true;
787 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
788 if (FAILED_UNEXPECTEDLY(hResult
))
791 if ((dwFlags
& SBSP_EXPLOREMODE
) != NULL
)
792 ShowBand(CLSID_ExplorerBand
, true);
794 ShowWindow(SW_SHOWNORMAL
);
799 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
801 CComPtr
<IShellFolder
> newFolder
;
802 FOLDERSETTINGS newFolderSettings
;
805 // called by shell view to browse to new folder
806 // also called by explorer band to navigate to new folder
807 hResult
= SHBindToFolder(pidl
, &newFolder
);
808 if (FAILED_UNEXPECTEDLY(hResult
))
811 newFolderSettings
.ViewMode
= FVM_ICON
;
812 newFolderSettings
.fFlags
= 0;
813 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
814 if (FAILED_UNEXPECTEDLY(hResult
))
819 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
821 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
824 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
826 LPCITEMIDLIST pidlnext
;
831 if (! _ILIsDesktop(pidl
))
833 length
= pidl
->mkid
.cb
;
835 reinterpret_cast<LPCITEMIDLIST
>(
836 reinterpret_cast<const BYTE
*>(pidl
) + length
);
837 if (pidlnext
->mkid
.cb
!= 0)
843 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
844 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
846 CComPtr
<IShellFolder
> psf
;
847 LPITEMIDLIST pidlChild
;
848 LPITEMIDLIST pidlParent
;
855 if (ppidlLast
!= NULL
)
857 if (_ILIsPidlSimple(pidl
))
859 if (ppidlLast
!= NULL
)
860 *ppidlLast
= ILClone(pidl
);
861 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
865 pidlChild
= ILClone(ILFindLastID(pidl
));
866 pidlParent
= ILClone(pidl
);
867 ILRemoveLastID(pidlParent
);
868 hResult
= SHGetDesktopFolder(&psf
);
869 if (SUCCEEDED(hResult
))
870 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
871 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
872 *ppidlLast
= pidlChild
;
880 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
881 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
883 CComPtr
<IShellFolder
> parentFolder
;
884 LPITEMIDLIST childPIDL
= NULL
;
888 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
892 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
896 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
899 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
912 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
914 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
917 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
918 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
920 CComPtr
<IObjectWithSite
> objectWithSite
;
921 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
922 CComPtr
<IShellView
> saveCurrentShellView
;
923 CComPtr
<IShellView
> newShellView
;
924 CComPtr
<ITravelLog
> travelLog
;
925 HWND newShellViewWindow
;
926 BOOL windowUpdateIsLocked
;
927 RECT shellViewWindowBounds
;
930 wchar_t newTitle
[MAX_PATH
];
934 if (newShellFolder
== NULL
)
937 hResult
= GetTravelLog(&travelLog
);
938 if (FAILED_UNEXPECTEDLY(hResult
))
942 if (flags
& BTP_UPDATE_CUR_HISTORY
)
944 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
945 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
946 // what to do with error? Do we want to halt browse because state save failed?
949 if (fCurrentShellView
)
951 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
954 // create view object
955 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
956 if (FAILED_UNEXPECTEDLY(hResult
))
958 previousView
= fCurrentShellViewWindow
;
960 // enter updating section
961 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
962 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
963 if (fCurrentShellView
!= NULL
)
964 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
967 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
969 // update folder and view
970 saveCurrentShellFolder
= fCurrentShellFolder
;
971 saveCurrentShellView
= fCurrentShellView
;
972 fCurrentShellFolder
= newShellFolder
;
973 fCurrentShellView
= newShellView
;
976 if (previousView
!= NULL
)
977 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
979 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
980 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
982 // create view window
983 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
984 this, &shellViewWindowBounds
, &newShellViewWindow
);
985 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
987 fCurrentShellView
= saveCurrentShellView
;
988 fCurrentShellFolder
= saveCurrentShellFolder
;
989 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
990 if (windowUpdateIsLocked
)
991 LockWindowUpdate(FALSE
);
992 SetCursor(saveCursor
);
996 if (objectWithSite
.p
!= NULL
)
997 hResult
= objectWithSite
->SetSite(NULL
);
999 // update current pidl
1000 ILFree(fCurrentDirectoryPIDL
);
1001 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1003 // update view window
1004 if (saveCurrentShellView
!= NULL
)
1005 saveCurrentShellView
->DestroyViewWindow();
1006 fCurrentShellViewWindow
= newShellViewWindow
;
1009 saveCurrentShellView
.Release();
1010 saveCurrentShellFolder
.Release();
1012 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1014 // leave updating section
1015 if (windowUpdateIsLocked
)
1016 LockWindowUpdate(FALSE
);
1017 SetCursor(saveCursor
);
1020 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1022 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1023 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1027 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1028 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1029 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1030 if (SUCCEEDED(hResult
))
1032 FireNavigateComplete(newTitle
);
1036 FireNavigateComplete(L
"ERROR");
1039 if (fCabinetState
.fFullPathTitle
)
1040 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1042 nameFlags
= SHGDN_FORADDRESSBAR
;
1043 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1044 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1045 if (SUCCEEDED(hResult
))
1047 SetWindowText(newTitle
);
1049 LPCITEMIDLIST pidlChild
;
1050 INT index
, indexOpen
;
1051 HIMAGELIST himlSmall
, himlLarge
;
1053 CComPtr
<IShellFolder
> sf
;
1054 hResult
= SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1055 if (SUCCEEDED(hResult
))
1057 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1059 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1061 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1062 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1064 /* Hack to make it possible to release the old icons */
1065 /* Something seems to go wrong with WM_SETICON */
1066 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1067 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1069 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1070 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1072 DestroyIcon(oldSmall
);
1073 DestroyIcon(oldLarge
);
1077 FireCommandStateChangeAll();
1078 hResult
= UpdateForwardBackState();
1079 hResult
= UpdateUpState();
1083 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1085 CComPtr
<IBandSite
> bandSite
;
1086 CComPtr
<IDeskBand
> deskBand
;
1089 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1092 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1093 if (FAILED_UNEXPECTEDLY(hResult
))
1096 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1097 if (FAILED_UNEXPECTEDLY(hResult
))
1100 return deskBand
->QueryInterface(riid
, shellMenu
);
1103 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, REFIID riid
, void **theBaseBar
)
1105 CComPtr
<IUnknown
> newBaseBar
;
1106 CComPtr
<IDeskBar
> deskBar
;
1107 CComPtr
<IUnknown
> newBaseBarSite
;
1108 CComPtr
<IDeskBarClient
> deskBarClient
;
1113 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1115 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1118 hResult
= CBaseBar_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBar
), vertical
);
1119 if (FAILED_UNEXPECTEDLY(hResult
))
1121 hResult
= CBaseBarSite_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBarSite
), vertical
);
1122 if (FAILED_UNEXPECTEDLY(hResult
))
1125 // we have to store our basebar into cache now
1126 *cache
= newBaseBar
;
1127 newBaseBar
->AddRef();
1129 // tell the new base bar about the shell browser
1130 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1131 if (FAILED_UNEXPECTEDLY(hResult
))
1134 // tell the new base bar about the new base bar site
1135 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1136 if (FAILED_UNEXPECTEDLY(hResult
))
1138 hResult
= deskBar
->SetClient(newBaseBarSite
);
1139 if (FAILED_UNEXPECTEDLY(hResult
))
1142 // tell the new base bar site about the new base bar
1143 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1144 if (FAILED_UNEXPECTEDLY(hResult
))
1146 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1147 if (FAILED_UNEXPECTEDLY(hResult
))
1151 return (*cache
)->QueryInterface(riid
, theBaseBar
);
1154 BOOL
CShellBrowser::IsBandLoaded(const CLSID clsidBand
, bool vertical
, DWORD
*pdwBandID
)
1157 CComPtr
<IDeskBar
> deskBar
;
1158 CComPtr
<IUnknown
> baseBarSite
;
1159 CComPtr
<IBandSite
> bandSite
;
1165 /* Get our basebarsite to be able to enumerate bands */
1166 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1167 if (FAILED_UNEXPECTEDLY(hResult
))
1169 hResult
= deskBar
->GetClient(&baseBarSite
);
1170 if (FAILED_UNEXPECTEDLY(hResult
))
1172 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &bandSite
));
1173 if (FAILED_UNEXPECTEDLY(hResult
))
1176 hResult
= bandSite
->EnumBands(-1, &numBands
);
1177 if (FAILED_UNEXPECTEDLY(hResult
))
1180 for(i
= 0; i
< numBands
; i
++)
1182 CComPtr
<IPersist
> bandPersist
;
1184 hResult
= bandSite
->EnumBands(i
, &dwBandID
);
1185 if (FAILED_UNEXPECTEDLY(hResult
))
1188 hResult
= bandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IPersist
, &bandPersist
));
1189 if (FAILED_UNEXPECTEDLY(hResult
))
1191 hResult
= bandPersist
->GetClassID(&clsidTmp
);
1192 if (FAILED_UNEXPECTEDLY(hResult
))
1194 if (IsEqualGUID(clsidBand
, clsidTmp
))
1196 if (pdwBandID
) *pdwBandID
= dwBandID
;
1203 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1205 CComPtr
<IDockingWindow
> dockingWindow
;
1206 CComPtr
<IUnknown
> baseBarSite
;
1207 CComPtr
<IUnknown
> newBand
;
1208 CComPtr
<IDeskBar
> deskBar
;
1213 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1214 if (FAILED_UNEXPECTEDLY(hResult
))
1217 hResult
= deskBar
->GetClient(&baseBarSite
);
1218 if (FAILED_UNEXPECTEDLY(hResult
))
1221 hResult
= deskBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1222 if (FAILED_UNEXPECTEDLY(hResult
))
1225 if (!IsBandLoaded(classID
, vertical
, &dwBandID
))
1227 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1228 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1230 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1231 hResult
= CExplorerBand_CreateInstance(IID_PPV_ARG(IUnknown
, &newBand
));
1232 if (FAILED_UNEXPECTEDLY(hResult
))
1237 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1238 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1239 if (FAILED_UNEXPECTEDLY(hResult
))
1245 CComPtr
<IBandSite
> pBandSite
;
1247 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &pBandSite
));
1248 if (!SUCCEEDED(hResult
))
1250 ERR("Can't get IBandSite interface\n");
1253 hResult
= pBandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IUnknown
, &newBand
));
1254 if (!SUCCEEDED(hResult
))
1256 ERR("Can't find band object\n");
1260 // It's hackish, but we should be able to show the wanted band until we
1261 // find the proper way to do this (but it seems to work to add a new band)
1262 // Here we'll just re-add the existing band to the site, causing it to display.
1264 V_VT(&vaIn
) = VT_UNKNOWN
;
1265 V_UNKNOWN(&vaIn
) = newBand
.p
;
1266 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1267 if (FAILED_UNEXPECTEDLY(hResult
))
1272 hResult
= dockingWindow
->ShowDW(TRUE
);
1273 if (FAILED_UNEXPECTEDLY(hResult
))
1279 HRESULT
CShellBrowser::NavigateToParent()
1281 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1282 if (newDirectory
== NULL
)
1283 return E_OUTOFMEMORY
;
1284 if (_ILIsDesktop(newDirectory
))
1286 ILFree(newDirectory
);
1287 return E_INVALIDARG
;
1289 ILRemoveLastID(newDirectory
);
1290 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1291 ILFree(newDirectory
);
1292 if (FAILED_UNEXPECTEDLY(hResult
))
1297 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1299 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1300 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1302 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1303 sheetInfo
->nPages
++;
1307 HRESULT
CShellBrowser::DoFolderOptions()
1309 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1310 PROPSHEETHEADER m_PropSheet
;
1311 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1312 // CComPtr<IGlobalFolderSettings> globalSettings;
1313 // SHELLSTATE2 shellState;
1316 memset(m_psp
, 0, sizeof(m_psp
));
1317 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1319 // create sheet object
1320 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1321 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1322 if (FAILED_UNEXPECTEDLY(hResult
))
1325 // must set site in order for Apply to all Folders on Advanced page to be enabled
1326 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1327 m_PropSheet
.phpage
= m_psp
;
1330 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1331 if (FAILED_UNEXPECTEDLY(hResult
))
1333 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1334 if (FAILED_UNEXPECTEDLY(hResult
))
1339 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1340 if (FAILED_UNEXPECTEDLY(hResult
))
1343 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1344 // It returns 'E_NOTIMPL'
1346 if (fCurrentShellView
!= NULL
)
1348 hResult
= fCurrentShellView
->AddPropertySheetPages(
1349 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1350 if (FAILED_UNEXPECTEDLY(hResult
))
1356 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1357 m_PropSheet
.dwFlags
= 0;
1358 m_PropSheet
.hwndParent
= m_hWnd
;
1359 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1360 m_PropSheet
.pszCaption
= _T("Folder Options");
1361 m_PropSheet
.nStartPage
= 0;
1362 PropertySheet(&m_PropSheet
);
1366 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1368 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1369 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1371 const _ATL_MSG
*previousMessage
;
1373 WNDPROC saveWindowProc
;
1376 hWnd
= pThis
->m_hWnd
;
1377 previousMessage
= pThis
->m_pCurrentMsg
;
1378 pThis
->m_pCurrentMsg
= &msg
;
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
;
1393 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1394 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1395 if (handled
== FALSE
)
1397 if (uMsg
== WM_NCDESTROY
)
1399 saveWindowProc
= reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1400 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1401 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1402 ::SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1403 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1406 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1408 pThis
->m_pCurrentMsg
= previousMessage
;
1409 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1411 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1412 pThis
->m_hWnd
= NULL
;
1413 pThis
->OnFinalMessage(hWnd
);
1418 void CShellBrowser::RepositionBars()
1424 GetClientRect(&clientRect
);
1426 if (fStatusBarVisible
&& fStatusBar
)
1428 ::GetWindowRect(fStatusBar
, &statusRect
);
1429 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1430 clientRect
.right
- clientRect
.left
,
1431 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1432 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1435 for (x
= 0; x
< 3; x
++)
1437 HWND hwnd
= fClientBars
[x
].hwnd
;
1438 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1439 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1441 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1442 fClientBars
[x
].hwnd
= hwnd
;
1446 RECT toolbarRect
= clientRect
;
1447 if (borderSpace
.top
!= 0)
1449 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1451 else if (borderSpace
.bottom
!= 0)
1453 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1455 else if (borderSpace
.left
!= 0)
1457 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1459 else if (borderSpace
.right
!= 0)
1461 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1464 ::SetWindowPos(hwnd
, NULL
,
1467 toolbarRect
.right
- toolbarRect
.left
,
1468 toolbarRect
.bottom
- toolbarRect
.top
,
1469 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1471 if (borderSpace
.top
!= 0)
1473 clientRect
.top
= toolbarRect
.bottom
;
1475 else if (borderSpace
.bottom
!= 0)
1477 clientRect
.bottom
= toolbarRect
.top
;
1479 else if (borderSpace
.left
!= 0)
1481 clientRect
.left
= toolbarRect
.right
;
1483 else if (borderSpace
.right
!= 0)
1485 clientRect
.right
= toolbarRect
.left
;
1489 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1490 clientRect
.right
- clientRect
.left
,
1491 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1494 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1497 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1498 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1501 params
.rgvarg
= arguments
;
1502 params
.rgdispidNamedArgs
= NULL
;
1503 params
.cArgs
= argCount
;
1504 params
.cNamedArgs
= 0;
1505 IUnknown
** pp
= vec
.begin();
1506 while (pp
< vec
.end())
1510 CComPtr
<IDispatch
> theDispatch
;
1512 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1513 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1518 while (pp
< vec2
.end())
1522 CComPtr
<IDispatch
> theDispatch
;
1524 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1525 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1532 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1534 // these two variants intentionally to do use CComVariant because it would double free/release
1535 // or does not need to dispose at all
1538 CComBSTR
tempString(newDirectory
);
1540 V_VT(&varArgs
) = VT_BSTR
;
1541 V_BSTR(&varArgs
) = tempString
.m_str
;
1543 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1544 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1545 V_VT(&varArg
[1]) = VT_DISPATCH
;
1546 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1548 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1551 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1555 V_VT(&varArg
[0]) = VT_BOOL
;
1556 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1557 V_VT(&varArg
[1]) = VT_I4
;
1558 V_I4(&varArg
[1]) = commandID
;
1560 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1563 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1565 return FireCommandStateChange(false, -1);
1568 HRESULT
CShellBrowser::UpdateForwardBackState()
1570 CComPtr
<ITravelLog
> travelLog
;
1571 CComPtr
<ITravelEntry
> unusedEntry
;
1577 canGoForward
= false;
1578 hResult
= GetTravelLog(&travelLog
);
1579 if (FAILED_UNEXPECTEDLY(hResult
))
1581 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1582 if (SUCCEEDED(hResult
))
1585 unusedEntry
.Release();
1587 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1588 if (SUCCEEDED(hResult
))
1590 canGoForward
= true;
1591 unusedEntry
.Release();
1593 hResult
= FireCommandStateChange(canGoBack
, 2);
1594 hResult
= FireCommandStateChange(canGoForward
, 1);
1598 HRESULT
CShellBrowser::UpdateUpState()
1604 if (_ILIsDesktop(fCurrentDirectoryPIDL
))
1606 hResult
= FireCommandStateChange(canGoUp
, 3);
1610 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1612 CComPtr
<ITravelLog
> travelLog
;
1613 CComPtr
<ITravelEntry
> unusedEntry
;
1615 MENUITEMINFO menuItemInfo
;
1618 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1620 position
= GetMenuItemCount(theMenu
);
1621 hResult
= GetTravelLog(&travelLog
);
1622 if (FAILED_UNEXPECTEDLY(hResult
))
1625 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1629 if (SUCCEEDED(hResult
))
1631 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, TRUE
);
1632 unusedEntry
.Release();
1635 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, FALSE
);
1637 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1641 if (SUCCEEDED(hResult
))
1643 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, TRUE
);
1644 unusedEntry
.Release();
1647 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, FALSE
);
1649 SHEnableMenuItem(theMenu
,
1650 IDM_GOTO_UPONELEVEL
,
1651 !_ILIsDesktop(fCurrentDirectoryPIDL
));
1653 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1654 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1655 if (SUCCEEDED(hResult
))
1657 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1658 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1659 menuItemInfo
.fType
= MF_SEPARATOR
;
1660 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1661 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1665 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1667 CComPtr
<ITravelLog
> travelLog
;
1669 OLECMD commandList
[5];
1670 HMENU toolbarMenuBar
;
1672 MENUITEMINFO menuItemInfo
;
1675 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1676 if (gotoMenu
!= NULL
)
1677 UpdateGotoMenu(gotoMenu
);
1679 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1680 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1681 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1682 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1683 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1685 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1686 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1687 if (FAILED_UNEXPECTEDLY(hResult
))
1688 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1691 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1692 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1693 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1694 DestroyMenu(menuItemInfo
.hSubMenu
);
1696 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1697 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1698 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1699 DestroyMenu(toolbarMenuBar
);
1702 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1703 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1704 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1705 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1707 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1708 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1709 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1710 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1711 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1712 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1713 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1714 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1716 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1717 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1718 menuItemInfo
.hSubMenu
= toolbarMenu
;
1719 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1721 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1724 HRESULT
CShellBrowser::BuildExplorerBandMenu()
1729 hBandsMenu
= SHGetMenuFromID(fCurrentMenuBar
, IDM_VIEW_EXPLORERBAR
);
1732 OutputDebugString(L
"No menu !\n");
1735 DSA_DeleteAllItems(menuDsa
);
1736 BuildExplorerBandCategory(hBandsMenu
, CATID_InfoBand
, 4, NULL
);
1737 BuildExplorerBandCategory(hBandsMenu
, CATID_CommBand
, 20, &nbFound
);
1741 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_SEPARATOR
, MF_BYCOMMAND
);
1743 // Remove media menu since XP does it (according to API Monitor)
1744 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_MEDIA
, MF_BYCOMMAND
);
1748 HRESULT
CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
)
1751 CComPtr
<IEnumGUID
> pEnumGUID
;
1752 WCHAR wszBandName
[MAX_PATH
];
1753 WCHAR wszBandGUID
[MAX_PATH
];
1754 WCHAR wRegKey
[MAX_PATH
];
1761 mbi
.fVertical
= IsEqualGUID(category
, CATID_InfoBand
);
1763 hr
= SHEnumClassesOfCategories(1, &category
, 0, NULL
, &pEnumGUID
);
1764 if (FAILED_UNEXPECTEDLY(hr
))
1770 pEnumGUID
->Next(1, &iter
, &dwRead
);
1773 // Get the band name
1774 if (IsBuiltinBand(iter
))
1776 if (!StringFromGUID2(iter
, wszBandGUID
, MAX_PATH
))
1778 StringCchPrintfW(wRegKey
, MAX_PATH
, L
"CLSID\\%s", wszBandGUID
);
1779 dwDataSize
= MAX_PATH
;
1780 SHGetValue(HKEY_CLASSES_ROOT
, wRegKey
, NULL
, NULL
, wszBandName
, &dwDataSize
);
1783 InsertMenu(hBandsMenu
, dwPos
+ cBands
, MF_BYPOSITION
, IDM_EXPLORERBAND_BEGINCUSTOM
+ DSA_GetItemCount(menuDsa
), wszBandName
);
1784 DSA_AppendItem(menuDsa
, &mbi
);
1794 BOOL
CShellBrowser::IsBuiltinBand(CLSID
&bandID
)
1796 if (IsEqualCLSID(bandID
, CLSID_ExplorerBand
))
1798 if (IsEqualCLSID(bandID
, CLSID_SH_SearchBand
) || IsEqualCLSID(bandID
, CLSID_SearchBand
))
1800 if (IsEqualCLSID(bandID
, CLSID_IE_SearchBand
) || IsEqualCLSID(bandID
, CLSID_FileSearchBand
))
1802 if (IsEqualCLSID(bandID
, CLSID_SH_HistBand
))
1804 if (IsEqualCLSID(bandID
, CLSID_SH_FavBand
))
1806 if (IsEqualCLSID(bandID
, CLSID_ChannelsBand
))
1811 HRESULT
CShellBrowser::OnSearch()
1813 CComPtr
<IObjectWithSite
> objectWithSite
;
1814 CComPtr
<IContextMenu
> contextMenu
;
1815 CMINVOKECOMMANDINFO commandInfo
;
1816 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1819 // TODO: Query shell if this command is enabled first
1821 memset(&commandInfo
, 0, sizeof(commandInfo
));
1822 commandInfo
.cbSize
= sizeof(commandInfo
);
1823 commandInfo
.hwnd
= m_hWnd
;
1824 commandInfo
.lpParameters
= searchGUID
;
1825 commandInfo
.nShow
= SW_SHOWNORMAL
;
1827 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1828 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1829 if (FAILED_UNEXPECTEDLY(hResult
))
1831 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1832 if (FAILED_UNEXPECTEDLY(hResult
))
1834 hResult
= objectWithSite
->SetSite(dynamic_cast<IShellBrowser
*>(this));
1835 if (FAILED_UNEXPECTEDLY(hResult
))
1837 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1838 hResult
= objectWithSite
->SetSite(NULL
);
1842 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1844 CComPtr
<IUnknown
> int1Retry
;
1845 CComPtr
<IUnknown
> int2Retry
;
1850 if (int1
== NULL
|| int2
== NULL
)
1852 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1853 if (FAILED_UNEXPECTEDLY(hResult
))
1855 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1856 if (FAILED_UNEXPECTEDLY(hResult
))
1858 if (int1Retry
== int2Retry
)
1863 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1865 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1867 RECT availableBounds
;
1869 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1870 for (INT x
= 0; x
< 3; x
++)
1872 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1874 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1875 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1876 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1877 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1880 *prcBorder
= availableBounds
;
1884 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1889 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1891 for (INT x
= 0; x
< 3; x
++)
1893 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1895 fClientBars
[x
].borderSpace
= *pbw
;
1896 // if this bar changed size, it cascades and forces all subsequent bars to resize
1901 return E_INVALIDARG
;
1904 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1905 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1907 CComPtr
<IOleCommandTarget
> commandTarget
;
1910 if (prgCmds
== NULL
)
1911 return E_INVALIDARG
;
1912 if (pguidCmdGroup
== NULL
)
1914 if (fCurrentShellView
.p
!= NULL
)
1916 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1917 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1918 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1927 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1931 switch (prgCmds
->cmdID
)
1933 case 0x1c: // search
1934 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1936 case 0x1d: // history
1937 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1939 case 0x1e: // favorites
1940 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1942 case 0x23: // folders
1943 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1953 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1957 switch (prgCmds
->cmdID
)
1959 case 0xa022: // up level
1960 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1961 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1962 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1972 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1973 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1979 TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
1982 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1987 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1990 if (nCmdexecopt
== 1)
1992 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1996 // update zones part of the status bar
1999 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
2000 V_VT(pvaOut
) = VT_INT_PTR
;
2001 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
2002 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
2005 // indicate if this cabinet was opened as a browser
2011 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
2020 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
2025 // what is theater mode and why do we receive this?
2029 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
2034 // initialize favorites menu
2038 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
2043 // refresh on toolbar clicked
2046 // called for unknown bands ?
2049 // tell the view if it should hide the task pane or not
2050 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
2053 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
2058 return NavigateToParent();
2061 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
2066 return DoFolderOptions();
2069 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
2074 // Reset All Folders option in Folder Options
2078 else if (IsEqualIID(*pguidCmdGroup
, CLSID_CommonButtons
))
2080 // Windows seems to use this as proxy for toolbar buttons.
2081 // We use it for search band for now to remove code duplication,
2082 // let's see if it could be useful in the future.
2086 // Show search band from toolbar
2099 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
2107 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
2112 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2114 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2116 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
2118 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
2121 DestroyMenu(mainMenu
);
2123 lpMenuWidths
->width
[0] = 2;
2124 lpMenuWidths
->width
[2] = 3;
2125 lpMenuWidths
->width
[4] = 1;
2129 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
2131 CComPtr
<IShellMenu
> shellMenu
;
2134 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
2136 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
2137 if (FAILED_UNEXPECTEDLY(hResult
))
2142 hmenuShared
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2144 // FIXME: Figure out the proper way to do this.
2145 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
2148 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
2151 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
2152 if (FAILED_UNEXPECTEDLY(hResult
))
2154 fCurrentMenuBar
= hmenuShared
;
2155 BuildExplorerBandMenu();
2159 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
2161 if (hmenuShared
== fCurrentMenuBar
)
2163 //DestroyMenu(fCurrentMenuBar);
2164 SetMenuSB(NULL
, NULL
, NULL
);
2169 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
2174 ::SetWindowText(fStatusBar
, pszStatusText
);
2183 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
2188 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
2190 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
2195 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
2197 if ((wFlags
& SBSP_EXPLOREMODE
) != NULL
)
2198 ShowBand(CLSID_ExplorerBand
, true);
2200 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2203 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
2208 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
2216 *lphwnd
= fToolbarProxy
.m_hWnd
;
2219 *lphwnd
= fStatusBar
;
2222 // find the directory browser and return it
2223 // this should be used only to determine if a tree is present
2226 // is this a progress dialog?
2232 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
2233 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
2242 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
2247 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
2255 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
2259 *ppshv
= fCurrentShellView
;
2260 if (fCurrentShellView
.p
!= NULL
)
2261 fCurrentShellView
.p
->AddRef();
2265 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2270 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2275 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2276 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2281 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2286 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2291 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2292 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2297 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2299 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2300 // the returned interface has a method GetPropertyBag on it
2301 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2302 return this->QueryInterface(riid
, ppvObject
);
2303 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2304 return this->QueryInterface(riid
, ppvObject
);
2305 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2306 return this->QueryInterface(riid
, ppvObject
);
2307 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2308 return this->QueryInterface(riid
, ppvObject
);
2309 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2310 return this->QueryInterface(riid
, ppvObject
);
2311 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2312 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2313 if (IsEqualIID(riid
, IID_IShellBrowser
))
2314 return this->QueryInterface(riid
, ppvObject
);
2315 return E_NOINTERFACE
;
2318 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2320 if (ppvObject
== NULL
)
2326 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2331 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2336 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2337 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2342 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2343 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2353 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2358 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2363 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2368 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2372 // called by toolbar when displaying tooltips
2377 if (fTravelLog
.p
== NULL
)
2379 hResult
= CTravelLog_CreateInstance(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2380 if (FAILED_UNEXPECTEDLY(hResult
))
2383 *pptl
= fTravelLog
.p
;
2384 fTravelLog
.p
->AddRef();
2388 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2398 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2403 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2408 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2413 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2418 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2423 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2428 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2433 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2438 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2443 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2448 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2453 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2458 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2460 // called by explorer bar to get current pidl
2463 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2467 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2472 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2477 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2482 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2484 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2485 return E_INVALIDARG
;
2486 *ppole
= fHistoryObject
;
2487 if (fHistoryObject
!= NULL
)
2488 fHistoryObject
->AddRef();
2489 *pstm
= fHistoryStream
;
2490 if (fHistoryStream
!= NULL
)
2491 fHistoryStream
->AddRef();
2492 *ppbc
= fHistoryBindContext
;
2493 if (fHistoryBindContext
!= NULL
)
2494 fHistoryBindContext
->AddRef();
2495 fHistoryObject
= NULL
;
2496 fHistoryStream
= NULL
;
2497 fHistoryBindContext
= NULL
;
2503 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2508 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2513 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2518 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2519 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2524 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2529 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2534 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2539 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2544 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2549 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2554 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2556 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2560 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2565 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2570 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2575 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2580 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2585 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2590 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2595 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2596 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2601 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2606 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2611 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2616 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2621 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2626 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2631 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2636 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2641 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2646 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2651 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2656 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2661 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2666 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2671 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2676 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2681 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2686 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2691 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2696 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2701 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2706 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2707 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2712 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2713 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2718 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2723 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2728 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2733 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2738 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2743 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2748 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2753 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2758 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2763 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2768 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2773 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2778 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2783 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2788 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2793 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2798 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2803 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2808 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2813 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2814 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2819 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2824 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2829 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2834 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2836 for (int i
= 0; i
< 3; i
++)
2838 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2842 if (!fCurrentShellView
)
2845 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2848 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2853 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2858 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2860 CComPtr
<ITravelLog
> travelLog
;
2861 HRESULT hResult
= GetTravelLog(&travelLog
);
2862 if (FAILED_UNEXPECTEDLY(hResult
))
2864 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2867 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2869 CComPtr
<ITravelLog
> travelLog
;
2870 HRESULT hResult
= GetTravelLog(&travelLog
);
2871 if (FAILED_UNEXPECTEDLY(hResult
))
2873 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2876 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2881 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2886 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2887 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2889 CComHeapPtr
<ITEMIDLIST
> pidl
;
2891 CComPtr
<IShellFolder
> pDesktop
;
2893 hResult
= SHGetDesktopFolder(&pDesktop
);
2894 if (FAILED_UNEXPECTEDLY(hResult
))
2896 hResult
= pDesktop
->ParseDisplayName(NULL
, NULL
, URL
, NULL
, &pidl
, NULL
);
2897 if (FAILED_UNEXPECTEDLY(hResult
))
2899 return BrowseObject(pidl
, 1);
2902 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2906 V_VT(&level
) = VT_I4
;
2908 return Refresh2(&level
);
2911 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2913 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2916 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2917 if (FAILED_UNEXPECTEDLY(hResult
))
2919 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2922 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2927 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2932 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2937 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2942 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2947 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2952 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2959 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2964 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2969 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2974 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2979 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2984 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2989 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2994 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
3001 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
3006 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
3011 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
3016 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
3021 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
3026 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
3031 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
3036 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
3041 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
3046 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
3051 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
3056 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
3061 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
3066 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
3071 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
3076 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
3081 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
3086 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
3091 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
3096 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
3101 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
3106 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
3111 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
3116 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
3117 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
3119 LPITEMIDLIST pidl
= NULL
;
3121 // called from drive combo box to navigate to a directory
3122 // Also called by search band to display shell results folder view
3124 if (V_VT(URL
) == VT_BSTR
)
3126 return this->Navigate(V_BSTR(URL
), Flags
, TargetFrameName
, PostData
, Headers
);
3128 if (V_VT(URL
) == (VT_ARRAY
| VT_UI1
))
3130 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
3131 return E_INVALIDARG
;
3133 pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
3135 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
3136 if (FAILED_UNEXPECTEDLY(hResult
))
3141 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
3146 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
3147 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3152 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
3157 // called to show search bar
3158 if (V_VT(pvaClsid
) != VT_BSTR
)
3159 return E_INVALIDARG
;
3160 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
3161 // TODO: properly compute the value of vertical
3163 return ShowBand(classID
, vertical
);
3166 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
3171 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
3176 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
3181 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
3186 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
3191 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
3196 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
3201 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
3206 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
3211 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
3216 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
3221 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
3226 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
3231 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
3236 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
3241 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
3246 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
3248 if (pWinData
== NULL
)
3251 pWinData
->dwWindowID
= -1;
3253 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
3254 pWinData
->lpszUrl
= NULL
;
3255 pWinData
->lpszUrlLocation
= NULL
;
3256 pWinData
->lpszTitle
= NULL
;
3260 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
3265 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
3270 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
3272 CComPtr
<IPersistHistory
> viewPersistHistory
;
3273 CComPtr
<IOleObject
> viewHistoryObject
;
3274 persistState oldState
;
3279 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
3280 if (FAILED_UNEXPECTEDLY(hResult
))
3282 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3284 if (oldState
.browseType
!= 2)
3286 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3288 return E_OUTOFMEMORY
;
3289 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3290 if (FAILED_UNEXPECTEDLY(hResult
))
3295 if (numRead
!= oldState
.pidlSize
)
3300 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3301 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3302 fHistoryObject
= viewHistoryObject
;
3303 fHistoryStream
= pStream
;
3304 fHistoryBindContext
= pbc
;
3305 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3306 fHistoryObject
= NULL
;
3307 fHistoryStream
= NULL
;
3308 fHistoryBindContext
= NULL
;
3310 if (FAILED_UNEXPECTEDLY(hResult
))
3315 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3317 CComPtr
<IPersistHistory
> viewPersistHistory
;
3318 persistState newState
;
3321 hResult
= fCurrentShellView
->GetItemObject(
3322 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3323 memset(&newState
, 0, sizeof(newState
));
3324 newState
.dwSize
= sizeof(newState
);
3325 newState
.browseType
= 2;
3326 newState
.browserIndex
= GetBrowserIndex();
3327 if (viewPersistHistory
.p
!= NULL
)
3329 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3330 if (FAILED_UNEXPECTEDLY(hResult
))
3333 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3334 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3335 if (FAILED_UNEXPECTEDLY(hResult
))
3337 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3338 if (FAILED_UNEXPECTEDLY(hResult
))
3340 if (viewPersistHistory
.p
!= NULL
)
3342 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3343 if (FAILED_UNEXPECTEDLY(hResult
))
3349 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3354 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3359 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3361 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3365 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3369 /* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
3370 OleFlushClipboard();
3372 // TODO: rip down everything
3374 fToolbarProxy
.Destroy();
3376 fCurrentShellView
->DestroyViewWindow();
3377 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3379 for (int i
= 0; i
< 3; i
++)
3381 CComPtr
<IDockingWindow
> pdw
;
3382 CComPtr
<IDeskBar
> bar
;
3383 CComPtr
<IUnknown
> pBarSite
;
3384 CComPtr
<IDeskBarClient
> pClient
;
3386 if (fClientBars
[i
].clientBar
== NULL
)
3389 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3390 if (FAILED_UNEXPECTEDLY(hr
))
3393 /* We should destroy our basebarsite too */
3394 hr
= pdw
->QueryInterface(IID_PPV_ARG(IDeskBar
, &bar
));
3397 hr
= bar
->GetClient(&pBarSite
);
3398 if (SUCCEEDED(hr
) && pBarSite
)
3400 hr
= pBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &pClient
));
3402 pClient
->SetDeskBarSite(NULL
);
3411 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3413 ReleaseCComPtrExpectZero(fCurrentShellView
);
3414 ReleaseCComPtrExpectZero(fTravelLog
);
3416 fCurrentShellFolder
.Release();
3417 ILFree(fCurrentDirectoryPIDL
);
3418 ::DestroyWindow(fStatusBar
);
3419 DestroyMenu(fCurrentMenuBar
);
3425 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3427 CComPtr
<IDockingWindow
> dockingWindow
;
3428 RECT availableBounds
;
3429 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3432 if (wParam
!= SIZE_MINIMIZED
)
3434 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3435 for (INT x
= 0; x
< 3; x
++)
3437 if (fClientBars
[x
].clientBar
!= NULL
)
3439 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3440 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3441 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3443 hResult
= dockingWindow
->ResizeBorderDW(
3444 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3454 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3457 LPARAM menuIndex
= lParam
;
3459 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3461 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3465 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3469 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3471 UpdateViewMenu(theMenu
);
3474 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3478 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3480 // FIXME: Remove once implemented
3481 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3482 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3483 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3484 FIXME("Folder options dialog is stubbed: CORE-11141\n");
3485 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
); // Remove when CORE-11141 is fixed.
3488 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3493 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3498 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3500 ::SetFocus(fCurrentShellViewWindow
);
3504 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3506 if (fCurrentShellViewWindow
!= NULL
)
3507 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3511 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3513 return SendMessage(WM_CLOSE
);
3516 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3518 HRESULT hResult
= DoFolderOptions();
3519 if (FAILED(hResult
))
3520 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3524 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3527 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3528 #endif /* __REACTOS__ */
3532 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3535 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3536 #endif /* __REACTOS__ */
3540 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3542 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3546 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3548 HRESULT hResult
= GoBack();
3549 if (FAILED(hResult
))
3550 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3554 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3556 HRESULT hResult
= GoForward();
3557 if (FAILED(hResult
))
3558 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3562 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3564 HRESULT hResult
= NavigateToParent();
3565 if (FAILED(hResult
))
3566 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3570 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3572 HRESULT hResult
= GoHome();
3573 if (FAILED(hResult
))
3574 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3578 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3580 // FIXME: This does not appear to be what windows does.
3581 HRESULT hResult
= NavigateToParent();
3582 if (FAILED(hResult
))
3583 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3587 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3589 CComPtr
<IShellFolder
> psfDesktop
;
3590 LPITEMIDLIST pidlFavs
;
3592 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3595 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3600 hr
= SHGetDesktopFolder(&psfDesktop
);
3601 if (FAILED_UNEXPECTEDLY(hr
))
3604 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3605 if (FAILED_UNEXPECTEDLY(hr
))
3611 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3613 fStatusBarVisible
= !fStatusBarVisible
;
3616 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3622 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3625 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3626 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3630 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3633 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3634 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3638 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3641 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3642 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3646 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3649 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3650 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3654 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3657 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3658 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3662 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3665 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3666 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3670 LRESULT
CShellBrowser::OnRefresh(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3672 if (fCurrentShellView
)
3673 fCurrentShellView
->Refresh();
3677 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3682 LRESULT
CShellBrowser::OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3684 // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3685 if (wID
>= IDM_EXPLORERBAND_BEGINCUSTOM
&& wID
<= IDM_EXPLORERBAND_ENDCUSTOM
)
3688 mbi
= (MenuBandInfo
*)DSA_GetItemPtr(menuDsa
, (wID
- IDM_EXPLORERBAND_BEGINCUSTOM
));
3691 ShowBand(mbi
->barGuid
, mbi
->fVertical
);
3697 case IDM_EXPLORERBAR_SEARCH
:
3698 Exec(&CLSID_CommonButtons
, 0x123, 1, NULL
, NULL
);
3700 case IDM_EXPLORERBAR_FOLDERS
:
3701 ShowBand(CLSID_ExplorerBand
, true);
3703 case IDM_EXPLORERBAR_HISTORY
:
3704 ShowBand(CLSID_SH_HistBand
, true);
3706 case IDM_EXPLORERBAR_FAVORITES
:
3707 ShowBand(CLSID_SH_FavBand
, true);
3710 WARN("Unknown id %x\n", wID
);
3716 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3718 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3719 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3723 HRESULT
CShellBrowser_CreateInstance(LPITEMIDLIST pidl
, DWORD dwFlags
, REFIID riid
, void **ppv
)
3725 return ShellObjectCreatorInit
<CShellBrowser
>(pidl
, dwFlags
, riid
, ppv
);