4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
29 #include "newatlinterfaces.h"
33 **Provide implementation of new and delete that use LocalAlloc
34 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
35 view doesn't restore the selection correctly.
36 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
37 **Add brand band bitmaps to shell32.dll
38 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
39 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
40 current state overwrites the wrong entry's contents. This needs to be changed.
41 ****Fix close of browser window to release all objects
42 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
43 **When a new bar is added to base bar site, how is base bar told so it can resize?
44 **Does the base bar site have a classid?
45 **What should refresh command send to views to make them refresh?
46 **When new bar is created, what status notifications need to be fired?
47 **How does keyboard filtering dispatch?
48 **For deferred persist history load, how does the view connect up and get the state?
49 How does context menu send open, cut, rename commands to its site (the shell view)?
50 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
52 **Route View->Toolbars commands to internet toolbar
53 **Handle travel log items in View->Go
54 **Fix ShowBrowserBar to pass correct size on when bar is shown
55 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
56 ****Make ShowToolbar check if bar is already created before creating it again
57 ****Shell should fill in the list of explorer bars in the View submenus
58 **Add folder menu in the file menu
59 **Fix CShellBrowser::GetBorderDW to compute available size correctly
60 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
61 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
62 Make folders toolbar item update state appropriately
63 Read list of bands from registry on launch
64 Read list of bars from registry on launch
65 If the folders or search bars don't exist, disable the toolbar buttons
66 If the favorites or history bars don't exist, disable the toolbar butons
67 Fix Apply to all Folders in Folder Options
68 Implement close command
69 Add explorer band context menu to file menu
70 Add code to allow restore of internet toolbar from registry
71 Fix code that calls FireNavigateComplete to pass the correct new path
73 What are the other command ids for QueryStatus/FireCommandStateChange?
75 Add handler for cabinet settings change
76 Add handler for system metrics change (renegotiate border space?)
77 Add handler for theme change and forward to contained windows
79 When folders are shown, the status bar text should change
80 Add code to save/restore shell view settings
81 Implement tabbing between frames
82 Fix handling of focus everywhere
83 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
85 The status bar doesn't show help text for items owned by frame during menu tracking
86 Stub out frame command handlers
87 "Arrange icons by" group is not checked properly
89 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
90 the icon is always an open folder with magnifying glass
91 Fix bars to calculate height correctly
92 Hookup policies for everything...
93 Investigate toolbar message WM_USER+93
94 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
96 Vertical Explorer Bar CATID_InfoBand
97 Horizontal Explorer Bar CATID_CommBand
98 Desk Band CATID_DeskBand
101 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
102 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
104 create key here with CLSID of bar to register tool band
105 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
110 #pragma comment(linker, \
111 "\"/manifestdependency:type='Win32' "\
112 "name='Microsoft.Windows.Common-Controls' "\
113 "version='6.0.0.0' "\
114 "processorArchitecture='*' "\
115 "publicKeyToken='6595b64144ccf1df' "\
119 static const unsigned int folderOptionsPageCountMax
= 20;
120 static const long BTP_DONT_UPDATE_HISTORY
= 0;
121 static const long BTP_UPDATE_CUR_HISTORY
= 1;
122 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
124 BOOL createNewStuff
= false;
127 // this class is private to browseui.dll and is not registered externally?
128 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
130 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
132 MENUITEMINFO menuItemInfo
;
136 menuItemCount
= GetMenuItemCount(theMenu
);
138 while (curIndex
< menuItemCount
)
140 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
141 menuItemInfo
.fMask
= MIIM_ID
;
142 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
143 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
145 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
153 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
155 CComPtr
<IShellFolder
> desktop
;
157 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
158 if (FAILED_UNEXPECTEDLY(hr
))
160 if (path
== NULL
|| path
->mkid
.cb
== 0)
162 *newFolder
= desktop
;
163 desktop
.p
->AddRef ();
166 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
169 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
170 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
175 class CToolbarProxy
:
176 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
179 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
181 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
186 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
187 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
189 BEGIN_MSG_MAP(CToolbarProxy
)
190 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
191 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
195 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
200 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
201 if (myWindow
!= NULL
)
203 SubclassWindow(myWindow
);
204 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
205 hResult
= explorerToolbar
->QueryInterface(
206 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
210 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
216 if (fExplorerToolbar
.p
!= NULL
)
218 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
219 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
220 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
221 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
226 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
232 if (fExplorerToolbar
.p
!= NULL
)
233 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
238 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
239 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
243 struct MenuBandInfo
{
248 class CShellBrowser
:
249 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
250 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
251 public IShellBrowser
,
253 public IServiceProvider
,
254 public IProfferServiceImpl
<CShellBrowser
>,
255 public IShellBrowserService
,
257 public ITravelLogClient
,
258 public IPersistHistory
,
259 public IDockingWindowSite
,
260 public IOleCommandTarget
,
261 public IBrowserService2
,
262 public IConnectionPointContainerImpl
<CShellBrowser
>,
263 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
264 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
271 CComPtr
<IUnknown
> clientBar
;
274 static const int BIInternetToolbar
= 0;
275 static const int BIVerticalBaseBar
= 1;
276 static const int BIHorizontalBaseBar
= 2;
278 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
279 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
280 CComPtr
<IShellView
> fCurrentShellView
; //
281 LPITEMIDLIST fCurrentDirectoryPIDL
; //
283 bool fStatusBarVisible
;
284 CToolbarProxy fToolbarProxy
;
285 barInfo fClientBars
[3];
286 CComPtr
<ITravelLog
> fTravelLog
;
287 HMENU fCurrentMenuBar
;
288 CABINETSTATE fCabinetState
;
289 // The next three fields support persisted history for shell views.
290 // They do not need to be reference counted.
291 IOleObject
*fHistoryObject
;
292 IStream
*fHistoryStream
;
293 IBindCtx
*fHistoryBindContext
;
298 ULONG
InternalAddRef()
300 OutputDebugString(_T("AddRef\n"));
301 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
303 ULONG
InternalRelease()
305 OutputDebugString(_T("Release\n"));
306 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
312 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
314 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
315 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
316 FOLDERSETTINGS
*folderSettings
, long flags
);
317 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
318 HRESULT
GetBaseBar(bool vertical
, REFIID riid
, void **theBaseBar
);
319 BOOL
IsBandLoaded(const CLSID clsidBand
, bool verticali
, DWORD
*pdwBandID
);
320 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
321 HRESULT
NavigateToParent();
322 HRESULT
DoFolderOptions();
323 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
324 void RepositionBars();
325 HRESULT
BuildExplorerBandMenu();
326 HRESULT
BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
);
327 BOOL
IsBuiltinBand(CLSID
&bandID
);
328 virtual WNDPROC
GetWindowProc()
332 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
333 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
334 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
335 HRESULT
FireCommandStateChangeAll();
336 HRESULT
UpdateForwardBackState();
337 HRESULT
UpdateUpState();
338 void UpdateGotoMenu(HMENU theMenu
);
339 void UpdateViewMenu(HMENU theMenu
);
341 /* // *** IDockingWindowFrame methods ***
342 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
343 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
344 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
347 // *** IDockingWindowSite methods ***
348 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
349 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
350 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
352 // *** IOleCommandTarget methods ***
353 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
354 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
355 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
356 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
358 // *** IOleWindow methods ***
359 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
360 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
362 // *** IShellBrowser methods ***
363 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
364 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
365 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
366 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
367 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
368 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
369 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
370 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
371 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
372 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
373 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
374 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
375 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
377 // *** IDropTarget methods ***
378 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
379 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
380 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
381 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
383 // *** IServiceProvider methods ***
384 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
386 // *** IShellBowserService methods ***
387 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
389 // *** IDispatch methods ***
390 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
391 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
392 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
393 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
394 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
395 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
397 // *** IBrowserService methods ***
398 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
399 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
400 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
401 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
402 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
403 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
404 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
405 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
406 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
407 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
408 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
409 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
410 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
411 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
412 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
413 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
414 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
415 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
416 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
417 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
418 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
419 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
420 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
421 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
422 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
423 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
424 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
425 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
426 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
427 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
429 // *** IBrowserService2 methods ***
430 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
431 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
432 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
433 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
434 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
435 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
436 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
437 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
438 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
439 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
440 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
441 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
442 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
443 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
444 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
445 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
446 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
447 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
448 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
449 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
450 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
451 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
452 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
453 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
454 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
455 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
456 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
457 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
458 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
459 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
460 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
461 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
462 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
463 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
464 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
465 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
466 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
467 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
468 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
469 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
470 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
471 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
472 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
473 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
474 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
475 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
476 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
477 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
478 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
479 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
480 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
481 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
482 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
483 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
484 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
485 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
486 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
487 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
488 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
489 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
490 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
491 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
492 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
493 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
494 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
496 // *** IWebBrowser methods ***
497 virtual HRESULT STDMETHODCALLTYPE
GoBack();
498 virtual HRESULT STDMETHODCALLTYPE
GoForward();
499 virtual HRESULT STDMETHODCALLTYPE
GoHome();
500 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
501 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
502 VARIANT
*PostData
, VARIANT
*Headers
);
503 virtual HRESULT STDMETHODCALLTYPE
Refresh();
504 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
505 virtual HRESULT STDMETHODCALLTYPE
Stop();
506 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
507 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
508 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
509 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
510 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
511 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
512 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
513 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
514 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
515 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
516 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
517 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
518 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
519 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
520 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
521 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
522 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
524 // *** IWebBrowserApp methods ***
525 virtual HRESULT STDMETHODCALLTYPE
Quit();
526 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
527 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
528 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
529 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
530 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
531 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
532 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
533 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
534 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
535 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
536 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
537 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
538 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
539 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
540 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
541 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
542 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
543 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
544 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
546 // *** IWebBrowser2 methods ***
547 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
548 VARIANT
*PostData
, VARIANT
*Headers
);
549 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
550 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
551 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
552 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
553 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
554 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
555 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
556 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
557 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
558 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
559 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
560 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
561 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
562 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
563 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
564 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
565 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
566 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
567 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
569 // *** ITravelLogClient methods ***
570 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
571 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
572 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
574 // *** IPersist methods ***
575 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
577 // *** IPersistHistory methods ***
578 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
579 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
580 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
581 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
584 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
585 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
586 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
587 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
588 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
589 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
590 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
591 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
592 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
593 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
594 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
595 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
596 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
597 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
598 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
599 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
600 LRESULT
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
601 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
602 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
603 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
604 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
605 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
606 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
607 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
608 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
609 LRESULT
OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
610 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
613 static ATL::CWndClassInfo
& GetWndClassInfo()
615 static ATL::CWndClassInfo wc
=
617 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
618 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
619 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
620 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
625 BEGIN_MSG_MAP(CShellBrowser
)
626 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
627 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
628 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
629 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
630 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
631 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
632 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
633 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
634 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
635 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
636 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
637 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
638 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
639 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
640 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
641 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
642 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
643 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
644 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
645 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
646 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
647 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
648 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
649 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
650 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
651 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH
, OnExplorerBar
)
652 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS
, OnExplorerBar
)
653 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY
, OnExplorerBar
)
654 COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES
, OnExplorerBar
)
655 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
656 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
657 COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM
, IDM_EXPLORERBAND_ENDCUSTOM
, OnExplorerBar
)
658 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
661 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
662 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
663 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
664 END_CONNECTION_POINT_MAP()
666 BEGIN_COM_MAP(CShellBrowser
)
667 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
668 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
669 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
670 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
671 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
672 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
673 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
674 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
675 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
676 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
677 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
678 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
679 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
680 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
681 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
682 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
683 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
684 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
688 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
690 CShellBrowser::CShellBrowser()
692 fCurrentShellViewWindow
= NULL
;
693 fCurrentDirectoryPIDL
= NULL
;
695 fStatusBarVisible
= true;
696 memset(fClientBars
, 0, sizeof(fClientBars
));
697 fCurrentMenuBar
= NULL
;
698 fHistoryObject
= NULL
;
699 fHistoryStream
= NULL
;
700 fHistoryBindContext
= NULL
;
703 CShellBrowser::~CShellBrowser()
706 DSA_Destroy(menuDsa
);
709 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
711 CComPtr
<IPersistStreamInit
> persistStreamInit
;
713 CComPtr
<IUnknown
> clientBar
;
715 _AtlInitialConstruct();
717 menuDsa
= DSA_Create(sizeof(MenuBandInfo
), 5);
719 return E_OUTOFMEMORY
;
721 fCabinetState
.cLength
= sizeof(fCabinetState
);
722 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
727 Create(HWND_DESKTOP
);
731 hResult
= CInternetToolbar_CreateInstance(IID_PPV_ARG(IUnknown
, &clientBar
));
732 if (FAILED_UNEXPECTEDLY(hResult
))
735 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
738 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
739 if (FAILED_UNEXPECTEDLY(hResult
))
742 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
743 if (FAILED_UNEXPECTEDLY(hResult
))
746 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
747 if (FAILED_UNEXPECTEDLY(hResult
))
750 // TODO: create settingsStream from registry entry
751 //if (settingsStream.p)
753 // hResult = persistStreamInit->Load(settingsStream);
754 // if (FAILED_UNEXPECTEDLY(hResult))
759 hResult
= persistStreamInit
->InitNew();
760 if (FAILED_UNEXPECTEDLY(hResult
))
764 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
765 if (FAILED_UNEXPECTEDLY(hResult
))
768 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
772 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
773 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
774 _AtlBaseModule
.GetModuleInstance(), 0);
775 fStatusBarVisible
= true;
779 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
780 if (FAILED_UNEXPECTEDLY(hResult
))
783 ShowWindow(SW_SHOWNORMAL
);
788 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
790 CComPtr
<IShellFolder
> newFolder
;
791 FOLDERSETTINGS newFolderSettings
;
794 // called by shell view to browse to new folder
795 // also called by explorer band to navigate to new folder
796 hResult
= SHBindToFolder(pidl
, &newFolder
);
797 if (FAILED_UNEXPECTEDLY(hResult
))
800 newFolderSettings
.ViewMode
= FVM_ICON
;
801 newFolderSettings
.fFlags
= 0;
802 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
803 if (FAILED_UNEXPECTEDLY(hResult
))
808 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
810 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
813 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
815 LPCITEMIDLIST pidlnext
;
820 if (! _ILIsDesktop(pidl
))
822 length
= pidl
->mkid
.cb
;
824 reinterpret_cast<LPCITEMIDLIST
>(
825 reinterpret_cast<const BYTE
*>(pidl
) + length
);
826 if (pidlnext
->mkid
.cb
!= 0)
832 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
833 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
835 CComPtr
<IShellFolder
> psf
;
836 LPITEMIDLIST pidlChild
;
837 LPITEMIDLIST pidlParent
;
844 if (ppidlLast
!= NULL
)
846 if (_ILIsPidlSimple(pidl
))
848 if (ppidlLast
!= NULL
)
849 *ppidlLast
= ILClone(pidl
);
850 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
854 pidlChild
= ILClone(ILFindLastID(pidl
));
855 pidlParent
= ILClone(pidl
);
856 ILRemoveLastID(pidlParent
);
857 hResult
= SHGetDesktopFolder(&psf
);
858 if (SUCCEEDED(hResult
))
859 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
860 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
861 *ppidlLast
= pidlChild
;
869 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
870 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
872 CComPtr
<IShellFolder
> parentFolder
;
873 LPITEMIDLIST childPIDL
= NULL
;
877 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
881 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
885 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
888 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
901 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
903 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
906 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
907 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
909 CComPtr
<IObjectWithSite
> objectWithSite
;
910 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
911 CComPtr
<IShellView
> saveCurrentShellView
;
912 CComPtr
<IShellView
> newShellView
;
913 CComPtr
<ITravelLog
> travelLog
;
914 HWND newShellViewWindow
;
915 BOOL windowUpdateIsLocked
;
916 RECT shellViewWindowBounds
;
919 wchar_t newTitle
[MAX_PATH
];
923 if (newShellFolder
== NULL
)
926 hResult
= GetTravelLog(&travelLog
);
927 if (FAILED_UNEXPECTEDLY(hResult
))
931 if (flags
& BTP_UPDATE_CUR_HISTORY
)
933 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
934 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
935 // what to do with error? Do we want to halt browse because state save failed?
938 if (fCurrentShellView
)
940 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
943 // create view object
944 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
945 if (FAILED_UNEXPECTEDLY(hResult
))
947 previousView
= fCurrentShellViewWindow
;
949 // enter updating section
950 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
951 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
952 if (fCurrentShellView
!= NULL
)
953 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
956 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
958 // update folder and view
959 saveCurrentShellFolder
= fCurrentShellFolder
;
960 saveCurrentShellView
= fCurrentShellView
;
961 fCurrentShellFolder
= newShellFolder
;
962 fCurrentShellView
= newShellView
;
965 if (previousView
!= NULL
)
966 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
968 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
969 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
971 // create view window
972 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
973 this, &shellViewWindowBounds
, &newShellViewWindow
);
974 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
976 fCurrentShellView
= saveCurrentShellView
;
977 fCurrentShellFolder
= saveCurrentShellFolder
;
978 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
979 if (windowUpdateIsLocked
)
980 LockWindowUpdate(FALSE
);
981 SetCursor(saveCursor
);
985 if (objectWithSite
.p
!= NULL
)
986 hResult
= objectWithSite
->SetSite(NULL
);
988 // update current pidl
989 ILFree(fCurrentDirectoryPIDL
);
990 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
992 // update view window
993 if (saveCurrentShellView
!= NULL
)
994 saveCurrentShellView
->DestroyViewWindow();
995 fCurrentShellViewWindow
= newShellViewWindow
;
998 saveCurrentShellView
.Release();
999 saveCurrentShellFolder
.Release();
1001 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1003 // leave updating section
1004 if (windowUpdateIsLocked
)
1005 LockWindowUpdate(FALSE
);
1006 SetCursor(saveCursor
);
1009 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1011 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1012 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1016 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1017 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1018 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1019 if (SUCCEEDED(hResult
))
1021 FireNavigateComplete(newTitle
);
1025 FireNavigateComplete(L
"ERROR");
1028 if (fCabinetState
.fFullPathTitle
)
1029 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1031 nameFlags
= SHGDN_FORADDRESSBAR
;
1032 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1033 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1034 if (SUCCEEDED(hResult
))
1036 SetWindowText(newTitle
);
1038 LPCITEMIDLIST pidlChild
;
1039 INT index
, indexOpen
;
1040 HIMAGELIST himlSmall
, himlLarge
;
1042 CComPtr
<IShellFolder
> sf
;
1043 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1045 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1047 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1049 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1050 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1052 /* Hack to make it possible to release the old icons */
1053 /* Something seems to go wrong with WM_SETICON */
1054 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1055 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1057 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1058 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1060 DestroyIcon(oldSmall
);
1061 DestroyIcon(oldLarge
);
1064 FireCommandStateChangeAll();
1065 hResult
= UpdateForwardBackState();
1066 hResult
= UpdateUpState();
1070 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1072 CComPtr
<IBandSite
> bandSite
;
1073 CComPtr
<IDeskBand
> deskBand
;
1076 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1079 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1080 if (FAILED_UNEXPECTEDLY(hResult
))
1083 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1084 if (FAILED_UNEXPECTEDLY(hResult
))
1087 return deskBand
->QueryInterface(riid
, shellMenu
);
1090 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, REFIID riid
, void **theBaseBar
)
1092 CComPtr
<IUnknown
> newBaseBar
;
1093 CComPtr
<IDeskBar
> deskBar
;
1094 CComPtr
<IUnknown
> newBaseBarSite
;
1095 CComPtr
<IDeskBarClient
> deskBarClient
;
1100 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1102 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1105 hResult
= CBaseBar_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBar
), vertical
);
1106 if (FAILED_UNEXPECTEDLY(hResult
))
1108 hResult
= CBaseBarSite_CreateInstance(IID_PPV_ARG(IUnknown
, &newBaseBarSite
), vertical
);
1109 if (FAILED_UNEXPECTEDLY(hResult
))
1112 // we have to store our basebar into cache now
1113 *cache
= newBaseBar
;
1115 // tell the new base bar about the shell browser
1116 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1117 if (FAILED_UNEXPECTEDLY(hResult
))
1120 // tell the new base bar about the new base bar site
1121 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1122 if (FAILED_UNEXPECTEDLY(hResult
))
1124 hResult
= deskBar
->SetClient(newBaseBarSite
);
1125 if (FAILED_UNEXPECTEDLY(hResult
))
1128 // tell the new base bar site about the new base bar
1129 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1130 if (FAILED_UNEXPECTEDLY(hResult
))
1132 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1133 if (FAILED_UNEXPECTEDLY(hResult
))
1137 return (*cache
)->QueryInterface(riid
, theBaseBar
);
1140 BOOL
CShellBrowser::IsBandLoaded(const CLSID clsidBand
, bool vertical
, DWORD
*pdwBandID
)
1143 CComPtr
<IDeskBar
> deskBar
;
1144 CComPtr
<IUnknown
> baseBarSite
;
1145 CComPtr
<IBandSite
> bandSite
;
1151 /* Get our basebarsite to be able to enumerate bands */
1152 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1153 if (FAILED_UNEXPECTEDLY(hResult
))
1155 hResult
= deskBar
->GetClient(&baseBarSite
);
1156 if (FAILED_UNEXPECTEDLY(hResult
))
1158 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &bandSite
));
1159 if (FAILED_UNEXPECTEDLY(hResult
))
1162 hResult
= bandSite
->EnumBands(-1, &numBands
);
1163 if (FAILED_UNEXPECTEDLY(hResult
))
1166 for(i
= 0; i
< numBands
; i
++)
1168 CComPtr
<IPersist
> bandPersist
;
1170 hResult
= bandSite
->EnumBands(i
, &dwBandID
);
1171 if (FAILED_UNEXPECTEDLY(hResult
))
1174 hResult
= bandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IPersist
, &bandPersist
));
1175 if (FAILED_UNEXPECTEDLY(hResult
))
1177 hResult
= bandPersist
->GetClassID(&clsidTmp
);
1178 if (FAILED_UNEXPECTEDLY(hResult
))
1180 if (IsEqualGUID(clsidBand
, clsidTmp
))
1182 if (pdwBandID
) *pdwBandID
= dwBandID
;
1189 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1191 CComPtr
<IDockingWindow
> dockingWindow
;
1192 CComPtr
<IUnknown
> baseBarSite
;
1193 CComPtr
<IUnknown
> newBand
;
1194 CComPtr
<IDeskBar
> deskBar
;
1199 hResult
= GetBaseBar(vertical
, IID_PPV_ARG(IDeskBar
, &deskBar
));
1200 if (FAILED_UNEXPECTEDLY(hResult
))
1203 hResult
= deskBar
->GetClient(&baseBarSite
);
1204 if (FAILED_UNEXPECTEDLY(hResult
))
1207 hResult
= deskBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1208 if (FAILED_UNEXPECTEDLY(hResult
))
1211 if (!IsBandLoaded(classID
, vertical
, &dwBandID
))
1213 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1214 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1216 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1217 hResult
= CExplorerBand_CreateInstance(IID_PPV_ARG(IUnknown
, &newBand
));
1218 if (FAILED_UNEXPECTEDLY(hResult
))
1223 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1224 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1225 if (FAILED_UNEXPECTEDLY(hResult
))
1231 CComPtr
<IBandSite
> pBandSite
;
1233 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IBandSite
, &pBandSite
));
1234 if (!SUCCEEDED(hResult
))
1236 ERR("Can't get IBandSite interface\n");
1239 hResult
= pBandSite
->GetBandObject(dwBandID
, IID_PPV_ARG(IUnknown
, &newBand
));
1240 if (!SUCCEEDED(hResult
))
1242 ERR("Can't find band object\n");
1246 // It's hackish, but we should be able to show the wanted band until we
1247 // find the proper way to do this (but it seems to work to add a new band)
1248 // Here we'll just re-add the existing band to the site, causing it to display.
1250 V_VT(&vaIn
) = VT_UNKNOWN
;
1251 V_UNKNOWN(&vaIn
) = newBand
.p
;
1252 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1253 if (FAILED_UNEXPECTEDLY(hResult
))
1258 hResult
= dockingWindow
->ShowDW(TRUE
);
1259 if (FAILED_UNEXPECTEDLY(hResult
))
1265 HRESULT
CShellBrowser::NavigateToParent()
1267 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1268 if (newDirectory
== NULL
)
1269 return E_OUTOFMEMORY
;
1270 if (_ILIsDesktop(newDirectory
))
1272 ILFree(newDirectory
);
1273 return E_INVALIDARG
;
1275 ILRemoveLastID(newDirectory
);
1276 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1277 ILFree(newDirectory
);
1278 if (FAILED_UNEXPECTEDLY(hResult
))
1283 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1285 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1286 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1288 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1289 sheetInfo
->nPages
++;
1293 HRESULT
CShellBrowser::DoFolderOptions()
1295 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1296 PROPSHEETHEADER m_PropSheet
;
1297 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1298 // CComPtr<IGlobalFolderSettings> globalSettings;
1299 // SHELLSTATE2 shellState;
1302 memset(m_psp
, 0, sizeof(m_psp
));
1303 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1305 // create sheet object
1306 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1307 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1308 if (FAILED_UNEXPECTEDLY(hResult
))
1311 // must set site in order for Apply to all Folders on Advanced page to be enabled
1312 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1313 m_PropSheet
.phpage
= m_psp
;
1316 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1317 if (FAILED_UNEXPECTEDLY(hResult
))
1319 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1320 if (FAILED_UNEXPECTEDLY(hResult
))
1325 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1326 if (FAILED_UNEXPECTEDLY(hResult
))
1329 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1330 // It returns 'E_NOTIMPL'
1332 if (fCurrentShellView
!= NULL
)
1334 hResult
= fCurrentShellView
->AddPropertySheetPages(
1335 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1336 if (FAILED_UNEXPECTEDLY(hResult
))
1342 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1343 m_PropSheet
.dwFlags
= 0;
1344 m_PropSheet
.hwndParent
= m_hWnd
;
1345 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1346 m_PropSheet
.pszCaption
= _T("Folder Options");
1347 m_PropSheet
.nStartPage
= 0;
1348 PropertySheet(&m_PropSheet
);
1352 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1354 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1355 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1357 const _ATL_MSG
*previousMessage
;
1359 WNDPROC saveWindowProc
;
1362 hWnd
= pThis
->m_hWnd
;
1363 previousMessage
= pThis
->m_pCurrentMsg
;
1364 pThis
->m_pCurrentMsg
= &msg
;
1366 CComPtr
<IMenuBand
> menuBand
;
1367 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1368 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1370 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1371 if (hResult
== S_OK
)
1374 wParam
= msg
.wParam
;
1375 lParam
= msg
.lParam
;
1379 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1380 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1381 if (handled
== FALSE
)
1383 if (uMsg
== WM_NCDESTROY
)
1385 saveWindowProc
= reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1386 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1387 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1388 ::SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1389 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1392 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1394 pThis
->m_pCurrentMsg
= previousMessage
;
1395 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1397 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1398 pThis
->m_hWnd
= NULL
;
1399 pThis
->OnFinalMessage(hWnd
);
1404 void CShellBrowser::RepositionBars()
1410 GetClientRect(&clientRect
);
1412 if (fStatusBarVisible
&& fStatusBar
)
1414 ::GetWindowRect(fStatusBar
, &statusRect
);
1415 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1416 clientRect
.right
- clientRect
.left
,
1417 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1418 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1421 for (x
= 0; x
< 3; x
++)
1423 HWND hwnd
= fClientBars
[x
].hwnd
;
1424 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1425 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1427 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1428 fClientBars
[x
].hwnd
= hwnd
;
1432 RECT toolbarRect
= clientRect
;
1433 if (borderSpace
.top
!= 0)
1435 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1437 else if (borderSpace
.bottom
!= 0)
1439 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1441 else if (borderSpace
.left
!= 0)
1443 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1445 else if (borderSpace
.right
!= 0)
1447 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1450 ::SetWindowPos(hwnd
, NULL
,
1453 toolbarRect
.right
- toolbarRect
.left
,
1454 toolbarRect
.bottom
- toolbarRect
.top
,
1455 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1457 if (borderSpace
.top
!= 0)
1459 clientRect
.top
= toolbarRect
.bottom
;
1461 else if (borderSpace
.bottom
!= 0)
1463 clientRect
.bottom
= toolbarRect
.top
;
1465 else if (borderSpace
.left
!= 0)
1467 clientRect
.left
= toolbarRect
.right
;
1469 else if (borderSpace
.right
!= 0)
1471 clientRect
.right
= toolbarRect
.left
;
1475 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1476 clientRect
.right
- clientRect
.left
,
1477 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1480 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1483 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1484 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1487 params
.rgvarg
= arguments
;
1488 params
.rgdispidNamedArgs
= NULL
;
1489 params
.cArgs
= argCount
;
1490 params
.cNamedArgs
= 0;
1491 IUnknown
** pp
= vec
.begin();
1492 while (pp
< vec
.end())
1496 CComPtr
<IDispatch
> theDispatch
;
1498 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1499 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1504 while (pp
< vec2
.end())
1508 CComPtr
<IDispatch
> theDispatch
;
1510 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1511 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1518 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1520 // these two variants intentionally to do use CComVariant because it would double free/release
1521 // or does not need to dispose at all
1524 CComBSTR
tempString(newDirectory
);
1526 V_VT(&varArgs
) = VT_BSTR
;
1527 V_BSTR(&varArgs
) = tempString
.m_str
;
1529 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1530 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1531 V_VT(&varArg
[1]) = VT_DISPATCH
;
1532 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1534 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1537 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1541 V_VT(&varArg
[0]) = VT_BOOL
;
1542 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1543 V_VT(&varArg
[1]) = VT_I4
;
1544 V_I4(&varArg
[1]) = commandID
;
1546 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1549 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1551 return FireCommandStateChange(false, -1);
1554 HRESULT
CShellBrowser::UpdateForwardBackState()
1556 CComPtr
<ITravelLog
> travelLog
;
1557 CComPtr
<ITravelEntry
> unusedEntry
;
1563 canGoForward
= false;
1564 hResult
= GetTravelLog(&travelLog
);
1565 if (FAILED_UNEXPECTEDLY(hResult
))
1567 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1568 if (SUCCEEDED(hResult
))
1571 unusedEntry
.Release();
1573 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1574 if (SUCCEEDED(hResult
))
1576 canGoForward
= true;
1577 unusedEntry
.Release();
1579 hResult
= FireCommandStateChange(canGoBack
, 2);
1580 hResult
= FireCommandStateChange(canGoForward
, 1);
1584 HRESULT
CShellBrowser::UpdateUpState()
1590 if (_ILIsDesktop(fCurrentDirectoryPIDL
))
1592 hResult
= FireCommandStateChange(canGoUp
, 3);
1596 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1598 CComPtr
<ITravelLog
> travelLog
;
1599 CComPtr
<ITravelEntry
> unusedEntry
;
1601 MENUITEMINFO menuItemInfo
;
1604 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1606 position
= GetMenuItemCount(theMenu
);
1607 hResult
= GetTravelLog(&travelLog
);
1608 if (FAILED_UNEXPECTEDLY(hResult
))
1611 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1615 if (SUCCEEDED(hResult
))
1617 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, TRUE
);
1618 unusedEntry
.Release();
1621 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, FALSE
);
1623 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1627 if (SUCCEEDED(hResult
))
1629 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, TRUE
);
1630 unusedEntry
.Release();
1633 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, FALSE
);
1635 SHEnableMenuItem(theMenu
,
1636 IDM_GOTO_UPONELEVEL
,
1637 !_ILIsDesktop(fCurrentDirectoryPIDL
));
1639 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1640 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1641 if (SUCCEEDED(hResult
))
1643 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1644 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1645 menuItemInfo
.fType
= MF_SEPARATOR
;
1646 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1647 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1651 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1653 CComPtr
<ITravelLog
> travelLog
;
1655 OLECMD commandList
[5];
1656 HMENU toolbarMenuBar
;
1658 MENUITEMINFO menuItemInfo
;
1661 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1662 if (gotoMenu
!= NULL
)
1663 UpdateGotoMenu(gotoMenu
);
1665 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1666 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1667 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1668 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1669 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1671 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1672 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1673 if (FAILED_UNEXPECTEDLY(hResult
))
1674 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1677 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1678 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1679 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1680 DestroyMenu(menuItemInfo
.hSubMenu
);
1682 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1683 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1684 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1685 DestroyMenu(toolbarMenuBar
);
1688 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1689 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1690 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1691 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1693 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1694 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1695 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1696 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1697 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1698 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1699 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1700 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1702 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1703 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1704 menuItemInfo
.hSubMenu
= toolbarMenu
;
1705 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1707 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1710 HRESULT
CShellBrowser::BuildExplorerBandMenu()
1715 hBandsMenu
= SHGetMenuFromID(fCurrentMenuBar
, IDM_VIEW_EXPLORERBAR
);
1718 OutputDebugString(L
"No menu !\n");
1721 DSA_DeleteAllItems(menuDsa
);
1722 BuildExplorerBandCategory(hBandsMenu
, CATID_InfoBand
, 4, NULL
);
1723 BuildExplorerBandCategory(hBandsMenu
, CATID_CommBand
, 20, &nbFound
);
1727 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_SEPARATOR
, MF_BYCOMMAND
);
1729 // Remove media menu since XP does it (according to API Monitor)
1730 DeleteMenu(hBandsMenu
, IDM_EXPLORERBAR_MEDIA
, MF_BYCOMMAND
);
1734 HRESULT
CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu
, CATID category
, DWORD dwPos
, UINT
*nbFound
)
1737 CComPtr
<IEnumGUID
> pEnumGUID
;
1738 WCHAR wszBandName
[MAX_PATH
];
1739 WCHAR wszBandGUID
[MAX_PATH
];
1740 WCHAR wRegKey
[MAX_PATH
];
1747 mbi
.fVertical
= IsEqualGUID(category
, CATID_InfoBand
);
1749 hr
= SHEnumClassesOfCategories(1, &category
, 0, NULL
, &pEnumGUID
);
1750 if (FAILED_UNEXPECTEDLY(hr
))
1756 pEnumGUID
->Next(1, &iter
, &dwRead
);
1759 // Get the band name
1760 if (IsBuiltinBand(iter
))
1762 if (!StringFromGUID2(iter
, wszBandGUID
, MAX_PATH
))
1764 StringCchPrintfW(wRegKey
, MAX_PATH
, L
"CLSID\\%s", wszBandGUID
);
1765 dwDataSize
= MAX_PATH
;
1766 SHGetValue(HKEY_CLASSES_ROOT
, wRegKey
, NULL
, NULL
, wszBandName
, &dwDataSize
);
1769 InsertMenu(hBandsMenu
, dwPos
+ cBands
, MF_BYPOSITION
, IDM_EXPLORERBAND_BEGINCUSTOM
+ DSA_GetItemCount(menuDsa
), wszBandName
);
1770 DSA_AppendItem(menuDsa
, &mbi
);
1780 BOOL
CShellBrowser::IsBuiltinBand(CLSID
&bandID
)
1782 if (IsEqualCLSID(bandID
, CLSID_ExplorerBand
))
1784 if (IsEqualCLSID(bandID
, CLSID_SH_SearchBand
) || IsEqualCLSID(bandID
, CLSID_SearchBand
))
1786 if (IsEqualCLSID(bandID
, CLSID_IE_SearchBand
) || IsEqualCLSID(bandID
, CLSID_FileSearchBand
))
1788 if (IsEqualCLSID(bandID
, CLSID_SH_HistBand
))
1790 if (IsEqualCLSID(bandID
, CLSID_SH_FavBand
))
1792 if (IsEqualCLSID(bandID
, CLSID_ChannelsBand
))
1797 HRESULT
CShellBrowser::OnSearch()
1799 CComPtr
<IObjectWithSite
> objectWithSite
;
1800 CComPtr
<IContextMenu
> contextMenu
;
1801 CMINVOKECOMMANDINFO commandInfo
;
1802 const char *searchGUID
= "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1805 // TODO: Query shell if this command is enabled first
1807 memset(&commandInfo
, 0, sizeof(commandInfo
));
1808 commandInfo
.cbSize
= sizeof(commandInfo
);
1809 commandInfo
.hwnd
= m_hWnd
;
1810 commandInfo
.lpParameters
= searchGUID
;
1811 commandInfo
.nShow
= SW_SHOWNORMAL
;
1813 hResult
= CoCreateInstance(CLSID_ShellSearchExt
, NULL
, CLSCTX_INPROC_SERVER
,
1814 IID_PPV_ARG(IContextMenu
, &contextMenu
));
1815 if (FAILED_UNEXPECTEDLY(hResult
))
1817 hResult
= contextMenu
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1818 if (FAILED_UNEXPECTEDLY(hResult
))
1820 hResult
= objectWithSite
->SetSite(dynamic_cast<IShellBrowser
*>(this));
1821 if (FAILED_UNEXPECTEDLY(hResult
))
1823 hResult
= contextMenu
->InvokeCommand(&commandInfo
);
1824 hResult
= objectWithSite
->SetSite(NULL
);
1828 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1830 CComPtr
<IUnknown
> int1Retry
;
1831 CComPtr
<IUnknown
> int2Retry
;
1836 if (int1
== NULL
|| int2
== NULL
)
1838 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1839 if (FAILED_UNEXPECTEDLY(hResult
))
1841 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1842 if (FAILED_UNEXPECTEDLY(hResult
))
1844 if (int1Retry
== int2Retry
)
1849 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1851 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1853 RECT availableBounds
;
1855 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1856 for (INT x
= 0; x
< 3; x
++)
1858 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1860 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1861 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1862 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1863 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1866 *prcBorder
= availableBounds
;
1870 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1875 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1877 for (INT x
= 0; x
< 3; x
++)
1879 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1881 fClientBars
[x
].borderSpace
= *pbw
;
1882 // if this bar changed size, it cascades and forces all subsequent bars to resize
1887 return E_INVALIDARG
;
1890 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1891 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1893 CComPtr
<IOleCommandTarget
> commandTarget
;
1896 if (prgCmds
== NULL
)
1897 return E_INVALIDARG
;
1898 if (pguidCmdGroup
== NULL
)
1900 if (fCurrentShellView
.p
!= NULL
)
1902 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1903 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1904 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1913 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1917 switch (prgCmds
->cmdID
)
1919 case 0x1c: // search
1920 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1922 case 0x1d: // history
1923 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1925 case 0x1e: // favorites
1926 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1928 case 0x23: // folders
1929 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1939 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1943 switch (prgCmds
->cmdID
)
1945 case 0xa022: // up level
1946 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1947 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1948 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1958 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1959 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1965 TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID
, nCmdexecopt
, pvaIn
, pvaOut
);
1968 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1973 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1976 if (nCmdexecopt
== 1)
1978 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1982 // update zones part of the status bar
1985 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1986 V_VT(pvaOut
) = VT_INT_PTR
;
1987 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1988 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1991 // indicate if this cabinet was opened as a browser
1997 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
2006 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
2011 // what is theater mode and why do we receive this?
2015 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
2020 // initialize favorites menu
2024 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
2029 // refresh on toolbar clicked
2032 // called for unknown bands ?
2035 // tell the view if it should hide the task pane or not
2036 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
2039 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
2044 return NavigateToParent();
2047 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
2052 return DoFolderOptions();
2055 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
2060 // Reset All Folders option in Folder Options
2064 else if (IsEqualIID(*pguidCmdGroup
, CLSID_CommonButtons
))
2066 // Windows seems to use this as proxy for toolbar buttons.
2067 // We use it for search band for now to remove code duplication,
2068 // let's see if it could be useful in the future.
2072 // Show search band from toolbar
2085 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
2093 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
2098 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
2100 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2102 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
2104 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
2107 DestroyMenu(mainMenu
);
2109 lpMenuWidths
->width
[0] = 2;
2110 lpMenuWidths
->width
[2] = 3;
2111 lpMenuWidths
->width
[4] = 1;
2115 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
2117 CComPtr
<IShellMenu
> shellMenu
;
2120 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
2122 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
2123 if (FAILED_UNEXPECTEDLY(hResult
))
2128 hmenuShared
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
2130 // FIXME: Figure out the proper way to do this.
2131 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
2134 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
2137 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
2138 if (FAILED_UNEXPECTEDLY(hResult
))
2140 fCurrentMenuBar
= hmenuShared
;
2141 BuildExplorerBandMenu();
2145 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
2147 if (hmenuShared
== fCurrentMenuBar
)
2149 //DestroyMenu(fCurrentMenuBar);
2150 SetMenuSB(NULL
, NULL
, NULL
);
2155 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
2160 ::SetWindowText(fStatusBar
, pszStatusText
);
2169 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
2174 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
2176 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
2181 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
2183 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2186 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
2191 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
2199 *lphwnd
= fToolbarProxy
.m_hWnd
;
2202 *lphwnd
= fStatusBar
;
2205 // find the directory browser and return it
2206 // this should be used only to determine if a tree is present
2209 // is this a progress dialog?
2215 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
2216 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
2225 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
2230 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
2238 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
2242 *ppshv
= fCurrentShellView
;
2243 if (fCurrentShellView
.p
!= NULL
)
2244 fCurrentShellView
.p
->AddRef();
2248 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2253 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2258 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2259 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2264 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2269 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2274 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2275 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2280 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2282 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2283 // the returned interface has a method GetPropertyBag on it
2284 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2285 return this->QueryInterface(riid
, ppvObject
);
2286 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2287 return this->QueryInterface(riid
, ppvObject
);
2288 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2289 return this->QueryInterface(riid
, ppvObject
);
2290 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2291 return this->QueryInterface(riid
, ppvObject
);
2292 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2293 return this->QueryInterface(riid
, ppvObject
);
2294 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2295 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2296 if (IsEqualIID(riid
, IID_IShellBrowser
))
2297 return this->QueryInterface(riid
, ppvObject
);
2298 return E_NOINTERFACE
;
2301 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2303 if (ppvObject
== NULL
)
2309 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2314 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2319 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2320 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2325 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2326 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2331 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2336 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2341 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2346 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2351 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2355 // called by toolbar when displaying tooltips
2360 if (fTravelLog
.p
== NULL
)
2362 hResult
= CTravelLog_CreateInstance(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2363 if (FAILED_UNEXPECTEDLY(hResult
))
2366 *pptl
= fTravelLog
.p
;
2367 fTravelLog
.p
->AddRef();
2371 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2376 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2381 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2386 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2391 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2396 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2401 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2406 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2411 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2416 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2421 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2426 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2431 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2436 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2441 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2443 // called by explorer bar to get current pidl
2446 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2450 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2455 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2460 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2465 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2467 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2468 return E_INVALIDARG
;
2469 *ppole
= fHistoryObject
;
2470 if (fHistoryObject
!= NULL
)
2471 fHistoryObject
->AddRef();
2472 *pstm
= fHistoryStream
;
2473 if (fHistoryStream
!= NULL
)
2474 fHistoryStream
->AddRef();
2475 *ppbc
= fHistoryBindContext
;
2476 if (fHistoryBindContext
!= NULL
)
2477 fHistoryBindContext
->AddRef();
2478 fHistoryObject
= NULL
;
2479 fHistoryStream
= NULL
;
2480 fHistoryBindContext
= NULL
;
2486 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2491 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2496 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2501 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2502 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2507 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2512 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2517 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2522 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2527 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2532 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2537 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2539 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2543 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2548 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2553 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2558 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2563 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2568 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2573 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2578 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2579 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2584 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2589 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2594 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2599 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2604 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2609 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2614 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2619 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2624 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2629 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2634 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2639 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2644 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2649 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2654 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2659 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2664 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2669 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2674 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2679 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2684 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2689 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2690 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2695 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2696 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2701 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2706 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2711 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2716 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2721 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2726 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2731 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2736 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2741 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2746 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2751 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2756 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2761 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2766 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2771 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2776 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2781 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2786 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2791 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2796 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2797 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2802 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2807 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2812 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2817 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2819 for (int i
= 0; i
< 3; i
++)
2821 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2825 if (!fCurrentShellView
)
2828 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2831 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2836 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2841 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2843 CComPtr
<ITravelLog
> travelLog
;
2844 HRESULT hResult
= GetTravelLog(&travelLog
);
2845 if (FAILED_UNEXPECTEDLY(hResult
))
2847 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2850 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2852 CComPtr
<ITravelLog
> travelLog
;
2853 HRESULT hResult
= GetTravelLog(&travelLog
);
2854 if (FAILED_UNEXPECTEDLY(hResult
))
2856 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2859 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2864 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2869 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2870 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2872 CComHeapPtr
<ITEMIDLIST
> pidl
;
2874 CComPtr
<IShellFolder
> pDesktop
;
2876 hResult
= SHGetDesktopFolder(&pDesktop
);
2877 if (FAILED_UNEXPECTEDLY(hResult
))
2879 hResult
= pDesktop
->ParseDisplayName(NULL
, NULL
, URL
, NULL
, &pidl
, NULL
);
2880 if (FAILED_UNEXPECTEDLY(hResult
))
2882 return BrowseObject(pidl
, 1);
2885 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2889 V_VT(&level
) = VT_I4
;
2891 return Refresh2(&level
);
2894 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2896 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2899 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2900 if (FAILED_UNEXPECTEDLY(hResult
))
2902 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2905 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2910 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2915 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2920 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2925 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2930 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2935 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2942 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2947 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2952 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2957 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2962 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2967 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2972 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2977 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2984 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2989 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2994 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2999 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
3004 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
3009 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
3014 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
3019 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
3024 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
3029 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
3034 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
3039 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
3044 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
3049 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
3054 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
3059 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
3064 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
3069 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
3074 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
3079 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
3084 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
3089 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
3094 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
3099 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
3100 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
3102 LPITEMIDLIST pidl
= NULL
;
3104 // called from drive combo box to navigate to a directory
3105 // Also called by search band to display shell results folder view
3107 if (V_VT(URL
) == VT_BSTR
)
3109 return this->Navigate(V_BSTR(URL
), Flags
, TargetFrameName
, PostData
, Headers
);
3111 if (V_VT(URL
) == (VT_ARRAY
| VT_UI1
))
3113 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
3114 return E_INVALIDARG
;
3116 pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
3118 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
3119 if (FAILED_UNEXPECTEDLY(hResult
))
3124 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
3129 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
3130 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
3135 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
3140 // called to show search bar
3141 if (V_VT(pvaClsid
) != VT_BSTR
)
3142 return E_INVALIDARG
;
3143 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
3144 // TODO: properly compute the value of vertical
3146 return ShowBand(classID
, vertical
);
3149 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
3154 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
3159 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
3164 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
3169 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
3174 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
3179 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
3184 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
3189 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
3194 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
3199 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
3204 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
3209 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
3214 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
3219 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
3224 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
3229 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
3231 if (pWinData
== NULL
)
3234 pWinData
->dwWindowID
= -1;
3236 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
3237 pWinData
->lpszUrl
= NULL
;
3238 pWinData
->lpszUrlLocation
= NULL
;
3239 pWinData
->lpszTitle
= NULL
;
3243 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
3248 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
3253 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
3255 CComPtr
<IPersistHistory
> viewPersistHistory
;
3256 CComPtr
<IOleObject
> viewHistoryObject
;
3257 persistState oldState
;
3262 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
3263 if (FAILED_UNEXPECTEDLY(hResult
))
3265 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3267 if (oldState
.browseType
!= 2)
3269 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3271 return E_OUTOFMEMORY
;
3272 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3273 if (FAILED_UNEXPECTEDLY(hResult
))
3278 if (numRead
!= oldState
.pidlSize
)
3283 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3284 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3285 fHistoryObject
= viewHistoryObject
;
3286 fHistoryStream
= pStream
;
3287 fHistoryBindContext
= pbc
;
3288 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3289 fHistoryObject
= NULL
;
3290 fHistoryStream
= NULL
;
3291 fHistoryBindContext
= NULL
;
3293 if (FAILED_UNEXPECTEDLY(hResult
))
3298 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3300 CComPtr
<IPersistHistory
> viewPersistHistory
;
3301 persistState newState
;
3304 hResult
= fCurrentShellView
->GetItemObject(
3305 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3306 memset(&newState
, 0, sizeof(newState
));
3307 newState
.dwSize
= sizeof(newState
);
3308 newState
.browseType
= 2;
3309 newState
.browserIndex
= GetBrowserIndex();
3310 if (viewPersistHistory
.p
!= NULL
)
3312 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3313 if (FAILED_UNEXPECTEDLY(hResult
))
3316 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3317 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3318 if (FAILED_UNEXPECTEDLY(hResult
))
3320 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3321 if (FAILED_UNEXPECTEDLY(hResult
))
3323 if (viewPersistHistory
.p
!= NULL
)
3325 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3326 if (FAILED_UNEXPECTEDLY(hResult
))
3332 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3337 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3342 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3344 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3348 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3352 /* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
3353 OleFlushClipboard();
3355 // TODO: rip down everything
3357 fCurrentShellView
->DestroyViewWindow();
3358 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3359 ReleaseCComPtrExpectZero(fCurrentShellView
);
3361 for (int i
= 0; i
< 3; i
++)
3363 CComPtr
<IDockingWindow
> pdw
;
3364 CComPtr
<IDeskBar
> bar
;
3365 CComPtr
<IUnknown
> pBarSite
;
3366 CComPtr
<IDeskBarClient
> pClient
;
3368 if (fClientBars
[i
].clientBar
== NULL
)
3371 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3372 if (FAILED_UNEXPECTEDLY(hr
))
3375 /* We should destroy our basebarsite too */
3376 hr
= pdw
->QueryInterface(IID_PPV_ARG(IDeskBar
, &bar
));
3379 hr
= bar
->GetClient(&pBarSite
);
3380 if (SUCCEEDED(hr
) && pBarSite
)
3382 hr
= pBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &pClient
));
3384 pClient
->SetDeskBarSite(NULL
);
3389 /* For some reasons, it's like we miss some AddRef in ATL when QueryInterface on
3390 * same interface or inherited one, so we are removing already removed (!) object.
3391 * TODO: check with MSVC's ATL to see if this behaviour happens too
3396 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3398 ReleaseCComPtrExpectZero(fTravelLog
);
3400 fCurrentShellFolder
.Release();
3401 ILFree(fCurrentDirectoryPIDL
);
3402 ::DestroyWindow(fStatusBar
);
3403 DestroyMenu(fCurrentMenuBar
);
3409 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3411 CComPtr
<IDockingWindow
> dockingWindow
;
3412 RECT availableBounds
;
3413 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3416 if (wParam
!= SIZE_MINIMIZED
)
3418 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3419 for (INT x
= 0; x
< 3; x
++)
3421 if (fClientBars
[x
].clientBar
!= NULL
)
3423 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3424 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3425 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3427 hResult
= dockingWindow
->ResizeBorderDW(
3428 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3438 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3441 LPARAM menuIndex
= lParam
;
3443 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3445 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3449 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3453 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3455 UpdateViewMenu(theMenu
);
3458 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3462 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3464 // FIXME: Remove once implemented
3465 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3466 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3467 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3468 FIXME("Folder options dialog is stubbed: CORE-11141\n");
3469 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
); // Remove when CORE-11141 is fixed.
3472 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3477 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3482 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3484 ::SetFocus(fCurrentShellViewWindow
);
3488 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3490 if (fCurrentShellViewWindow
!= NULL
)
3491 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3495 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3497 return SendMessage(WM_CLOSE
);
3500 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3502 HRESULT hResult
= DoFolderOptions();
3503 if (FAILED(hResult
))
3504 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3508 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3511 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3512 #endif /* __REACTOS__ */
3516 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3519 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3520 #endif /* __REACTOS__ */
3524 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3526 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3530 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3532 HRESULT hResult
= GoBack();
3533 if (FAILED(hResult
))
3534 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3538 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3540 HRESULT hResult
= GoForward();
3541 if (FAILED(hResult
))
3542 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3546 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3548 HRESULT hResult
= NavigateToParent();
3549 if (FAILED(hResult
))
3550 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3554 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3556 HRESULT hResult
= GoHome();
3557 if (FAILED(hResult
))
3558 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3562 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3564 // FIXME: This does not appear to be what windows does.
3565 HRESULT hResult
= NavigateToParent();
3566 if (FAILED(hResult
))
3567 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3571 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3573 CComPtr
<IShellFolder
> psfDesktop
;
3574 LPITEMIDLIST pidlFavs
;
3576 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3579 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3584 hr
= SHGetDesktopFolder(&psfDesktop
);
3585 if (FAILED_UNEXPECTEDLY(hr
))
3588 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3589 if (FAILED_UNEXPECTEDLY(hr
))
3595 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3597 fStatusBarVisible
= !fStatusBarVisible
;
3600 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3606 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3609 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3610 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3614 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3617 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3618 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3622 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3625 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3626 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3630 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3633 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3634 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3638 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3641 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3642 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3646 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3649 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3650 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3654 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3659 LRESULT
CShellBrowser::OnExplorerBar(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3661 // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3662 if (wID
>= IDM_EXPLORERBAND_BEGINCUSTOM
&& wID
<= IDM_EXPLORERBAND_ENDCUSTOM
)
3665 mbi
= (MenuBandInfo
*)DSA_GetItemPtr(menuDsa
, (wID
- IDM_EXPLORERBAND_BEGINCUSTOM
));
3668 ShowBand(mbi
->barGuid
, mbi
->fVertical
);
3674 case IDM_EXPLORERBAR_SEARCH
:
3675 Exec(&CLSID_CommonButtons
, 0x123, 1, NULL
, NULL
);
3677 case IDM_EXPLORERBAR_FOLDERS
:
3678 ShowBand(CLSID_ExplorerBand
, true);
3680 case IDM_EXPLORERBAR_HISTORY
:
3681 ShowBand(CLSID_SH_HistBand
, true);
3683 case IDM_EXPLORERBAR_FAVORITES
:
3684 ShowBand(CLSID_SH_FavBand
, true);
3687 WARN("Unknown id %x\n", wID
);
3693 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3695 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3696 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3700 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3702 CComPtr
<CShellBrowser
> theCabinet
;
3707 // Tell the thread ref we are using it.
3708 if (parameters
&& parameters
->offsetF8
)
3709 parameters
->offsetF8
->AddRef();
3711 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3712 if (theCabinet
== NULL
)
3714 return E_OUTOFMEMORY
;
3717 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3718 if (FAILED_UNEXPECTEDLY(hResult
))
3719 return E_OUTOFMEMORY
;
3721 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3725 // Error: continue or exit?
3729 if (Msg
.message
== WM_QUIT
)
3732 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3734 TranslateMessage(&Msg
);
3735 DispatchMessage(&Msg
);
3739 int nrc
= theCabinet
->Release();
3742 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3745 theCabinet
.Detach();
3747 // Tell the thread ref we are not using it anymore.
3748 if (parameters
&& parameters
->offsetF8
)
3749 parameters
->offsetF8
->Release();
3754 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3757 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3759 OleInitialize(NULL
);
3761 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3765 SHDestroyIETHREADPARAM(parameters
);