4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 BOOL WINAPI
Shell_GetImageLists(
28 _Out_ HIMAGELIST
*phiml
,
29 _Out_ HIMAGELIST
*phimlSmall
32 #include "newatlinterfaces.h"
36 **Provide implementation of new and delete that use LocalAlloc
37 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
38 view doesn't restore the selection correctly.
39 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
40 **Add brand band bitmaps to shell32.dll
41 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
42 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
43 current state overwrites the wrong entry's contents. This needs to be changed.
44 ****Fix close of browser window to release all objects
45 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
46 **When a new bar is added to base bar site, how is base bar told so it can resize?
47 **Does the base bar site have a classid?
48 **What should refresh command send to views to make them refresh?
49 **When new bar is created, what status notifications need to be fired?
50 **How does keyboard filtering dispatch?
51 **For deferred persist history load, how does the view connect up and get the state?
52 How does context menu send open, cut, rename commands to its site (the shell view)?
53 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
55 **Route View->Toolbars commands to internet toolbar
56 **Handle travel log items in View->Go
57 **Fix ShowBrowserBar to pass correct size on when bar is shown
58 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
59 ****Make ShowToolbar check if bar is already created before creating it again
60 ****Shell should fill in the list of explorer bars in the View submenus
61 **Add folder menu in the file menu
62 **Fix CShellBrowser::GetBorderDW to compute available size correctly
63 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
64 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
65 Make folders toolbar item update state appropriately
66 Read list of bands from registry on launch
67 Read list of bars from registry on launch
68 If the folders or search bars don't exist, disable the toolbar buttons
69 If the favorites or history bars don't exist, disable the toolbar butons
70 Fix Apply to all Folders in Folder Options
71 Implement close command
72 Add explorer band context menu to file menu
73 Add code to allow restore of internet toolbar from registry
74 Fix code that calls FireNavigateComplete to pass the correct new path
76 What are the other command ids for QueryStatus/FireCommandStateChange?
78 Add handler for cabinet settings change
79 Add handler for system metrics change (renegotiate border space?)
80 Add handler for theme change and forward to contained windows
82 When folders are shown, the status bar text should change
83 Add code to save/restore shell view settings
84 Implement tabbing between frames
85 Fix handling of focus everywhere
86 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
88 The status bar doesn't show help text for items owned by frame during menu tracking
89 Stub out frame command handlers
90 "Arrange icons by" group is not checked properly
92 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
93 the icon is always an open folder with magnifying glass
94 Fix bars to calculate height correctly
95 Hookup policies for everything...
96 Investigate toolbar message WM_USER+93
97 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
99 Vertical Explorer Bar CATID_InfoBand
100 Horizontal Explorer Bar CATID_CommBand
101 Desk Band CATID_DeskBand
104 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
105 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
107 create key here with CLSID of bar to register tool band
108 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
113 #pragma comment(linker, \
114 "\"/manifestdependency:type='Win32' "\
115 "name='Microsoft.Windows.Common-Controls' "\
116 "version='6.0.0.0' "\
117 "processorArchitecture='*' "\
118 "publicKeyToken='6595b64144ccf1df' "\
122 struct categoryCacheHeader
124 long dwSize
; // size of header only
125 long version
; // currently 1
126 SYSTEMTIME writeTime
; // time we were written to registry
127 long classCount
; // number of classes following
130 static const unsigned int folderOptionsPageCountMax
= 20;
131 static const long BTP_UPDATE_CUR_HISTORY
= 1;
132 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
134 BOOL createNewStuff
= false;
137 // this class is private to browseui.dll and is not registered externally?
138 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
141 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
142 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
143 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
146 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
149 HMENU
SHGetMenuFromID(HMENU topMenu
, int theID
)
151 MENUITEMINFO menuItemInfo
;
153 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
154 menuItemInfo
.fMask
= MIIM_SUBMENU
;
155 if (!GetMenuItemInfo(topMenu
, theID
, FALSE
, &menuItemInfo
))
157 return menuItemInfo
.hSubMenu
;
160 void SHCheckMenuItem(HMENU theMenu
, int theID
, BOOL checked
)
162 MENUITEMINFO menuItemInfo
;
164 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
165 menuItemInfo
.fMask
= MIIM_STATE
;
166 if (GetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
))
169 menuItemInfo
.fState
|= MF_CHECKED
;
171 menuItemInfo
.fState
&= ~MF_CHECKED
;
172 SetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
);
176 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
178 MENUITEMINFO menuItemInfo
;
182 menuItemCount
= GetMenuItemCount(theMenu
);
184 while (curIndex
< menuItemCount
)
186 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
187 menuItemInfo
.fMask
= MIIM_ID
;
188 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
189 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
191 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
199 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
201 CComPtr
<IShellFolder
> desktop
;
203 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
206 if (path
== NULL
|| path
->mkid
.cb
== 0)
208 *newFolder
= desktop
;
209 desktop
.p
->AddRef ();
212 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
215 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
216 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
221 class CToolbarProxy
:
222 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
225 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
227 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
232 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
233 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
235 BEGIN_MSG_MAP(CToolbarProxy
)
236 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
237 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
241 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
246 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
247 if (myWindow
!= NULL
)
249 SubclassWindow(myWindow
);
250 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
251 hResult
= explorerToolbar
->QueryInterface(
252 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
256 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
262 if (fExplorerToolbar
.p
!= NULL
)
264 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
265 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
266 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
267 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
272 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
278 if (fExplorerToolbar
.p
!= NULL
)
279 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
284 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
285 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
289 class CShellBrowser
:
290 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
291 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
292 public IShellBrowser
,
294 public IServiceProvider
,
295 public IProfferServiceImpl
<CShellBrowser
>,
296 public IShellBrowserService
,
298 public ITravelLogClient
,
299 public IPersistHistory
,
300 public IDockingWindowSite
,
301 public IOleCommandTarget
,
302 public IBrowserService2
,
303 public IConnectionPointContainerImpl
<CShellBrowser
>,
304 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
305 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
312 CComPtr
<IUnknown
> clientBar
;
315 static const int BIInternetToolbar
= 0;
316 static const int BIVerticalBaseBar
= 1;
317 static const int BIHorizontalBaseBar
= 2;
319 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
320 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
321 CComPtr
<IShellView
> fCurrentShellView
; //
322 LPITEMIDLIST fCurrentDirectoryPIDL
; //
324 bool fStatusBarVisible
;
325 CToolbarProxy fToolbarProxy
;
326 barInfo fClientBars
[3];
327 CComPtr
<ITravelLog
> fTravelLog
;
328 HMENU fCurrentMenuBar
;
329 CABINETSTATE fCabinetState
;
330 // The next three fields support persisted history for shell views.
331 // They do not need to be reference counted.
332 IOleObject
*fHistoryObject
;
333 IStream
*fHistoryStream
;
334 IBindCtx
*fHistoryBindContext
;
337 ULONG
InternalAddRef()
339 OutputDebugString(_T("AddRef\n"));
340 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
342 ULONG
InternalRelease()
344 OutputDebugString(_T("Release\n"));
345 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
351 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
353 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
354 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
355 FOLDERSETTINGS
*folderSettings
, long flags
);
356 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
357 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
358 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
359 HRESULT
NavigateToParent();
360 HRESULT
DoFolderOptions();
361 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
362 void RepositionBars();
363 virtual WNDPROC
GetWindowProc()
367 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
368 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
369 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
370 HRESULT
FireCommandStateChangeAll();
371 HRESULT
UpdateForwardBackState();
372 void UpdateGotoMenu(HMENU theMenu
);
373 void UpdateViewMenu(HMENU theMenu
);
375 /* // *** IDockingWindowFrame methods ***
376 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
377 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
378 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
381 // *** IDockingWindowSite methods ***
382 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
383 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
384 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
386 // *** IOleCommandTarget methods ***
387 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
388 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
389 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
390 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
392 // *** IOleWindow methods ***
393 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
394 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
396 // *** IShellBrowser methods ***
397 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
398 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
399 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
400 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
401 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
402 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
403 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
404 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
405 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
406 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
407 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
408 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
409 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
411 // *** IDropTarget methods ***
412 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
413 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
414 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
415 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
417 // *** IServiceProvider methods ***
418 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
420 // *** IShellBowserService methods ***
421 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
423 // *** IDispatch methods ***
424 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
425 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
426 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
427 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
428 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
429 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
431 // *** IBrowserService methods ***
432 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
433 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
434 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
435 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
436 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
437 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
438 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
439 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
440 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
441 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
442 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
443 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
444 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
445 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
446 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
447 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
448 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
449 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
450 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
451 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
452 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
453 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
454 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
455 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
456 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
457 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
458 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
459 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
460 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
461 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
463 // *** IBrowserService2 methods ***
464 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
465 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
466 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
467 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
468 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
469 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
470 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
471 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
472 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
473 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
474 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
475 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
476 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
477 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
478 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
479 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
480 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
481 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
482 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
483 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
484 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
485 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
486 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
487 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
488 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
489 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
490 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
491 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
492 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
493 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
494 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
495 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
496 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
497 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
498 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
499 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
500 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
501 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
502 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
503 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
504 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
505 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
506 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
507 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
508 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
509 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
510 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
511 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
512 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
513 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
514 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
515 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
516 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
517 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
518 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
519 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
520 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
521 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
522 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
523 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
524 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
525 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
526 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
527 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
528 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
530 // *** IWebBrowser methods ***
531 virtual HRESULT STDMETHODCALLTYPE
GoBack();
532 virtual HRESULT STDMETHODCALLTYPE
GoForward();
533 virtual HRESULT STDMETHODCALLTYPE
GoHome();
534 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
535 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
536 VARIANT
*PostData
, VARIANT
*Headers
);
537 virtual HRESULT STDMETHODCALLTYPE
Refresh();
538 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
539 virtual HRESULT STDMETHODCALLTYPE
Stop();
540 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
541 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
542 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
543 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
544 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
545 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
546 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
547 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
548 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
549 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
550 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
551 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
552 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
553 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
554 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
555 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
556 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
558 // *** IWebBrowserApp methods ***
559 virtual HRESULT STDMETHODCALLTYPE
Quit();
560 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
561 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
562 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
563 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
564 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
565 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
566 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
567 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
568 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
569 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
570 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
571 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
572 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
573 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
574 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
575 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
576 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
577 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
578 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
580 // *** IWebBrowser2 methods ***
581 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
582 VARIANT
*PostData
, VARIANT
*Headers
);
583 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
584 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
585 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
586 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
587 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
588 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
589 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
590 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
591 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
592 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
593 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
594 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
595 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
596 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
597 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
598 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
599 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
600 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
601 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
603 // *** ITravelLogClient methods ***
604 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
605 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
606 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
608 // *** IPersist methods ***
609 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
611 // *** IPersistHistory methods ***
612 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
613 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
614 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
615 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
618 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
619 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
620 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
621 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
622 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
623 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
624 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
625 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
626 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
627 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
628 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
629 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
630 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
631 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
632 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
633 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
634 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
635 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
636 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
637 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
638 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
639 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
640 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
642 static ATL::CWndClassInfo
& GetWndClassInfo()
644 static ATL::CWndClassInfo wc
=
646 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
647 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
648 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
649 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
654 BEGIN_MSG_MAP(CShellBrowser
)
655 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
656 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
657 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
658 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
659 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
660 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
661 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
662 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
663 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
664 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
665 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
666 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
667 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
668 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
669 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
670 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
671 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
672 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
673 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
674 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
675 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
676 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
677 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
678 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
679 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
682 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
683 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
684 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
685 END_CONNECTION_POINT_MAP()
687 BEGIN_COM_MAP(CShellBrowser
)
688 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
689 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
690 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
691 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
692 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
693 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
694 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
695 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
696 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
697 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
698 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
699 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
700 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
701 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
702 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
703 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
704 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
705 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
709 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
711 CShellBrowser::CShellBrowser()
713 fCurrentShellViewWindow
= NULL
;
714 fCurrentDirectoryPIDL
= NULL
;
716 fStatusBarVisible
= true;
717 memset(fClientBars
, 0, sizeof(fClientBars
));
718 fCurrentMenuBar
= NULL
;
719 fHistoryObject
= NULL
;
720 fHistoryStream
= NULL
;
721 fHistoryBindContext
= NULL
;
724 CShellBrowser::~CShellBrowser()
728 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
730 CComPtr
<IDockingWindow
> dockingWindow
;
731 CComPtr
<IStream
> settingsStream
;
732 CComPtr
<IPersistStreamInit
> persistStreamInit
;
733 CComPtr
<IOleCommandTarget
> commandTarget
;
734 CComPtr
<IObjectWithSite
> objectSite
;
737 _AtlInitialConstruct();
739 fCabinetState
.cLength
= sizeof(fCabinetState
);
740 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
745 Create(HWND_DESKTOP
);
750 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
754 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
760 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
761 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
764 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
765 IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
768 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
769 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
772 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
773 IID_PPV_ARG(IObjectWithSite
, &objectSite
));
777 hResult
= objectSite
->SetSite(static_cast<IShellBrowser
*>(this));
781 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
785 // TODO: create settingsStream from registry entry
786 if (settingsStream
.p
== NULL
)
788 hResult
= persistStreamInit
->InitNew();
794 hResult
= persistStreamInit
->Load(settingsStream
);
798 hResult
= dockingWindow
->ShowDW(TRUE
);
802 fToolbarProxy
.Initialize(m_hWnd
, fClientBars
[BIInternetToolbar
].clientBar
);
805 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
806 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
807 _AtlBaseModule
.GetModuleInstance(), 0);
808 fStatusBarVisible
= true;
811 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
815 ShowWindow(SW_SHOWNORMAL
);
820 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
822 CComPtr
<IShellFolder
> newFolder
;
823 FOLDERSETTINGS newFolderSettings
;
826 // called by shell view to browse to new folder
827 // also called by explorer band to navigate to new folder
828 hResult
= SHBindToFolder(pidl
, &newFolder
);
829 newFolderSettings
.ViewMode
= FVM_ICON
;
830 newFolderSettings
.fFlags
= 0;
831 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
837 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
839 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
842 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
844 LPCITEMIDLIST pidlnext
;
849 if (! _ILIsDesktop(pidl
))
851 length
= pidl
->mkid
.cb
;
853 reinterpret_cast<LPCITEMIDLIST
>(
854 reinterpret_cast<const BYTE
*>(pidl
) + length
);
855 if (pidlnext
->mkid
.cb
!= 0)
861 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
862 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
864 CComPtr
<IShellFolder
> psf
;
865 LPITEMIDLIST pidlChild
;
866 LPITEMIDLIST pidlParent
;
873 if (ppidlLast
!= NULL
)
875 if (_ILIsPidlSimple(pidl
))
877 if (ppidlLast
!= NULL
)
878 *ppidlLast
= ILClone(pidl
);
879 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
883 pidlChild
= ILClone(ILFindLastID(pidl
));
884 pidlParent
= ILClone(pidl
);
885 ILRemoveLastID(pidlParent
);
886 hResult
= SHGetDesktopFolder(&psf
);
887 if (SUCCEEDED(hResult
))
888 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
889 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
890 *ppidlLast
= pidlChild
;
898 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
899 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
901 CComPtr
<IShellFolder
> parentFolder
;
902 LPITEMIDLIST childPIDL
;
906 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
907 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
908 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
910 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
915 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
917 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
920 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
921 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
923 CComPtr
<IObjectWithSite
> objectWithSite
;
924 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
925 CComPtr
<IShellView
> saveCurrentShellView
;
926 CComPtr
<IShellView
> newShellView
;
927 CComPtr
<ITravelLog
> travelLog
;
928 HWND newShellViewWindow
;
929 BOOL windowUpdateIsLocked
;
930 RECT shellViewWindowBounds
;
933 wchar_t newTitle
[MAX_PATH
];
937 if (newShellFolder
== NULL
)
940 hResult
= GetTravelLog(&travelLog
);
945 if (flags
& BTP_UPDATE_CUR_HISTORY
)
947 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
948 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
949 // what to do with error? Do we want to halt browse because state save failed?
952 // create view object
953 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
956 previousView
= fCurrentShellViewWindow
;
958 // enter updating section
959 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
960 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
961 if (fCurrentShellView
!= NULL
)
962 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
965 hResult
= newShellView
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
966 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
967 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
969 // update folder and view
970 saveCurrentShellFolder
= fCurrentShellFolder
;
971 saveCurrentShellView
= fCurrentShellView
;
972 fCurrentShellFolder
= newShellFolder
;
973 fCurrentShellView
= newShellView
;
976 if (previousView
!= NULL
)
977 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
979 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
980 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
982 // create view window
983 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
984 this, &shellViewWindowBounds
, &newShellViewWindow
);
985 if (FAILED(hResult
) || newShellViewWindow
== NULL
)
987 fCurrentShellView
= saveCurrentShellView
;
988 fCurrentShellFolder
= saveCurrentShellFolder
;
989 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
990 if (windowUpdateIsLocked
)
991 LockWindowUpdate(FALSE
);
992 SetCursor(saveCursor
);
996 if (objectWithSite
.p
!= NULL
)
997 hResult
= objectWithSite
->SetSite(NULL
);
999 // update current pidl
1000 ILFree(fCurrentDirectoryPIDL
);
1001 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1003 // update view window
1004 if (saveCurrentShellView
!= NULL
)
1005 saveCurrentShellView
->DestroyViewWindow();
1006 fCurrentShellViewWindow
= newShellViewWindow
;
1009 saveCurrentShellView
.Release();
1010 saveCurrentShellFolder
.Release();
1012 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1014 // leave updating section
1015 if (windowUpdateIsLocked
)
1016 LockWindowUpdate(FALSE
);
1017 SetCursor(saveCursor
);
1020 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1022 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1023 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1027 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1028 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1029 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1030 if (SUCCEEDED(hResult
))
1032 FireNavigateComplete(newTitle
);
1036 FireNavigateComplete(L
"ERROR");
1039 if (fCabinetState
.fFullPathTitle
)
1040 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1042 nameFlags
= SHGDN_FORADDRESSBAR
;
1043 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1044 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1045 if (SUCCEEDED(hResult
))
1047 SetWindowText(newTitle
);
1049 LPCITEMIDLIST pidlChild
;
1050 INT index
, indexOpen
;
1051 HIMAGELIST himlSmall
, himlLarge
;
1053 CComPtr
<IShellFolder
> sf
;
1054 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1056 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1058 Shell_GetImageLists(&himlSmall
, &himlLarge
);
1060 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1061 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1063 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1064 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1067 // TODO: Update the window icon
1069 FireCommandStateChangeAll();
1070 hResult
= UpdateForwardBackState();
1074 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1076 CComPtr
<IServiceProvider
> serviceProvider
;
1077 CComPtr
<IBandSite
> bandSite
;
1078 CComPtr
<IDeskBand
> deskBand
;
1081 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
1083 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1084 IID_PPV_ARG(IServiceProvider
, &serviceProvider
));
1085 if (FAILED(hResult
))
1087 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1088 if (FAILED(hResult
))
1090 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1091 if (FAILED(hResult
))
1093 return deskBand
->QueryInterface(riid
, shellMenu
);
1096 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1098 CComPtr
<IUnknown
> newBaseBar
;
1099 CComPtr
<IDeskBar
> deskBar
;
1100 CComPtr
<IUnknown
> newBaseBarSite
;
1101 CComPtr
<IObjectWithSite
> objectWithSite
;
1102 CComPtr
<IDeskBarClient
> deskBarClient
;
1107 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1109 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1112 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1113 if (FAILED(hResult
))
1115 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1116 if (FAILED(hResult
))
1119 // tell the new base bar about the shell browser
1120 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1121 if (FAILED(hResult
))
1123 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1124 if (FAILED(hResult
))
1127 // tell the new base bar about the new base bar site
1128 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1129 if (FAILED(hResult
))
1131 hResult
= deskBar
->SetClient(newBaseBarSite
);
1132 if (FAILED(hResult
))
1135 // tell the new base bar site about the new base bar
1136 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1137 if (FAILED(hResult
))
1139 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1140 if (FAILED(hResult
))
1143 *cache
= newBaseBar
.Detach();
1145 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1148 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1150 CComPtr
<IDockingWindow
> dockingWindow
;
1151 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1152 CComPtr
<IUnknown
> baseBarSite
;
1153 CComPtr
<IUnknown
> newBand
;
1154 CComPtr
<IUnknown
> theBaseBar
;
1155 CComPtr
<IDeskBar
> deskBar
;
1161 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1162 if (FAILED(hResult
))
1164 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1165 if (FAILED(hResult
))
1167 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1168 if (FAILED(hResult
))
1170 hResult
= deskBar
->GetClient(&baseBarSite
);
1171 if (FAILED(hResult
))
1173 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1174 if (FAILED(hResult
))
1176 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1177 if (FAILED(hResult
))
1179 V_VT(&vaIn
) = VT_UNKNOWN
;
1180 V_UNKNOWN(&vaIn
) = newBand
.p
;
1181 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1182 if (FAILED(hResult
))
1184 hResult
= dockingWindow
->ShowDW(TRUE
);
1185 if (FAILED(hResult
))
1190 HRESULT
CShellBrowser::NavigateToParent()
1192 LPITEMIDLIST newDirectory
;
1195 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1196 if (newDirectory
== NULL
)
1197 return E_OUTOFMEMORY
;
1198 ILRemoveLastID(newDirectory
);
1199 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1200 ILFree(newDirectory
);
1201 if (FAILED(hResult
))
1206 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1208 PROPSHEETHEADER
*sheetInfo
;
1210 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1211 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1213 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1214 sheetInfo
->nPages
++;
1218 HRESULT
CShellBrowser::DoFolderOptions()
1220 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1221 CComPtr
<IObjectWithSite
> objectWithSite
;
1222 PROPSHEETHEADER m_PropSheet
;
1223 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1224 // CComPtr<IGlobalFolderSettings> globalSettings;
1225 // SHELLSTATE2 shellState;
1228 memset(m_psp
, 0, sizeof(m_psp
));
1229 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1231 // create sheet object
1232 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1233 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1234 if (FAILED(hResult
))
1237 // must set site in order for Apply to all Folders on Advanced page to be enabled
1238 hResult
= folderOptionsSheet
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1239 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1240 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1241 m_PropSheet
.phpage
= m_psp
;
1244 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1245 if (FAILED(hResult
))
1247 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1248 if (FAILED(hResult
))
1253 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1254 if (FAILED(hResult
))
1257 if (fCurrentShellView
!= NULL
)
1259 hResult
= fCurrentShellView
->AddPropertySheetPages(
1260 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1261 if (FAILED(hResult
))
1266 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1267 m_PropSheet
.dwFlags
= 0;
1268 m_PropSheet
.hwndParent
= m_hWnd
;
1269 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1270 m_PropSheet
.pszCaption
= _T("Folder Options");
1271 m_PropSheet
.nStartPage
= 0;
1272 PropertySheet(&m_PropSheet
);
1276 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1278 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1279 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1281 CComPtr
<IMenuBand
> menuBand
;
1282 const _ATL_MSG
*previousMessage
;
1284 WNDPROC saveWindowProc
;
1287 hWnd
= pThis
->m_hWnd
;
1288 previousMessage
= pThis
->m_pCurrentMsg
;
1289 pThis
->m_pCurrentMsg
= &msg
;
1291 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1292 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1294 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1295 if (hResult
== S_OK
)
1298 wParam
= msg
.wParam
;
1299 lParam
= msg
.lParam
;
1302 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1303 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1304 if (handled
== FALSE
)
1306 if (uMsg
== WM_NCDESTROY
)
1308 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1309 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1310 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1311 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1312 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1315 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1317 pThis
->m_pCurrentMsg
= previousMessage
;
1318 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1320 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1321 pThis
->m_hWnd
= NULL
;
1322 pThis
->OnFinalMessage(hWnd
);
1327 void CShellBrowser::RepositionBars()
1333 GetClientRect(&clientRect
);
1335 if (fStatusBarVisible
&& fStatusBar
)
1337 ::GetWindowRect(fStatusBar
, &statusRect
);
1338 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1339 clientRect
.right
- clientRect
.left
,
1340 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1341 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1344 for (x
= 0; x
< 3; x
++)
1346 HWND hwnd
= fClientBars
[x
].hwnd
;
1347 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1348 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1350 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1351 fClientBars
[x
].hwnd
= hwnd
;
1355 RECT toolbarRect
= clientRect
;
1356 if (borderSpace
.top
!= 0)
1358 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1360 else if (borderSpace
.bottom
!= 0)
1362 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1364 else if (borderSpace
.left
!= 0)
1366 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1368 else if (borderSpace
.right
!= 0)
1370 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1373 ::SetWindowPos(hwnd
, NULL
,
1376 toolbarRect
.right
- toolbarRect
.left
,
1377 toolbarRect
.bottom
- toolbarRect
.top
,
1378 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1380 if (borderSpace
.top
!= 0)
1382 clientRect
.top
= toolbarRect
.bottom
;
1384 else if (borderSpace
.bottom
!= 0)
1386 clientRect
.bottom
= toolbarRect
.top
;
1388 else if (borderSpace
.left
!= 0)
1390 clientRect
.left
= toolbarRect
.right
;
1392 else if (borderSpace
.right
!= 0)
1394 clientRect
.right
= toolbarRect
.left
;
1398 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1399 clientRect
.right
- clientRect
.left
,
1400 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1403 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1406 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1407 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1410 params
.rgvarg
= arguments
;
1411 params
.rgdispidNamedArgs
= NULL
;
1412 params
.cArgs
= argCount
;
1413 params
.cNamedArgs
= 0;
1414 IUnknown
** pp
= vec
.begin();
1415 while (pp
< vec
.end())
1419 CComPtr
<IDispatch
> theDispatch
;
1421 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1422 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1427 while (pp
< vec2
.end())
1431 CComPtr
<IDispatch
> theDispatch
;
1433 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1434 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1441 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1443 // these two variants intentionally to do use CComVariant because it would double free/release
1444 // or does not need to dispose at all
1447 CComBSTR
tempString(newDirectory
);
1449 V_VT(&varArgs
) = VT_BSTR
;
1450 V_BSTR(&varArgs
) = tempString
.m_str
;
1452 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1453 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1454 V_VT(&varArg
[1]) = VT_DISPATCH
;
1455 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1457 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1460 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1464 V_VT(&varArg
[0]) = VT_BOOL
;
1465 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1466 V_VT(&varArg
[1]) = VT_I4
;
1467 V_I4(&varArg
[1]) = commandID
;
1469 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1472 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1474 return FireCommandStateChange(false, -1);
1477 HRESULT
CShellBrowser::UpdateForwardBackState()
1479 CComPtr
<ITravelLog
> travelLog
;
1480 CComPtr
<ITravelEntry
> unusedEntry
;
1486 canGoForward
= false;
1487 hResult
= GetTravelLog(&travelLog
);
1488 if (FAILED(hResult
))
1490 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1491 if (SUCCEEDED(hResult
))
1494 unusedEntry
.Release();
1496 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1497 if (SUCCEEDED(hResult
))
1499 canGoForward
= true;
1500 unusedEntry
.Release();
1502 hResult
= FireCommandStateChange(canGoBack
, 2);
1503 hResult
= FireCommandStateChange(canGoForward
, 1);
1507 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1509 CComPtr
<ITravelLog
> travelLog
;
1511 MENUITEMINFO menuItemInfo
;
1514 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1516 position
= GetMenuItemCount(theMenu
);
1517 hResult
= GetTravelLog(&travelLog
);
1518 if (FAILED(hResult
))
1520 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1521 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1522 if (SUCCEEDED(hResult
))
1524 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1525 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1526 menuItemInfo
.fType
= MF_SEPARATOR
;
1527 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1528 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1532 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1534 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1535 CComPtr
<ITravelLog
> travelLog
;
1537 OLECMD commandList
[5];
1538 HMENU toolbarMenuBar
;
1540 MENUITEMINFO menuItemInfo
;
1543 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1544 if (gotoMenu
!= NULL
)
1545 UpdateGotoMenu(gotoMenu
);
1547 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1548 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1549 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1550 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1551 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1553 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1554 IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1555 if (SUCCEEDED(hResult
))
1556 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1557 if (FAILED(hResult
))
1558 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1561 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1562 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1564 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1565 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1566 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1567 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1568 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1569 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1570 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1571 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1573 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1574 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1575 menuItemInfo
.hSubMenu
= toolbarMenu
;
1576 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1578 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1581 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1583 CComPtr
<IUnknown
> int1Retry
;
1584 CComPtr
<IUnknown
> int2Retry
;
1589 if (int1
== NULL
|| int2
== NULL
)
1591 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1592 if (FAILED(hResult
))
1594 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1595 if (FAILED(hResult
))
1597 if (int1Retry
== int2Retry
)
1602 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1604 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1606 RECT availableBounds
;
1608 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1609 for (INT x
= 0; x
< 3; x
++)
1611 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1613 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1614 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1615 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1616 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1619 *prcBorder
= availableBounds
;
1623 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1628 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1630 for (INT x
= 0; x
< 3; x
++)
1632 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1634 fClientBars
[x
].borderSpace
= *pbw
;
1635 // if this bar changed size, it cascades and forces all subsequent bars to resize
1640 return E_INVALIDARG
;
1643 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1644 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1646 CComPtr
<IOleCommandTarget
> commandTarget
;
1649 if (prgCmds
== NULL
)
1650 return E_INVALIDARG
;
1651 if (pguidCmdGroup
== NULL
)
1653 if (fCurrentShellView
.p
!= NULL
)
1655 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1656 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1657 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1666 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1670 switch (prgCmds
->cmdID
)
1672 case 0x1c: // search
1673 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1675 case 0x1d: // history
1676 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1678 case 0x1e: // favorites
1679 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1681 case 0x23: // folders
1682 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1692 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1696 switch (prgCmds
->cmdID
)
1698 case 0xa022: // up level
1699 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1700 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1701 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1711 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1712 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1716 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1721 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1724 if (nCmdexecopt
== 1)
1726 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1730 // update zones part of the status bar
1733 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1734 V_VT(pvaOut
) = VT_INT_PTR
;
1735 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1736 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1739 // indicate if this cabinet was opened as a browser
1745 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1754 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1759 // what is theater mode and why do we receive this?
1763 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1768 // initialize favorites menu
1772 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1777 // refresh on toolbar clicked
1780 // tell the view if it should hide the task pane or not
1781 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1784 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1789 return NavigateToParent();
1792 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1797 return DoFolderOptions();
1800 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1805 // Reset All Folders option in Folder Options
1816 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1824 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1829 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1831 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1832 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1834 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1837 lpMenuWidths
->width
[0] = 2;
1838 lpMenuWidths
->width
[2] = 3;
1839 lpMenuWidths
->width
[4] = 1;
1843 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1845 CComPtr
<IShellMenu
> shellMenu
;
1848 if (IsMenu(hmenuShared
) == FALSE
)
1850 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1851 if (FAILED(hResult
))
1853 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1854 if (FAILED(hResult
))
1856 fCurrentMenuBar
= hmenuShared
;
1860 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1862 if (hmenuShared
== fCurrentMenuBar
)
1863 fCurrentMenuBar
= NULL
;
1867 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1872 ::SetWindowText(fStatusBar
, pszStatusText
);
1881 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1886 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1891 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1893 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1896 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1901 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1909 *lphwnd
= fToolbarProxy
.m_hWnd
;
1912 *lphwnd
= fStatusBar
;
1915 // find the directory browser and return it
1916 // this should be used only to determine if a tree is present
1919 // is this a progress dialog?
1925 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1926 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1935 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1940 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1948 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1952 *ppshv
= fCurrentShellView
;
1953 if (fCurrentShellView
.p
!= NULL
)
1954 fCurrentShellView
.p
->AddRef();
1958 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1963 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1968 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1969 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1974 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1979 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
1984 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
1985 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1990 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1992 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
1993 // the returned interface has a method GetPropertyBag on it
1994 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
1995 return this->QueryInterface(riid
, ppvObject
);
1996 if (IsEqualIID(guidService
, SID_SShellBrowser
))
1997 return this->QueryInterface(riid
, ppvObject
);
1998 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
1999 return this->QueryInterface(riid
, ppvObject
);
2000 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2001 return this->QueryInterface(riid
, ppvObject
);
2002 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2003 return this->QueryInterface(riid
, ppvObject
);
2004 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2005 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2006 if (IsEqualIID(riid
, IID_IShellBrowser
))
2007 return this->QueryInterface(riid
, ppvObject
);
2008 return E_NOINTERFACE
;
2011 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2013 if (ppvObject
== NULL
)
2019 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2024 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2029 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2030 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2035 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2036 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2041 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2046 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2051 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2056 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2061 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2065 // called by toolbar when displaying tooltips
2070 if (fTravelLog
.p
== NULL
)
2072 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2073 if (FAILED(hResult
))
2076 *pptl
= fTravelLog
.p
;
2077 fTravelLog
.p
->AddRef();
2081 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2086 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2091 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2096 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2101 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2106 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2111 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2116 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2121 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2126 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2131 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2136 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2141 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2146 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2151 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2153 // called by explorer bar to get current pidl
2156 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2165 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2170 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2177 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2178 return E_INVALIDARG
;
2179 *ppole
= fHistoryObject
;
2180 if (fHistoryObject
!= NULL
)
2181 fHistoryObject
->AddRef();
2182 *pstm
= fHistoryStream
;
2183 if (fHistoryStream
!= NULL
)
2184 fHistoryStream
->AddRef();
2185 *ppbc
= fHistoryBindContext
;
2186 if (fHistoryBindContext
!= NULL
)
2187 fHistoryBindContext
->AddRef();
2188 fHistoryObject
= NULL
;
2189 fHistoryStream
= NULL
;
2190 fHistoryBindContext
= NULL
;
2196 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2201 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2206 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2211 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2212 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2217 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2222 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2227 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2232 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2237 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2242 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2247 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2252 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2257 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2262 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2267 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2272 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2277 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2282 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2288 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2293 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2298 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2303 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2308 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2313 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2318 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2323 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2328 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2333 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2338 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2343 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2353 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2358 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2363 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2368 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2373 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2378 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2383 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2388 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2398 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2399 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2404 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2405 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2410 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2415 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2420 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2425 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2430 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2435 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2440 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2445 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2450 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2455 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2460 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2465 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2470 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2475 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2480 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2485 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2490 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2495 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2500 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2505 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2506 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2511 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2516 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2521 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2526 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2531 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2536 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2541 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2543 CComPtr
<ITravelLog
> travelLog
;
2546 hResult
= GetTravelLog(&travelLog
);
2547 if (FAILED(hResult
))
2549 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2552 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2554 CComPtr
<ITravelLog
> travelLog
;
2557 hResult
= GetTravelLog(&travelLog
);
2558 if (FAILED(hResult
))
2560 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2563 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2568 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2573 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2574 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2579 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2583 V_VT(&level
) = VT_I4
;
2585 return Refresh2(&level
);
2588 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2590 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2593 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2594 if (FAILED(hResult
))
2596 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2599 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2604 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2609 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2614 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2619 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2624 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2629 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2636 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2641 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2646 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2651 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2656 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2661 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2666 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2671 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2678 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2683 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2688 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2693 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2698 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2703 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2708 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2713 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2718 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2723 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2728 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2733 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2738 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2743 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2748 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2753 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2758 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2763 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2768 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2773 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2778 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2783 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2788 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2793 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2794 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2799 // called from drive combo box to navigate to a directory
2800 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2801 return E_INVALIDARG
;
2802 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2803 return E_INVALIDARG
;
2804 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2805 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2806 if (FAILED(hResult
))
2811 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2816 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2817 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2822 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2827 // called to show search bar
2828 if (V_VT(pvaClsid
) != VT_BSTR
)
2829 return E_INVALIDARG
;
2830 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2831 // TODO: properly compute the value of vertical
2833 return ShowBand(classID
, vertical
);
2836 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2841 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2846 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2851 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2856 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2861 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2866 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2871 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2876 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2881 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2886 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2891 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2896 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2901 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2906 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2911 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2916 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2918 if (pWinData
== NULL
)
2921 pWinData
->dwWindowID
= -1;
2923 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2924 pWinData
->lpszUrl
= NULL
;
2925 pWinData
->lpszUrlLocation
= NULL
;
2926 pWinData
->lpszTitle
= NULL
;
2930 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2935 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2940 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2942 CComPtr
<IPersistHistory
> viewPersistHistory
;
2943 CComPtr
<IOleObject
> viewHistoryObject
;
2944 persistState oldState
;
2949 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2950 if (FAILED(hResult
))
2952 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2954 if (oldState
.browseType
!= 2)
2956 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2958 return E_OUTOFMEMORY
;
2959 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2960 if (FAILED(hResult
))
2965 if (numRead
!= oldState
.pidlSize
)
2970 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
2971 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
2972 fHistoryObject
= viewHistoryObject
;
2973 fHistoryStream
= pStream
;
2974 fHistoryBindContext
= pbc
;
2975 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
2976 fHistoryObject
= NULL
;
2977 fHistoryStream
= NULL
;
2978 fHistoryBindContext
= NULL
;
2980 if (FAILED(hResult
))
2985 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
2987 CComPtr
<IPersistHistory
> viewPersistHistory
;
2988 persistState newState
;
2991 hResult
= fCurrentShellView
->GetItemObject(
2992 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
2993 memset(&newState
, 0, sizeof(newState
));
2994 newState
.dwSize
= sizeof(newState
);
2995 newState
.browseType
= 2;
2996 newState
.browserIndex
= GetBrowserIndex();
2997 if (viewPersistHistory
.p
!= NULL
)
2999 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3000 if (FAILED(hResult
))
3003 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3004 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3005 if (FAILED(hResult
))
3007 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3008 if (FAILED(hResult
))
3010 if (viewPersistHistory
.p
!= NULL
)
3012 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3013 if (FAILED(hResult
))
3019 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3024 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3029 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3031 // TODO: rip down everything
3036 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3038 CComPtr
<IDockingWindow
> dockingWindow
;
3039 RECT availableBounds
;
3040 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3043 if (wParam
!= SIZE_MINIMIZED
)
3045 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3046 for (INT x
= 0; x
< 3; x
++)
3048 if (fClientBars
[x
].clientBar
!= NULL
)
3050 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3051 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3052 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3054 hResult
= dockingWindow
->ResizeBorderDW(
3055 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3065 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3069 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3070 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3071 UpdateViewMenu(theMenu
);
3072 return RelayMsgToShellView(uMsg
, wParam
, lParam
, bHandled
);
3075 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3077 if (fCurrentShellViewWindow
!= NULL
)
3078 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3082 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3087 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3091 hResult
= DoFolderOptions();
3095 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3098 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3099 #endif /* __REACTOS__ */
3103 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3106 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3107 #endif /* __REACTOS__ */
3111 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3113 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3117 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3125 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3129 hResult
= GoForward();
3133 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3137 hResult
= NavigateToParent();
3141 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3149 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3153 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3154 PSHOpenNewFrame Func
;
3157 hShlwapi
= LoadLibrary(TEXT("browseui.dll"));
3158 if (hShlwapi
!= NULL
)
3159 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(hShlwapi
, (LPCSTR
)103));
3164 LPITEMIDLIST desktopPIDL
;
3166 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3167 if (SUCCEEDED(hResult
))
3169 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3175 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3177 fStatusBarVisible
= !fStatusBarVisible
;
3178 // TODO: trigger a relayout of contained items
3182 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3184 CComPtr
<IOleCommandTarget
> commandTarget
;
3187 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3188 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3189 if (FAILED(hResult
))
3191 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3195 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3197 CComPtr
<IOleCommandTarget
> commandTarget
;
3200 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3201 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3202 if (FAILED(hResult
))
3204 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3208 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3210 CComPtr
<IOleCommandTarget
> commandTarget
;
3213 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3214 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3215 if (FAILED(hResult
))
3217 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3221 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3223 CComPtr
<IOleCommandTarget
> commandTarget
;
3226 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3227 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3228 if (FAILED(hResult
))
3230 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3234 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3236 CComPtr
<IOleCommandTarget
> commandTarget
;
3239 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3240 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3241 if (FAILED(hResult
))
3243 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3247 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3249 CComPtr
<IOleCommandTarget
> commandTarget
;
3252 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3253 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3254 if (FAILED(hResult
))
3256 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3260 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3265 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3267 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3268 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3272 //static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
3274 // return DefWindowProc(hwnd, uMsg, wParam, lParam);
3277 static void ExplorerMessageLoop()
3284 Ret
= (GetMessage(&Msg
, NULL
, 0, 0) != 0);
3291 TranslateMessage(&Msg
);
3292 DispatchMessage(&Msg
);
3294 if (Msg
.message
== WM_QUIT
)
3300 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3302 CComPtr
<IShellBrowser
> shellBrowser
;
3303 CComObject
<CShellBrowser
> *theCabinet
;
3304 IEThreadParamBlock
*parameters
;
3307 parameters
= (IEThreadParamBlock
*)lpThreadParameter
;
3308 OleInitialize(NULL
);
3309 ATLTRY (theCabinet
= new CComObject
<CShellBrowser
>);
3310 if (theCabinet
== NULL
)
3311 return E_OUTOFMEMORY
;
3312 hResult
= theCabinet
->QueryInterface(IID_PPV_ARG(IShellBrowser
, &shellBrowser
));
3313 if (FAILED(hResult
))
3318 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3319 if (FAILED(hResult
))
3321 ExplorerMessageLoop();