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
26 #include <undocshell.h>
28 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
30 #include "newatlinterfaces.h"
34 **Provide implementation of new and delete that use LocalAlloc
35 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
36 view doesn't restore the selection correctly.
37 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
38 **Add brand band bitmaps to shell32.dll
39 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
40 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
41 current state overwrites the wrong entry's contents. This needs to be changed.
42 ****Fix close of browser window to release all objects
43 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
44 **When a new bar is added to base bar site, how is base bar told so it can resize?
45 **Does the base bar site have a classid?
46 **What should refresh command send to views to make them refresh?
47 **When new bar is created, what status notifications need to be fired?
48 **How does keyboard filtering dispatch?
49 **For deferred persist history load, how does the view connect up and get the state?
50 How does context menu send open, cut, rename commands to its site (the shell view)?
51 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
53 **Route View->Toolbars commands to internet toolbar
54 **Handle travel log items in View->Go
55 **Fix ShowBrowserBar to pass correct size on when bar is shown
56 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
57 ****Make ShowToolbar check if bar is already created before creating it again
58 ****Shell should fill in the list of explorer bars in the View submenus
59 **Add folder menu in the file menu
60 **Fix CShellBrowser::GetBorderDW to compute available size correctly
61 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
62 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
63 Make folders toolbar item update state appropriately
64 Read list of bands from registry on launch
65 Read list of bars from registry on launch
66 If the folders or search bars don't exist, disable the toolbar buttons
67 If the favorites or history bars don't exist, disable the toolbar butons
68 Fix Apply to all Folders in Folder Options
69 Implement close command
70 Add explorer band context menu to file menu
71 Add code to allow restore of internet toolbar from registry
72 Fix code that calls FireNavigateComplete to pass the correct new path
74 What are the other command ids for QueryStatus/FireCommandStateChange?
76 Add handler for cabinet settings change
77 Add handler for system metrics change (renegotiate border space?)
78 Add handler for theme change and forward to contained windows
80 When folders are shown, the status bar text should change
81 Add code to save/restore shell view settings
82 Implement tabbing between frames
83 Fix handling of focus everywhere
84 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
86 The status bar doesn't show help text for items owned by frame during menu tracking
87 Stub out frame command handlers
88 "Arrange icons by" group is not checked properly
90 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
91 the icon is always an open folder with magnifying glass
92 Fix bars to calculate height correctly
93 Hookup policies for everything...
94 Investigate toolbar message WM_USER+93
95 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
97 Vertical Explorer Bar CATID_InfoBand
98 Horizontal Explorer Bar CATID_CommBand
99 Desk Band CATID_DeskBand
102 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
103 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
105 create key here with CLSID of bar to register tool band
106 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
111 #pragma comment(linker, \
112 "\"/manifestdependency:type='Win32' "\
113 "name='Microsoft.Windows.Common-Controls' "\
114 "version='6.0.0.0' "\
115 "processorArchitecture='*' "\
116 "publicKeyToken='6595b64144ccf1df' "\
120 static const unsigned int folderOptionsPageCountMax
= 20;
121 static const long BTP_DONT_UPDATE_HISTORY
= 0;
122 static const long BTP_UPDATE_CUR_HISTORY
= 1;
123 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
125 BOOL createNewStuff
= false;
128 // this class is private to browseui.dll and is not registered externally?
129 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
131 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
133 MENUITEMINFO menuItemInfo
;
137 menuItemCount
= GetMenuItemCount(theMenu
);
139 while (curIndex
< menuItemCount
)
141 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
142 menuItemInfo
.fMask
= MIIM_ID
;
143 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
144 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
146 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
154 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
156 CComPtr
<IShellFolder
> desktop
;
158 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
159 if (FAILED_UNEXPECTEDLY(hr
))
161 if (path
== NULL
|| path
->mkid
.cb
== 0)
163 *newFolder
= desktop
;
164 desktop
.p
->AddRef ();
167 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
170 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClass");
171 //static const TCHAR szExploreWndClass[] = TEXT("ExploreWClass");
176 class CToolbarProxy
:
177 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
180 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
182 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
187 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
188 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
190 BEGIN_MSG_MAP(CToolbarProxy
)
191 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
192 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
196 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
201 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
202 if (myWindow
!= NULL
)
204 SubclassWindow(myWindow
);
205 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
206 hResult
= explorerToolbar
->QueryInterface(
207 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
211 void CToolbarProxy::Destroy()
214 fExplorerToolbar
= NULL
;
217 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
223 if (fExplorerToolbar
.p
!= NULL
)
225 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
226 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
227 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
228 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
233 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
239 if (fExplorerToolbar
.p
!= NULL
)
240 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
245 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
246 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
250 struct MenuBandInfo
{
255 class CShellBrowser
:
256 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
257 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
258 public IShellBrowser
,
260 public IServiceProvider
,
261 public IProfferServiceImpl
<CShellBrowser
>,
262 public IShellBrowserService
,
264 public ITravelLogClient
,
265 public IPersistHistory
,
266 public IDockingWindowSite
,
267 public IOleCommandTarget
,
268 public IBrowserService2
,
269 public IConnectionPointContainerImpl
<CShellBrowser
>,
270 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
271 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
279 memset(&borderSpace
, 0, sizeof(borderSpace
));
284 CComPtr
<IUnknown
> clientBar
;
287 static const int BIInternetToolbar
= 0;
288 static const int BIVerticalBaseBar
= 1;
289 static const int BIHorizontalBaseBar
= 2;
291 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
292 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
293 CComPtr
<IShellView
> fCurrentShellView
; //
294 LPITEMIDLIST fCurrentDirectoryPIDL
; //
296 bool fStatusBarVisible
;
297 CToolbarProxy fToolbarProxy
;
298 barInfo fClientBars
[3];
299 CComPtr
<ITravelLog
> fTravelLog
;
300 HMENU fCurrentMenuBar
;
301 CABINETSTATE fCabinetState
;
302 GUID fCurrentVertBar
; //The guid of the built in vertical bar that is being shown
303 // The next three fields support persisted history for shell views.
304 // They do not need to be reference counted.
305 IOleObject
*fHistoryObject
;
306 IStream
*fHistoryStream
;
307 IBindCtx
*fHistoryBindContext
;
312 ULONG
InternalAddRef()
314 OutputDebugString(_T("AddRef\n"));
315 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
317 ULONG
InternalRelease()
319 OutputDebugString(_T("Release\n"));
320 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
326 HRESULT
Initialize();
328 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
329 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
330 FOLDERSETTINGS
*folderSettings
, long flags
);
331 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
332 HRESULT
GetBaseBar(bool vertical
, REFIID riid
, void **theBaseBar
);
333 BOOL
IsBandLoaded(const CLSID clsidBand
, bool verticali
, DWORD
*pdwBandID
);
334 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
335 HRESULT
NavigateToParent();
336 HRESULT
DoFolderOptions();
337 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
338 void RepositionBars();
339 HRESULT
BuildExplorerBandMenu();
340 HRESULT
BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
);
341 BOOL
IsBuiltinBand(CLSID
&bandID
);
342 virtual WNDPROC
GetWindowProc()
346 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
347 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
348 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
349 HRESULT
FireCommandStateChangeAll();
350 HRESULT
UpdateForwardBackState();
351 HRESULT
UpdateUpState();
352 void UpdateGotoMenu(HMENU theMenu
);
353 void UpdateViewMenu(HMENU theMenu
);
355 /* // *** IDockingWindowFrame methods ***
356 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
357 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
358 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
361 // *** IDockingWindowSite methods ***
362 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
363 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
364 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
366 // *** IOleCommandTarget methods ***
367 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
368 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
369 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
370 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
372 // *** IOleWindow methods ***
373 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
374 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
376 // *** IShellBrowser methods ***
377 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
378 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
379 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
380 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
381 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
382 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
383 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
384 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
385 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
386 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
387 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
388 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
389 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
391 // *** IDropTarget methods ***
392 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
393 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
394 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
395 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
397 // *** IServiceProvider methods ***
398 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
400 // *** IShellBowserService methods ***
401 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
403 // *** IDispatch methods ***
404 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
405 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
406 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
407 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
408 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
409 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
411 // *** IBrowserService methods ***
412 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
413 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
414 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
415 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
416 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
417 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
418 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
419 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
420 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
421 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
422 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
423 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
424 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
425 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
426 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
427 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
428 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
429 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
430 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
431 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
432 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
433 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
434 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
435 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
436 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
437 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
438 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
439 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
440 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
441 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
443 // *** IBrowserService2 methods ***
444 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
445 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
446 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
447 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
448 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
449 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
450 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
451 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
452 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
453 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
454 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
455 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
456 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
457 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
458 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
459 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
460 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
461 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
462 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
463 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
464 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
465 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
466 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
467 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
468 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
469 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
470 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
471 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
472 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
473 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
474 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
475 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
476 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
477 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
478 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
479 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
480 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
481 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
482 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
483 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
484 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
485 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
486 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
487 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
488 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
489 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
490 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
491 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
492 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
493 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
494 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
495 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
496 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
497 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
498 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
499 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
500 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
501 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
502 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
503 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
504 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
505 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
506 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
507 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
508 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
510 // *** IWebBrowser methods ***
511 virtual HRESULT STDMETHODCALLTYPE
GoBack();
512 virtual HRESULT STDMETHODCALLTYPE
GoForward();
513 virtual HRESULT STDMETHODCALLTYPE
GoHome();
514 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
515 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
516 VARIANT
*PostData
, VARIANT
*Headers
);
517 virtual HRESULT STDMETHODCALLTYPE
Refresh();
518 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
519 virtual HRESULT STDMETHODCALLTYPE
Stop();
520 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
521 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
522 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
523 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
524 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
525 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
526 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
527 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
528 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
529 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
530 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
531 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
532 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
533 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
534 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
535 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
536 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
538 // *** IWebBrowserApp methods ***
539 virtual HRESULT STDMETHODCALLTYPE
Quit();
540 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
541 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
542 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
543 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
544 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
545 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
546 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
547 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
548 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
549 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
550 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
551 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
552 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
553 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
554 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
555 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
556 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
557 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
558 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
560 // *** IWebBrowser2 methods ***
561 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
562 VARIANT
*PostData
, VARIANT
*Headers
);
563 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
564 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
565 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
566 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
567 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
568 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
569 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
570 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
571 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
572 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
573 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
574 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
575 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
576 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
577 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
578 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
579 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
580 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
581 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
583 // *** ITravelLogClient methods ***
584 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
585 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
586 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
588 // *** IPersist methods ***
589 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
591 // *** IPersistHistory methods ***
592 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
593 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
594 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
595 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
598 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
599 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
600 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
601 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
602 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
603 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
604 LRESULT
OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
605 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
606 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
607 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
608 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
609 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
610 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
611 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
612 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
613 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
614 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
615 LRESULT
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
616 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
617 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
618 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
619 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
620 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
621 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
622 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
623 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
624 LRESULT
OnRefresh(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
625 LRESULT
OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
626 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
629 static ATL::CWndClassInfo
& GetWndClassInfo()
631 static ATL::CWndClassInfo wc
=
633 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
634 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
635 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
636 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
641 BEGIN_MSG_MAP(CShellBrowser
)
642 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
643 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
644 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
645 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
646 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
647 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
648 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
649 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
650 MESSAGE_HANDLER(WM_SETTINGCHANGE
, OnSettingChange
)
651 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
652 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
653 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
654 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
655 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
656 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
657 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
658 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
659 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
660 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
661 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
662 COMMAND_ID_HANDLER(IDM_VIEW_REFRESH
, OnRefresh
)
663 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
664 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
665 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
666 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
667 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
668 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
669 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH
, OnExplorerBar
)
670 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS
, OnExplorerBar
)
671 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY
, OnExplorerBar
)
672 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES
, OnExplorerBar
)
673 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
674 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
675 COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM
, IDM_EXPLORERBAND_ENDCUSTOM
, OnExplorerBar
)
676 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
679 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
680 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
681 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
682 END_CONNECTION_POINT_MAP()
684 BEGIN_COM_MAP(CShellBrowser
)
685 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
686 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
687 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
688 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
689 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
690 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
691 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
692 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
693 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
694 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
695 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
696 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
697 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
698 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
699 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
700 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
701 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
702 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
706 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
708 CShellBrowser::CShellBrowser()
710 fCurrentShellViewWindow
= NULL
;
711 fCurrentDirectoryPIDL
= NULL
;
713 fStatusBarVisible
= true;
714 fCurrentMenuBar
= NULL
;
715 fHistoryObject
= NULL
;
716 fHistoryStream
= NULL
;
717 fHistoryBindContext
= NULL
;
720 CShellBrowser::~CShellBrowser()
723 DSA_Destroy(menuDsa
);
726 HRESULT
CShellBrowser::Initialize()
728 CComPtr
<IPersistStreamInit
> persistStreamInit
;
730 CComPtr
<IUnknown
> clientBar
;
732 _AtlInitialConstruct();
734 menuDsa
= DSA_Create(sizeof(MenuBandInfo
), 5);
736 return E_OUTOFMEMORY
;
738 fCabinetState
.cLength
= sizeof(fCabinetState
);
739 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
744 Create(HWND_DESKTOP
);
748 hResult
= CInternetToolbar_CreateInstance(IID_PPV_ARG(IUnknown
, &clientBar
));
749 if (FAILED_UNEXPECTEDLY(hResult
))
752 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
755 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
756 if (FAILED_UNEXPECTEDLY(hResult
))
759 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
760 if (FAILED_UNEXPECTEDLY(hResult
))
763 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
764 if (FAILED_UNEXPECTEDLY(hResult
))
767 // TODO: create settingsStream from registry entry
768 //if (settingsStream.p)
770 // hResult = persistStreamInit->Load(settingsStream);
771 // if (FAILED_UNEXPECTEDLY(hResult))
776 hResult
= persistStreamInit
->InitNew();
777 if (FAILED_UNEXPECTEDLY(hResult
))
781 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
782 if (FAILED_UNEXPECTEDLY(hResult
))
785 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
789 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
790 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
791 _AtlBaseModule
.GetModuleInstance(), 0);
792 fStatusBarVisible
= true;
795 ShowWindow(SW_SHOWNORMAL
);
801 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
803 CComPtr
<IShellFolder
> newFolder
;
804 FOLDERSETTINGS newFolderSettings
;
807 // called by shell view to browse to new folder
808 // also called by explorer band to navigate to new folder
809 hResult
= SHBindToFolder(pidl
, &newFolder
);
810 if (FAILED_UNEXPECTEDLY(hResult
))
813 newFolderSettings
.ViewMode
= FVM_ICON
;
814 newFolderSettings
.fFlags
= 0;
815 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
816 if (FAILED_UNEXPECTEDLY(hResult
))
821 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
823 LPCITEMIDLIST pidlnext
;
828 if (! _ILIsDesktop(pidl
))
830 length
= pidl
->mkid
.cb
;
832 reinterpret_cast<LPCITEMIDLIST
>(
833 reinterpret_cast<const BYTE
*>(pidl
) + length
);
834 if (pidlnext
->mkid
.cb
!= 0)
840 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
841 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
843 CComPtr
<IShellFolder
> psf
;
844 LPITEMIDLIST pidlChild
;
845 LPITEMIDLIST pidlParent
;
852 if (ppidlLast
!= NULL
)
854 if (_ILIsPidlSimple(pidl
))
856 if (ppidlLast
!= NULL
)
857 *ppidlLast
= ILClone(pidl
);
858 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
862 pidlChild
= ILClone(ILFindLastID(pidl
));
863 pidlParent
= ILClone(pidl
);
864 ILRemoveLastID(pidlParent
);
865 hResult
= SHGetDesktopFolder(&psf
);
866 if (SUCCEEDED(hResult
))
867 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
868 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
869 *ppidlLast
= pidlChild
;
877 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
878 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
880 CComPtr
<IShellFolder
> parentFolder
;
881 LPITEMIDLIST childPIDL
= NULL
;
885 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
889 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
893 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
896 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
909 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
911 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
914 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
915 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
917 CComPtr
<IObjectWithSite
> objectWithSite
;
918 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
919 CComPtr
<IShellView
> saveCurrentShellView
;
920 CComPtr
<IShellView
> newShellView
;
921 CComPtr
<ITravelLog
> travelLog
;
922 HWND newShellViewWindow
;
923 BOOL windowUpdateIsLocked
;
924 RECT shellViewWindowBounds
;
927 wchar_t newTitle
[MAX_PATH
];
931 if (newShellFolder
== NULL
)
934 hResult
= GetTravelLog(&travelLog
);
935 if (FAILED_UNEXPECTEDLY(hResult
))
939 if (flags
& BTP_UPDATE_CUR_HISTORY
)
941 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
942 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
943 // what to do with error? Do we want to halt browse because state save failed?
946 if (fCurrentShellView
)
948 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
951 // create view object
952 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
953 if (FAILED_UNEXPECTEDLY(hResult
))
955 previousView
= fCurrentShellViewWindow
;
957 // enter updating section
958 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
959 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
960 if (fCurrentShellView
!= NULL
)
961 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
964 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
966 // update folder and view
967 saveCurrentShellFolder
= fCurrentShellFolder
;
968 saveCurrentShellView
= fCurrentShellView
;
969 fCurrentShellFolder
= newShellFolder
;
970 fCurrentShellView
= newShellView
;
973 if (previousView
!= NULL
)
974 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
976 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
977 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
979 // create view window
980 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
981 this, &shellViewWindowBounds
, &newShellViewWindow
);
982 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
984 fCurrentShellView
= saveCurrentShellView
;
985 fCurrentShellFolder
= saveCurrentShellFolder
;
986 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
987 if (windowUpdateIsLocked
)
988 LockWindowUpdate(FALSE
);
989 SetCursor(saveCursor
);
993 if (objectWithSite
.p
!= NULL
)
994 hResult
= objectWithSite
->SetSite(NULL
);
996 // update current pidl
997 ILFree(fCurrentDirectoryPIDL
);
998 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1000 // update view window
1001 if (saveCurrentShellView
!= NULL
)
1002 saveCurrentShellView
->DestroyViewWindow();
1003 fCurrentShellViewWindow
= newShellViewWindow
;
1005 if (previousView
== NULL
)
1011 saveCurrentShellView
.Release();
1012 saveCurrentShellFolder
.Release();
1014 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1016 // leave updating section
1017 if (windowUpdateIsLocked
)
1018 LockWindowUpdate(FALSE
);
1019 SetCursor(saveCursor
);
1022 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1024 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1025 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1029 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1030 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1031 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1032 if (SUCCEEDED(hResult
))
1034 FireNavigateComplete(newTitle
);
1038 FireNavigateComplete(L
"ERROR");
1041 if (fCabinetState
.fFullPathTitle
)
1042 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1044 nameFlags
= SHGDN_FORADDRESSBAR
;
1045 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1046 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1047 if (SUCCEEDED(hResult
))
1049 SetWindowText(newTitle
);
1051 LPCITEMIDLIST pidlChild
;
1052 INT index
, indexOpen
;
1053 HIMAGELIST himlSmall
, himlLarge
;
1055 CComPtr
<IShellFolder
> sf
;
1056 hResult
= SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1057 if (SUCCEEDED(hResult
))
1059 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1061 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1063 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1064 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1066 /* Hack to make it possible to release the old icons */
1067 /* Something seems to go wrong with WM_SETICON */
1068 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1069 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1071 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1072 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1074 DestroyIcon(oldSmall
);
1075 DestroyIcon(oldLarge
);
1079 FireCommandStateChangeAll();
1080 hResult
= UpdateForwardBackState();
1081 hResult
= UpdateUpState();
1085 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1087 CComPtr
<IBandSite
> bandSite
;
1088 CComPtr
<IDeskBand
> deskBand
;
1091 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1094 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1095 if (FAILED_UNEXPECTEDLY(hResult
))
1098 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1099 if (FAILED_UNEXPECTEDLY(hResult
))
1102 return deskBand
->QueryInterface(riid
, shellMenu
);
1105 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, REFIID riid
, void **theBaseBar
)
1107 CComPtr
<IUnknown
> newBaseBar
;
1108 CComPtr
<IDeskBar
> deskBar
;
1109 CComPtr
<IUnknown
> newBaseBarSite
;
1110 CComPtr
<IDeskBarClient
> deskBarClient
;
1115 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1117 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1120 hResult
= CBaseBar_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBar
), vertical
);
1121 if (FAILED_UNEXPECTEDLY(hResult
))
1123 hResult
= CBaseBarSite_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBarSite
), vertical
);
1124 if (FAILED_UNEXPECTEDLY(hResult
))
1127 // we have to store our basebar into cache now
1128 *cache
= newBaseBar
;
1129 newBaseBar
->AddRef();
1131 // tell the new base bar about the shell browser
1132 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1133 if (FAILED_UNEXPECTEDLY(hResult
))
1136 // tell the new base bar about the new base bar site
1137 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1138 if (FAILED_UNEXPECTEDLY(hResult
))
1140 hResult
= deskBar
->SetClient(newBaseBarSite
);
1141 if (FAILED_UNEXPECTEDLY(hResult
))
1144 // tell the new base bar site about the new base bar
1145 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1146 if (FAILED_UNEXPECTEDLY(hResult
))
1148 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1149 if (FAILED_UNEXPECTEDLY(hResult
))
1153 return (*cache
)->QueryInterface(riid
, theBaseBar
);
1156 BOOL
CShellBrowser::IsBandLoaded(const CLSID clsidBand
, bool vertical
, DWORD
*pdwBandID
)
1159 CComPtr
<IDeskBar
> deskBar
;
1160 CComPtr
<IUnknown
> baseBarSite
;
1161 CComPtr
<IBandSite
> bandSite
;
1167 /* Get our basebarsite to be able to enumerate bands */
1168 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1169 if (FAILED_UNEXPECTEDLY(hResult
))
1171 hResult
= deskBar
->GetClient(&baseBarSite
);
1172 if (FAILED_UNEXPECTEDLY(hResult
))
1174 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &bandSite
));
1175 if (FAILED_UNEXPECTEDLY(hResult
))
1178 hResult
= bandSite
->EnumBands(-1, &numBands
);
1179 if (FAILED_UNEXPECTEDLY(hResult
))
1182 for(i
= 0; i
< numBands
; i
++)
1184 CComPtr
<IPersist
> bandPersist
;
1186 hResult
= bandSite
->EnumBands(i
, &dwBandID
);
1187 if (FAILED_UNEXPECTEDLY(hResult
))
1190 hResult
= bandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IPersist
, &bandPersist
));
1191 if (FAILED_UNEXPECTEDLY(hResult
))
1193 hResult
= bandPersist
->GetClassID(&clsidTmp
);
1194 if (FAILED_UNEXPECTEDLY(hResult
))
1196 if (IsEqualGUID(clsidBand
, clsidTmp
))
1198 if (pdwBandID
) *pdwBandID
= dwBandID
;
1205 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1207 CComPtr
<IDockingWindow
> dockingWindow
;
1208 CComPtr
<IUnknown
> baseBarSite
;
1209 CComPtr
<IUnknown
> newBand
;
1210 CComPtr
<IDeskBar
> deskBar
;
1215 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1216 if (FAILED_UNEXPECTEDLY(hResult
))
1219 hResult
= deskBar
->GetClient(&baseBarSite
);
1220 if (FAILED_UNEXPECTEDLY(hResult
))
1223 hResult
= deskBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1224 if (FAILED_UNEXPECTEDLY(hResult
))
1227 if (!IsBandLoaded(classID
, vertical
, &dwBandID
))
1229 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1230 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1232 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1233 hResult
= CExplorerBand_CreateInstance(IID_PPV_ARG(IUnknown
, &newBand
));
1234 if (FAILED_UNEXPECTEDLY(hResult
))
1239 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1240 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1241 if (FAILED_UNEXPECTEDLY(hResult
))
1247 CComPtr
<IBandSite
> pBandSite
;
1249 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &pBandSite
));
1250 if (!SUCCEEDED(hResult
))
1252 ERR("Can't get IBandSite interface\n");
1255 hResult
= pBandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IUnknown
, &newBand
));
1256 if (!SUCCEEDED(hResult
))
1258 ERR("Can't find band object\n");
1262 // It's hackish, but we should be able to show the wanted band until we
1263 // find the proper way to do this (but it seems to work to add a new band)
1264 // Here we'll just re-add the existing band to the site, causing it to display.
1266 V_VT(&vaIn
) = VT_UNKNOWN
;
1267 V_UNKNOWN(&vaIn
) = newBand
.p
;
1268 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1269 if (FAILED_UNEXPECTEDLY(hResult
))
1274 hResult
= dockingWindow
->ShowDW(TRUE
);
1275 if (FAILED_UNEXPECTEDLY(hResult
))
1280 fCurrentVertBar
= classID
;
1281 FireCommandStateChangeAll();
1287 HRESULT
CShellBrowser::NavigateToParent()
1289 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1290 if (newDirectory
== NULL
)
1291 return E_OUTOFMEMORY
;
1292 if (_ILIsDesktop(newDirectory
))
1294 ILFree(newDirectory
);
1295 return E_INVALIDARG
;
1297 ILRemoveLastID(newDirectory
);
1298 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1299 ILFree(newDirectory
);
1300 if (FAILED_UNEXPECTEDLY(hResult
))
1305 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1307 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1308 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1310 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1311 sheetInfo
->nPages
++;
1315 HRESULT
CShellBrowser::DoFolderOptions()
1317 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1318 PROPSHEETHEADER m_PropSheet
;
1319 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1320 // CComPtr<IGlobalFolderSettings> globalSettings;
1321 // SHELLSTATE2 shellState;
1324 memset(m_psp
, 0, sizeof(m_psp
));
1325 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1327 // create sheet object
1328 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1329 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1330 if (FAILED_UNEXPECTEDLY(hResult
))
1333 // must set site in order for Apply to all Folders on Advanced page to be enabled
1334 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1335 m_PropSheet
.phpage
= m_psp
;
1338 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1339 if (FAILED_UNEXPECTEDLY(hResult
))
1341 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1342 if (FAILED_UNEXPECTEDLY(hResult
))
1347 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1348 if (FAILED_UNEXPECTEDLY(hResult
))
1351 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1352 // It returns 'E_NOTIMPL'
1354 if (fCurrentShellView
!= NULL
)
1356 hResult
= fCurrentShellView
->AddPropertySheetPages(
1357 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1358 if (FAILED_UNEXPECTEDLY(hResult
))
1364 CStringW
strFolderOptions(MAKEINTRESOURCEW(IDS_FOLDER_OPTIONS
));
1365 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1366 m_PropSheet
.dwFlags
= 0;
1367 m_PropSheet
.hwndParent
= m_hWnd
;
1368 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1369 m_PropSheet
.pszCaption
= strFolderOptions
;
1370 m_PropSheet
.nStartPage
= 0;
1371 PropertySheet(&m_PropSheet
);
1375 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1377 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1378 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1380 const _ATL_MSG
*previousMessage
;
1382 WNDPROC saveWindowProc
;
1385 hWnd
= pThis
->m_hWnd
;
1386 previousMessage
= pThis
->m_pCurrentMsg
;
1387 pThis
->m_pCurrentMsg
= &msg
;
1389 /* If the shell browser is initialized, let the menu band preprocess the messages */
1390 if (pThis
->fCurrentDirectoryPIDL
)
1392 CComPtr
<IMenuBand
> menuBand
;
1393 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1394 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1396 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1397 if (hResult
== S_OK
)
1400 wParam
= msg
.wParam
;
1401 lParam
= msg
.lParam
;
1406 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1407 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1408 if (handled
== FALSE
)
1410 if (uMsg
== WM_NCDESTROY
)
1412 saveWindowProc
= reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
));
1413 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1414 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWLP_WNDPROC
)))
1415 ::SetWindowLongPtr(hWnd
, GWLP_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1416 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1419 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1421 pThis
->m_pCurrentMsg
= previousMessage
;
1422 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1424 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1425 pThis
->m_hWnd
= NULL
;
1426 pThis
->OnFinalMessage(hWnd
);
1431 void CShellBrowser::RepositionBars()
1437 GetClientRect(&clientRect
);
1439 if (fStatusBarVisible
&& fStatusBar
)
1441 ::GetWindowRect(fStatusBar
, &statusRect
);
1442 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1443 clientRect
.right
- clientRect
.left
,
1444 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1445 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1448 for (x
= 0; x
< 3; x
++)
1450 HWND hwnd
= fClientBars
[x
].hwnd
;
1451 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1452 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1454 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1455 fClientBars
[x
].hwnd
= hwnd
;
1459 RECT toolbarRect
= clientRect
;
1460 if (borderSpace
.top
!= 0)
1462 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1464 else if (borderSpace
.bottom
!= 0)
1466 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1468 else if (borderSpace
.left
!= 0)
1470 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1472 else if (borderSpace
.right
!= 0)
1474 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1477 ::SetWindowPos(hwnd
, NULL
,
1480 toolbarRect
.right
- toolbarRect
.left
,
1481 toolbarRect
.bottom
- toolbarRect
.top
,
1482 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1484 if (borderSpace
.top
!= 0)
1486 clientRect
.top
= toolbarRect
.bottom
;
1488 else if (borderSpace
.bottom
!= 0)
1490 clientRect
.bottom
= toolbarRect
.top
;
1492 else if (borderSpace
.left
!= 0)
1494 clientRect
.left
= toolbarRect
.right
;
1496 else if (borderSpace
.right
!= 0)
1498 clientRect
.right
= toolbarRect
.left
;
1502 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1503 clientRect
.right
- clientRect
.left
,
1504 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1507 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1510 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1511 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1514 params
.rgvarg
= arguments
;
1515 params
.rgdispidNamedArgs
= NULL
;
1516 params
.cArgs
= argCount
;
1517 params
.cNamedArgs
= 0;
1518 IUnknown
** pp
= vec
.begin();
1519 while (pp
< vec
.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
);
1531 while (pp
< vec2
.end())
1535 CComPtr
<IDispatch
> theDispatch
;
1537 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1538 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1545 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1547 // these two variants intentionally to do use CComVariant because it would double free/release
1548 // or does not need to dispose at all
1551 CComBSTR
tempString(newDirectory
);
1553 V_VT(&varArgs
) = VT_BSTR
;
1554 V_BSTR(&varArgs
) = tempString
.m_str
;
1556 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1557 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1558 V_VT(&varArg
[1]) = VT_DISPATCH
;
1559 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1561 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1564 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1568 V_VT(&varArg
[0]) = VT_BOOL
;
1569 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1570 V_VT(&varArg
[1]) = VT_I4
;
1571 V_I4(&varArg
[1]) = commandID
;
1573 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1576 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1578 return FireCommandStateChange(false, -1);
1581 HRESULT
CShellBrowser::UpdateForwardBackState()
1583 CComPtr
<ITravelLog
> travelLog
;
1584 CComPtr
<ITravelEntry
> unusedEntry
;
1590 canGoForward
= false;
1591 hResult
= GetTravelLog(&travelLog
);
1592 if (FAILED_UNEXPECTEDLY(hResult
))
1594 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1595 if (SUCCEEDED(hResult
))
1598 unusedEntry
.Release();
1600 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1601 if (SUCCEEDED(hResult
))
1603 canGoForward
= true;
1604 unusedEntry
.Release();
1606 hResult
= FireCommandStateChange(canGoBack
, 2);
1607 hResult
= FireCommandStateChange(canGoForward
, 1);
1611 HRESULT
CShellBrowser::UpdateUpState()
1617 if (_ILIsDesktop(fCurrentDirectoryPIDL
))
1619 hResult
= FireCommandStateChange(canGoUp
, 3);
1623 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1625 CComPtr
<ITravelLog
> travelLog
;
1626 CComPtr
<ITravelEntry
> unusedEntry
;
1628 MENUITEMINFO menuItemInfo
;
1631 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1633 position
= GetMenuItemCount(theMenu
);
1634 hResult
= GetTravelLog(&travelLog
);
1635 if (FAILED_UNEXPECTEDLY(hResult
))
1638 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1642 if (SUCCEEDED(hResult
))
1644 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, TRUE
);
1645 unusedEntry
.Release();
1648 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, FALSE
);
1650 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1654 if (SUCCEEDED(hResult
))
1656 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, TRUE
);
1657 unusedEntry
.Release();
1660 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, FALSE
);
1662 SHEnableMenuItem(theMenu
,
1663 IDM_GOTO_UPONELEVEL
,
1664 !_ILIsDesktop(fCurrentDirectoryPIDL
));
1666 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1667 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1668 if (SUCCEEDED(hResult
))
1670 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1671 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1672 menuItemInfo
.fType
= MF_SEPARATOR
;
1673 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1674 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1678 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1680 CComPtr
<ITravelLog
> travelLog
;
1682 OLECMD commandList
[5];
1683 HMENU toolbarMenuBar
;
1685 MENUITEMINFO menuItemInfo
;
1688 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1689 if (gotoMenu
!= NULL
)
1690 UpdateGotoMenu(gotoMenu
);
1692 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1693 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1694 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1695 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1696 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1698 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1699 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1700 if (FAILED_UNEXPECTEDLY(hResult
))
1701 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1704 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1705 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1706 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1707 DestroyMenu(menuItemInfo
.hSubMenu
);
1709 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1710 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1711 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1712 DestroyMenu(toolbarMenuBar
);
1715 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1716 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1717 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1718 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1720 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1721 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1722 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1723 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1724 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1725 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1726 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1727 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1729 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1730 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1731 menuItemInfo
.hSubMenu
= toolbarMenu
;
1732 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1734 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1737 HRESULT
CShellBrowser::BuildExplorerBandMenu()
1742 hBandsMenu
= SHGetMenuFromID(fCurrentMenuBar
, IDM_VIEW_EXPLORERBAR
);
1745 OutputDebugString(L
"No menu !\n");
1748 DSA_DeleteAllItems(menuDsa
);
1749 BuildExplorerBandCategory(hBandsMenu
, CATID_InfoBand
, 4, NULL
);
1750 BuildExplorerBandCategory(hBandsMenu
, CATID_CommBand
, 20, &nbFound
);
1754 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_SEPARATOR
, MF_BYCOMMAND
);
1756 // Remove media menu since XP does it (according to API Monitor)
1757 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_MEDIA
, MF_BYCOMMAND
);
1761 HRESULT
CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
)
1764 CComPtr
<IEnumGUID
> pEnumGUID
;
1765 WCHAR wszBandName
[MAX_PATH
];
1766 WCHAR wszBandGUID
[MAX_PATH
];
1767 WCHAR wRegKey
[MAX_PATH
];
1774 mbi
.fVertical
= IsEqualGUID(category
, CATID_InfoBand
);
1776 hr
= SHEnumClassesOfCategories(1, &category
, 0, NULL
, &pEnumGUID
);
1777 if (FAILED_UNEXPECTEDLY(hr
))
1783 pEnumGUID
->Next(1, &iter
, &dwRead
);
1786 // Get the band name
1787 if (IsBuiltinBand(iter
))
1789 if (!StringFromGUID2(iter
, wszBandGUID
, MAX_PATH
))
1791 StringCchPrintfW(wRegKey
, MAX_PATH
, L
"CLSID\\%s", wszBandGUID
);
1792 dwDataSize
= MAX_PATH
;
1793 SHGetValue(HKEY_CLASSES_ROOT
, wRegKey
, NULL
, NULL
, wszBandName
, &dwDataSize
);
1796 InsertMenu(hBandsMenu
, dwPos
+ cBands
, MF_BYPOSITION
, IDM_EXPLORERBAND_BEGINCUSTOM
+ DSA_GetItemCount(menuDsa
), wszBandName
);
1797 DSA_AppendItem(menuDsa
, &mbi
);
1807 BOOL
CShellBrowser::IsBuiltinBand(CLSID
&bandID
)
1809 if (IsEqualCLSID(bandID
, CLSID_ExplorerBand
))
1811 if (IsEqualCLSID(bandID
, CLSID_SH_SearchBand
) || IsEqualCLSID(bandID
, CLSID_SearchBand
))
1813 if (IsEqualCLSID(bandID
, CLSID_IE_SearchBand
) || IsEqualCLSID(bandID
, CLSID_FileSearchBand
))
1815 if (IsEqualCLSID(bandID
, CLSID_SH_HistBand
))
1817 if (IsEqualCLSID(bandID
, CLSID_SH_FavBand
))
1819 if (IsEqualCLSID(bandID
, CLSID_ChannelsBand
))
1824 HRESULT
CShellBrowser::OnSearch()
1826 CComPtr
<IObjectWithSite
> objectWithSite
;
1827 CComPtr
<IContextMenu
> contextMenu
;
1828 CMINVOKECOMMANDINFO commandInfo
;
1829 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1832 // TODO: Query shell if this command is enabled first
1834 memset(&commandInfo
, 0, sizeof(commandInfo
));
1835 commandInfo
.cbSize
= sizeof(commandInfo
);
1836 commandInfo
.hwnd
= m_hWnd
;
1837 commandInfo
.lpParameters
= searchGUID
;
1838 commandInfo
.nShow
= SW_SHOWNORMAL
;
1840 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1841 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1842 if (FAILED_UNEXPECTEDLY(hResult
))
1844 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1845 if (FAILED_UNEXPECTEDLY(hResult
))
1847 hResult
= objectWithSite
->SetSite(dynamic_cast<IShellBrowser
*>(this));
1848 if (FAILED_UNEXPECTEDLY(hResult
))
1850 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1851 hResult
= objectWithSite
->SetSite(NULL
);
1855 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1857 CComPtr
<IUnknown
> int1Retry
;
1858 CComPtr
<IUnknown
> int2Retry
;
1863 if (int1
== NULL
|| int2
== NULL
)
1865 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1866 if (FAILED_UNEXPECTEDLY(hResult
))
1868 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1869 if (FAILED_UNEXPECTEDLY(hResult
))
1871 if (int1Retry
== int2Retry
)
1876 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1878 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1880 RECT availableBounds
;
1882 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1883 for (INT x
= 0; x
< 3; x
++)
1885 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1887 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1888 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1889 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1890 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1893 *prcBorder
= availableBounds
;
1897 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1902 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1904 for (INT x
= 0; x
< 3; x
++)
1906 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1908 fClientBars
[x
].borderSpace
= *pbw
;
1909 // if this bar changed size, it cascades and forces all subsequent bars to resize
1914 return E_INVALIDARG
;
1917 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1918 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1920 CComPtr
<IOleCommandTarget
> commandTarget
;
1923 if (prgCmds
== NULL
)
1924 return E_INVALIDARG
;
1925 if (pguidCmdGroup
== NULL
)
1927 if (fCurrentShellView
.p
!= NULL
)
1929 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1930 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1931 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1940 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1944 switch (prgCmds
->cmdID
)
1946 case 0x1c: // search
1947 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1948 if (IsEqualCLSID(CLSID_SH_SearchBand
, fCurrentVertBar
) ||
1949 IsEqualCLSID(CLSID_SearchBand
, fCurrentVertBar
) ||
1950 IsEqualCLSID(CLSID_IE_SearchBand
, fCurrentVertBar
) ||
1951 IsEqualCLSID(CLSID_FileSearchBand
, fCurrentVertBar
))
1953 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1956 case 0x1d: // history
1957 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1958 if (IsEqualCLSID(CLSID_SH_HistBand
, fCurrentVertBar
))
1959 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1961 case 0x1e: // favorites
1962 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1963 if (IsEqualCLSID(CLSID_SH_FavBand
, fCurrentVertBar
))
1964 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1966 case 0x23: // folders
1967 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1968 if (IsEqualCLSID(CLSID_ExplorerBand
, fCurrentVertBar
))
1969 prgCmds
->cmdf
|= OLECMDF_LATCHED
;
1979 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1983 switch (prgCmds
->cmdID
)
1985 case 0xa022: // up level
1986 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1987 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1988 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1998 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1999 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2005 TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
2008 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
2012 case 0x1c: //Toggle Search
2013 if (IsEqualCLSID(CLSID_SH_SearchBand
, fCurrentVertBar
) ||
2014 IsEqualCLSID(CLSID_SearchBand
, fCurrentVertBar
) ||
2015 IsEqualCLSID(CLSID_IE_SearchBand
, fCurrentVertBar
) ||
2016 IsEqualCLSID(CLSID_FileSearchBand
, fCurrentVertBar
))
2018 hResult
= IUnknown_ShowDW(fClientBars
[BIVerticalBaseBar
].clientBar
.p
, FALSE
);
2019 memset(&fCurrentVertBar
, 0, sizeof(fCurrentVertBar
));
2020 FireCommandStateChangeAll();
2027 case 0x1d: //Toggle History
2028 case 0x1e: //Toggle Favorites
2029 case 0x23: //Toggle Folders
2031 if (nCmdID
== 0x1d) pclsid
= &CLSID_SH_HistBand
;
2032 else if (nCmdID
== 0x1e) pclsid
= &CLSID_SH_FavBand
;
2033 else pclsid
= &CLSID_ExplorerBand
;
2035 if (IsEqualCLSID(*pclsid
, fCurrentVertBar
))
2037 hResult
= IUnknown_ShowDW(fClientBars
[BIVerticalBaseBar
].clientBar
.p
, FALSE
);
2038 memset(&fCurrentVertBar
, 0, sizeof(fCurrentVertBar
));
2039 FireCommandStateChangeAll();
2043 hResult
= ShowBand(*pclsid
, true);
2047 //Sent when a band closes
2048 if (V_VT(pvaIn
) != VT_UNKNOWN
)
2049 return E_INVALIDARG
;
2051 if (IUnknownIsEqual(V_UNKNOWN(pvaIn
), fClientBars
[BIVerticalBaseBar
].clientBar
.p
))
2053 memset(&fCurrentVertBar
, 0, sizeof(fCurrentVertBar
));
2054 FireCommandStateChangeAll();
2058 if (nCmdexecopt
== 1)
2060 // pvaIn is a VT_UNKNOWN with a band that is being hidden
2064 // update zones part of the status bar
2067 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
2068 V_VT(pvaOut
) = VT_INT_PTR
;
2069 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
2070 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
2073 // indicate if this cabinet was opened as a browser
2079 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
2088 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
2093 // what is theater mode and why do we receive this?
2097 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
2102 // initialize favorites menu
2106 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
2111 // refresh on toolbar clicked
2114 // called for unknown bands ?
2117 // tell the view if it should hide the task pane or not
2118 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
2121 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
2126 return NavigateToParent();
2129 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
2134 return DoFolderOptions();
2137 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
2142 // Reset All Folders option in Folder Options
2153 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
2161 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
2166 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2168 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2170 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
2172 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
2175 DestroyMenu(mainMenu
);
2177 lpMenuWidths
->width
[0] = 2;
2178 lpMenuWidths
->width
[2] = 3;
2179 lpMenuWidths
->width
[4] = 1;
2183 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
2185 CComPtr
<IShellMenu
> shellMenu
;
2188 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
2190 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
2191 if (FAILED_UNEXPECTEDLY(hResult
))
2196 hmenuShared
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2198 // FIXME: Figure out the proper way to do this.
2199 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
2202 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
2205 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
2206 if (FAILED_UNEXPECTEDLY(hResult
))
2208 fCurrentMenuBar
= hmenuShared
;
2209 BuildExplorerBandMenu();
2213 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
2215 if (hmenuShared
== fCurrentMenuBar
)
2217 //DestroyMenu(fCurrentMenuBar);
2218 SetMenuSB(NULL
, NULL
, NULL
);
2223 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
2228 ::SetWindowText(fStatusBar
, pszStatusText
);
2237 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
2242 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
2244 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
2249 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
2251 if ((wFlags
& SBSP_EXPLOREMODE
) != NULL
)
2252 ShowBand(CLSID_ExplorerBand
, true);
2254 long flags
= BTP_UPDATE_NEXT_HISTORY
;
2256 flags
|= BTP_UPDATE_CUR_HISTORY
;
2257 return BrowseToPIDL(pidl
, flags
);
2260 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
2265 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
2273 *lphwnd
= fToolbarProxy
.m_hWnd
;
2276 *lphwnd
= fStatusBar
;
2279 // find the directory browser and return it
2280 // this should be used only to determine if a tree is present
2283 // is this a progress dialog?
2289 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
2290 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
2299 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
2304 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
2312 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
2316 *ppshv
= fCurrentShellView
;
2317 if (fCurrentShellView
.p
!= NULL
)
2318 fCurrentShellView
.p
->AddRef();
2322 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2327 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2332 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2333 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2338 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2343 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2349 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2354 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2356 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2357 // the returned interface has a method GetPropertyBag on it
2358 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2359 return this->QueryInterface(riid
, ppvObject
);
2360 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2361 return this->QueryInterface(riid
, ppvObject
);
2362 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2363 return this->QueryInterface(riid
, ppvObject
);
2364 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2365 return this->QueryInterface(riid
, ppvObject
);
2366 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2367 return this->QueryInterface(riid
, ppvObject
);
2368 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2369 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2370 if (IsEqualIID(riid
, IID_IShellBrowser
))
2371 return this->QueryInterface(riid
, ppvObject
);
2372 return E_NOINTERFACE
;
2375 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2377 if (ppvObject
== NULL
)
2383 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2388 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2394 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2399 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2400 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2405 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2410 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2415 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2420 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2425 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2429 // called by toolbar when displaying tooltips
2434 if (fTravelLog
.p
== NULL
)
2436 hResult
= CTravelLog_CreateInstance(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2437 if (FAILED_UNEXPECTEDLY(hResult
))
2440 *pptl
= fTravelLog
.p
;
2441 fTravelLog
.p
->AddRef();
2445 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2450 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2455 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2460 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2465 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2470 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2475 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2480 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2485 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2490 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2495 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2500 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2505 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2510 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2515 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2517 // called by explorer bar to get current pidl
2520 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2524 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2529 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2534 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2539 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2541 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2542 return E_INVALIDARG
;
2543 *ppole
= fHistoryObject
;
2544 if (fHistoryObject
!= NULL
)
2545 fHistoryObject
->AddRef();
2546 *pstm
= fHistoryStream
;
2547 if (fHistoryStream
!= NULL
)
2548 fHistoryStream
->AddRef();
2549 *ppbc
= fHistoryBindContext
;
2550 if (fHistoryBindContext
!= NULL
)
2551 fHistoryBindContext
->AddRef();
2552 fHistoryObject
= NULL
;
2553 fHistoryStream
= NULL
;
2554 fHistoryBindContext
= NULL
;
2560 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2565 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2570 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2575 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2576 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2581 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2586 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2591 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2596 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2601 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2606 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2611 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2613 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2617 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2622 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2627 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2632 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2637 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2642 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2647 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2652 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2653 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2658 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2663 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2668 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2673 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2678 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2683 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2688 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2693 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2698 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2703 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2708 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2713 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2718 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2723 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2728 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2733 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2738 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2743 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2748 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2753 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2758 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2763 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2764 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2769 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2770 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2775 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2780 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2785 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2790 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2795 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2800 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2805 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2810 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2815 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2820 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2825 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2830 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2835 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2840 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2845 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2850 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2855 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2860 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2865 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2870 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2871 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2876 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2881 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2886 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2891 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2893 for (int i
= 0; i
< 3; i
++)
2895 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2899 if (!fCurrentShellView
)
2902 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2905 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2910 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2915 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2917 CComPtr
<ITravelLog
> travelLog
;
2918 HRESULT hResult
= GetTravelLog(&travelLog
);
2919 if (FAILED_UNEXPECTEDLY(hResult
))
2921 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2924 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2926 CComPtr
<ITravelLog
> travelLog
;
2927 HRESULT hResult
= GetTravelLog(&travelLog
);
2928 if (FAILED_UNEXPECTEDLY(hResult
))
2930 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2933 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2938 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2943 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2944 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2946 CComHeapPtr
<ITEMIDLIST
> pidl
;
2948 CComPtr
<IShellFolder
> pDesktop
;
2950 hResult
= SHGetDesktopFolder(&pDesktop
);
2951 if (FAILED_UNEXPECTEDLY(hResult
))
2953 hResult
= pDesktop
->ParseDisplayName(NULL
, NULL
, URL
, NULL
, &pidl
, NULL
);
2954 if (FAILED_UNEXPECTEDLY(hResult
))
2956 return BrowseObject(pidl
, 1);
2959 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2963 V_VT(&level
) = VT_I4
;
2965 return Refresh2(&level
);
2968 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2970 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2973 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2974 if (FAILED_UNEXPECTEDLY(hResult
))
2976 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2979 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2984 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2989 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2994 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2999 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
3004 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
3009 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
3016 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
3021 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
3026 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
3031 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
3036 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
3041 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
3046 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
3051 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
3058 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
3063 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
3068 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
3073 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
3078 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
3083 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
3088 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
3093 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
3098 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
3103 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
3108 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
3113 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
3118 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
3123 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
3128 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
3133 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
3138 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
3143 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
3148 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
3153 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
3158 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
3163 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
3168 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
3173 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
3174 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
3176 LPITEMIDLIST pidl
= NULL
;
3178 // called from drive combo box to navigate to a directory
3179 // Also called by search band to display shell results folder view
3181 if (V_VT(URL
) == VT_BSTR
)
3183 return this->Navigate(V_BSTR(URL
), Flags
, TargetFrameName
, PostData
, Headers
);
3185 if (V_VT(URL
) == (VT_ARRAY
| VT_UI1
))
3187 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
3188 return E_INVALIDARG
;
3190 pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
3192 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
3193 if (FAILED_UNEXPECTEDLY(hResult
))
3198 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
3203 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
3204 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3209 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
3214 // called to show search bar
3215 if (V_VT(pvaClsid
) != VT_BSTR
)
3216 return E_INVALIDARG
;
3217 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
3218 // TODO: properly compute the value of vertical
3220 return ShowBand(classID
, vertical
);
3223 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
3228 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
3233 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
3238 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
3243 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
3248 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
3253 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
3258 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
3263 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
3268 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
3273 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
3278 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
3283 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
3288 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
3293 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
3298 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
3303 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
3305 if (pWinData
== NULL
)
3308 pWinData
->dwWindowID
= -1;
3310 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
3311 pWinData
->lpszUrl
= NULL
;
3312 pWinData
->lpszUrlLocation
= NULL
;
3313 pWinData
->lpszTitle
= NULL
;
3317 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
3322 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
3327 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
3329 CComPtr
<IPersistHistory
> viewPersistHistory
;
3330 CComPtr
<IOleObject
> viewHistoryObject
;
3331 persistState oldState
;
3336 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
3337 if (FAILED_UNEXPECTEDLY(hResult
))
3339 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3341 if (oldState
.browseType
!= 2)
3343 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3345 return E_OUTOFMEMORY
;
3346 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3347 if (FAILED_UNEXPECTEDLY(hResult
))
3352 if (numRead
!= oldState
.pidlSize
)
3357 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3358 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3359 fHistoryObject
= viewHistoryObject
;
3360 fHistoryStream
= pStream
;
3361 fHistoryBindContext
= pbc
;
3362 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3363 fHistoryObject
= NULL
;
3364 fHistoryStream
= NULL
;
3365 fHistoryBindContext
= NULL
;
3367 if (FAILED_UNEXPECTEDLY(hResult
))
3372 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3374 CComPtr
<IPersistHistory
> viewPersistHistory
;
3375 persistState newState
;
3378 hResult
= fCurrentShellView
->GetItemObject(
3379 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3380 memset(&newState
, 0, sizeof(newState
));
3381 newState
.dwSize
= sizeof(newState
);
3382 newState
.browseType
= 2;
3383 newState
.browserIndex
= GetBrowserIndex();
3384 if (viewPersistHistory
.p
!= NULL
)
3386 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3387 if (FAILED_UNEXPECTEDLY(hResult
))
3390 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3391 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3392 if (FAILED_UNEXPECTEDLY(hResult
))
3394 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3395 if (FAILED_UNEXPECTEDLY(hResult
))
3397 if (viewPersistHistory
.p
!= NULL
)
3399 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3400 if (FAILED_UNEXPECTEDLY(hResult
))
3406 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3411 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3416 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3418 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3422 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3426 /* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
3427 OleFlushClipboard();
3429 // TODO: rip down everything
3431 fToolbarProxy
.Destroy();
3433 fCurrentShellView
->DestroyViewWindow();
3434 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3436 for (int i
= 0; i
< 3; i
++)
3438 CComPtr
<IDockingWindow
> pdw
;
3439 CComPtr
<IDeskBar
> bar
;
3440 CComPtr
<IUnknown
> pBarSite
;
3441 CComPtr
<IDeskBarClient
> pClient
;
3443 if (fClientBars
[i
].clientBar
== NULL
)
3446 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3447 if (FAILED_UNEXPECTEDLY(hr
))
3450 /* We should destroy our basebarsite too */
3451 hr
= pdw
->QueryInterface(IID_PPV_ARG(IDeskBar
, &bar
));
3454 hr
= bar
->GetClient(&pBarSite
);
3455 if (SUCCEEDED(hr
) && pBarSite
)
3457 hr
= pBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &pClient
));
3459 pClient
->SetDeskBarSite(NULL
);
3468 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3470 ReleaseCComPtrExpectZero(fCurrentShellView
);
3471 ReleaseCComPtrExpectZero(fTravelLog
);
3473 fCurrentShellFolder
.Release();
3474 ILFree(fCurrentDirectoryPIDL
);
3475 ::DestroyWindow(fStatusBar
);
3476 DestroyMenu(fCurrentMenuBar
);
3482 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3484 CComPtr
<IDockingWindow
> dockingWindow
;
3485 RECT availableBounds
;
3486 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3489 if (wParam
!= SIZE_MINIMIZED
)
3491 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3492 for (INT x
= 0; x
< 3; x
++)
3494 if (fClientBars
[x
].clientBar
!= NULL
)
3496 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3497 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3498 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3500 hResult
= dockingWindow
->ResizeBorderDW(
3501 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3511 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3514 LPARAM menuIndex
= lParam
;
3516 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3518 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3522 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3526 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3528 UpdateViewMenu(theMenu
);
3531 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3535 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3537 // FIXME: Remove once implemented
3538 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3539 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3542 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3547 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3552 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3554 ::SetFocus(fCurrentShellViewWindow
);
3558 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3560 if (fCurrentShellViewWindow
!= NULL
)
3561 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3565 LRESULT
CShellBrowser::OnSettingChange(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3567 LPVOID lpEnvironment
;
3568 RegenerateUserEnvironment(&lpEnvironment
, TRUE
);
3570 SHPropagateMessage(m_hWnd
, uMsg
, wParam
, lParam
, TRUE
);
3574 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3576 return SendMessage(WM_CLOSE
);
3579 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3581 HRESULT hResult
= DoFolderOptions();
3582 if (FAILED(hResult
))
3583 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3587 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3590 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3591 #endif /* __REACTOS__ */
3595 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3597 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3601 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3603 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3607 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3609 HRESULT hResult
= GoBack();
3610 if (FAILED(hResult
))
3611 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3615 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3617 HRESULT hResult
= GoForward();
3618 if (FAILED(hResult
))
3619 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3623 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3625 HRESULT hResult
= NavigateToParent();
3626 if (FAILED(hResult
))
3627 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3631 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3633 HRESULT hResult
= GoHome();
3634 if (FAILED(hResult
))
3635 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3639 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3641 // FIXME: This does not appear to be what windows does.
3642 HRESULT hResult
= NavigateToParent();
3643 if (FAILED(hResult
))
3644 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3648 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3650 CComPtr
<IShellFolder
> psfDesktop
;
3651 LPITEMIDLIST pidlFavs
;
3653 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3656 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3661 hr
= SHGetDesktopFolder(&psfDesktop
);
3662 if (FAILED_UNEXPECTEDLY(hr
))
3665 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3666 if (FAILED_UNEXPECTEDLY(hr
))
3672 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3674 fStatusBarVisible
= !fStatusBarVisible
;
3677 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3683 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3686 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3687 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3691 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3694 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3695 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3699 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3702 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3703 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3707 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3710 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3711 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3715 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3718 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3719 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3723 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3726 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3727 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3731 LRESULT
CShellBrowser::OnRefresh(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3733 if (fCurrentShellView
)
3734 fCurrentShellView
->Refresh();
3738 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3743 LRESULT
CShellBrowser::OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3745 // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3746 if (wID
>= IDM_EXPLORERBAND_BEGINCUSTOM
&& wID
<= IDM_EXPLORERBAND_ENDCUSTOM
)
3749 mbi
= (MenuBandInfo
*)DSA_GetItemPtr(menuDsa
, (wID
- IDM_EXPLORERBAND_BEGINCUSTOM
));
3752 ShowBand(mbi
->barGuid
, mbi
->fVertical
);
3758 case IDM_EXPLORERBAR_SEARCH
:
3759 Exec(&CLSID_CommonButtons
, 0x123, 1, NULL
, NULL
);
3761 case IDM_EXPLORERBAR_FOLDERS
:
3762 ShowBand(CLSID_ExplorerBand
, true);
3764 case IDM_EXPLORERBAR_HISTORY
:
3765 ShowBand(CLSID_SH_HistBand
, true);
3767 case IDM_EXPLORERBAR_FAVORITES
:
3768 ShowBand(CLSID_SH_FavBand
, true);
3771 WARN("Unknown id %x\n", wID
);
3777 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3779 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3780 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3784 HRESULT
CShellBrowser_CreateInstance(REFIID riid
, void **ppv
)
3786 return ShellObjectCreatorInit
<CShellBrowser
>(riid
, ppv
);