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 0
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 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1241 if (FAILED_UNEXPECTEDLY(hResult
))
1246 CComPtr
<IBandSite
> pBandSite
;
1248 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &pBandSite
));
1249 if (!SUCCEEDED(hResult
))
1251 ERR("Can't get IBandSite interface\n");
1254 hResult
= pBandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IUnknown
, &newBand
));
1255 if (!SUCCEEDED(hResult
))
1257 ERR("Can't find band object\n");
1261 // It's hackish, but we should be able to show the wanted band until we
1262 // find the proper way to do this (but it seems to work to add a new band)
1263 // Here we'll just re-add the existing band to the site, causing it to display.
1265 V_VT(&vaIn
) = VT_UNKNOWN
;
1266 V_UNKNOWN(&vaIn
) = newBand
.p
;
1267 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1268 if (FAILED_UNEXPECTEDLY(hResult
))
1273 hResult
= dockingWindow
->ShowDW(TRUE
);
1274 if (FAILED_UNEXPECTEDLY(hResult
))
1280 HRESULT
CShellBrowser::NavigateToParent()
1282 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1283 if (newDirectory
== NULL
)
1284 return E_OUTOFMEMORY
;
1285 if (_ILIsDesktop(newDirectory
))
1287 ILFree(newDirectory
);
1288 return E_INVALIDARG
;
1290 ILRemoveLastID(newDirectory
);
1291 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1292 ILFree(newDirectory
);
1293 if (FAILED_UNEXPECTEDLY(hResult
))
1298 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1300 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1301 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1303 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1304 sheetInfo
->nPages
++;
1308 HRESULT
CShellBrowser::DoFolderOptions()
1310 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1311 PROPSHEETHEADER m_PropSheet
;
1312 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1313 // CComPtr<IGlobalFolderSettings> globalSettings;
1314 // SHELLSTATE2 shellState;
1317 memset(m_psp
, 0, sizeof(m_psp
));
1318 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1320 // create sheet object
1321 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1322 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1323 if (FAILED_UNEXPECTEDLY(hResult
))
1326 // must set site in order for Apply to all Folders on Advanced page to be enabled
1327 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1328 m_PropSheet
.phpage
= m_psp
;
1331 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1332 if (FAILED_UNEXPECTEDLY(hResult
))
1334 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1335 if (FAILED_UNEXPECTEDLY(hResult
))
1340 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1341 if (FAILED_UNEXPECTEDLY(hResult
))
1344 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1345 // It returns 'E_NOTIMPL'
1347 if (fCurrentShellView
!= NULL
)
1349 hResult
= fCurrentShellView
->AddPropertySheetPages(
1350 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1351 if (FAILED_UNEXPECTEDLY(hResult
))
1357 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1358 m_PropSheet
.dwFlags
= 0;
1359 m_PropSheet
.hwndParent
= m_hWnd
;
1360 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1361 m_PropSheet
.pszCaption
= _T("Folder Options");
1362 m_PropSheet
.nStartPage
= 0;
1363 PropertySheet(&m_PropSheet
);
1367 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1369 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1370 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1372 const _ATL_MSG
*previousMessage
;
1374 WNDPROC saveWindowProc
;
1377 hWnd
= pThis
->m_hWnd
;
1378 previousMessage
= pThis
->m_pCurrentMsg
;
1379 pThis
->m_pCurrentMsg
= &msg
;
1381 CComPtr
<IMenuBand
> menuBand
;
1382 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1383 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1385 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1386 if (hResult
== S_OK
)
1389 wParam
= msg
.wParam
;
1390 lParam
= msg
.lParam
;
1394 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1395 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1396 if (handled
== FALSE
)
1398 if (uMsg
== WM_NCDESTROY
)
1400 saveWindowProc
= reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1401 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1402 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1403 ::SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1404 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1407 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1409 pThis
->m_pCurrentMsg
= previousMessage
;
1410 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1412 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1413 pThis
->m_hWnd
= NULL
;
1414 pThis
->OnFinalMessage(hWnd
);
1419 void CShellBrowser::RepositionBars()
1425 GetClientRect(&clientRect
);
1427 if (fStatusBarVisible
&& fStatusBar
)
1429 ::GetWindowRect(fStatusBar
, &statusRect
);
1430 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1431 clientRect
.right
- clientRect
.left
,
1432 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1433 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1436 for (x
= 0; x
< 3; x
++)
1438 HWND hwnd
= fClientBars
[x
].hwnd
;
1439 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1440 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1442 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1443 fClientBars
[x
].hwnd
= hwnd
;
1447 RECT toolbarRect
= clientRect
;
1448 if (borderSpace
.top
!= 0)
1450 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1452 else if (borderSpace
.bottom
!= 0)
1454 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1456 else if (borderSpace
.left
!= 0)
1458 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1460 else if (borderSpace
.right
!= 0)
1462 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1465 ::SetWindowPos(hwnd
, NULL
,
1468 toolbarRect
.right
- toolbarRect
.left
,
1469 toolbarRect
.bottom
- toolbarRect
.top
,
1470 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1472 if (borderSpace
.top
!= 0)
1474 clientRect
.top
= toolbarRect
.bottom
;
1476 else if (borderSpace
.bottom
!= 0)
1478 clientRect
.bottom
= toolbarRect
.top
;
1480 else if (borderSpace
.left
!= 0)
1482 clientRect
.left
= toolbarRect
.right
;
1484 else if (borderSpace
.right
!= 0)
1486 clientRect
.right
= toolbarRect
.left
;
1490 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1491 clientRect
.right
- clientRect
.left
,
1492 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1495 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1498 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1499 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1502 params
.rgvarg
= arguments
;
1503 params
.rgdispidNamedArgs
= NULL
;
1504 params
.cArgs
= argCount
;
1505 params
.cNamedArgs
= 0;
1506 IUnknown
** pp
= vec
.begin();
1507 while (pp
< vec
.end())
1511 CComPtr
<IDispatch
> theDispatch
;
1513 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1514 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1519 while (pp
< vec2
.end())
1523 CComPtr
<IDispatch
> theDispatch
;
1525 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1526 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1533 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1535 // these two variants intentionally to do use CComVariant because it would double free/release
1536 // or does not need to dispose at all
1539 CComBSTR
tempString(newDirectory
);
1541 V_VT(&varArgs
) = VT_BSTR
;
1542 V_BSTR(&varArgs
) = tempString
.m_str
;
1544 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1545 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1546 V_VT(&varArg
[1]) = VT_DISPATCH
;
1547 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1549 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1552 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1556 V_VT(&varArg
[0]) = VT_BOOL
;
1557 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1558 V_VT(&varArg
[1]) = VT_I4
;
1559 V_I4(&varArg
[1]) = commandID
;
1561 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1564 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1566 return FireCommandStateChange(false, -1);
1569 HRESULT
CShellBrowser::UpdateForwardBackState()
1571 CComPtr
<ITravelLog
> travelLog
;
1572 CComPtr
<ITravelEntry
> unusedEntry
;
1578 canGoForward
= false;
1579 hResult
= GetTravelLog(&travelLog
);
1580 if (FAILED_UNEXPECTEDLY(hResult
))
1582 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1583 if (SUCCEEDED(hResult
))
1586 unusedEntry
.Release();
1588 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1589 if (SUCCEEDED(hResult
))
1591 canGoForward
= true;
1592 unusedEntry
.Release();
1594 hResult
= FireCommandStateChange(canGoBack
, 2);
1595 hResult
= FireCommandStateChange(canGoForward
, 1);
1599 HRESULT
CShellBrowser::UpdateUpState()
1605 if (_ILIsDesktop(fCurrentDirectoryPIDL
))
1607 hResult
= FireCommandStateChange(canGoUp
, 3);
1611 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1613 CComPtr
<ITravelLog
> travelLog
;
1614 CComPtr
<ITravelEntry
> unusedEntry
;
1616 MENUITEMINFO menuItemInfo
;
1619 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1621 position
= GetMenuItemCount(theMenu
);
1622 hResult
= GetTravelLog(&travelLog
);
1623 if (FAILED_UNEXPECTEDLY(hResult
))
1626 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1630 if (SUCCEEDED(hResult
))
1632 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, TRUE
);
1633 unusedEntry
.Release();
1636 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, FALSE
);
1638 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1642 if (SUCCEEDED(hResult
))
1644 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, TRUE
);
1645 unusedEntry
.Release();
1648 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, FALSE
);
1650 SHEnableMenuItem(theMenu
,
1651 IDM_GOTO_UPONELEVEL
,
1652 !_ILIsDesktop(fCurrentDirectoryPIDL
));
1654 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1655 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1656 if (SUCCEEDED(hResult
))
1658 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1659 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1660 menuItemInfo
.fType
= MF_SEPARATOR
;
1661 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1662 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1666 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1668 CComPtr
<ITravelLog
> travelLog
;
1670 OLECMD commandList
[5];
1671 HMENU toolbarMenuBar
;
1673 MENUITEMINFO menuItemInfo
;
1676 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1677 if (gotoMenu
!= NULL
)
1678 UpdateGotoMenu(gotoMenu
);
1680 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1681 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1682 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1683 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1684 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1686 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1687 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1688 if (FAILED_UNEXPECTEDLY(hResult
))
1689 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1692 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1693 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1694 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1695 DestroyMenu(menuItemInfo
.hSubMenu
);
1697 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1698 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1699 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1700 DestroyMenu(toolbarMenuBar
);
1703 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1704 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1705 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1706 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1708 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1709 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1710 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1711 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1712 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1713 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1714 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1715 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1717 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1718 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1719 menuItemInfo
.hSubMenu
= toolbarMenu
;
1720 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1722 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1725 HRESULT
CShellBrowser::BuildExplorerBandMenu()
1730 hBandsMenu
= SHGetMenuFromID(fCurrentMenuBar
, IDM_VIEW_EXPLORERBAR
);
1733 OutputDebugString(L
"No menu !\n");
1736 DSA_DeleteAllItems(menuDsa
);
1737 BuildExplorerBandCategory(hBandsMenu
, CATID_InfoBand
, 4, NULL
);
1738 BuildExplorerBandCategory(hBandsMenu
, CATID_CommBand
, 20, &nbFound
);
1742 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_SEPARATOR
, MF_BYCOMMAND
);
1744 // Remove media menu since XP does it (according to API Monitor)
1745 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_MEDIA
, MF_BYCOMMAND
);
1749 HRESULT
CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
)
1752 CComPtr
<IEnumGUID
> pEnumGUID
;
1753 WCHAR wszBandName
[MAX_PATH
];
1754 WCHAR wszBandGUID
[MAX_PATH
];
1755 WCHAR wRegKey
[MAX_PATH
];
1762 mbi
.fVertical
= IsEqualGUID(category
, CATID_InfoBand
);
1764 hr
= SHEnumClassesOfCategories(1, &category
, 0, NULL
, &pEnumGUID
);
1765 if (FAILED_UNEXPECTEDLY(hr
))
1771 pEnumGUID
->Next(1, &iter
, &dwRead
);
1774 // Get the band name
1775 if (IsBuiltinBand(iter
))
1777 if (!StringFromGUID2(iter
, wszBandGUID
, MAX_PATH
))
1779 StringCchPrintfW(wRegKey
, MAX_PATH
, L
"CLSID\\%s", wszBandGUID
);
1780 dwDataSize
= MAX_PATH
;
1781 SHGetValue(HKEY_CLASSES_ROOT
, wRegKey
, NULL
, NULL
, wszBandName
, &dwDataSize
);
1784 InsertMenu(hBandsMenu
, dwPos
+ cBands
, MF_BYPOSITION
, IDM_EXPLORERBAND_BEGINCUSTOM
+ DSA_GetItemCount(menuDsa
), wszBandName
);
1785 DSA_AppendItem(menuDsa
, &mbi
);
1795 BOOL
CShellBrowser::IsBuiltinBand(CLSID
&bandID
)
1797 if (IsEqualCLSID(bandID
, CLSID_ExplorerBand
))
1799 if (IsEqualCLSID(bandID
, CLSID_SH_SearchBand
) || IsEqualCLSID(bandID
, CLSID_SearchBand
))
1801 if (IsEqualCLSID(bandID
, CLSID_IE_SearchBand
) || IsEqualCLSID(bandID
, CLSID_FileSearchBand
))
1803 if (IsEqualCLSID(bandID
, CLSID_SH_HistBand
))
1805 if (IsEqualCLSID(bandID
, CLSID_SH_FavBand
))
1807 if (IsEqualCLSID(bandID
, CLSID_ChannelsBand
))
1812 HRESULT
CShellBrowser::OnSearch()
1814 CComPtr
<IObjectWithSite
> objectWithSite
;
1815 CComPtr
<IContextMenu
> contextMenu
;
1816 CMINVOKECOMMANDINFO commandInfo
;
1817 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1820 // TODO: Query shell if this command is enabled first
1822 memset(&commandInfo
, 0, sizeof(commandInfo
));
1823 commandInfo
.cbSize
= sizeof(commandInfo
);
1824 commandInfo
.hwnd
= m_hWnd
;
1825 commandInfo
.lpParameters
= searchGUID
;
1826 commandInfo
.nShow
= SW_SHOWNORMAL
;
1828 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1829 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1830 if (FAILED_UNEXPECTEDLY(hResult
))
1832 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1833 if (FAILED_UNEXPECTEDLY(hResult
))
1835 hResult
= objectWithSite
->SetSite(dynamic_cast<IShellBrowser
*>(this));
1836 if (FAILED_UNEXPECTEDLY(hResult
))
1838 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1839 hResult
= objectWithSite
->SetSite(NULL
);
1843 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1845 CComPtr
<IUnknown
> int1Retry
;
1846 CComPtr
<IUnknown
> int2Retry
;
1851 if (int1
== NULL
|| int2
== NULL
)
1853 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1854 if (FAILED_UNEXPECTEDLY(hResult
))
1856 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1857 if (FAILED_UNEXPECTEDLY(hResult
))
1859 if (int1Retry
== int2Retry
)
1864 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1866 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1868 RECT availableBounds
;
1870 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1871 for (INT x
= 0; x
< 3; x
++)
1873 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1875 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1876 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1877 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1878 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1881 *prcBorder
= availableBounds
;
1885 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1890 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1892 for (INT x
= 0; x
< 3; x
++)
1894 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1896 fClientBars
[x
].borderSpace
= *pbw
;
1897 // if this bar changed size, it cascades and forces all subsequent bars to resize
1902 return E_INVALIDARG
;
1905 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1906 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1908 CComPtr
<IOleCommandTarget
> commandTarget
;
1911 if (prgCmds
== NULL
)
1912 return E_INVALIDARG
;
1913 if (pguidCmdGroup
== NULL
)
1915 if (fCurrentShellView
.p
!= NULL
)
1917 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1918 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1919 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1928 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1932 switch (prgCmds
->cmdID
)
1934 case 0x1c: // search
1935 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1937 case 0x1d: // history
1938 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1940 case 0x1e: // favorites
1941 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1943 case 0x23: // folders
1944 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1954 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1958 switch (prgCmds
->cmdID
)
1960 case 0xa022: // up level
1961 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1962 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1963 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1973 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1974 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1980 TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
1983 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1988 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1991 if (nCmdexecopt
== 1)
1993 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1997 // update zones part of the status bar
2000 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
2001 V_VT(pvaOut
) = VT_INT_PTR
;
2002 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
2003 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
2006 // indicate if this cabinet was opened as a browser
2012 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
2021 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
2026 // what is theater mode and why do we receive this?
2030 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
2035 // initialize favorites menu
2039 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
2044 // refresh on toolbar clicked
2047 // called for unknown bands ?
2050 // tell the view if it should hide the task pane or not
2051 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
2054 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
2059 return NavigateToParent();
2062 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
2067 return DoFolderOptions();
2070 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
2075 // Reset All Folders option in Folder Options
2079 else if (IsEqualIID(*pguidCmdGroup
, CLSID_CommonButtons
))
2081 // Windows seems to use this as proxy for toolbar buttons.
2082 // We use it for search band for now to remove code duplication,
2083 // let's see if it could be useful in the future.
2087 // Show search band from toolbar
2100 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
2108 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
2113 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2115 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2117 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
2119 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
2122 DestroyMenu(mainMenu
);
2124 lpMenuWidths
->width
[0] = 2;
2125 lpMenuWidths
->width
[2] = 3;
2126 lpMenuWidths
->width
[4] = 1;
2130 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
2132 CComPtr
<IShellMenu
> shellMenu
;
2135 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
2137 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
2138 if (FAILED_UNEXPECTEDLY(hResult
))
2143 hmenuShared
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2145 // FIXME: Figure out the proper way to do this.
2146 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
2149 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
2152 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
2153 if (FAILED_UNEXPECTEDLY(hResult
))
2155 fCurrentMenuBar
= hmenuShared
;
2156 BuildExplorerBandMenu();
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
2162 if (hmenuShared
== fCurrentMenuBar
)
2164 //DestroyMenu(fCurrentMenuBar);
2165 SetMenuSB(NULL
, NULL
, NULL
);
2170 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
2175 ::SetWindowText(fStatusBar
, pszStatusText
);
2184 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
2189 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
2191 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
2196 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
2198 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2201 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
2206 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
2214 *lphwnd
= fToolbarProxy
.m_hWnd
;
2217 *lphwnd
= fStatusBar
;
2220 // find the directory browser and return it
2221 // this should be used only to determine if a tree is present
2224 // is this a progress dialog?
2230 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
2231 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
2240 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
2245 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
2253 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
2257 *ppshv
= fCurrentShellView
;
2258 if (fCurrentShellView
.p
!= NULL
)
2259 fCurrentShellView
.p
->AddRef();
2263 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2268 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2273 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2274 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2279 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2284 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2289 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2290 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2295 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2297 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2298 // the returned interface has a method GetPropertyBag on it
2299 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2300 return this->QueryInterface(riid
, ppvObject
);
2301 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2302 return this->QueryInterface(riid
, ppvObject
);
2303 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2304 return this->QueryInterface(riid
, ppvObject
);
2305 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2306 return this->QueryInterface(riid
, ppvObject
);
2307 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2308 return this->QueryInterface(riid
, ppvObject
);
2309 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2310 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2311 if (IsEqualIID(riid
, IID_IShellBrowser
))
2312 return this->QueryInterface(riid
, ppvObject
);
2313 return E_NOINTERFACE
;
2316 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2318 if (ppvObject
== NULL
)
2324 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2329 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2334 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2335 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2340 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2341 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2346 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2351 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2356 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2361 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2366 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2370 // called by toolbar when displaying tooltips
2375 if (fTravelLog
.p
== NULL
)
2377 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2378 if (FAILED_UNEXPECTEDLY(hResult
))
2381 *pptl
= fTravelLog
.p
;
2382 fTravelLog
.p
->AddRef();
2386 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2391 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2396 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2401 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2406 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2411 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2416 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2421 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2426 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2431 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2436 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2441 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2446 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2451 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2456 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2458 // called by explorer bar to get current pidl
2461 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2465 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2470 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2475 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2480 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2482 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2483 return E_INVALIDARG
;
2484 *ppole
= fHistoryObject
;
2485 if (fHistoryObject
!= NULL
)
2486 fHistoryObject
->AddRef();
2487 *pstm
= fHistoryStream
;
2488 if (fHistoryStream
!= NULL
)
2489 fHistoryStream
->AddRef();
2490 *ppbc
= fHistoryBindContext
;
2491 if (fHistoryBindContext
!= NULL
)
2492 fHistoryBindContext
->AddRef();
2493 fHistoryObject
= NULL
;
2494 fHistoryStream
= NULL
;
2495 fHistoryBindContext
= NULL
;
2501 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2506 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2511 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2516 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2517 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2522 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2527 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2532 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2537 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2542 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2547 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2552 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2554 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2558 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2563 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2568 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2573 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2578 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2583 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2588 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2593 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2594 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2599 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2604 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2609 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2614 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2619 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2624 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2629 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2634 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2639 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2644 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2649 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2654 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2659 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2664 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2669 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2674 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2679 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2684 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2689 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2694 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2699 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2704 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2705 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2710 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2711 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2716 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2721 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2726 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2731 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2736 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2741 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2746 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2751 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2756 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2761 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2766 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2771 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2776 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2781 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2786 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2791 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2796 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2801 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2806 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2811 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2812 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2817 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2822 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2827 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2832 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2834 for (int i
= 0; i
< 3; i
++)
2836 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2840 if (!fCurrentShellView
)
2843 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2846 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2851 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2856 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2858 CComPtr
<ITravelLog
> travelLog
;
2859 HRESULT hResult
= GetTravelLog(&travelLog
);
2860 if (FAILED_UNEXPECTEDLY(hResult
))
2862 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2865 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2867 CComPtr
<ITravelLog
> travelLog
;
2868 HRESULT hResult
= GetTravelLog(&travelLog
);
2869 if (FAILED_UNEXPECTEDLY(hResult
))
2871 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2874 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2879 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2884 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2885 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2887 CComHeapPtr
<ITEMIDLIST
> pidl
;
2889 CComPtr
<IShellFolder
> pDesktop
;
2891 hResult
= SHGetDesktopFolder(&pDesktop
);
2892 if (FAILED_UNEXPECTEDLY(hResult
))
2894 hResult
= pDesktop
->ParseDisplayName(NULL
, NULL
, URL
, NULL
, &pidl
, NULL
);
2895 if (FAILED_UNEXPECTEDLY(hResult
))
2897 return BrowseObject(pidl
, 1);
2900 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2904 V_VT(&level
) = VT_I4
;
2906 return Refresh2(&level
);
2909 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2911 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2914 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2915 if (FAILED_UNEXPECTEDLY(hResult
))
2917 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2920 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2925 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2930 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2935 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2940 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2945 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2950 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2957 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2962 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2967 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2972 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2977 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2982 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2987 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2992 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2999 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
3004 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
3009 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
3014 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
3019 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
3024 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
3029 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
3034 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
3039 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
3044 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
3049 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
3054 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
3059 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
3064 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
3069 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
3074 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
3079 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
3084 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
3089 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
3094 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
3099 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
3104 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
3109 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
3114 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
3115 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
3117 LPITEMIDLIST pidl
= NULL
;
3119 // called from drive combo box to navigate to a directory
3120 // Also called by search band to display shell results folder view
3122 if (V_VT(URL
) == VT_BSTR
)
3124 return this->Navigate(V_BSTR(URL
), Flags
, TargetFrameName
, PostData
, Headers
);
3126 if (V_VT(URL
) == (VT_ARRAY
| VT_UI1
))
3128 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
3129 return E_INVALIDARG
;
3131 pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
3133 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
3134 if (FAILED_UNEXPECTEDLY(hResult
))
3139 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
3144 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
3145 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3150 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
3155 // called to show search bar
3156 if (V_VT(pvaClsid
) != VT_BSTR
)
3157 return E_INVALIDARG
;
3158 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
3159 // TODO: properly compute the value of vertical
3161 return ShowBand(classID
, vertical
);
3164 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
3169 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
3174 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
3179 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
3184 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
3189 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
3194 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
3199 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
3204 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
3209 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
3214 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
3219 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
3224 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
3229 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
3234 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
3239 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
3244 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
3246 if (pWinData
== NULL
)
3249 pWinData
->dwWindowID
= -1;
3251 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
3252 pWinData
->lpszUrl
= NULL
;
3253 pWinData
->lpszUrlLocation
= NULL
;
3254 pWinData
->lpszTitle
= NULL
;
3258 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
3263 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
3268 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
3270 CComPtr
<IPersistHistory
> viewPersistHistory
;
3271 CComPtr
<IOleObject
> viewHistoryObject
;
3272 persistState oldState
;
3277 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
3278 if (FAILED_UNEXPECTEDLY(hResult
))
3280 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3282 if (oldState
.browseType
!= 2)
3284 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3286 return E_OUTOFMEMORY
;
3287 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3288 if (FAILED_UNEXPECTEDLY(hResult
))
3293 if (numRead
!= oldState
.pidlSize
)
3298 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3299 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3300 fHistoryObject
= viewHistoryObject
;
3301 fHistoryStream
= pStream
;
3302 fHistoryBindContext
= pbc
;
3303 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3304 fHistoryObject
= NULL
;
3305 fHistoryStream
= NULL
;
3306 fHistoryBindContext
= NULL
;
3308 if (FAILED_UNEXPECTEDLY(hResult
))
3313 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3315 CComPtr
<IPersistHistory
> viewPersistHistory
;
3316 persistState newState
;
3319 hResult
= fCurrentShellView
->GetItemObject(
3320 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3321 memset(&newState
, 0, sizeof(newState
));
3322 newState
.dwSize
= sizeof(newState
);
3323 newState
.browseType
= 2;
3324 newState
.browserIndex
= GetBrowserIndex();
3325 if (viewPersistHistory
.p
!= NULL
)
3327 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3328 if (FAILED_UNEXPECTEDLY(hResult
))
3331 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3332 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3333 if (FAILED_UNEXPECTEDLY(hResult
))
3335 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3336 if (FAILED_UNEXPECTEDLY(hResult
))
3338 if (viewPersistHistory
.p
!= NULL
)
3340 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3341 if (FAILED_UNEXPECTEDLY(hResult
))
3347 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3352 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3357 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3359 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3363 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3366 // TODO: rip down everything
3368 fCurrentShellView
->DestroyViewWindow();
3369 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3370 ReleaseCComPtrExpectZero(fCurrentShellView
);
3372 for (int i
= 0; i
< 3; i
++)
3374 CComPtr
<IDockingWindow
> pdw
;
3375 CComPtr
<IDeskBar
> bar
;
3376 CComPtr
<IUnknown
> pBarSite
;
3377 CComPtr
<IDeskBarClient
> pClient
;
3379 if (fClientBars
[i
].clientBar
== NULL
)
3382 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3383 if (FAILED_UNEXPECTEDLY(hr
))
3386 /* We should destroy our basebarsite too */
3387 hr
= pdw
->QueryInterface(IID_PPV_ARG(IDeskBar
, &bar
));
3390 hr
= bar
->GetClient(&pBarSite
);
3391 if (SUCCEEDED(hr
) && pBarSite
)
3393 hr
= pBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &pClient
));
3395 pClient
->SetDeskBarSite(NULL
);
3400 /* For some reasons, it's like we miss some AddRef in ATL when QueryInterface on
3401 * same interface or inherited one, so we are removing already removed (!) object.
3402 * TODO: check with MSVC's ATL to see if this behaviour happens too
3407 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3409 ReleaseCComPtrExpectZero(fTravelLog
);
3411 fCurrentShellFolder
.Release();
3412 ILFree(fCurrentDirectoryPIDL
);
3413 ::DestroyWindow(fStatusBar
);
3414 DestroyMenu(fCurrentMenuBar
);
3420 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3422 CComPtr
<IDockingWindow
> dockingWindow
;
3423 RECT availableBounds
;
3424 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3427 if (wParam
!= SIZE_MINIMIZED
)
3429 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3430 for (INT x
= 0; x
< 3; x
++)
3432 if (fClientBars
[x
].clientBar
!= NULL
)
3434 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3435 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3436 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3438 hResult
= dockingWindow
->ResizeBorderDW(
3439 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3449 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3452 LPARAM menuIndex
= lParam
;
3454 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3456 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3460 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3464 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3466 UpdateViewMenu(theMenu
);
3469 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3473 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3475 // FIXME: Remove once implemented
3476 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3477 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3478 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3479 FIXME("Folder options dialog is stubbed: CORE-11141\n");
3480 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
); // Remove when CORE-11141 is fixed.
3483 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3488 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3493 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3495 ::SetFocus(fCurrentShellViewWindow
);
3499 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3501 if (fCurrentShellViewWindow
!= NULL
)
3502 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3506 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3508 return SendMessage(WM_CLOSE
);
3511 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3513 HRESULT hResult
= DoFolderOptions();
3514 if (FAILED(hResult
))
3515 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3519 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3522 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3523 #endif /* __REACTOS__ */
3527 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3530 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3531 #endif /* __REACTOS__ */
3535 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3537 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3541 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3543 HRESULT hResult
= GoBack();
3544 if (FAILED(hResult
))
3545 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3549 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3551 HRESULT hResult
= GoForward();
3552 if (FAILED(hResult
))
3553 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3557 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3559 HRESULT hResult
= NavigateToParent();
3560 if (FAILED(hResult
))
3561 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3565 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3567 HRESULT hResult
= GoHome();
3568 if (FAILED(hResult
))
3569 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3573 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3575 // FIXME: This does not appear to be what windows does.
3576 HRESULT hResult
= NavigateToParent();
3577 if (FAILED(hResult
))
3578 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3582 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3584 CComPtr
<IShellFolder
> psfDesktop
;
3585 LPITEMIDLIST pidlFavs
;
3587 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3590 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3595 hr
= SHGetDesktopFolder(&psfDesktop
);
3596 if (FAILED_UNEXPECTEDLY(hr
))
3599 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3600 if (FAILED_UNEXPECTEDLY(hr
))
3606 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3608 /* TODO: Implement properly */
3610 LPCWSTR strSite
= L
"https://www.reactos.org/user-faq";
3612 /* TODO: Make localizable */
3613 LPCWSTR strCaption
= L
"Sorry";
3614 LPCWSTR strMessage
= L
"ReactOS could not browse to '%s' (error %d). Please make sure there is a web browser installed.";
3615 WCHAR tmpMessage
[512];
3617 /* TODO: Read from the registry */
3618 LPCWSTR strVerb
= NULL
; /* default */
3619 LPCWSTR strPath
= strSite
;
3620 LPCWSTR strParams
= NULL
;
3622 /* The return value is defined as HINSTANCE for backwards compatibility only, the cast is needed */
3623 int result
= (int) ShellExecuteW(m_hWnd
, strVerb
, strPath
, strParams
, NULL
, SW_SHOWNORMAL
);
3626 StringCchPrintfW(tmpMessage
, 512, strMessage
, strSite
, result
);
3627 MessageBoxExW(m_hWnd
, tmpMessage
, strCaption
, MB_OK
, 0);
3633 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3635 fStatusBarVisible
= !fStatusBarVisible
;
3638 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3644 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3647 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3648 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3652 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3655 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3656 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3660 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3663 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3664 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3668 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3671 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3672 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3676 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3679 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3680 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3684 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3687 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3688 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3692 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3697 LRESULT
CShellBrowser::OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3699 // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3700 if (wID
>= IDM_EXPLORERBAND_BEGINCUSTOM
&& wID
<= IDM_EXPLORERBAND_ENDCUSTOM
)
3703 mbi
= (MenuBandInfo
*)DSA_GetItemPtr(menuDsa
, (wID
- IDM_EXPLORERBAND_BEGINCUSTOM
));
3706 ShowBand(mbi
->barGuid
, mbi
->fVertical
);
3712 case IDM_EXPLORERBAR_SEARCH
:
3713 Exec(&CLSID_CommonButtons
, 0x123, 1, NULL
, NULL
);
3715 case IDM_EXPLORERBAR_FOLDERS
:
3716 ShowBand(CLSID_ExplorerBand
, true);
3718 case IDM_EXPLORERBAR_HISTORY
:
3719 ShowBand(CLSID_SH_HistBand
, true);
3721 case IDM_EXPLORERBAR_FAVORITES
:
3722 ShowBand(CLSID_SH_FavBand
, true);
3725 WARN("Unknown id %x\n", wID
);
3731 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3733 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3734 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3738 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3740 CComPtr
<CShellBrowser
> theCabinet
;
3745 // Tell the thread ref we are using it.
3746 if (parameters
&& parameters
->offsetF8
)
3747 parameters
->offsetF8
->AddRef();
3749 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3750 if (theCabinet
== NULL
)
3752 return E_OUTOFMEMORY
;
3755 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3756 if (FAILED_UNEXPECTEDLY(hResult
))
3757 return E_OUTOFMEMORY
;
3759 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3763 // Error: continue or exit?
3767 if (Msg
.message
== WM_QUIT
)
3770 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3772 TranslateMessage(&Msg
);
3773 DispatchMessage(&Msg
);
3777 int nrc
= theCabinet
->Release();
3780 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3783 theCabinet
.Detach();
3785 // Tell the thread ref we are not using it anymore.
3786 if (parameters
&& parameters
->offsetF8
)
3787 parameters
->offsetF8
->Release();
3792 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3795 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3797 OleInitialize(NULL
);
3799 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3803 SHDestroyIETHREADPARAM(parameters
);