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
23 #include <shlobj_undoc.h>
25 #include <shlguid_undoc.h>
27 #include <shlwapi_undoc.h>
37 #include "newatlinterfaces.h"
41 **Provide implementation of new and delete that use LocalAlloc
42 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
43 view doesn't restore the selection correctly.
44 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
45 **Add brand band bitmaps to shell32.dll
46 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
47 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
48 current state overwrites the wrong entry's contents. This needs to be changed.
49 ****Fix close of browser window to release all objects
50 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
51 **When a new bar is added to base bar site, how is base bar told so it can resize?
52 **Does the base bar site have a classid?
53 **What should refresh command send to views to make them refresh?
54 **When new bar is created, what status notifications need to be fired?
55 **How does keyboard filtering dispatch?
56 **For deferred persist history load, how does the view connect up and get the state?
57 How does context menu send open, cut, rename commands to its site (the shell view)?
58 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
60 **Route View->Toolbars commands to internet toolbar
61 **Handle travel log items in View->Go
62 **Fix ShowBrowserBar to pass correct size on when bar is shown
63 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
64 ****Make ShowToolbar check if bar is already created before creating it again
65 ****Shell should fill in the list of explorer bars in the View submenus
66 **Add folder menu in the file menu
67 **Fix CShellBrowser::GetBorderDW to compute available size correctly
68 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
69 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
70 Make folders toolbar item update state appropriately
71 Read list of bands from registry on launch
72 Read list of bars from registry on launch
73 If the folders or search bars don't exist, disable the toolbar buttons
74 If the favorites or history bars don't exist, disable the toolbar butons
75 Fix Apply to all Folders in Folder Options
76 Implement close command
77 Add explorer band context menu to file menu
78 Add code to allow restore of internet toolbar from registry
79 Fix code that calls FireNavigateComplete to pass the correct new path
81 What are the other command ids for QueryStatus/FireCommandStateChange?
83 Add handler for cabinet settings change
84 Add handler for system metrics change (renegotiate border space?)
85 Add handler for theme change and forward to contained windows
87 When folders are shown, the status bar text should change
88 Add code to save/restore shell view settings
89 Implement tabbing between frames
90 Fix handling of focus everywhere
91 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
93 The status bar doesn't show help text for items owned by frame during menu tracking
94 Stub out frame command handlers
95 "Arrange icons by" group is not checked properly
97 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
98 the icon is always an open folder with magnifying glass
99 Fix bars to calculate height correctly
100 Hookup policies for everything...
101 Investigate toolbar message WM_USER+93
102 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
104 Vertical Explorer Bar CATID_InfoBand
105 Horizontal Explorer Bar CATID_CommBand
106 Desk Band CATID_DeskBand
109 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
110 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
112 create key here with CLSID of bar to register tool band
113 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
118 #pragma comment(linker, \
119 "\"/manifestdependency:type='Win32' "\
120 "name='Microsoft.Windows.Common-Controls' "\
121 "version='6.0.0.0' "\
122 "processorArchitecture='*' "\
123 "publicKeyToken='6595b64144ccf1df' "\
127 #define SHANDLE_PTR LONG
129 struct categoryCacheHeader
131 long dwSize
; // size of header only
132 long version
; // currently 1
133 SYSTEMTIME writeTime
; // time we were written to registry
134 long classCount
; // number of classes following
137 static const unsigned int folderOptionsPageCountMax
= 20;
138 static const long BTP_UPDATE_CUR_HISTORY
= 1;
139 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
141 BOOL createNewStuff
= false;
144 // this class is private to browseui.dll and is not registered externally?
145 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
148 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
149 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
150 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
152 SHSTDAPI_(void *) SHAlloc(SIZE_T cb
);
156 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
160 #ifdef SetWindowLongPtr
161 #undef SetWindowLongPtr
162 inline LONG_PTR
SetWindowLongPtr(HWND hWnd
, int nIndex
, LONG_PTR dwNewLong
)
164 return SetWindowLong(hWnd
, nIndex
, (LONG
)dwNewLong
);
168 #ifdef GetWindowLongPtr
169 #undef GetWindowLongPtr
170 inline LONG_PTR
GetWindowLongPtr(HWND hWnd
, int nIndex
)
172 return (LONG_PTR
)GetWindowLong(hWnd
, nIndex
);
176 HMENU
SHGetMenuFromID(HMENU topMenu
, int theID
)
178 MENUITEMINFO menuItemInfo
;
180 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
181 menuItemInfo
.fMask
= MIIM_SUBMENU
;
182 if (GetMenuItemInfo(topMenu
, theID
, FALSE
, &menuItemInfo
) == FALSE
)
184 return menuItemInfo
.hSubMenu
;
187 void SHCheckMenuItem(HMENU theMenu
, int theID
, BOOL checked
)
189 MENUITEMINFO menuItemInfo
;
191 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
192 menuItemInfo
.fMask
= MIIM_STATE
;
193 if (GetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
))
196 menuItemInfo
.fState
|= MF_CHECKED
;
198 menuItemInfo
.fState
&= ~MF_CHECKED
;
199 SetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
);
203 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
205 MENUITEMINFO menuItemInfo
;
209 menuItemCount
= GetMenuItemCount(theMenu
);
211 while (curIndex
< menuItemCount
)
213 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
214 menuItemInfo
.fMask
= MIIM_ID
;
215 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) && menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
217 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
225 HRESULT WINAPI
SHBindToFolder(LPITEMIDLIST path
, IShellFolder
**newFolder
)
227 CComPtr
<IShellFolder
> desktop
;
229 ::SHGetDesktopFolder(&desktop
);
232 if (path
== NULL
|| path
->mkid
.cb
== 0)
234 *newFolder
= desktop
;
235 desktop
.p
->AddRef ();
238 return desktop
->BindToObject (path
, NULL
, IID_IShellFolder
, (void **)newFolder
);
241 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
242 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
247 class CToolbarProxy
:
248 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
251 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
253 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
258 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
259 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
261 BEGIN_MSG_MAP(CToolbarProxy
)
262 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
263 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
267 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
272 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
273 if (myWindow
!= NULL
)
275 SubclassWindow(myWindow
);
276 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
277 hResult
= explorerToolbar
->QueryInterface(IID_IExplorerToolbar
, (void **)&fExplorerToolbar
);
281 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
287 if (fExplorerToolbar
.p
!= NULL
)
289 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
, (TBADDBITMAP
*)lParam
, &result
, RGB(192, 192, 192));
290 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
, (TBADDBITMAP
*)lParam
, &result
, RGB(192, 192, 192));
295 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
301 if (fExplorerToolbar
.p
!= NULL
)
302 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
307 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
308 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
312 class CShellBrowser
:
313 public CWindowImpl
<CShellBrowser
, CWindow
, CControlWinTraits
>,
314 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
315 public IShellBrowser
,
317 public IServiceProvider
,
318 public IProfferServiceImpl
<CShellBrowser
>,
319 public IShellBrowserService
,
321 public ITravelLogClient
,
322 public IPersistHistory
,
323 public IDockingWindowSite
,
324 public IOleCommandTarget
,
325 public IBrowserService2
,
326 public IConnectionPointContainerImpl
<CShellBrowser
>,
327 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
328 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
335 CComPtr
<IUnknown
> clientBar
;
338 static const int BIInternetToolbar
= 0;
339 static const int BIVerticalBaseBar
= 1;
340 static const int BIHorizontalBaseBar
= 2;
342 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
343 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
344 CComPtr
<IShellView
> fCurrentShellView
; //
345 LPITEMIDLIST fCurrentDirectoryPIDL
; //
347 bool fStatusBarVisible
;
348 CToolbarProxy fToolbarProxy
;
349 barInfo fClientBars
[3];
350 CComPtr
<ITravelLog
> fTravelLog
;
351 HMENU fCurrentMenuBar
;
352 CABINETSTATE fCabinetState
;
353 // The next three fields support persisted history for shell views. They do not need to be reference counted.
354 IOleObject
*fHistoryObject
;
355 IStream
*fHistoryStream
;
356 IBindCtx
*fHistoryBindContext
;
359 ULONG
InternalAddRef()
361 OutputDebugString(_T("AddRef\n"));
362 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
364 ULONG
InternalRelease()
366 OutputDebugString(_T("Release\n"));
367 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
373 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
375 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
376 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
);
377 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
378 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
379 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
380 HRESULT
NavigateToParent();
381 HRESULT
DoFolderOptions();
382 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
383 void RepositionBars();
384 virtual WNDPROC
GetWindowProc()
388 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
389 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
390 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
391 HRESULT
FireCommandStateChangeAll();
392 HRESULT
UpdateForwardBackState();
393 void UpdateGotoMenu(HMENU theMenu
);
394 void UpdateViewMenu(HMENU theMenu
);
396 /* // *** IDockingWindowFrame methods ***
397 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
398 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
399 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
402 // *** IDockingWindowSite methods ***
403 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
404 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
405 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
407 // *** IOleCommandTarget methods ***
408 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
409 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
411 // *** IOleWindow methods ***
412 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
413 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
415 // *** IShellBrowser methods ***
416 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
417 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
418 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
419 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
420 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
421 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
422 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
423 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
424 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
425 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
426 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(struct IShellView
**ppshv
);
427 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(struct IShellView
*ppshv
);
428 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
430 // *** IDropTarget methods ***
431 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
432 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
433 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
434 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
436 // *** IServiceProvider methods ***
437 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
439 // *** IShellBowserService methods ***
440 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
442 // *** IDispatch methods ***
443 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
444 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
445 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
446 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
448 // *** IBrowserService methods ***
449 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
450 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
451 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
452 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
453 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
454 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
455 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
456 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
457 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPCITEMIDLIST
*ppidlOut
);
458 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
459 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
460 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
461 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
462 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
463 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
464 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
465 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
466 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
467 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
468 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPCITEMIDLIST
*ppidl
);
469 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
470 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
471 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
472 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
473 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
474 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
475 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
476 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
477 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
478 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
480 // *** IBrowserService2 methods ***
481 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
482 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
483 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
484 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
485 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
486 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
487 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
488 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
489 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
490 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
491 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
492 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
493 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
494 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
495 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
496 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
497 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
498 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
499 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
500 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
501 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
502 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
503 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
504 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
505 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
506 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
507 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
508 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
509 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
510 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
511 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
512 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
513 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
514 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
515 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
516 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
517 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
518 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
519 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
520 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
521 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
522 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
523 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
524 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
525 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
526 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
527 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
528 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
529 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
530 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
531 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
532 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
533 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
534 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
535 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
536 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
537 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
538 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
539 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
540 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
541 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
542 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
544 // *** IWebBrowser methods ***
545 virtual HRESULT STDMETHODCALLTYPE
GoBack();
546 virtual HRESULT STDMETHODCALLTYPE
GoForward();
547 virtual HRESULT STDMETHODCALLTYPE
GoHome();
548 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
549 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
);
550 virtual HRESULT STDMETHODCALLTYPE
Refresh();
551 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
552 virtual HRESULT STDMETHODCALLTYPE
Stop();
553 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
554 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
555 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
556 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
557 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
558 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
559 virtual HRESULT STDMETHODCALLTYPE
get_Left(LONG
*pl
);
560 virtual HRESULT STDMETHODCALLTYPE
put_Left(LONG Left
);
561 virtual HRESULT STDMETHODCALLTYPE
get_Top(LONG
*pl
);
562 virtual HRESULT STDMETHODCALLTYPE
put_Top(LONG Top
);
563 virtual HRESULT STDMETHODCALLTYPE
get_Width(LONG
*pl
);
564 virtual HRESULT STDMETHODCALLTYPE
put_Width(LONG Width
);
565 virtual HRESULT STDMETHODCALLTYPE
get_Height(LONG
*pl
);
566 virtual HRESULT STDMETHODCALLTYPE
put_Height(LONG Height
);
567 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
568 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
569 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
571 // *** IWebBrowser2 methods ***
572 virtual HRESULT STDMETHODCALLTYPE
Quit();
573 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
574 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
575 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
576 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
577 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
578 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
579 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
580 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
581 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
582 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
583 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
584 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
585 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
586 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
587 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
588 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
589 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
590 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
591 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
593 // *** IWebBrowser2 methods ***
594 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
);
595 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
596 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
597 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
598 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
599 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
600 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
601 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
602 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
603 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
604 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
605 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
606 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
607 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
608 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
609 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
610 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
611 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
612 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
614 // *** ITravelLogClient methods ***
615 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
616 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(LPWINDOWDATA pWinData
);
617 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
619 // *** IPersist methods ***
620 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
622 // *** IPersistHistory methods ***
623 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
624 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
625 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
626 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
628 // *** IBrowserService2 methods ***
632 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
633 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
634 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
635 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
636 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
637 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
638 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
639 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
640 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
641 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
642 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
643 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
644 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
645 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
646 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
647 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
648 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
649 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
650 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
651 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
652 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
653 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
654 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
656 static ATL::CWndClassInfo
& GetWndClassInfo()
658 static ATL::CWndClassInfo wc
=
660 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
661 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
662 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
663 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
668 BEGIN_MSG_MAP(CShellBrowser
)
669 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
670 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
671 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
672 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
673 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
674 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
675 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
676 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
677 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
678 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
679 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
680 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
681 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
682 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
683 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
684 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
685 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
686 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
687 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
688 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
689 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
690 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
691 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
692 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
693 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
696 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
697 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
698 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
699 END_CONNECTION_POINT_MAP()
701 BEGIN_COM_MAP(CShellBrowser
)
702 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
703 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
704 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
705 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
706 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
707 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
708 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
709 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
710 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
711 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
712 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
713 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
714 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
715 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
716 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
717 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
718 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
719 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
723 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
725 CShellBrowser::CShellBrowser()
729 fCurrentShellViewWindow
= NULL
;
730 fCurrentDirectoryPIDL
= NULL
;
732 fStatusBarVisible
= true;
733 for (x
= 0; x
< 3; x
++)
734 fClientBars
[x
].hwnd
= NULL
;
735 fCurrentMenuBar
= NULL
;
736 fHistoryObject
= NULL
;
737 fHistoryStream
= NULL
;
738 fHistoryBindContext
= NULL
;
741 CShellBrowser::~CShellBrowser()
745 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
747 CComPtr
<IDockingWindow
> dockingWindow
;
748 CComPtr
<IStream
> settingsStream
;
749 CComPtr
<IPersistStreamInit
> persistStreamInit
;
750 CComPtr
<IOleCommandTarget
> commandTarget
;
751 CComPtr
<IObjectWithSite
> objectSite
;
752 RECT bounds
= {0, 0, 800, 591};
755 _AtlInitialConstruct();
757 fCabinetState
.cLength
= sizeof(fCabinetState
);
758 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
762 Create(HWND_DESKTOP
, bounds
, NULL
, WS_OVERLAPPEDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, 0, 0U);
767 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)&fClientBars
[BIInternetToolbar
].clientBar
);
771 hResult
= CreateInternetToolbar(IID_IUnknown
, (void **)&fClientBars
[BIInternetToolbar
].clientBar
);
775 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IDockingWindow
, (void **)&dockingWindow
);
778 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IPersistStreamInit
, (void **)&persistStreamInit
);
781 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
784 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IObjectWithSite
, (void **)&objectSite
);
787 hResult
= objectSite
->SetSite((IShellBrowser
*)this);
790 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
793 // TODO: create settingsStream from registry entry
794 if (settingsStream
.p
== NULL
)
796 hResult
= persistStreamInit
->InitNew();
802 hResult
= persistStreamInit
->Load(settingsStream
);
806 hResult
= dockingWindow
->ShowDW(TRUE
);
810 fToolbarProxy
.Initialize(m_hWnd
, fClientBars
[BIInternetToolbar
].clientBar
);
812 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, _T(""), WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
813 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001, _AtlBaseModule
.GetModuleInstance(), 0);
814 fStatusBarVisible
= true;
816 LPITEMIDLIST desktopPIDL
;
817 FOLDERSETTINGS newFolderSettings
;
819 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
822 newFolderSettings
.ViewMode
= FVM_LIST
;
823 newFolderSettings
.fFlags
= 0;
824 hResult
= BrowseToPIDL(desktopPIDL
, BTP_UPDATE_NEXT_HISTORY
);
826 if (FAILED (hResult
))
829 ShowWindow(SW_SHOWNORMAL
);
834 // test code to make brand band animate
836 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
837 CComPtr
<IServiceProvider
> serviceProvider
;
838 CComPtr
<IBandSite
> bandSite
;
839 CComPtr
<IDeskBand
> deskBand
;
840 CComPtr
<IWinEventHandler
> winEventHandler
;
843 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
845 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
846 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_IBandSite
, (void **)&bandSite
);
847 hResult
= bandSite
->QueryBand(5, &deskBand
, NULL
, NULL
, 0);
848 deskBand
->QueryInterface(IID_IWinEventHandler
, (void **)&winEventHandler
);
849 winEventHandler
->IsWindowOwner(NULL
);
850 deskBand
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
851 oleCommandTarget
->QueryStatus(&CGID_BrandCmdGroup
, 0, NULL
, NULL
);
852 oleCommandTarget
->Exec(&CGID_BrandCmdGroup
, BBID_STARTANIMATION
, 0, NULL
, NULL
);
861 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
863 CComPtr
<IShellFolder
> newFolder
;
864 FOLDERSETTINGS newFolderSettings
;
867 // called by shell view to browse to new folder
868 // also called by explorer band to navigate to new folder
869 hResult
= SHBindToFolder((LPITEMIDLIST
)pidl
, &newFolder
);
870 newFolderSettings
.ViewMode
= FVM_LIST
;
871 newFolderSettings
.fFlags
= 0;
872 hResult
= BrowseToPath(newFolder
, (LPITEMIDLIST
)pidl
, &newFolderSettings
, flags
);
873 if (FAILED (hResult
))
878 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
880 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
883 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
885 LPCITEMIDLIST pidlnext
;
890 if (! _ILIsDesktop(pidl
))
892 length
= pidl
->mkid
.cb
;
893 pidlnext
= (LPCITEMIDLIST
)(((LPBYTE
)pidl
) + length
);
894 if (pidlnext
->mkid
.cb
!= 0)
900 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
, const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
902 CComPtr
<IShellFolder
> psf
;
903 LPITEMIDLIST pidlChild
;
904 LPITEMIDLIST pidlParent
;
911 if (ppidlLast
!= NULL
)
913 if (_ILIsPidlSimple(pidl
))
915 if (ppidlLast
!= NULL
)
916 *ppidlLast
= ILClone(pidl
);
917 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
921 pidlChild
= ILClone(ILFindLastID(pidl
));
922 pidlParent
= ILClone(pidl
);
923 ILRemoveLastID(pidlParent
);
924 hResult
= SHGetDesktopFolder(&psf
);
925 if (SUCCEEDED(hResult
))
926 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
927 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
928 *ppidlLast
= pidlChild
;
936 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
938 CComPtr
<IShellFolder
> parentFolder
;
939 LPITEMIDLIST childPIDL
;
943 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_IShellFolder
, (void **)&parentFolder
, &childPIDL
);
944 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
945 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
947 hResult
= parentFolder
->GetAttributesOf(1, (LPCITEMIDLIST
*)&childPIDL
, rgfInOut
);
952 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
954 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
957 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
, LPITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
959 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
960 CComPtr
<IObjectWithSite
> objectWithSite
;
961 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
962 CComPtr
<IShellView
> saveCurrentShellView
;
963 CComPtr
<IShellView
> newShellView
;
964 CComPtr
<ITravelLog
> travelLog
;
965 HWND newShellViewWindow
;
966 BOOL windowUpdateIsLocked
;
967 RECT shellViewWindowBounds
;
970 wchar_t newTitle
[MAX_PATH
];
974 if (newShellFolder
== NULL
)
976 hResult
= GetTravelLog(&travelLog
);
977 if (FAILED (hResult
))
979 if (flags
& BTP_UPDATE_CUR_HISTORY
)
981 if (travelLog
->CountEntries((IDropTarget
*)this) > 0)
982 hResult
= travelLog
->UpdateEntry((IDropTarget
*)this, FALSE
);
983 // what to do with error? Do we want to halt browse because state save failed?
985 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_IShellView
, (void **)&newShellView
);
986 if (FAILED (hResult
))
988 previousView
= fCurrentShellViewWindow
;
989 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
990 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
991 if (fCurrentShellView
!= NULL
)
992 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
993 hResult
= newShellView
->QueryInterface(IID_IObjectWithSite
, (void **)&objectWithSite
);
994 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
995 hResult
= objectWithSite
->SetSite((IDropTarget
*)this);
996 saveCurrentShellFolder
= fCurrentShellFolder
;
997 saveCurrentShellView
= fCurrentShellView
;
998 fCurrentShellFolder
= newShellFolder
;
999 fCurrentShellView
= newShellView
;
1000 if (previousView
!= NULL
)
1001 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
1003 memset(&shellViewWindowBounds
, 0, sizeof(shellViewWindowBounds
));
1004 ::MapWindowPoints(0, m_hWnd
, (POINT
*)&shellViewWindowBounds
, 2);
1005 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
, this, &shellViewWindowBounds
, &newShellViewWindow
);
1006 if (FAILED (hResult
) || newShellViewWindow
== NULL
)
1008 fCurrentShellView
= saveCurrentShellView
;
1009 fCurrentShellFolder
= saveCurrentShellFolder
;
1010 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
1011 if (windowUpdateIsLocked
)
1012 LockWindowUpdate(FALSE
);
1013 SetCursor(saveCursor
);
1016 if (objectWithSite
.p
!= NULL
)
1017 hResult
= objectWithSite
->SetSite(NULL
);
1018 ILFree(fCurrentDirectoryPIDL
);
1019 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1020 if (saveCurrentShellView
!= NULL
)
1021 saveCurrentShellView
->DestroyViewWindow();
1022 fCurrentShellViewWindow
= newShellViewWindow
;
1023 oleCommandTarget
.Release();
1024 hResult
= newShellView
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1025 saveCurrentShellView
.Release();
1026 saveCurrentShellFolder
.Release();
1027 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1028 if (windowUpdateIsLocked
)
1029 LockWindowUpdate(FALSE
);
1030 SetCursor(saveCursor
);
1031 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1033 hResult
= travelLog
->AddEntry((IDropTarget
*)this, FALSE
);
1034 hResult
= travelLog
->UpdateEntry((IDropTarget
*)this, FALSE
);
1036 FireNavigateComplete(L
"c:\\temp"); // TODO: use real path here
1037 if (fCabinetState
.fFullPathTitle
)
1038 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1040 nameFlags
= SHGDN_FORADDRESSBAR
;
1041 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
, sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1042 if (SUCCEEDED(hResult
))
1043 SetWindowText(newTitle
);
1044 // TODO: Update the window icon
1045 FireCommandStateChangeAll();
1046 hResult
= UpdateForwardBackState();
1050 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1052 CComPtr
<IServiceProvider
> serviceProvider
;
1053 CComPtr
<IBandSite
> bandSite
;
1054 CComPtr
<IDeskBand
> deskBand
;
1057 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
1059 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IServiceProvider
, (void **)&serviceProvider
);
1060 if (FAILED(hResult
))
1062 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_IBandSite
, (void **)&bandSite
);
1063 if (FAILED(hResult
))
1065 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1066 if (FAILED(hResult
))
1068 return deskBand
->QueryInterface(riid
, shellMenu
);
1071 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1073 CComPtr
<IUnknown
> newBaseBar
;
1074 CComPtr
<IDeskBar
> deskBar
;
1075 CComPtr
<IUnknown
> newBaseBarSite
;
1076 CComPtr
<IObjectWithSite
> objectWithSite
;
1077 CComPtr
<IDeskBarClient
> deskBarClient
;
1082 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1084 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1087 hResult
= CreateBaseBar(IID_IUnknown
, (void **)&newBaseBar
);
1088 if (FAILED(hResult
))
1090 hResult
= CreateBaseBarSite(IID_IUnknown
, (void **)&newBaseBarSite
);
1091 if (FAILED(hResult
))
1094 // tell the new base bar about the shell browser
1095 hResult
= newBaseBar
->QueryInterface(IID_IObjectWithSite
, (void **)&objectWithSite
);
1096 if (FAILED(hResult
))
1098 hResult
= objectWithSite
->SetSite((IDropTarget
*)this);
1099 if (FAILED(hResult
))
1102 // tell the new base bar about the new base bar site
1103 hResult
= newBaseBar
->QueryInterface(IID_IDeskBar
, (void **)&deskBar
);
1104 if (FAILED(hResult
))
1106 hResult
= deskBar
->SetClient(newBaseBarSite
);
1107 if (FAILED(hResult
))
1110 // tell the new base bar site about the new base bar
1111 hResult
= newBaseBarSite
->QueryInterface(IID_IDeskBarClient
, (void **)&deskBarClient
);
1112 if (FAILED(hResult
))
1114 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1115 if (FAILED(hResult
))
1118 *cache
= newBaseBar
.Detach();
1120 return (*cache
)->QueryInterface(IID_IUnknown
, (void **)theBaseBar
);
1123 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1125 CComPtr
<IDockingWindow
> dockingWindow
;
1126 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1127 CComPtr
<IUnknown
> baseBarSite
;
1128 CComPtr
<IUnknown
> newBand
;
1129 CComPtr
<IUnknown
> theBaseBar
;
1130 CComPtr
<IDeskBar
> deskBar
;
1134 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1135 if (FAILED(hResult
))
1137 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)&newBand
);
1138 if (FAILED(hResult
))
1140 hResult
= theBaseBar
->QueryInterface(IID_IDeskBar
, (void **)&deskBar
);
1141 if (FAILED(hResult
))
1143 hResult
= deskBar
->GetClient(&baseBarSite
);
1144 if (FAILED(hResult
))
1146 hResult
= theBaseBar
->QueryInterface(IID_IDockingWindow
, (void **)&dockingWindow
);
1147 if (FAILED(hResult
))
1149 hResult
= baseBarSite
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1150 if (FAILED(hResult
))
1152 V_VT(&vaIn
) = VT_UNKNOWN
;
1153 V_UNKNOWN(&vaIn
) = newBand
.p
;
1154 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1155 if (FAILED(hResult
))
1157 hResult
= dockingWindow
->ShowDW(TRUE
);
1158 if (FAILED(hResult
))
1163 HRESULT
CShellBrowser::NavigateToParent()
1165 LPITEMIDLIST newDirectory
;
1168 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1169 if (newDirectory
== NULL
)
1170 return E_OUTOFMEMORY
;
1171 ILRemoveLastID(newDirectory
);
1172 hResult
= BrowseToPIDL((LPITEMIDLIST
)newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1173 ILFree(newDirectory
);
1174 if (FAILED (hResult
))
1179 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1181 PROPSHEETHEADER
*sheetInfo
;
1183 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1184 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1186 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1187 sheetInfo
->nPages
++;
1191 HRESULT
CShellBrowser::DoFolderOptions()
1193 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1194 CComPtr
<IObjectWithSite
> objectWithSite
;
1195 PROPSHEETHEADER m_PropSheet
;
1196 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1197 // CComPtr<IGlobalFolderSettings> globalSettings;
1198 // SHELLSTATE2 shellState;
1201 memset(m_psp
, 0, sizeof(m_psp
));
1202 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1204 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
, IID_IShellPropSheetExt
, (void **)&folderOptionsSheet
);
1205 if (FAILED(hResult
))
1207 // must set site in order for Apply to all Folders on Advanced page to be enabled
1208 hResult
= folderOptionsSheet
->QueryInterface(IID_IObjectWithSite
, (void **)&objectWithSite
);
1209 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1210 hResult
= objectWithSite
->SetSite((IDispatch
*)this);
1211 m_PropSheet
.phpage
= m_psp
;
1213 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_IGlobalFolderSettings
, (void **)&globalSettings
);
1214 if (FAILED(hResult
))
1216 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1217 if (FAILED(hResult
))
1220 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, (LPARAM
)&m_PropSheet
);
1221 if (FAILED(hResult
))
1223 if (fCurrentShellView
!= NULL
)
1225 hResult
= fCurrentShellView
->AddPropertySheetPages( 0, AddFolderOptionsPage
, (LPARAM
)&m_PropSheet
);
1226 if (FAILED(hResult
))
1230 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1231 m_PropSheet
.dwFlags
= 0;
1232 m_PropSheet
.hwndParent
= m_hWnd
;
1233 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1234 m_PropSheet
.pszCaption
= _T("Folder Options");
1235 m_PropSheet
.nStartPage
= 0;
1237 PropertySheet(&m_PropSheet
);
1241 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1243 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1244 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1246 CComPtr
<IMenuBand
> menuBand
;
1247 const _ATL_MSG
*previousMessage
;
1249 WNDPROC saveWindowProc
;
1252 hWnd
= pThis
->m_hWnd
;
1253 previousMessage
= pThis
->m_pCurrentMsg
;
1254 pThis
->m_pCurrentMsg
= &msg
;
1256 hResult
= pThis
->GetMenuBand(IID_IMenuBand
, (void **)&menuBand
);
1257 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1259 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1260 if (hResult
== S_OK
)
1263 wParam
= msg
.wParam
;
1264 lParam
= msg
.lParam
;
1267 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1268 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1269 if (handled
== FALSE
)
1271 if (uMsg
== WM_NCDESTROY
)
1273 saveWindowProc
= (WNDPROC
)GetWindowLongPtr(hWnd
, GWL_WNDPROC
);
1274 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1275 if (saveWindowProc
== (WNDPROC
)GetWindowLongPtr(hWnd
, GWL_WNDPROC
))
1276 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1277 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1280 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1282 pThis
->m_pCurrentMsg
= previousMessage
;
1283 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1285 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1286 pThis
->m_hWnd
= NULL
;
1287 pThis
->OnFinalMessage(hWnd
);
1292 void CShellBrowser::RepositionBars()
1300 GetClientRect(&clientRect
);
1302 if (fStatusBarVisible
)
1304 ::GetWindowRect(fStatusBar
, &statusRect
);
1305 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1306 clientRect
.right
- clientRect
.left
,
1307 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1308 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1311 for (x
= 0; x
< 3; x
++)
1313 CComPtr
<IOleWindow
> oleWindow
;
1315 if (fClientBars
[x
].hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1317 hResult
= fClientBars
[x
].clientBar
->QueryInterface(IID_IOleWindow
, (void **)&oleWindow
);
1318 if (SUCCEEDED(hResult
))
1319 hResult
= oleWindow
->GetWindow(&fClientBars
[x
].hwnd
);
1321 if (fClientBars
[x
].hwnd
!= NULL
)
1323 toolbarRect
= clientRect
;
1324 if (fClientBars
[x
].borderSpace
.top
!= 0)
1325 toolbarRect
.bottom
= toolbarRect
.top
+ fClientBars
[x
].borderSpace
.top
;
1326 else if (fClientBars
[x
].borderSpace
.bottom
!= 0)
1327 toolbarRect
.top
= toolbarRect
.bottom
- fClientBars
[x
].borderSpace
.bottom
;
1328 if (fClientBars
[x
].borderSpace
.left
!= 0)
1329 toolbarRect
.right
= toolbarRect
.left
+ fClientBars
[x
].borderSpace
.left
;
1330 else if (fClientBars
[x
].borderSpace
.right
!= 0)
1331 toolbarRect
.left
= toolbarRect
.right
- fClientBars
[x
].borderSpace
.right
;
1332 ::SetWindowPos(fClientBars
[x
].hwnd
, NULL
, toolbarRect
.left
, toolbarRect
.top
,
1333 toolbarRect
.right
- toolbarRect
.left
,
1334 toolbarRect
.bottom
- toolbarRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1335 clientRect
.top
+= fClientBars
[x
].borderSpace
.top
;
1336 clientRect
.left
+= fClientBars
[x
].borderSpace
.left
;
1337 clientRect
.bottom
+= fClientBars
[x
].borderSpace
.bottom
;
1338 clientRect
.right
+= fClientBars
[x
].borderSpace
.right
;
1341 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1342 clientRect
.right
- clientRect
.left
,
1343 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1346 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1349 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1350 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1353 params
.rgvarg
= arguments
;
1354 params
.rgdispidNamedArgs
= NULL
;
1355 params
.cArgs
= argCount
;
1356 params
.cNamedArgs
= 0;
1357 IUnknown
** pp
= vec
.begin();
1358 while (pp
< vec
.end())
1362 CComPtr
<IDispatch
> theDispatch
;
1364 hResult
= (*pp
)->QueryInterface(IID_IDispatch
, (void **)&theDispatch
);
1365 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1370 while (pp
< vec2
.end())
1374 CComPtr
<IDispatch
> theDispatch
;
1376 hResult
= (*pp
)->QueryInterface(IID_IDispatch
, (void **)&theDispatch
);
1377 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1384 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1386 // these two variants intentionally to do use CComVariant because it would double free/release
1387 // or does not need to dispose at all
1390 CComBSTR
tempString(newDirectory
);
1392 V_VT(&varArgs
) = VT_BSTR
;
1393 V_BSTR(&varArgs
) = tempString
.m_str
;
1395 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1396 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1397 V_VT(&varArg
[1]) = VT_DISPATCH
;
1398 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1400 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1403 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1407 V_VT(&varArg
[0]) = VT_BOOL
;
1408 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1409 V_VT(&varArg
[1]) = VT_I4
;
1410 V_I4(&varArg
[1]) = commandID
;
1412 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1415 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1417 return FireCommandStateChange(false, -1);
1420 HRESULT
CShellBrowser::UpdateForwardBackState()
1422 CComPtr
<ITravelLog
> travelLog
;
1423 CComPtr
<ITravelEntry
> unusedEntry
;
1429 canGoForward
= false;
1430 hResult
= GetTravelLog(&travelLog
);
1431 if (FAILED (hResult
))
1433 hResult
= travelLog
->GetTravelEntry((IDropTarget
*)this, TLOG_BACK
, &unusedEntry
);
1434 if (SUCCEEDED(hResult
))
1437 unusedEntry
.Release();
1439 hResult
= travelLog
->GetTravelEntry((IDropTarget
*)this, TLOG_FORE
, &unusedEntry
);
1440 if (SUCCEEDED(hResult
))
1442 canGoForward
= true;
1443 unusedEntry
.Release();
1445 hResult
= FireCommandStateChange(canGoBack
, 2);
1446 hResult
= FireCommandStateChange(canGoForward
, 1);
1450 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1452 CComPtr
<ITravelLog
> travelLog
;
1454 MENUITEMINFO menuItemInfo
;
1457 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1459 position
= GetMenuItemCount(theMenu
);
1460 hResult
= GetTravelLog(&travelLog
);
1461 if (FAILED (hResult
))
1463 hResult
= travelLog
->InsertMenuEntries((IDropTarget
*)this, theMenu
, position
, IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1464 if (SUCCEEDED(hResult
))
1466 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1467 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1468 menuItemInfo
.fType
= MF_SEPARATOR
;
1469 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1470 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1474 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1476 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1477 CComPtr
<ITravelLog
> travelLog
;
1479 OLECMD commandList
[5];
1480 HMENU toolbarMenuBar
;
1482 MENUITEMINFO menuItemInfo
;
1485 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1486 if (gotoMenu
!= NULL
)
1487 UpdateGotoMenu(gotoMenu
);
1489 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1490 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1491 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1492 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1493 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1495 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
1496 if (SUCCEEDED(hResult
))
1497 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1498 if (FAILED(hResult
))
1499 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1502 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1503 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1505 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1506 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1507 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1508 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1509 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1510 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1511 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1512 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1514 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1515 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1516 menuItemInfo
.hSubMenu
= toolbarMenu
;
1517 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1519 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1522 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1524 CComPtr
<IUnknown
> int1Retry
;
1525 CComPtr
<IUnknown
> int2Retry
;
1530 if (int1
== NULL
|| int2
== NULL
)
1532 hResult
= int1
->QueryInterface(IID_IUnknown
, (void **)&int1Retry
);
1533 if (FAILED(hResult
))
1535 hResult
= int2
->QueryInterface(IID_IUnknown
, (void **)&int2Retry
);
1536 if (FAILED(hResult
))
1538 if (int1Retry
== int2Retry
)
1543 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1545 RECT availableBounds
;
1546 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
1549 GetEffectiveClientRect(m_hWnd
, &availableBounds
, (INT
*)&excludeItems
);
1550 for (x
= 0; x
< 3; x
++)
1552 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1554 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1555 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1556 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1557 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1560 *prcBorder
= availableBounds
;
1564 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1569 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1573 for (x
= 0; x
< 3; x
++)
1575 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1577 fClientBars
[x
].borderSpace
= *pbw
;
1578 // if this bar changed size, it cascades and forces all subsequent bars to resize
1583 return E_INVALIDARG
;
1586 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1588 CComPtr
<IOleCommandTarget
> commandTarget
;
1591 if (prgCmds
== NULL
)
1592 return E_INVALIDARG
;
1593 if (pguidCmdGroup
== NULL
)
1595 if (fCurrentShellView
.p
!= NULL
)
1597 hResult
= fCurrentShellView
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
1598 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1599 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1608 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1612 switch (prgCmds
->cmdID
)
1614 case 0x1c: // search
1615 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1617 case 0x1d: // history
1618 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1620 case 0x1e: // favorites
1621 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1623 case 0x23: // folders
1624 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1634 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1638 switch (prgCmds
->cmdID
)
1640 case 0xa022: // up level
1641 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1642 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1643 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1653 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1657 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1662 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1665 if (nCmdexecopt
== 1)
1667 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1671 // update zones part of the status bar
1674 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1675 V_VT(pvaOut
) = VT_INT_PTR
;
1676 V_INTREF(pvaOut
) = (INT
*)LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1679 // indicate if this cabinet was opened as a browser
1685 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1694 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1699 // what is theater mode and why do we receive this?
1703 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1708 // initialize favorites menu
1712 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1717 // refresh on toolbar clicked
1720 // tell the view if it should hide the task pane or not
1721 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1724 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1729 return NavigateToParent();
1732 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1737 return DoFolderOptions();
1740 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1745 // Reset All Folders option in Folder Options
1756 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1764 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1769 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1771 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1772 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1774 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1777 lpMenuWidths
->width
[0] = 2;
1778 lpMenuWidths
->width
[2] = 3;
1779 lpMenuWidths
->width
[4] = 1;
1783 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1785 CComPtr
<IShellMenu
> shellMenu
;
1788 if (IsMenu(hmenuShared
) == FALSE
)
1790 hResult
= GetMenuBand(IID_IShellMenu
, (void **)&shellMenu
);
1791 if (FAILED(hResult
))
1793 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1794 if (FAILED(hResult
))
1796 fCurrentMenuBar
= hmenuShared
;
1800 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1802 if (hmenuShared
== fCurrentMenuBar
)
1803 fCurrentMenuBar
= NULL
;
1807 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1812 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1817 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1822 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1824 return BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1827 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1832 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1840 *lphwnd
= fToolbarProxy
.m_hWnd
;
1843 *lphwnd
= fStatusBar
;
1846 // find the directory browser and return it
1847 // this should be used only to determine if a tree is present
1850 // is this a progress dialog?
1856 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1865 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1870 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1878 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(struct IShellView
**ppshv
)
1882 *ppshv
= fCurrentShellView
;
1883 if (fCurrentShellView
.p
!= NULL
)
1884 fCurrentShellView
.p
->AddRef();
1888 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(struct IShellView
*ppshv
)
1893 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1898 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1903 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1908 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
1913 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1918 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1920 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
1921 // the returned interface has a method GetPropertyBag on it
1922 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
1923 return this->QueryInterface(riid
, ppvObject
);
1924 if (IsEqualIID(guidService
, SID_SShellBrowser
))
1925 return this->QueryInterface(riid
, ppvObject
);
1926 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
1927 return this->QueryInterface(riid
, ppvObject
);
1928 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
1929 return this->QueryInterface(riid
, ppvObject
);
1930 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
1931 return this->QueryInterface(riid
, ppvObject
);
1932 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
1933 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
1934 return E_NOINTERFACE
;
1937 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
1939 if (ppvObject
== NULL
)
1945 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
1950 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1955 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1960 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1965 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
1970 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
1975 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
1980 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
1985 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
1989 // called by toolbar when displaying tooltips
1992 if (fTravelLog
.p
== NULL
)
1994 hResult
= CreateTravelLog(IID_ITravelLog
, (void **)&fTravelLog
);
1995 if (FAILED(hResult
))
1998 *pptl
= fTravelLog
.p
;
1999 fTravelLog
.p
->AddRef();
2003 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2008 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2013 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2018 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPCITEMIDLIST
*ppidlOut
)
2023 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2028 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2033 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2038 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2043 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2048 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2053 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2058 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2063 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2068 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2073 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPCITEMIDLIST
*ppidl
)
2075 // called by explorer bar to get current pidl
2078 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2082 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2087 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2092 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2097 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2099 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2100 return E_INVALIDARG
;
2101 *ppole
= fHistoryObject
;
2102 if (fHistoryObject
!= NULL
)
2103 fHistoryObject
->AddRef();
2104 *pstm
= fHistoryStream
;
2105 if (fHistoryStream
!= NULL
)
2106 fHistoryStream
->AddRef();
2107 *ppbc
= fHistoryBindContext
;
2108 if (fHistoryBindContext
!= NULL
)
2109 fHistoryBindContext
->AddRef();
2110 fHistoryObject
= NULL
;
2111 fHistoryStream
= NULL
;
2112 fHistoryBindContext
= NULL
;
2118 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2123 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2128 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2133 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2138 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2143 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2148 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2153 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2158 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2163 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2168 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2173 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2178 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2183 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2188 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2193 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2198 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2203 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2208 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2213 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2218 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2223 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2228 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2233 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2238 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2243 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2248 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2253 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2258 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2263 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2268 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2273 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2278 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2283 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2288 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2293 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2298 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2303 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2308 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2313 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2318 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2323 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2328 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2333 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2338 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2343 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2353 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2358 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2363 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2368 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2373 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2378 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2383 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2388 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2398 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2403 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2408 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2413 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2418 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2423 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2428 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2433 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2438 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2443 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2448 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2453 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2458 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2460 CComPtr
<ITravelLog
> travelLog
;
2463 hResult
= GetTravelLog(&travelLog
);
2464 if (FAILED (hResult
))
2466 return travelLog
->Travel((IDropTarget
*)this, TLOG_BACK
);
2469 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2471 CComPtr
<ITravelLog
> travelLog
;
2474 hResult
= GetTravelLog(&travelLog
);
2475 if (FAILED (hResult
))
2477 return travelLog
->Travel((IDropTarget
*)this, TLOG_FORE
);
2480 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2485 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2490 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2495 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2499 V_VT(&level
) = VT_I4
;
2501 return Refresh2(&level
);
2504 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2506 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2509 hResult
= fCurrentShellView
->QueryInterface(IID_IOleCommandTarget
, (void **)&oleCommandTarget
);
2510 if (FAILED (hResult
))
2512 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2515 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2520 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2525 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2530 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2535 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2540 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2545 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2550 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(LONG
*pl
)
2555 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(LONG Left
)
2560 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(LONG
*pl
)
2565 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(LONG Top
)
2570 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(LONG
*pl
)
2575 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(LONG Width
)
2580 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(LONG
*pl
)
2585 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(LONG Height
)
2590 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2595 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2600 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2605 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2610 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2615 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2620 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2625 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2630 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2635 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2640 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2645 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2650 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2655 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2660 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2665 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2670 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2675 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2680 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2685 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2690 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2695 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2700 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2705 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2710 // called from drive combo box to navigate to a directory
2711 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2712 return E_INVALIDARG
;
2713 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2714 return E_INVALIDARG
;
2715 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2716 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2717 if (FAILED (hResult
))
2722 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2727 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2732 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2737 // called to show search bar
2738 if (V_VT(pvaClsid
) != VT_BSTR
)
2739 return E_INVALIDARG
;
2740 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2741 // TODO: properly compute the value of vertical
2743 return ShowBand(classID
, vertical
);
2746 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2751 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2756 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2761 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2766 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2771 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2776 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2781 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2786 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2791 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2796 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2801 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2806 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2811 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2816 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2821 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2826 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(LPWINDOWDATA pWinData
)
2828 if (pWinData
== NULL
)
2831 pWinData
->dwWindowID
= -1;
2833 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2834 pWinData
->lpszUrl
= NULL
;
2835 pWinData
->lpszUrlLocation
= NULL
;
2836 pWinData
->lpszTitle
= NULL
;
2840 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2845 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2850 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2852 CComPtr
<IPersistHistory
> viewPersistHistory
;
2853 CComPtr
<IOleObject
> viewHistoryObject
;
2854 persistState oldState
;
2859 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2860 if (FAILED(hResult
))
2862 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2864 if (oldState
.browseType
!= 2)
2866 pidl
= (LPITEMIDLIST
)SHAlloc(oldState
.pidlSize
);
2868 return E_OUTOFMEMORY
;
2869 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2870 if (FAILED(hResult
))
2875 if (numRead
!= oldState
.pidlSize
)
2880 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
, IID_IOleObject
, (void **)&viewHistoryObject
);
2881 fHistoryObject
= viewHistoryObject
;
2882 fHistoryStream
= pStream
;
2883 fHistoryBindContext
= pbc
;
2884 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
2885 fHistoryObject
= NULL
;
2886 fHistoryStream
= NULL
;
2887 fHistoryBindContext
= NULL
;
2889 if (FAILED(hResult
))
2894 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
2896 CComPtr
<IPersistHistory
> viewPersistHistory
;
2897 persistState newState
;
2900 hResult
= fCurrentShellView
->GetItemObject(SVGIO_BACKGROUND
, IID_IPersistHistory
, (void **)&viewPersistHistory
);
2901 memset(&newState
, 0, sizeof(newState
));
2902 newState
.dwSize
= sizeof(newState
);
2903 newState
.browseType
= 2;
2904 newState
.browserIndex
= GetBrowserIndex();
2905 if (viewPersistHistory
.p
!= NULL
)
2907 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
2908 if (FAILED(hResult
))
2911 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
2912 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
2913 if (FAILED(hResult
))
2915 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
2916 if (FAILED(hResult
))
2918 if (viewPersistHistory
.p
!= NULL
)
2920 hResult
= viewPersistHistory
->SaveHistory(pStream
);
2921 if (FAILED(hResult
))
2927 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
2932 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
2937 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2939 // TODO: rip down everything
2944 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2946 CComPtr
<IDockingWindow
> dockingWindow
;
2947 RECT availableBounds
;
2948 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
2952 if (wParam
!= SIZE_MINIMIZED
)
2954 GetEffectiveClientRect(m_hWnd
, &availableBounds
, (INT
*)&excludeItems
);
2955 for (x
= 0; x
< 3; x
++)
2957 if (fClientBars
[x
].clientBar
!= NULL
)
2959 hResult
= fClientBars
[x
].clientBar
->QueryInterface(IID_IDockingWindow
, (void **)&dockingWindow
);
2960 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
2962 hResult
= dockingWindow
->ResizeBorderDW(&availableBounds
, (IDropTarget
*)this, TRUE
);
2972 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2976 theMenu
= (HMENU
)wParam
;
2977 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
2978 UpdateViewMenu(theMenu
);
2979 return RelayMsgToShellView(uMsg
, wParam
, lParam
, bHandled
);
2982 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2984 if (fCurrentShellViewWindow
!= NULL
)
2985 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
2989 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
2994 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
2998 hResult
= DoFolderOptions();
3002 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3005 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3010 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3013 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3018 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3020 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3024 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3032 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3036 hResult
= GoForward();
3040 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3044 hResult
= NavigateToParent();
3048 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3056 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3060 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3061 PSHOpenNewFrame Func
;
3064 hShlwapi
= LoadLibrary(TEXT("browseui.dll"));
3065 if (hShlwapi
!= NULL
)
3066 Func
= (PSHOpenNewFrame
)GetProcAddress(hShlwapi
, (LPCSTR
)103);
3071 LPITEMIDLIST desktopPIDL
;
3073 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3074 if (SUCCEEDED(hResult
))
3076 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3082 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3084 fStatusBarVisible
= !fStatusBarVisible
;
3085 // TODO: trigger a relayout of contained items
3089 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3091 CComPtr
<IOleCommandTarget
> commandTarget
;
3094 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
3095 if (FAILED(hResult
))
3097 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3101 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3103 CComPtr
<IOleCommandTarget
> commandTarget
;
3106 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
3107 if (FAILED(hResult
))
3109 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3113 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3115 CComPtr
<IOleCommandTarget
> commandTarget
;
3118 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
3119 if (FAILED(hResult
))
3121 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3125 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3127 CComPtr
<IOleCommandTarget
> commandTarget
;
3130 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
3131 if (FAILED(hResult
))
3133 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3137 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3139 CComPtr
<IOleCommandTarget
> commandTarget
;
3142 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
3143 if (FAILED(hResult
))
3145 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3149 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3151 CComPtr
<IOleCommandTarget
> commandTarget
;
3154 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(IID_IOleCommandTarget
, (void **)&commandTarget
);
3155 if (FAILED(hResult
))
3157 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3161 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3166 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3168 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3169 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3173 //static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
3175 // return DefWindowProc(hwnd, uMsg, wParam, lParam);
3178 static void ExplorerMessageLoop()
3185 Ret
= (GetMessage(&Msg
, NULL
, 0, 0) != 0);
3192 TranslateMessage(&Msg
);
3193 DispatchMessage(&Msg
);
3198 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3200 CComPtr
<IShellBrowser
> shellBrowser
;
3201 CComObject
<CShellBrowser
> *theCabinet
;
3202 IEThreadParamBlock
*parameters
;
3205 parameters
= (IEThreadParamBlock
*)lpThreadParameter
;
3206 OleInitialize(NULL
);
3207 ATLTRY (theCabinet
= new CComObject
<CShellBrowser
>);
3208 if (theCabinet
== NULL
)
3209 return E_OUTOFMEMORY
;
3210 hResult
= theCabinet
->QueryInterface(IID_IShellBrowser
, (void **)&shellBrowser
);
3211 if (FAILED (hResult
))
3216 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3217 if (FAILED (hResult
))
3219 ExplorerMessageLoop();