4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #define USE_CUSTOM_EXPLORERBAND 1
29 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
31 #include "newatlinterfaces.h"
35 **Provide implementation of new and delete that use LocalAlloc
36 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
37 view doesn't restore the selection correctly.
38 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
39 **Add brand band bitmaps to shell32.dll
40 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
41 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
42 current state overwrites the wrong entry's contents. This needs to be changed.
43 ****Fix close of browser window to release all objects
44 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
45 **When a new bar is added to base bar site, how is base bar told so it can resize?
46 **Does the base bar site have a classid?
47 **What should refresh command send to views to make them refresh?
48 **When new bar is created, what status notifications need to be fired?
49 **How does keyboard filtering dispatch?
50 **For deferred persist history load, how does the view connect up and get the state?
51 How does context menu send open, cut, rename commands to its site (the shell view)?
52 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
54 **Route View->Toolbars commands to internet toolbar
55 **Handle travel log items in View->Go
56 **Fix ShowBrowserBar to pass correct size on when bar is shown
57 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
58 ****Make ShowToolbar check if bar is already created before creating it again
59 ****Shell should fill in the list of explorer bars in the View submenus
60 **Add folder menu in the file menu
61 **Fix CShellBrowser::GetBorderDW to compute available size correctly
62 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
63 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
64 Make folders toolbar item update state appropriately
65 Read list of bands from registry on launch
66 Read list of bars from registry on launch
67 If the folders or search bars don't exist, disable the toolbar buttons
68 If the favorites or history bars don't exist, disable the toolbar butons
69 Fix Apply to all Folders in Folder Options
70 Implement close command
71 Add explorer band context menu to file menu
72 Add code to allow restore of internet toolbar from registry
73 Fix code that calls FireNavigateComplete to pass the correct new path
75 What are the other command ids for QueryStatus/FireCommandStateChange?
77 Add handler for cabinet settings change
78 Add handler for system metrics change (renegotiate border space?)
79 Add handler for theme change and forward to contained windows
81 When folders are shown, the status bar text should change
82 Add code to save/restore shell view settings
83 Implement tabbing between frames
84 Fix handling of focus everywhere
85 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
87 The status bar doesn't show help text for items owned by frame during menu tracking
88 Stub out frame command handlers
89 "Arrange icons by" group is not checked properly
91 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
92 the icon is always an open folder with magnifying glass
93 Fix bars to calculate height correctly
94 Hookup policies for everything...
95 Investigate toolbar message WM_USER+93
96 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
98 Vertical Explorer Bar CATID_InfoBand
99 Horizontal Explorer Bar CATID_CommBand
100 Desk Band CATID_DeskBand
103 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
104 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
106 create key here with CLSID of bar to register tool band
107 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
112 #pragma comment(linker, \
113 "\"/manifestdependency:type='Win32' "\
114 "name='Microsoft.Windows.Common-Controls' "\
115 "version='6.0.0.0' "\
116 "processorArchitecture='*' "\
117 "publicKeyToken='6595b64144ccf1df' "\
121 static const unsigned int folderOptionsPageCountMax
= 20;
122 static const long BTP_DONT_UPDATE_HISTORY
= 0;
123 static const long BTP_UPDATE_CUR_HISTORY
= 1;
124 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
126 BOOL createNewStuff
= false;
129 // this class is private to browseui.dll and is not registered externally?
130 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
133 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
134 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
, BOOL vertical
);
135 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
, BOOL vertical
);
138 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
140 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
142 MENUITEMINFO menuItemInfo
;
146 menuItemCount
= GetMenuItemCount(theMenu
);
148 while (curIndex
< menuItemCount
)
150 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
151 menuItemInfo
.fMask
= MIIM_ID
;
152 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
153 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
155 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
163 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
165 CComPtr
<IShellFolder
> desktop
;
167 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
168 if (FAILED_UNEXPECTEDLY(hr
))
170 if (path
== NULL
|| path
->mkid
.cb
== 0)
172 *newFolder
= desktop
;
173 desktop
.p
->AddRef ();
176 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
179 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
180 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
185 class CToolbarProxy
:
186 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
189 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
191 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
196 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
197 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
199 BEGIN_MSG_MAP(CToolbarProxy
)
200 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
201 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
205 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
210 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
211 if (myWindow
!= NULL
)
213 SubclassWindow(myWindow
);
214 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
215 hResult
= explorerToolbar
->QueryInterface(
216 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
220 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
226 if (fExplorerToolbar
.p
!= NULL
)
228 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
229 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
230 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
231 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
236 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
242 if (fExplorerToolbar
.p
!= NULL
)
243 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
248 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
249 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
253 struct MenuBandInfo
{
258 class CShellBrowser
:
259 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
260 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
261 public IShellBrowser
,
263 public IServiceProvider
,
264 public IProfferServiceImpl
<CShellBrowser
>,
265 public IShellBrowserService
,
267 public ITravelLogClient
,
268 public IPersistHistory
,
269 public IDockingWindowSite
,
270 public IOleCommandTarget
,
271 public IBrowserService2
,
272 public IConnectionPointContainerImpl
<CShellBrowser
>,
273 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
274 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
281 CComPtr
<IUnknown
> clientBar
;
284 static const int BIInternetToolbar
= 0;
285 static const int BIVerticalBaseBar
= 1;
286 static const int BIHorizontalBaseBar
= 2;
288 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
289 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
290 CComPtr
<IShellView
> fCurrentShellView
; //
291 LPITEMIDLIST fCurrentDirectoryPIDL
; //
293 bool fStatusBarVisible
;
294 CToolbarProxy fToolbarProxy
;
295 barInfo fClientBars
[3];
296 CComPtr
<ITravelLog
> fTravelLog
;
297 HMENU fCurrentMenuBar
;
298 CABINETSTATE fCabinetState
;
299 // The next three fields support persisted history for shell views.
300 // They do not need to be reference counted.
301 IOleObject
*fHistoryObject
;
302 IStream
*fHistoryStream
;
303 IBindCtx
*fHistoryBindContext
;
308 ULONG
InternalAddRef()
310 OutputDebugString(_T("AddRef\n"));
311 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
313 ULONG
InternalRelease()
315 OutputDebugString(_T("Release\n"));
316 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
322 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
324 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
325 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
326 FOLDERSETTINGS
*folderSettings
, long flags
);
327 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
328 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
329 BOOL
IsBandLoaded(const CLSID clsidBand
, bool verticali
, DWORD
*pdwBandID
);
330 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
331 HRESULT
NavigateToParent();
332 HRESULT
DoFolderOptions();
333 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
334 void RepositionBars();
335 HRESULT
BuildExplorerBandMenu();
336 HRESULT
BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
);
337 BOOL
IsBuiltinBand(CLSID
&bandID
);
338 virtual WNDPROC
GetWindowProc()
342 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
343 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
344 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
345 HRESULT
FireCommandStateChangeAll();
346 HRESULT
UpdateForwardBackState();
347 HRESULT
UpdateUpState();
348 void UpdateGotoMenu(HMENU theMenu
);
349 void UpdateViewMenu(HMENU theMenu
);
351 /* // *** IDockingWindowFrame methods ***
352 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
353 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
354 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
357 // *** IDockingWindowSite methods ***
358 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
359 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
360 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
362 // *** IOleCommandTarget methods ***
363 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
364 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
365 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
366 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
368 // *** IOleWindow methods ***
369 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
370 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
372 // *** IShellBrowser methods ***
373 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
374 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
375 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
376 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
377 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
378 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
379 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
380 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
381 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
382 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
383 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
384 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
385 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
387 // *** IDropTarget methods ***
388 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
389 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
390 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
391 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
393 // *** IServiceProvider methods ***
394 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
396 // *** IShellBowserService methods ***
397 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
399 // *** IDispatch methods ***
400 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
401 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
402 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
403 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
404 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
405 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
407 // *** IBrowserService methods ***
408 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
409 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
410 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
411 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
412 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
413 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
414 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
415 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
416 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
417 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
418 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
419 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
420 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
421 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
422 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
423 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
424 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
425 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
426 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
427 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
428 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
429 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
430 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
431 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
432 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
433 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
434 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
435 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
436 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
437 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
439 // *** IBrowserService2 methods ***
440 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
441 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
442 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
443 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
444 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
445 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
446 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
447 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
448 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
449 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
450 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
451 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
452 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
453 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
454 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
455 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
456 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
457 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
458 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
459 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
460 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
461 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
462 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
463 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
464 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
465 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
466 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
467 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
468 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
469 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
470 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
471 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
472 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
473 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
474 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
475 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
476 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
477 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
478 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
479 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
480 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
481 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
482 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
483 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
484 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
485 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
486 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
487 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
488 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
489 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
490 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
491 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
492 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
493 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
494 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
495 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
496 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
497 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
498 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
499 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
500 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
501 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
502 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
503 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
504 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
506 // *** IWebBrowser methods ***
507 virtual HRESULT STDMETHODCALLTYPE
GoBack();
508 virtual HRESULT STDMETHODCALLTYPE
GoForward();
509 virtual HRESULT STDMETHODCALLTYPE
GoHome();
510 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
511 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
512 VARIANT
*PostData
, VARIANT
*Headers
);
513 virtual HRESULT STDMETHODCALLTYPE
Refresh();
514 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
515 virtual HRESULT STDMETHODCALLTYPE
Stop();
516 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
517 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
518 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
519 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
520 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
521 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
522 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
523 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
524 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
525 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
526 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
527 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
528 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
529 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
530 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
531 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
532 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
534 // *** IWebBrowserApp methods ***
535 virtual HRESULT STDMETHODCALLTYPE
Quit();
536 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
537 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
538 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
539 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
540 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
541 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
542 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
543 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
544 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
545 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
546 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
547 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
548 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
549 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
550 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
551 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
552 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
553 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
554 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
556 // *** IWebBrowser2 methods ***
557 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
558 VARIANT
*PostData
, VARIANT
*Headers
);
559 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
560 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
561 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
562 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
563 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
564 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
565 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
566 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
567 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
568 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
569 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
570 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
571 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
572 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
573 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
574 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
575 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
576 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
577 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
579 // *** ITravelLogClient methods ***
580 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
581 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
582 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
584 // *** IPersist methods ***
585 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
587 // *** IPersistHistory methods ***
588 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
589 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
590 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
591 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
594 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
595 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
596 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
597 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
598 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
599 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
600 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
601 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
602 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
603 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
604 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
605 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
606 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
607 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
608 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
609 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
610 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
611 LRESULT
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
612 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
613 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
614 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
615 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
616 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
617 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
618 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
619 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
620 LRESULT
OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
621 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
624 static ATL::CWndClassInfo
& GetWndClassInfo()
626 static ATL::CWndClassInfo wc
=
628 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
629 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
630 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
631 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
636 BEGIN_MSG_MAP(CShellBrowser
)
637 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
638 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
639 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
640 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
641 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
642 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
643 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
644 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
645 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
646 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
647 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
648 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
649 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
650 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
651 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
652 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
653 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
654 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
655 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
656 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
657 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
658 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
659 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
660 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
661 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
662 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
663 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH
, OnExplorerBar
)
664 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS
, OnExplorerBar
)
665 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY
, OnExplorerBar
)
666 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES
, OnExplorerBar
)
667 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
668 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
669 COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM
, IDM_EXPLORERBAND_ENDCUSTOM
, OnExplorerBar
)
670 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
673 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
674 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
675 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
676 END_CONNECTION_POINT_MAP()
678 BEGIN_COM_MAP(CShellBrowser
)
679 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
680 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
681 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
682 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
683 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
684 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
685 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
686 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
687 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
688 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
689 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
690 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
691 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
692 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
693 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
694 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
695 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
696 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
700 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
702 CShellBrowser::CShellBrowser()
704 fCurrentShellViewWindow
= NULL
;
705 fCurrentDirectoryPIDL
= NULL
;
707 fStatusBarVisible
= true;
708 memset(fClientBars
, 0, sizeof(fClientBars
));
709 fCurrentMenuBar
= NULL
;
710 fHistoryObject
= NULL
;
711 fHistoryStream
= NULL
;
712 fHistoryBindContext
= NULL
;
715 CShellBrowser::~CShellBrowser()
718 DSA_Destroy(menuDsa
);
721 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
723 CComPtr
<IPersistStreamInit
> persistStreamInit
;
725 CComPtr
<IUnknown
> clientBar
;
727 _AtlInitialConstruct();
729 menuDsa
= DSA_Create(sizeof(MenuBandInfo
), 5);
731 return E_OUTOFMEMORY
;
733 fCabinetState
.cLength
= sizeof(fCabinetState
);
734 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
739 Create(HWND_DESKTOP
);
744 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
745 if (FAILED_UNEXPECTEDLY(hResult
))
748 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &clientBar
));
749 if (FAILED_UNEXPECTEDLY(hResult
))
753 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
756 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
757 if (FAILED_UNEXPECTEDLY(hResult
))
760 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
761 if (FAILED_UNEXPECTEDLY(hResult
))
764 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
765 if (FAILED_UNEXPECTEDLY(hResult
))
768 // TODO: create settingsStream from registry entry
769 //if (settingsStream.p)
771 // hResult = persistStreamInit->Load(settingsStream);
772 // if (FAILED_UNEXPECTEDLY(hResult))
777 hResult
= persistStreamInit
->InitNew();
778 if (FAILED_UNEXPECTEDLY(hResult
))
782 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
783 if (FAILED_UNEXPECTEDLY(hResult
))
786 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
790 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
791 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
792 _AtlBaseModule
.GetModuleInstance(), 0);
793 fStatusBarVisible
= true;
797 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
798 if (FAILED_UNEXPECTEDLY(hResult
))
801 ShowWindow(SW_SHOWNORMAL
);
806 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
808 CComPtr
<IShellFolder
> newFolder
;
809 FOLDERSETTINGS newFolderSettings
;
812 // called by shell view to browse to new folder
813 // also called by explorer band to navigate to new folder
814 hResult
= SHBindToFolder(pidl
, &newFolder
);
815 if (FAILED_UNEXPECTEDLY(hResult
))
818 newFolderSettings
.ViewMode
= FVM_ICON
;
819 newFolderSettings
.fFlags
= 0;
820 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
821 if (FAILED_UNEXPECTEDLY(hResult
))
826 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
828 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
831 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
833 LPCITEMIDLIST pidlnext
;
838 if (! _ILIsDesktop(pidl
))
840 length
= pidl
->mkid
.cb
;
842 reinterpret_cast<LPCITEMIDLIST
>(
843 reinterpret_cast<const BYTE
*>(pidl
) + length
);
844 if (pidlnext
->mkid
.cb
!= 0)
850 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
851 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
853 CComPtr
<IShellFolder
> psf
;
854 LPITEMIDLIST pidlChild
;
855 LPITEMIDLIST pidlParent
;
862 if (ppidlLast
!= NULL
)
864 if (_ILIsPidlSimple(pidl
))
866 if (ppidlLast
!= NULL
)
867 *ppidlLast
= ILClone(pidl
);
868 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
872 pidlChild
= ILClone(ILFindLastID(pidl
));
873 pidlParent
= ILClone(pidl
);
874 ILRemoveLastID(pidlParent
);
875 hResult
= SHGetDesktopFolder(&psf
);
876 if (SUCCEEDED(hResult
))
877 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
878 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
879 *ppidlLast
= pidlChild
;
887 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
888 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
890 CComPtr
<IShellFolder
> parentFolder
;
891 LPITEMIDLIST childPIDL
= NULL
;
895 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
899 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
903 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
906 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
919 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
921 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
924 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
925 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
927 CComPtr
<IObjectWithSite
> objectWithSite
;
928 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
929 CComPtr
<IShellView
> saveCurrentShellView
;
930 CComPtr
<IShellView
> newShellView
;
931 CComPtr
<ITravelLog
> travelLog
;
932 HWND newShellViewWindow
;
933 BOOL windowUpdateIsLocked
;
934 RECT shellViewWindowBounds
;
937 wchar_t newTitle
[MAX_PATH
];
941 if (newShellFolder
== NULL
)
944 hResult
= GetTravelLog(&travelLog
);
945 if (FAILED_UNEXPECTEDLY(hResult
))
949 if (flags
& BTP_UPDATE_CUR_HISTORY
)
951 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
952 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
953 // what to do with error? Do we want to halt browse because state save failed?
956 if (fCurrentShellView
)
958 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
961 // create view object
962 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
963 if (FAILED_UNEXPECTEDLY(hResult
))
965 previousView
= fCurrentShellViewWindow
;
967 // enter updating section
968 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
969 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
970 if (fCurrentShellView
!= NULL
)
971 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
974 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
976 // update folder and view
977 saveCurrentShellFolder
= fCurrentShellFolder
;
978 saveCurrentShellView
= fCurrentShellView
;
979 fCurrentShellFolder
= newShellFolder
;
980 fCurrentShellView
= newShellView
;
983 if (previousView
!= NULL
)
984 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
986 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
987 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
989 // create view window
990 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
991 this, &shellViewWindowBounds
, &newShellViewWindow
);
992 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
994 fCurrentShellView
= saveCurrentShellView
;
995 fCurrentShellFolder
= saveCurrentShellFolder
;
996 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
997 if (windowUpdateIsLocked
)
998 LockWindowUpdate(FALSE
);
999 SetCursor(saveCursor
);
1003 if (objectWithSite
.p
!= NULL
)
1004 hResult
= objectWithSite
->SetSite(NULL
);
1006 // update current pidl
1007 ILFree(fCurrentDirectoryPIDL
);
1008 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1010 // update view window
1011 if (saveCurrentShellView
!= NULL
)
1012 saveCurrentShellView
->DestroyViewWindow();
1013 fCurrentShellViewWindow
= newShellViewWindow
;
1016 saveCurrentShellView
.Release();
1017 saveCurrentShellFolder
.Release();
1019 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1021 // leave updating section
1022 if (windowUpdateIsLocked
)
1023 LockWindowUpdate(FALSE
);
1024 SetCursor(saveCursor
);
1027 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1029 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1030 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1034 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1035 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1036 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1037 if (SUCCEEDED(hResult
))
1039 FireNavigateComplete(newTitle
);
1043 FireNavigateComplete(L
"ERROR");
1046 if (fCabinetState
.fFullPathTitle
)
1047 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1049 nameFlags
= SHGDN_FORADDRESSBAR
;
1050 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1051 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1052 if (SUCCEEDED(hResult
))
1054 SetWindowText(newTitle
);
1056 LPCITEMIDLIST pidlChild
;
1057 INT index
, indexOpen
;
1058 HIMAGELIST himlSmall
, himlLarge
;
1060 CComPtr
<IShellFolder
> sf
;
1061 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1063 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1065 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1067 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1068 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1070 /* Hack to make it possible to release the old icons */
1071 /* Something seems to go wrong with WM_SETICON */
1072 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1073 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1075 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1076 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1078 DestroyIcon(oldSmall
);
1079 DestroyIcon(oldLarge
);
1082 FireCommandStateChangeAll();
1083 hResult
= UpdateForwardBackState();
1084 hResult
= UpdateUpState();
1088 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1090 CComPtr
<IBandSite
> bandSite
;
1091 CComPtr
<IDeskBand
> deskBand
;
1094 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1097 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1098 if (FAILED_UNEXPECTEDLY(hResult
))
1101 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1102 if (FAILED_UNEXPECTEDLY(hResult
))
1105 return deskBand
->QueryInterface(riid
, shellMenu
);
1108 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1110 CComPtr
<IUnknown
> newBaseBar
;
1111 CComPtr
<IDeskBar
> deskBar
;
1112 CComPtr
<IUnknown
> newBaseBarSite
;
1113 CComPtr
<IDeskBarClient
> deskBarClient
;
1118 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1120 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1123 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
), vertical
);
1124 if (FAILED_UNEXPECTEDLY(hResult
))
1126 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
), vertical
);
1127 if (FAILED_UNEXPECTEDLY(hResult
))
1130 // we have to store our basebar into cache now
1131 *cache
= newBaseBar
;
1133 // tell the new base bar about the shell browser
1134 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1135 if (FAILED_UNEXPECTEDLY(hResult
))
1138 // tell the new base bar about the new base bar site
1139 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1140 if (FAILED_UNEXPECTEDLY(hResult
))
1142 hResult
= deskBar
->SetClient(newBaseBarSite
);
1143 if (FAILED_UNEXPECTEDLY(hResult
))
1146 // tell the new base bar site about the new base bar
1147 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1148 if (FAILED_UNEXPECTEDLY(hResult
))
1150 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1151 if (FAILED_UNEXPECTEDLY(hResult
))
1155 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1158 BOOL
CShellBrowser::IsBandLoaded(const CLSID clsidBand
, bool vertical
, DWORD
*pdwBandID
)
1161 CComPtr
<IUnknown
> baseBar
;
1162 CComPtr
<IDeskBar
> deskBar
;
1163 CComPtr
<IUnknown
> baseBarSite
;
1164 CComPtr
<IBandSite
> bandSite
;
1170 /* Get our basebarsite to be able to enumerate bands */
1171 hResult
= GetBaseBar(vertical
, &baseBar
);
1172 if (FAILED_UNEXPECTEDLY(hResult
))
1174 hResult
= baseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1175 if (FAILED_UNEXPECTEDLY(hResult
))
1177 hResult
= deskBar
->GetClient(&baseBarSite
);
1178 if (FAILED_UNEXPECTEDLY(hResult
))
1180 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &bandSite
));
1181 if (FAILED_UNEXPECTEDLY(hResult
))
1184 hResult
= bandSite
->EnumBands(-1, &numBands
);
1185 if (FAILED_UNEXPECTEDLY(hResult
))
1188 for(i
= 0; i
< numBands
; i
++)
1190 CComPtr
<IPersist
> bandPersist
;
1192 hResult
= bandSite
->EnumBands(i
, &dwBandID
);
1193 if (FAILED_UNEXPECTEDLY(hResult
))
1196 hResult
= bandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IPersist
, &bandPersist
));
1197 if (FAILED_UNEXPECTEDLY(hResult
))
1199 hResult
= bandPersist
->GetClassID(&clsidTmp
);
1200 if (FAILED_UNEXPECTEDLY(hResult
))
1202 if (IsEqualGUID(clsidBand
, clsidTmp
))
1204 if (pdwBandID
) *pdwBandID
= dwBandID
;
1211 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1213 CComPtr
<IDockingWindow
> dockingWindow
;
1214 CComPtr
<IUnknown
> baseBarSite
;
1215 CComPtr
<IUnknown
> newBand
;
1216 CComPtr
<IUnknown
> theBaseBar
;
1217 CComPtr
<IDeskBar
> deskBar
;
1222 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1223 if (FAILED_UNEXPECTEDLY(hResult
))
1226 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1227 if (FAILED_UNEXPECTEDLY(hResult
))
1230 hResult
= deskBar
->GetClient(&baseBarSite
);
1231 if (FAILED_UNEXPECTEDLY(hResult
))
1234 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1235 if (FAILED_UNEXPECTEDLY(hResult
))
1238 if (!IsBandLoaded(classID
, vertical
, &dwBandID
))
1240 #if USE_CUSTOM_EXPLORERBAND
1241 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1242 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1244 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1245 hResult
= CExplorerBand_Constructor(IID_PPV_ARG(IUnknown
, &newBand
));
1246 if (FAILED_UNEXPECTEDLY(hResult
))
1252 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1253 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1254 if (FAILED_UNEXPECTEDLY(hResult
))
1260 CComPtr
<IBandSite
> pBandSite
;
1262 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &pBandSite
));
1263 if (!SUCCEEDED(hResult
))
1265 ERR("Can't get IBandSite interface\n");
1268 hResult
= pBandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IUnknown
, &newBand
));
1269 if (!SUCCEEDED(hResult
))
1271 ERR("Can't find band object\n");
1275 // It's hackish, but we should be able to show the wanted band until we
1276 // find the proper way to do this (but it seems to work to add a new band)
1277 // Here we'll just re-add the existing band to the site, causing it to display.
1279 V_VT(&vaIn
) = VT_UNKNOWN
;
1280 V_UNKNOWN(&vaIn
) = newBand
.p
;
1281 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1282 if (FAILED_UNEXPECTEDLY(hResult
))
1287 hResult
= dockingWindow
->ShowDW(TRUE
);
1288 if (FAILED_UNEXPECTEDLY(hResult
))
1294 HRESULT
CShellBrowser::NavigateToParent()
1296 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1297 if (newDirectory
== NULL
)
1298 return E_OUTOFMEMORY
;
1299 if (_ILIsDesktop(newDirectory
))
1301 ILFree(newDirectory
);
1302 return E_INVALIDARG
;
1304 ILRemoveLastID(newDirectory
);
1305 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1306 ILFree(newDirectory
);
1307 if (FAILED_UNEXPECTEDLY(hResult
))
1312 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1314 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1315 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1317 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1318 sheetInfo
->nPages
++;
1322 HRESULT
CShellBrowser::DoFolderOptions()
1324 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1325 PROPSHEETHEADER m_PropSheet
;
1326 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1327 // CComPtr<IGlobalFolderSettings> globalSettings;
1328 // SHELLSTATE2 shellState;
1331 memset(m_psp
, 0, sizeof(m_psp
));
1332 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1334 // create sheet object
1335 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1336 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1337 if (FAILED_UNEXPECTEDLY(hResult
))
1340 // must set site in order for Apply to all Folders on Advanced page to be enabled
1341 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1342 m_PropSheet
.phpage
= m_psp
;
1345 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1346 if (FAILED_UNEXPECTEDLY(hResult
))
1348 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1349 if (FAILED_UNEXPECTEDLY(hResult
))
1354 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1355 if (FAILED_UNEXPECTEDLY(hResult
))
1358 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1359 // It returns 'E_NOTIMPL'
1361 if (fCurrentShellView
!= NULL
)
1363 hResult
= fCurrentShellView
->AddPropertySheetPages(
1364 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1365 if (FAILED_UNEXPECTEDLY(hResult
))
1371 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1372 m_PropSheet
.dwFlags
= 0;
1373 m_PropSheet
.hwndParent
= m_hWnd
;
1374 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1375 m_PropSheet
.pszCaption
= _T("Folder Options");
1376 m_PropSheet
.nStartPage
= 0;
1377 PropertySheet(&m_PropSheet
);
1381 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1383 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1384 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1386 const _ATL_MSG
*previousMessage
;
1388 WNDPROC saveWindowProc
;
1391 hWnd
= pThis
->m_hWnd
;
1392 previousMessage
= pThis
->m_pCurrentMsg
;
1393 pThis
->m_pCurrentMsg
= &msg
;
1395 CComPtr
<IMenuBand
> menuBand
;
1396 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1397 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1399 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1400 if (hResult
== S_OK
)
1403 wParam
= msg
.wParam
;
1404 lParam
= msg
.lParam
;
1408 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1409 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1410 if (handled
== FALSE
)
1412 if (uMsg
== WM_NCDESTROY
)
1414 saveWindowProc
= reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1415 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1416 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1417 ::SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1418 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1421 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1423 pThis
->m_pCurrentMsg
= previousMessage
;
1424 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1426 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1427 pThis
->m_hWnd
= NULL
;
1428 pThis
->OnFinalMessage(hWnd
);
1433 void CShellBrowser::RepositionBars()
1439 GetClientRect(&clientRect
);
1441 if (fStatusBarVisible
&& fStatusBar
)
1443 ::GetWindowRect(fStatusBar
, &statusRect
);
1444 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1445 clientRect
.right
- clientRect
.left
,
1446 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1447 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1450 for (x
= 0; x
< 3; x
++)
1452 HWND hwnd
= fClientBars
[x
].hwnd
;
1453 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1454 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1456 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1457 fClientBars
[x
].hwnd
= hwnd
;
1461 RECT toolbarRect
= clientRect
;
1462 if (borderSpace
.top
!= 0)
1464 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1466 else if (borderSpace
.bottom
!= 0)
1468 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1470 else if (borderSpace
.left
!= 0)
1472 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1474 else if (borderSpace
.right
!= 0)
1476 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1479 ::SetWindowPos(hwnd
, NULL
,
1482 toolbarRect
.right
- toolbarRect
.left
,
1483 toolbarRect
.bottom
- toolbarRect
.top
,
1484 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1486 if (borderSpace
.top
!= 0)
1488 clientRect
.top
= toolbarRect
.bottom
;
1490 else if (borderSpace
.bottom
!= 0)
1492 clientRect
.bottom
= toolbarRect
.top
;
1494 else if (borderSpace
.left
!= 0)
1496 clientRect
.left
= toolbarRect
.right
;
1498 else if (borderSpace
.right
!= 0)
1500 clientRect
.right
= toolbarRect
.left
;
1504 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1505 clientRect
.right
- clientRect
.left
,
1506 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1509 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1512 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1513 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1516 params
.rgvarg
= arguments
;
1517 params
.rgdispidNamedArgs
= NULL
;
1518 params
.cArgs
= argCount
;
1519 params
.cNamedArgs
= 0;
1520 IUnknown
** pp
= vec
.begin();
1521 while (pp
< vec
.end())
1525 CComPtr
<IDispatch
> theDispatch
;
1527 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1528 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1533 while (pp
< vec2
.end())
1537 CComPtr
<IDispatch
> theDispatch
;
1539 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1540 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1547 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1549 // these two variants intentionally to do use CComVariant because it would double free/release
1550 // or does not need to dispose at all
1553 CComBSTR
tempString(newDirectory
);
1555 V_VT(&varArgs
) = VT_BSTR
;
1556 V_BSTR(&varArgs
) = tempString
.m_str
;
1558 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1559 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1560 V_VT(&varArg
[1]) = VT_DISPATCH
;
1561 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1563 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1566 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1570 V_VT(&varArg
[0]) = VT_BOOL
;
1571 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1572 V_VT(&varArg
[1]) = VT_I4
;
1573 V_I4(&varArg
[1]) = commandID
;
1575 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1578 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1580 return FireCommandStateChange(false, -1);
1583 HRESULT
CShellBrowser::UpdateForwardBackState()
1585 CComPtr
<ITravelLog
> travelLog
;
1586 CComPtr
<ITravelEntry
> unusedEntry
;
1592 canGoForward
= false;
1593 hResult
= GetTravelLog(&travelLog
);
1594 if (FAILED_UNEXPECTEDLY(hResult
))
1596 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1597 if (SUCCEEDED(hResult
))
1600 unusedEntry
.Release();
1602 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1603 if (SUCCEEDED(hResult
))
1605 canGoForward
= true;
1606 unusedEntry
.Release();
1608 hResult
= FireCommandStateChange(canGoBack
, 2);
1609 hResult
= FireCommandStateChange(canGoForward
, 1);
1613 HRESULT
CShellBrowser::UpdateUpState()
1619 if (_ILIsDesktop(fCurrentDirectoryPIDL
))
1621 hResult
= FireCommandStateChange(canGoUp
, 3);
1625 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1627 CComPtr
<ITravelLog
> travelLog
;
1628 CComPtr
<ITravelEntry
> unusedEntry
;
1630 MENUITEMINFO menuItemInfo
;
1633 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1635 position
= GetMenuItemCount(theMenu
);
1636 hResult
= GetTravelLog(&travelLog
);
1637 if (FAILED_UNEXPECTEDLY(hResult
))
1640 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1644 if (SUCCEEDED(hResult
))
1646 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, TRUE
);
1647 unusedEntry
.Release();
1650 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, FALSE
);
1652 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1656 if (SUCCEEDED(hResult
))
1658 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, TRUE
);
1659 unusedEntry
.Release();
1662 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, FALSE
);
1664 SHEnableMenuItem(theMenu
,
1665 IDM_GOTO_UPONELEVEL
,
1666 !_ILIsDesktop(fCurrentDirectoryPIDL
));
1668 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1669 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1670 if (SUCCEEDED(hResult
))
1672 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1673 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1674 menuItemInfo
.fType
= MF_SEPARATOR
;
1675 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1676 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1680 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1682 CComPtr
<ITravelLog
> travelLog
;
1684 OLECMD commandList
[5];
1685 HMENU toolbarMenuBar
;
1687 MENUITEMINFO menuItemInfo
;
1690 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1691 if (gotoMenu
!= NULL
)
1692 UpdateGotoMenu(gotoMenu
);
1694 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1695 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1696 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1697 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1698 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1700 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1701 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1702 if (FAILED_UNEXPECTEDLY(hResult
))
1703 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1706 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1707 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1708 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1709 DestroyMenu(menuItemInfo
.hSubMenu
);
1711 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1712 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1713 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1714 DestroyMenu(toolbarMenuBar
);
1717 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1718 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1719 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1720 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1722 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1723 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1724 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1725 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1726 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1727 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1728 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1729 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1731 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1732 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1733 menuItemInfo
.hSubMenu
= toolbarMenu
;
1734 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1736 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1739 HRESULT
CShellBrowser::BuildExplorerBandMenu()
1744 hBandsMenu
= SHGetMenuFromID(fCurrentMenuBar
, IDM_VIEW_EXPLORERBAR
);
1747 OutputDebugString(L
"No menu !\n");
1750 DSA_DeleteAllItems(menuDsa
);
1751 BuildExplorerBandCategory(hBandsMenu
, CATID_InfoBand
, 4, NULL
);
1752 BuildExplorerBandCategory(hBandsMenu
, CATID_CommBand
, 20, &nbFound
);
1756 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_SEPARATOR
, MF_BYCOMMAND
);
1758 // Remove media menu since XP does it (according to API Monitor)
1759 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_MEDIA
, MF_BYCOMMAND
);
1763 HRESULT
CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
)
1766 CComPtr
<IEnumGUID
> pEnumGUID
;
1767 WCHAR wszBandName
[MAX_PATH
];
1768 WCHAR wszBandGUID
[MAX_PATH
];
1769 WCHAR wRegKey
[MAX_PATH
];
1776 mbi
.fVertical
= IsEqualGUID(category
, CATID_InfoBand
);
1778 hr
= SHEnumClassesOfCategories(1, &category
, 0, NULL
, &pEnumGUID
);
1779 if (FAILED_UNEXPECTEDLY(hr
))
1785 pEnumGUID
->Next(1, &iter
, &dwRead
);
1788 // Get the band name
1789 if (IsBuiltinBand(iter
))
1791 if (!StringFromGUID2(iter
, wszBandGUID
, MAX_PATH
))
1793 StringCchPrintfW(wRegKey
, MAX_PATH
, L
"CLSID\\%s", wszBandGUID
);
1794 dwDataSize
= MAX_PATH
;
1795 SHGetValue(HKEY_CLASSES_ROOT
, wRegKey
, NULL
, NULL
, wszBandName
, &dwDataSize
);
1798 InsertMenu(hBandsMenu
, dwPos
+ cBands
, MF_BYPOSITION
, IDM_EXPLORERBAND_BEGINCUSTOM
+ DSA_GetItemCount(menuDsa
), wszBandName
);
1799 DSA_AppendItem(menuDsa
, &mbi
);
1809 BOOL
CShellBrowser::IsBuiltinBand(CLSID
&bandID
)
1811 if (IsEqualCLSID(bandID
, CLSID_ExplorerBand
))
1813 if (IsEqualCLSID(bandID
, CLSID_SH_SearchBand
) || IsEqualCLSID(bandID
, CLSID_SearchBand
))
1815 if (IsEqualCLSID(bandID
, CLSID_IE_SearchBand
) || IsEqualCLSID(bandID
, CLSID_FileSearchBand
))
1817 if (IsEqualCLSID(bandID
, CLSID_SH_HistBand
))
1819 if (IsEqualCLSID(bandID
, CLSID_SH_FavBand
))
1821 if (IsEqualCLSID(bandID
, CLSID_ChannelsBand
))
1826 HRESULT
CShellBrowser::OnSearch()
1828 CComPtr
<IObjectWithSite
> objectWithSite
;
1829 CComPtr
<IContextMenu
> contextMenu
;
1830 CMINVOKECOMMANDINFO commandInfo
;
1831 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1834 // TODO: Query shell if this command is enabled first
1836 memset(&commandInfo
, 0, sizeof(commandInfo
));
1837 commandInfo
.cbSize
= sizeof(commandInfo
);
1838 commandInfo
.hwnd
= m_hWnd
;
1839 commandInfo
.lpParameters
= searchGUID
;
1840 commandInfo
.nShow
= SW_SHOWNORMAL
;
1842 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1843 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1844 if (FAILED_UNEXPECTEDLY(hResult
))
1846 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1847 if (FAILED_UNEXPECTEDLY(hResult
))
1849 hResult
= objectWithSite
->SetSite(dynamic_cast<IShellBrowser
*>(this));
1850 if (FAILED_UNEXPECTEDLY(hResult
))
1852 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1853 hResult
= objectWithSite
->SetSite(NULL
);
1857 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1859 CComPtr
<IUnknown
> int1Retry
;
1860 CComPtr
<IUnknown
> int2Retry
;
1865 if (int1
== NULL
|| int2
== NULL
)
1867 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1868 if (FAILED_UNEXPECTEDLY(hResult
))
1870 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1871 if (FAILED_UNEXPECTEDLY(hResult
))
1873 if (int1Retry
== int2Retry
)
1878 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1880 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1882 RECT availableBounds
;
1884 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1885 for (INT x
= 0; x
< 3; x
++)
1887 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1889 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1890 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1891 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1892 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1895 *prcBorder
= availableBounds
;
1899 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1904 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1906 for (INT x
= 0; x
< 3; x
++)
1908 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1910 fClientBars
[x
].borderSpace
= *pbw
;
1911 // if this bar changed size, it cascades and forces all subsequent bars to resize
1916 return E_INVALIDARG
;
1919 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1920 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1922 CComPtr
<IOleCommandTarget
> commandTarget
;
1925 if (prgCmds
== NULL
)
1926 return E_INVALIDARG
;
1927 if (pguidCmdGroup
== NULL
)
1929 if (fCurrentShellView
.p
!= NULL
)
1931 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1932 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1933 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1942 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1946 switch (prgCmds
->cmdID
)
1948 case 0x1c: // search
1949 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1951 case 0x1d: // history
1952 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1954 case 0x1e: // favorites
1955 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1957 case 0x23: // folders
1958 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1968 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1972 switch (prgCmds
->cmdID
)
1974 case 0xa022: // up level
1975 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1976 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1977 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1987 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1988 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1994 TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
1997 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
2002 hResult
= ShowBand(CLSID_ExplorerBand
, true);
2005 if (nCmdexecopt
== 1)
2007 // pvaIn is a VT_UNKNOWN with a band that is being hidden
2011 // update zones part of the status bar
2014 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
2015 V_VT(pvaOut
) = VT_INT_PTR
;
2016 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
2017 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
2020 // indicate if this cabinet was opened as a browser
2026 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
2035 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
2040 // what is theater mode and why do we receive this?
2044 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
2049 // initialize favorites menu
2053 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
2058 // refresh on toolbar clicked
2061 // called for unknown bands ?
2064 // tell the view if it should hide the task pane or not
2065 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
2068 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
2073 return NavigateToParent();
2076 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
2081 return DoFolderOptions();
2084 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
2089 // Reset All Folders option in Folder Options
2093 else if (IsEqualIID(*pguidCmdGroup
, CLSID_CommonButtons
))
2095 // Windows seems to use this as proxy for toolbar buttons.
2096 // We use it for search band for now to remove code duplication,
2097 // let's see if it could be useful in the future.
2101 // Show search band from toolbar
2114 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
2122 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
2127 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2129 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2131 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
2133 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
2136 DestroyMenu(mainMenu
);
2138 lpMenuWidths
->width
[0] = 2;
2139 lpMenuWidths
->width
[2] = 3;
2140 lpMenuWidths
->width
[4] = 1;
2144 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
2146 CComPtr
<IShellMenu
> shellMenu
;
2149 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
2151 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
2152 if (FAILED_UNEXPECTEDLY(hResult
))
2157 hmenuShared
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2159 // FIXME: Figure out the proper way to do this.
2160 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
2163 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
2166 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
2167 if (FAILED_UNEXPECTEDLY(hResult
))
2169 fCurrentMenuBar
= hmenuShared
;
2170 BuildExplorerBandMenu();
2174 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
2176 if (hmenuShared
== fCurrentMenuBar
)
2178 //DestroyMenu(fCurrentMenuBar);
2179 SetMenuSB(NULL
, NULL
, NULL
);
2184 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
2189 ::SetWindowText(fStatusBar
, pszStatusText
);
2198 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
2203 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
2205 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
2210 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
2212 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2215 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
2220 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
2228 *lphwnd
= fToolbarProxy
.m_hWnd
;
2231 *lphwnd
= fStatusBar
;
2234 // find the directory browser and return it
2235 // this should be used only to determine if a tree is present
2238 // is this a progress dialog?
2244 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
2245 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
2254 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
2259 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
2267 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
2271 *ppshv
= fCurrentShellView
;
2272 if (fCurrentShellView
.p
!= NULL
)
2273 fCurrentShellView
.p
->AddRef();
2277 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2282 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2288 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2293 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2298 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2303 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2304 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2309 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2311 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2312 // the returned interface has a method GetPropertyBag on it
2313 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2314 return this->QueryInterface(riid
, ppvObject
);
2315 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2316 return this->QueryInterface(riid
, ppvObject
);
2317 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2318 return this->QueryInterface(riid
, ppvObject
);
2319 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2320 return this->QueryInterface(riid
, ppvObject
);
2321 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2322 return this->QueryInterface(riid
, ppvObject
);
2323 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2324 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2325 if (IsEqualIID(riid
, IID_IShellBrowser
))
2326 return this->QueryInterface(riid
, ppvObject
);
2327 return E_NOINTERFACE
;
2330 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2332 if (ppvObject
== NULL
)
2338 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2343 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2349 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2354 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2355 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2360 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2365 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2370 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2375 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2380 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2384 // called by toolbar when displaying tooltips
2389 if (fTravelLog
.p
== NULL
)
2391 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2392 if (FAILED_UNEXPECTEDLY(hResult
))
2395 *pptl
= fTravelLog
.p
;
2396 fTravelLog
.p
->AddRef();
2400 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2405 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2410 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2415 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2420 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2425 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2430 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2435 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2440 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2445 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2450 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2455 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2460 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2465 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2470 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2472 // called by explorer bar to get current pidl
2475 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2479 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2484 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2489 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2494 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2496 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2497 return E_INVALIDARG
;
2498 *ppole
= fHistoryObject
;
2499 if (fHistoryObject
!= NULL
)
2500 fHistoryObject
->AddRef();
2501 *pstm
= fHistoryStream
;
2502 if (fHistoryStream
!= NULL
)
2503 fHistoryStream
->AddRef();
2504 *ppbc
= fHistoryBindContext
;
2505 if (fHistoryBindContext
!= NULL
)
2506 fHistoryBindContext
->AddRef();
2507 fHistoryObject
= NULL
;
2508 fHistoryStream
= NULL
;
2509 fHistoryBindContext
= NULL
;
2515 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2520 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2525 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2530 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2531 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2536 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2541 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2546 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2551 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2556 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2561 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2566 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2568 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2572 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2577 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2582 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2587 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2592 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2597 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2602 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2607 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2608 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2613 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2618 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2623 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2628 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2633 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2638 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2643 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2648 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2653 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2658 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2663 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2668 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2673 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2678 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2683 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2688 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2693 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2698 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2703 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2708 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2713 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2718 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2719 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2724 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2725 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2730 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2735 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2740 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2745 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2750 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2755 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2760 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2765 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2770 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2775 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2780 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2785 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2790 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2795 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2800 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2805 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2810 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2815 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2820 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2825 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2826 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2831 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2836 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2841 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2846 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2848 for (int i
= 0; i
< 3; i
++)
2850 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2854 if (!fCurrentShellView
)
2857 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2860 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2865 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2870 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2872 CComPtr
<ITravelLog
> travelLog
;
2873 HRESULT hResult
= GetTravelLog(&travelLog
);
2874 if (FAILED_UNEXPECTEDLY(hResult
))
2876 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2879 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2881 CComPtr
<ITravelLog
> travelLog
;
2882 HRESULT hResult
= GetTravelLog(&travelLog
);
2883 if (FAILED_UNEXPECTEDLY(hResult
))
2885 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2888 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2893 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2898 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2899 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2901 CComHeapPtr
<ITEMIDLIST
> pidl
;
2903 CComPtr
<IShellFolder
> pDesktop
;
2905 hResult
= SHGetDesktopFolder(&pDesktop
);
2906 if (FAILED_UNEXPECTEDLY(hResult
))
2908 hResult
= pDesktop
->ParseDisplayName(NULL
, NULL
, URL
, NULL
, &pidl
, NULL
);
2909 if (FAILED_UNEXPECTEDLY(hResult
))
2911 return BrowseObject(pidl
, 1);
2914 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2918 V_VT(&level
) = VT_I4
;
2920 return Refresh2(&level
);
2923 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2925 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2928 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2929 if (FAILED_UNEXPECTEDLY(hResult
))
2931 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2934 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2939 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2944 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2949 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2954 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2959 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2964 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2971 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2976 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2981 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2986 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2991 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2996 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
3001 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
3006 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
3013 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
3018 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
3023 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
3028 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
3033 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
3038 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
3043 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
3048 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
3053 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
3058 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
3063 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
3068 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
3073 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
3078 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
3083 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
3088 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
3093 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
3098 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
3103 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
3108 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
3113 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
3118 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
3123 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
3128 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
3129 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
3131 LPITEMIDLIST pidl
= NULL
;
3133 // called from drive combo box to navigate to a directory
3134 // Also called by search band to display shell results folder view
3136 if (V_VT(URL
) == VT_BSTR
)
3138 return this->Navigate(V_BSTR(URL
), Flags
, TargetFrameName
, PostData
, Headers
);
3140 if (V_VT(URL
) == (VT_ARRAY
| VT_UI1
))
3142 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
3143 return E_INVALIDARG
;
3145 pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
3147 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
3148 if (FAILED_UNEXPECTEDLY(hResult
))
3153 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
3158 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
3159 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3164 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
3169 // called to show search bar
3170 if (V_VT(pvaClsid
) != VT_BSTR
)
3171 return E_INVALIDARG
;
3172 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
3173 // TODO: properly compute the value of vertical
3175 return ShowBand(classID
, vertical
);
3178 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
3183 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
3188 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
3193 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
3198 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
3203 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
3208 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
3213 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
3218 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
3223 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
3228 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
3233 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
3238 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
3243 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
3248 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
3253 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
3258 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
3260 if (pWinData
== NULL
)
3263 pWinData
->dwWindowID
= -1;
3265 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
3266 pWinData
->lpszUrl
= NULL
;
3267 pWinData
->lpszUrlLocation
= NULL
;
3268 pWinData
->lpszTitle
= NULL
;
3272 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
3277 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
3282 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
3284 CComPtr
<IPersistHistory
> viewPersistHistory
;
3285 CComPtr
<IOleObject
> viewHistoryObject
;
3286 persistState oldState
;
3291 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
3292 if (FAILED_UNEXPECTEDLY(hResult
))
3294 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3296 if (oldState
.browseType
!= 2)
3298 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3300 return E_OUTOFMEMORY
;
3301 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3302 if (FAILED_UNEXPECTEDLY(hResult
))
3307 if (numRead
!= oldState
.pidlSize
)
3312 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3313 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3314 fHistoryObject
= viewHistoryObject
;
3315 fHistoryStream
= pStream
;
3316 fHistoryBindContext
= pbc
;
3317 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3318 fHistoryObject
= NULL
;
3319 fHistoryStream
= NULL
;
3320 fHistoryBindContext
= NULL
;
3322 if (FAILED_UNEXPECTEDLY(hResult
))
3327 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3329 CComPtr
<IPersistHistory
> viewPersistHistory
;
3330 persistState newState
;
3333 hResult
= fCurrentShellView
->GetItemObject(
3334 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3335 memset(&newState
, 0, sizeof(newState
));
3336 newState
.dwSize
= sizeof(newState
);
3337 newState
.browseType
= 2;
3338 newState
.browserIndex
= GetBrowserIndex();
3339 if (viewPersistHistory
.p
!= NULL
)
3341 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3342 if (FAILED_UNEXPECTEDLY(hResult
))
3345 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3346 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3347 if (FAILED_UNEXPECTEDLY(hResult
))
3349 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3350 if (FAILED_UNEXPECTEDLY(hResult
))
3352 if (viewPersistHistory
.p
!= NULL
)
3354 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3355 if (FAILED_UNEXPECTEDLY(hResult
))
3361 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3366 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3371 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3373 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3377 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3380 // TODO: rip down everything
3382 fCurrentShellView
->DestroyViewWindow();
3383 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3384 ReleaseCComPtrExpectZero(fCurrentShellView
);
3386 for (int i
= 0; i
< 3; i
++)
3388 CComPtr
<IDockingWindow
> pdw
;
3389 CComPtr
<IDeskBar
> bar
;
3390 CComPtr
<IUnknown
> pBarSite
;
3391 CComPtr
<IDeskBarClient
> pClient
;
3393 if (fClientBars
[i
].clientBar
== NULL
)
3396 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3397 if (FAILED_UNEXPECTEDLY(hr
))
3400 /* We should destroy our basebarsite too */
3401 hr
= pdw
->QueryInterface(IID_PPV_ARG(IDeskBar
, &bar
));
3404 hr
= bar
->GetClient(&pBarSite
);
3405 if (SUCCEEDED(hr
) && pBarSite
)
3407 hr
= pBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &pClient
));
3409 pClient
->SetDeskBarSite(NULL
);
3414 /* For some reasons, it's like we miss some AddRef in ATL when QueryInterface on
3415 * same interface or inherited one, so we are removing already removed (!) object.
3416 * TODO: check with MSVC's ATL to see if this behaviour happens too
3421 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3423 ReleaseCComPtrExpectZero(fTravelLog
);
3425 fCurrentShellFolder
.Release();
3426 ILFree(fCurrentDirectoryPIDL
);
3427 ::DestroyWindow(fStatusBar
);
3428 DestroyMenu(fCurrentMenuBar
);
3434 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3436 CComPtr
<IDockingWindow
> dockingWindow
;
3437 RECT availableBounds
;
3438 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3441 if (wParam
!= SIZE_MINIMIZED
)
3443 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3444 for (INT x
= 0; x
< 3; x
++)
3446 if (fClientBars
[x
].clientBar
!= NULL
)
3448 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3449 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3450 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3452 hResult
= dockingWindow
->ResizeBorderDW(
3453 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3463 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3466 LPARAM menuIndex
= lParam
;
3468 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3470 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3474 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3478 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3480 UpdateViewMenu(theMenu
);
3483 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3487 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3489 // FIXME: Remove once implemented
3490 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3491 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3492 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3493 FIXME("Folder options dialog is stubbed: CORE-11141\n");
3494 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
); // Remove when CORE-11141 is fixed.
3497 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3502 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3507 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3509 ::SetFocus(fCurrentShellViewWindow
);
3513 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3515 if (fCurrentShellViewWindow
!= NULL
)
3516 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3520 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3522 return SendMessage(WM_CLOSE
);
3525 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3527 HRESULT hResult
= DoFolderOptions();
3528 if (FAILED(hResult
))
3529 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3533 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3536 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3537 #endif /* __REACTOS__ */
3541 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3544 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3545 #endif /* __REACTOS__ */
3549 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3551 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3555 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3557 HRESULT hResult
= GoBack();
3558 if (FAILED(hResult
))
3559 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3563 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3565 HRESULT hResult
= GoForward();
3566 if (FAILED(hResult
))
3567 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3571 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3573 HRESULT hResult
= NavigateToParent();
3574 if (FAILED(hResult
))
3575 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3579 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3581 HRESULT hResult
= GoHome();
3582 if (FAILED(hResult
))
3583 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3587 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3589 // FIXME: This does not appear to be what windows does.
3590 HRESULT hResult
= NavigateToParent();
3591 if (FAILED(hResult
))
3592 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3596 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3598 CComPtr
<IShellFolder
> psfDesktop
;
3599 LPITEMIDLIST pidlFavs
;
3601 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3604 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3609 hr
= SHGetDesktopFolder(&psfDesktop
);
3610 if (FAILED_UNEXPECTEDLY(hr
))
3613 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3614 if (FAILED_UNEXPECTEDLY(hr
))
3620 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3622 /* TODO: Implement properly */
3624 LPCWSTR strSite
= L
"https://www.reactos.org/user-faq";
3626 /* TODO: Make localizable */
3627 LPCWSTR strCaption
= L
"Sorry";
3628 LPCWSTR strMessage
= L
"ReactOS could not browse to '%s' (error %d). Please make sure there is a web browser installed.";
3629 WCHAR tmpMessage
[512];
3631 /* TODO: Read from the registry */
3632 LPCWSTR strVerb
= NULL
; /* default */
3633 LPCWSTR strPath
= strSite
;
3634 LPCWSTR strParams
= NULL
;
3636 /* The return value is defined as HINSTANCE for backwards compatibility only, the cast is needed */
3637 int result
= (int) ShellExecuteW(m_hWnd
, strVerb
, strPath
, strParams
, NULL
, SW_SHOWNORMAL
);
3640 StringCchPrintfW(tmpMessage
, 512, strMessage
, strSite
, result
);
3641 MessageBoxExW(m_hWnd
, tmpMessage
, strCaption
, MB_OK
, 0);
3647 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3649 fStatusBarVisible
= !fStatusBarVisible
;
3652 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3658 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3661 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3662 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3666 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3669 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3670 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3674 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3677 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3678 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3682 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3685 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3686 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3690 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3693 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3694 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3698 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3701 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3702 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3706 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3711 LRESULT
CShellBrowser::OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3713 // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3714 if (wID
>= IDM_EXPLORERBAND_BEGINCUSTOM
&& wID
<= IDM_EXPLORERBAND_ENDCUSTOM
)
3717 mbi
= (MenuBandInfo
*)DSA_GetItemPtr(menuDsa
, (wID
- IDM_EXPLORERBAND_BEGINCUSTOM
));
3720 ShowBand(mbi
->barGuid
, mbi
->fVertical
);
3726 case IDM_EXPLORERBAR_SEARCH
:
3727 Exec(&CLSID_CommonButtons
, 0x123, 1, NULL
, NULL
);
3729 case IDM_EXPLORERBAR_FOLDERS
:
3730 ShowBand(CLSID_ExplorerBand
, true);
3732 case IDM_EXPLORERBAR_HISTORY
:
3733 ShowBand(CLSID_SH_HistBand
, true);
3735 case IDM_EXPLORERBAR_FAVORITES
:
3736 ShowBand(CLSID_SH_FavBand
, true);
3739 WARN("Unknown id %x\n", wID
);
3745 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3747 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3748 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3752 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3754 CComPtr
<CShellBrowser
> theCabinet
;
3759 // Tell the thread ref we are using it.
3760 if (parameters
&& parameters
->offsetF8
)
3761 parameters
->offsetF8
->AddRef();
3763 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3764 if (theCabinet
== NULL
)
3766 return E_OUTOFMEMORY
;
3769 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3770 if (FAILED_UNEXPECTEDLY(hResult
))
3771 return E_OUTOFMEMORY
;
3773 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3777 // Error: continue or exit?
3781 if (Msg
.message
== WM_QUIT
)
3784 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3786 TranslateMessage(&Msg
);
3787 DispatchMessage(&Msg
);
3791 int nrc
= theCabinet
->Release();
3794 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3797 theCabinet
.Detach();
3799 // Tell the thread ref we are not using it anymore.
3800 if (parameters
&& parameters
->offsetF8
)
3801 parameters
->offsetF8
->Release();
3806 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3809 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3811 OleInitialize(NULL
);
3813 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3817 SHDestroyIETHREADPARAM(parameters
);