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
25 **Provide implementation of new and delete that use LocalAlloc
26 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
27 view doesn't restore the selection correctly.
28 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
29 **Add brand band bitmaps to shell32.dll
30 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
31 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
32 current state overwrites the wrong entry's contents. This needs to be changed.
33 ****Fix close of browser window to release all objects
34 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
35 **When a new bar is added to base bar site, how is base bar told so it can resize?
36 **Does the base bar site have a classid?
37 **What should refresh command send to views to make them refresh?
38 **When new bar is created, what status notifications need to be fired?
39 **How does keyboard filtering dispatch?
40 **For deferred persist history load, how does the view connect up and get the state?
41 How does context menu send open, cut, rename commands to its site (the shell view)?
42 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
44 **Route View->Toolbars commands to internet toolbar
45 **Handle travel log items in View->Go
46 **Fix ShowBrowserBar to pass correct size on when bar is shown
47 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
48 ****Make ShowToolbar check if bar is already created before creating it again
49 ****Shell should fill in the list of explorer bars in the View submenus
50 **Add folder menu in the file menu
51 **Fix CShellBrowser::GetBorderDW to compute available size correctly
52 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
53 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
54 Make folders toolbar item update state appropriately
55 Read list of bands from registry on launch
56 Read list of bars from registry on launch
57 If the folders or search bars don't exist, disable the toolbar buttons
58 If the favorites or history bars don't exist, disable the toolbar butons
59 Fix Apply to all Folders in Folder Options
60 Implement close command
61 Add explorer band context menu to file menu
62 Add code to allow restore of internet toolbar from registry
63 Fix code that calls FireNavigateComplete to pass the correct new path
65 What are the other command ids for QueryStatus/FireCommandStateChange?
67 Add handler for cabinet settings change
68 Add handler for system metrics change (renegotiate border space?)
69 Add handler for theme change and forward to contained windows
71 When folders are shown, the status bar text should change
72 Add code to save/restore shell view settings
73 Implement tabbing between frames
74 Fix handling of focus everywhere
75 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
77 The status bar doesn't show help text for items owned by frame during menu tracking
78 Stub out frame command handlers
79 "Arrange icons by" group is not checked properly
81 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
82 the icon is always an open folder with magnifying glass
83 Fix bars to calculate height correctly
84 Hookup policies for everything...
85 Investigate toolbar message WM_USER+93
86 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
88 Vertical Explorer Bar CATID_InfoBand
89 Horizontal Explorer Bar CATID_CommBand
90 Desk Band CATID_DeskBand
93 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
94 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
96 create key here with CLSID of bar to register tool band
97 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
102 #pragma comment(linker, \
103 "\"/manifestdependency:type='Win32' "\
104 "name='Microsoft.Windows.Common-Controls' "\
105 "version='6.0.0.0' "\
106 "processorArchitecture='*' "\
107 "publicKeyToken='6595b64144ccf1df' "\
111 struct categoryCacheHeader
113 long dwSize
; // size of header only
114 long version
; // currently 1
115 SYSTEMTIME writeTime
; // time we were written to registry
116 long classCount
; // number of classes following
119 static const unsigned int folderOptionsPageCountMax
= 20;
120 static const long BTP_UPDATE_CUR_HISTORY
= 1;
121 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
123 BOOL createNewStuff
= false;
126 // this class is private to browseui.dll and is not registered externally?
127 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
130 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
131 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
132 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
135 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
138 HMENU
SHGetMenuFromID(HMENU topMenu
, int theID
)
140 MENUITEMINFO menuItemInfo
;
142 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
143 menuItemInfo
.fMask
= MIIM_SUBMENU
;
144 if (!GetMenuItemInfo(topMenu
, theID
, FALSE
, &menuItemInfo
))
146 return menuItemInfo
.hSubMenu
;
149 void SHCheckMenuItem(HMENU theMenu
, int theID
, BOOL checked
)
151 MENUITEMINFO menuItemInfo
;
153 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
154 menuItemInfo
.fMask
= MIIM_STATE
;
155 if (GetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
))
158 menuItemInfo
.fState
|= MF_CHECKED
;
160 menuItemInfo
.fState
&= ~MF_CHECKED
;
161 SetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
);
165 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
167 MENUITEMINFO menuItemInfo
;
171 menuItemCount
= GetMenuItemCount(theMenu
);
173 while (curIndex
< menuItemCount
)
175 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
176 menuItemInfo
.fMask
= MIIM_ID
;
177 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
178 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
180 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
188 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
190 CComPtr
<IShellFolder
> desktop
;
192 ::SHGetDesktopFolder(&desktop
);
195 if (path
== NULL
|| path
->mkid
.cb
== 0)
197 *newFolder
= desktop
;
198 desktop
.p
->AddRef ();
201 return desktop
->BindToObject (path
, NULL
, IID_IShellFolder
, reinterpret_cast<void **>(newFolder
));
204 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
205 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
210 class CToolbarProxy
:
211 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
214 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
216 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
221 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
222 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
224 BEGIN_MSG_MAP(CToolbarProxy
)
225 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
226 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
230 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
235 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
236 if (myWindow
!= NULL
)
238 SubclassWindow(myWindow
);
239 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
240 hResult
= explorerToolbar
->QueryInterface(
241 IID_IExplorerToolbar
, reinterpret_cast<void **>(&fExplorerToolbar
));
245 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
251 if (fExplorerToolbar
.p
!= NULL
)
253 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
254 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
255 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
256 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
261 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
267 if (fExplorerToolbar
.p
!= NULL
)
268 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
273 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
274 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
278 class CShellBrowser
:
279 public CWindowImpl
<CShellBrowser
, CWindow
, CControlWinTraits
>,
280 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
281 public IShellBrowser
,
283 public IServiceProvider
,
284 public IProfferServiceImpl
<CShellBrowser
>,
285 public IShellBrowserService
,
287 public ITravelLogClient
,
288 public IPersistHistory
,
289 public IDockingWindowSite
,
290 public IOleCommandTarget
,
291 public IBrowserService2
,
292 public IConnectionPointContainerImpl
<CShellBrowser
>,
293 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
294 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
301 CComPtr
<IUnknown
> clientBar
;
304 static const int BIInternetToolbar
= 0;
305 static const int BIVerticalBaseBar
= 1;
306 static const int BIHorizontalBaseBar
= 2;
308 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
309 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
310 CComPtr
<IShellView
> fCurrentShellView
; //
311 LPITEMIDLIST fCurrentDirectoryPIDL
; //
313 bool fStatusBarVisible
;
314 CToolbarProxy fToolbarProxy
;
315 barInfo fClientBars
[3];
316 CComPtr
<ITravelLog
> fTravelLog
;
317 HMENU fCurrentMenuBar
;
318 CABINETSTATE fCabinetState
;
319 // The next three fields support persisted history for shell views.
320 // They do not need to be reference counted.
321 IOleObject
*fHistoryObject
;
322 IStream
*fHistoryStream
;
323 IBindCtx
*fHistoryBindContext
;
326 ULONG
InternalAddRef()
328 OutputDebugString(_T("AddRef\n"));
329 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
331 ULONG
InternalRelease()
333 OutputDebugString(_T("Release\n"));
334 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
340 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
342 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
343 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
344 FOLDERSETTINGS
*folderSettings
, long flags
);
345 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
346 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
347 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
348 HRESULT
NavigateToParent();
349 HRESULT
DoFolderOptions();
350 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
351 void RepositionBars();
352 virtual WNDPROC
GetWindowProc()
356 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
357 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
358 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
359 HRESULT
FireCommandStateChangeAll();
360 HRESULT
UpdateForwardBackState();
361 void UpdateGotoMenu(HMENU theMenu
);
362 void UpdateViewMenu(HMENU theMenu
);
364 /* // *** IDockingWindowFrame methods ***
365 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
366 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
367 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
370 // *** IDockingWindowSite methods ***
371 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
372 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
373 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
375 // *** IOleCommandTarget methods ***
376 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
377 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
378 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
379 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
381 // *** IOleWindow methods ***
382 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
383 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
385 // *** IShellBrowser methods ***
386 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
387 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
388 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
389 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
390 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
391 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
392 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
393 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
394 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
395 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
396 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
397 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
398 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
400 // *** IDropTarget methods ***
401 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
402 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
403 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
404 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
406 // *** IServiceProvider methods ***
407 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
409 // *** IShellBowserService methods ***
410 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
412 // *** IDispatch methods ***
413 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
414 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
415 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
416 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
417 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
418 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
420 // *** IBrowserService methods ***
421 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
422 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
423 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
424 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
425 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
426 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
427 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
428 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
429 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPCITEMIDLIST
*ppidlOut
);
430 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
431 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
432 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
433 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
434 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
435 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
436 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
437 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
438 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
439 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
440 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPCITEMIDLIST
*ppidl
);
441 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
442 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
443 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
444 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
445 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
446 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
447 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
448 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
449 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
450 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
452 // *** IBrowserService2 methods ***
453 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
454 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
455 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
456 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
457 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
458 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
459 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
460 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
461 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
462 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
463 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
464 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
465 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
466 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
467 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
468 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
469 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
470 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
471 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
472 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
473 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
474 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
475 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
476 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
477 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
478 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
479 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
480 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
481 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
482 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
483 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
484 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
485 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
486 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
487 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
488 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
489 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
490 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
491 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
492 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
493 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
494 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
495 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
496 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
497 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
498 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
499 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
500 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
501 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
502 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
503 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
504 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
505 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
506 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
507 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
508 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
509 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
510 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
511 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
512 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
513 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
514 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
515 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
516 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
517 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
519 // *** IWebBrowser methods ***
520 virtual HRESULT STDMETHODCALLTYPE
GoBack();
521 virtual HRESULT STDMETHODCALLTYPE
GoForward();
522 virtual HRESULT STDMETHODCALLTYPE
GoHome();
523 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
524 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
525 VARIANT
*PostData
, VARIANT
*Headers
);
526 virtual HRESULT STDMETHODCALLTYPE
Refresh();
527 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
528 virtual HRESULT STDMETHODCALLTYPE
Stop();
529 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
530 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
531 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
532 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
533 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
534 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
536 // WIDL temp hack : when the interface contains 'long' WIDL writes it out as a 'LONG'
537 // Setting the prototype to LONG in this class breaks building with MSVC so we use
538 // the correct 'long' type here and temp hack it for WIDL generated prototypes.
542 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
543 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
544 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
545 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
546 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
547 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
548 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
549 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
553 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
554 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
555 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
557 // *** IWebBrowserApp methods ***
558 virtual HRESULT STDMETHODCALLTYPE
Quit();
559 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
560 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
561 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
562 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
563 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
564 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
565 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
566 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
567 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
568 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
569 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
570 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
571 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
572 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
573 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
574 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
575 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
576 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
577 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
579 // *** IWebBrowser2 methods ***
580 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
581 VARIANT
*PostData
, VARIANT
*Headers
);
582 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
583 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
584 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
585 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
586 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
587 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
588 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
589 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
590 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
591 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
592 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
593 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
594 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
595 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
596 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
597 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
598 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
599 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
600 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
602 // *** ITravelLogClient methods ***
603 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
604 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(LPWINDOWDATA pWinData
);
605 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
607 // *** IPersist methods ***
608 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
610 // *** IPersistHistory methods ***
611 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
612 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
613 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
614 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
616 // *** IBrowserService2 methods ***
620 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
621 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
622 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
623 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
624 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
625 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
626 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
627 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
628 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
629 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
630 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
631 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
632 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
633 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
634 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
635 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
636 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
637 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
638 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
639 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
640 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
641 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
642 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
644 static ATL::CWndClassInfo
& GetWndClassInfo()
646 static ATL::CWndClassInfo wc
=
648 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
649 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
650 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
651 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
656 BEGIN_MSG_MAP(CShellBrowser
)
657 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
658 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
659 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
660 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
661 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
662 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
663 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
664 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
665 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
666 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
667 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
668 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
669 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
670 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
671 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
672 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
673 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
674 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
675 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
676 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
677 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
678 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
679 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
680 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
681 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
684 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
685 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
686 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
687 END_CONNECTION_POINT_MAP()
689 BEGIN_COM_MAP(CShellBrowser
)
690 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
691 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
692 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
693 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
694 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
695 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
696 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
697 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
698 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
699 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
700 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
701 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
702 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
703 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
704 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
705 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
706 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
707 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
711 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
713 CShellBrowser::CShellBrowser()
715 fCurrentShellViewWindow
= NULL
;
716 fCurrentDirectoryPIDL
= NULL
;
718 fStatusBarVisible
= true;
719 for (INT x
= 0; x
< 3; x
++)
720 fClientBars
[x
].hwnd
= NULL
;
721 fCurrentMenuBar
= NULL
;
722 fHistoryObject
= NULL
;
723 fHistoryStream
= NULL
;
724 fHistoryBindContext
= NULL
;
727 CShellBrowser::~CShellBrowser()
731 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
733 CComPtr
<IDockingWindow
> dockingWindow
;
734 CComPtr
<IStream
> settingsStream
;
735 CComPtr
<IPersistStreamInit
> persistStreamInit
;
736 CComPtr
<IOleCommandTarget
> commandTarget
;
737 CComPtr
<IObjectWithSite
> objectSite
;
738 RECT bounds
= {0, 0, 800, 591};
741 _AtlInitialConstruct();
743 fCabinetState
.cLength
= sizeof(fCabinetState
);
744 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
749 Create(HWND_DESKTOP
, bounds
, NULL
, WS_OVERLAPPEDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, 0, 0U);
754 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)&fClientBars
[BIInternetToolbar
].clientBar
);
758 hResult
= CreateInternetToolbar(IID_IUnknown
, (void **)&fClientBars
[BIInternetToolbar
].clientBar
);
764 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
765 IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
768 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
769 IID_IPersistStreamInit
, reinterpret_cast<void **>(&persistStreamInit
));
772 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
773 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
776 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
777 IID_IObjectWithSite
, reinterpret_cast<void **>(&objectSite
));
781 hResult
= objectSite
->SetSite(static_cast<IShellBrowser
*>(this));
785 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
789 // TODO: create settingsStream from registry entry
790 if (settingsStream
.p
== NULL
)
792 hResult
= persistStreamInit
->InitNew();
798 hResult
= persistStreamInit
->Load(settingsStream
);
802 hResult
= dockingWindow
->ShowDW(TRUE
);
806 fToolbarProxy
.Initialize(m_hWnd
, fClientBars
[BIInternetToolbar
].clientBar
);
809 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
810 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
811 _AtlBaseModule
.GetModuleInstance(), 0);
812 fStatusBarVisible
= true;
814 LPITEMIDLIST desktopPIDL
;
815 FOLDERSETTINGS newFolderSettings
;
818 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
821 newFolderSettings
.ViewMode
= FVM_LIST
;
822 newFolderSettings
.fFlags
= 0;
823 hResult
= BrowseToPIDL(desktopPIDL
, BTP_UPDATE_NEXT_HISTORY
);
828 ShowWindow(SW_SHOWNORMAL
);
831 // test code to make brand band animate
833 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
834 CComPtr
<IServiceProvider
> serviceProvider
;
835 CComPtr
<IBandSite
> bandSite
;
836 CComPtr
<IDeskBand
> deskBand
;
837 CComPtr
<IWinEventHandler
> winEventHandler
;
840 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
842 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->
843 QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
844 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_IBandSite
, reinterpret_cast<void **>(&bandSite
));
845 hResult
= bandSite
->QueryBand(5, &deskBand
, NULL
, NULL
, 0);
846 deskBand
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&winEventHandler
));
847 winEventHandler
->IsWindowOwner(NULL
);
848 deskBand
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
849 oleCommandTarget
->QueryStatus(&CGID_BrandCmdGroup
, 0, NULL
, NULL
);
850 oleCommandTarget
->Exec(&CGID_BrandCmdGroup
, BBID_STARTANIMATION
, 0, NULL
, NULL
);
856 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
858 CComPtr
<IShellFolder
> newFolder
;
859 FOLDERSETTINGS newFolderSettings
;
862 // called by shell view to browse to new folder
863 // also called by explorer band to navigate to new folder
864 hResult
= SHBindToFolder(pidl
, &newFolder
);
865 newFolderSettings
.ViewMode
= FVM_LIST
;
866 newFolderSettings
.fFlags
= 0;
867 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
873 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
875 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
878 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
880 LPCITEMIDLIST pidlnext
;
885 if (! _ILIsDesktop(pidl
))
887 length
= pidl
->mkid
.cb
;
889 reinterpret_cast<LPCITEMIDLIST
>(
890 reinterpret_cast<const BYTE
*>(pidl
) + length
);
891 if (pidlnext
->mkid
.cb
!= 0)
897 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
898 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
900 CComPtr
<IShellFolder
> psf
;
901 LPITEMIDLIST pidlChild
;
902 LPITEMIDLIST pidlParent
;
909 if (ppidlLast
!= NULL
)
911 if (_ILIsPidlSimple(pidl
))
913 if (ppidlLast
!= NULL
)
914 *ppidlLast
= ILClone(pidl
);
915 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
919 pidlChild
= ILClone(ILFindLastID(pidl
));
920 pidlParent
= ILClone(pidl
);
921 ILRemoveLastID(pidlParent
);
922 hResult
= SHGetDesktopFolder(&psf
);
923 if (SUCCEEDED(hResult
))
924 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
925 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
926 *ppidlLast
= pidlChild
;
934 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
935 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
937 CComPtr
<IShellFolder
> parentFolder
;
938 LPITEMIDLIST childPIDL
;
942 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_IShellFolder
,
943 reinterpret_cast<void **>(&parentFolder
), &childPIDL
);
944 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
945 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
947 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
952 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
954 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
957 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
958 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
960 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
961 CComPtr
<IObjectWithSite
> objectWithSite
;
962 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
963 CComPtr
<IShellView
> saveCurrentShellView
;
964 CComPtr
<IShellView
> newShellView
;
965 CComPtr
<ITravelLog
> travelLog
;
966 HWND newShellViewWindow
;
967 BOOL windowUpdateIsLocked
;
968 RECT shellViewWindowBounds
;
971 wchar_t newTitle
[MAX_PATH
];
975 if (newShellFolder
== NULL
)
978 hResult
= GetTravelLog(&travelLog
);
983 if (flags
& BTP_UPDATE_CUR_HISTORY
)
985 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
986 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
987 // what to do with error? Do we want to halt browse because state save failed?
990 // create view object
991 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_IShellView
, reinterpret_cast<void **>(&newShellView
));
994 previousView
= fCurrentShellViewWindow
;
996 // enter updating section
997 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
998 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
999 if (fCurrentShellView
!= NULL
)
1000 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
1003 hResult
= newShellView
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1004 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1005 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1007 // update folder and view
1008 saveCurrentShellFolder
= fCurrentShellFolder
;
1009 saveCurrentShellView
= fCurrentShellView
;
1010 fCurrentShellFolder
= newShellFolder
;
1011 fCurrentShellView
= newShellView
;
1014 if (previousView
!= NULL
)
1015 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
1017 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
1018 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
1020 // create view window
1021 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
1022 this, &shellViewWindowBounds
, &newShellViewWindow
);
1023 if (FAILED(hResult
) || newShellViewWindow
== NULL
)
1025 fCurrentShellView
= saveCurrentShellView
;
1026 fCurrentShellFolder
= saveCurrentShellFolder
;
1027 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
1028 if (windowUpdateIsLocked
)
1029 LockWindowUpdate(FALSE
);
1030 SetCursor(saveCursor
);
1034 if (objectWithSite
.p
!= NULL
)
1035 hResult
= objectWithSite
->SetSite(NULL
);
1037 // update current pidl
1038 ILFree(fCurrentDirectoryPIDL
);
1039 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1041 // update view window
1042 if (saveCurrentShellView
!= NULL
)
1043 saveCurrentShellView
->DestroyViewWindow();
1044 fCurrentShellViewWindow
= newShellViewWindow
;
1046 // get command target
1047 oleCommandTarget
.Release();
1048 hResult
= newShellView
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1051 saveCurrentShellView
.Release();
1052 saveCurrentShellFolder
.Release();
1054 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1056 // leave updating section
1057 if (windowUpdateIsLocked
)
1058 LockWindowUpdate(FALSE
);
1059 SetCursor(saveCursor
);
1062 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1064 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1065 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1069 FireNavigateComplete(L
"c:\\temp"); // TODO: use real path here
1070 if (fCabinetState
.fFullPathTitle
)
1071 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1073 nameFlags
= SHGDN_FORADDRESSBAR
;
1074 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1075 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1076 if (SUCCEEDED(hResult
))
1077 SetWindowText(newTitle
);
1079 // TODO: Update the window icon
1081 FireCommandStateChangeAll();
1082 hResult
= UpdateForwardBackState();
1086 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1088 CComPtr
<IServiceProvider
> serviceProvider
;
1089 CComPtr
<IBandSite
> bandSite
;
1090 CComPtr
<IDeskBand
> deskBand
;
1093 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
1095 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1096 IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1097 if (FAILED(hResult
))
1099 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_IBandSite
, reinterpret_cast<void **>(&bandSite
));
1100 if (FAILED(hResult
))
1102 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1103 if (FAILED(hResult
))
1105 return deskBand
->QueryInterface(riid
, shellMenu
);
1108 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1110 CComPtr
<IUnknown
> newBaseBar
;
1111 CComPtr
<IDeskBar
> deskBar
;
1112 CComPtr
<IUnknown
> newBaseBarSite
;
1113 CComPtr
<IObjectWithSite
> objectWithSite
;
1114 CComPtr
<IDeskBarClient
> deskBarClient
;
1119 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1121 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1124 hResult
= CreateBaseBar(IID_IUnknown
, reinterpret_cast<void **>(&newBaseBar
));
1125 if (FAILED(hResult
))
1127 hResult
= CreateBaseBarSite(IID_IUnknown
, reinterpret_cast<void **>(&newBaseBarSite
));
1128 if (FAILED(hResult
))
1131 // tell the new base bar about the shell browser
1132 hResult
= newBaseBar
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1133 if (FAILED(hResult
))
1135 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1136 if (FAILED(hResult
))
1139 // tell the new base bar about the new base bar site
1140 hResult
= newBaseBar
->QueryInterface(IID_IDeskBar
, reinterpret_cast<void **>(&deskBar
));
1141 if (FAILED(hResult
))
1143 hResult
= deskBar
->SetClient(newBaseBarSite
);
1144 if (FAILED(hResult
))
1147 // tell the new base bar site about the new base bar
1148 hResult
= newBaseBarSite
->QueryInterface(IID_IDeskBarClient
, reinterpret_cast<void **>(&deskBarClient
));
1149 if (FAILED(hResult
))
1151 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1152 if (FAILED(hResult
))
1155 *cache
= newBaseBar
.Detach();
1157 return (*cache
)->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(theBaseBar
));
1160 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1162 CComPtr
<IDockingWindow
> dockingWindow
;
1163 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1164 CComPtr
<IUnknown
> baseBarSite
;
1165 CComPtr
<IUnknown
> newBand
;
1166 CComPtr
<IUnknown
> theBaseBar
;
1167 CComPtr
<IDeskBar
> deskBar
;
1171 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1172 if (FAILED(hResult
))
1174 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
,
1175 reinterpret_cast<void **>(&newBand
));
1176 if (FAILED(hResult
))
1178 hResult
= theBaseBar
->QueryInterface(IID_IDeskBar
, reinterpret_cast<void **>(&deskBar
));
1179 if (FAILED(hResult
))
1181 hResult
= deskBar
->GetClient(&baseBarSite
);
1182 if (FAILED(hResult
))
1184 hResult
= theBaseBar
->QueryInterface(IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
1185 if (FAILED(hResult
))
1187 hResult
= baseBarSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1188 if (FAILED(hResult
))
1190 V_VT(&vaIn
) = VT_UNKNOWN
;
1191 V_UNKNOWN(&vaIn
) = newBand
.p
;
1192 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1193 if (FAILED(hResult
))
1195 hResult
= dockingWindow
->ShowDW(TRUE
);
1196 if (FAILED(hResult
))
1201 HRESULT
CShellBrowser::NavigateToParent()
1203 LPITEMIDLIST newDirectory
;
1206 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1207 if (newDirectory
== NULL
)
1208 return E_OUTOFMEMORY
;
1209 ILRemoveLastID(newDirectory
);
1210 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1211 ILFree(newDirectory
);
1212 if (FAILED(hResult
))
1217 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1219 PROPSHEETHEADER
*sheetInfo
;
1221 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1222 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1224 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1225 sheetInfo
->nPages
++;
1229 HRESULT
CShellBrowser::DoFolderOptions()
1231 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1232 CComPtr
<IObjectWithSite
> objectWithSite
;
1233 PROPSHEETHEADER m_PropSheet
;
1234 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1235 // CComPtr<IGlobalFolderSettings> globalSettings;
1236 // SHELLSTATE2 shellState;
1239 memset(m_psp
, 0, sizeof(m_psp
));
1240 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1242 // create sheet object
1243 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1244 IID_IShellPropSheetExt
, reinterpret_cast<void **>(&folderOptionsSheet
));
1245 if (FAILED(hResult
))
1248 // must set site in order for Apply to all Folders on Advanced page to be enabled
1249 hResult
= folderOptionsSheet
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1250 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1251 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1252 m_PropSheet
.phpage
= m_psp
;
1255 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_IGlobalFolderSettings
, (void **)&globalSettings
);
1256 if (FAILED(hResult
))
1258 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1259 if (FAILED(hResult
))
1264 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1265 if (FAILED(hResult
))
1268 if (fCurrentShellView
!= NULL
)
1270 hResult
= fCurrentShellView
->AddPropertySheetPages(
1271 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1272 if (FAILED(hResult
))
1277 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1278 m_PropSheet
.dwFlags
= 0;
1279 m_PropSheet
.hwndParent
= m_hWnd
;
1280 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1281 m_PropSheet
.pszCaption
= _T("Folder Options");
1282 m_PropSheet
.nStartPage
= 0;
1283 PropertySheet(&m_PropSheet
);
1287 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1289 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1290 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1292 CComPtr
<IMenuBand
> menuBand
;
1293 const _ATL_MSG
*previousMessage
;
1295 WNDPROC saveWindowProc
;
1298 hWnd
= pThis
->m_hWnd
;
1299 previousMessage
= pThis
->m_pCurrentMsg
;
1300 pThis
->m_pCurrentMsg
= &msg
;
1302 hResult
= pThis
->GetMenuBand(IID_IMenuBand
, reinterpret_cast<void **>(&menuBand
));
1303 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1305 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1306 if (hResult
== S_OK
)
1309 wParam
= msg
.wParam
;
1310 lParam
= msg
.lParam
;
1313 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1314 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1315 if (handled
== FALSE
)
1317 if (uMsg
== WM_NCDESTROY
)
1319 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1320 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1321 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1322 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1323 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1326 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1328 pThis
->m_pCurrentMsg
= previousMessage
;
1329 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1331 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1332 pThis
->m_hWnd
= NULL
;
1333 pThis
->OnFinalMessage(hWnd
);
1338 void CShellBrowser::RepositionBars()
1346 GetClientRect(&clientRect
);
1348 if (fStatusBarVisible
)
1350 ::GetWindowRect(fStatusBar
, &statusRect
);
1351 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1352 clientRect
.right
- clientRect
.left
,
1353 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1354 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1357 for (x
= 0; x
< 3; x
++)
1359 CComPtr
<IOleWindow
> oleWindow
;
1361 if (fClientBars
[x
].hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1363 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
1364 IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
1365 if (SUCCEEDED(hResult
))
1366 hResult
= oleWindow
->GetWindow(&fClientBars
[x
].hwnd
);
1368 if (fClientBars
[x
].hwnd
!= NULL
)
1370 toolbarRect
= clientRect
;
1371 if (fClientBars
[x
].borderSpace
.top
!= 0)
1372 toolbarRect
.bottom
= toolbarRect
.top
+ fClientBars
[x
].borderSpace
.top
;
1373 else if (fClientBars
[x
].borderSpace
.bottom
!= 0)
1374 toolbarRect
.top
= toolbarRect
.bottom
- fClientBars
[x
].borderSpace
.bottom
;
1375 if (fClientBars
[x
].borderSpace
.left
!= 0)
1376 toolbarRect
.right
= toolbarRect
.left
+ fClientBars
[x
].borderSpace
.left
;
1377 else if (fClientBars
[x
].borderSpace
.right
!= 0)
1378 toolbarRect
.left
= toolbarRect
.right
- fClientBars
[x
].borderSpace
.right
;
1379 ::SetWindowPos(fClientBars
[x
].hwnd
, NULL
, toolbarRect
.left
, toolbarRect
.top
,
1380 toolbarRect
.right
- toolbarRect
.left
,
1381 toolbarRect
.bottom
- toolbarRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1382 clientRect
.top
+= fClientBars
[x
].borderSpace
.top
;
1383 clientRect
.left
+= fClientBars
[x
].borderSpace
.left
;
1384 clientRect
.bottom
+= fClientBars
[x
].borderSpace
.bottom
;
1385 clientRect
.right
+= fClientBars
[x
].borderSpace
.right
;
1388 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1389 clientRect
.right
- clientRect
.left
,
1390 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1393 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1396 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1397 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1400 params
.rgvarg
= arguments
;
1401 params
.rgdispidNamedArgs
= NULL
;
1402 params
.cArgs
= argCount
;
1403 params
.cNamedArgs
= 0;
1404 IUnknown
** pp
= vec
.begin();
1405 while (pp
< vec
.end())
1409 CComPtr
<IDispatch
> theDispatch
;
1411 hResult
= (*pp
)->QueryInterface(IID_IDispatch
, reinterpret_cast<void **>(&theDispatch
));
1412 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1417 while (pp
< vec2
.end())
1421 CComPtr
<IDispatch
> theDispatch
;
1423 hResult
= (*pp
)->QueryInterface(IID_IDispatch
, reinterpret_cast<void **>(&theDispatch
));
1424 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1431 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1433 // these two variants intentionally to do use CComVariant because it would double free/release
1434 // or does not need to dispose at all
1437 CComBSTR
tempString(newDirectory
);
1439 V_VT(&varArgs
) = VT_BSTR
;
1440 V_BSTR(&varArgs
) = tempString
.m_str
;
1442 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1443 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1444 V_VT(&varArg
[1]) = VT_DISPATCH
;
1445 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1447 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1450 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1454 V_VT(&varArg
[0]) = VT_BOOL
;
1455 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1456 V_VT(&varArg
[1]) = VT_I4
;
1457 V_I4(&varArg
[1]) = commandID
;
1459 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1462 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1464 return FireCommandStateChange(false, -1);
1467 HRESULT
CShellBrowser::UpdateForwardBackState()
1469 CComPtr
<ITravelLog
> travelLog
;
1470 CComPtr
<ITravelEntry
> unusedEntry
;
1476 canGoForward
= false;
1477 hResult
= GetTravelLog(&travelLog
);
1478 if (FAILED(hResult
))
1480 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1481 if (SUCCEEDED(hResult
))
1484 unusedEntry
.Release();
1486 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1487 if (SUCCEEDED(hResult
))
1489 canGoForward
= true;
1490 unusedEntry
.Release();
1492 hResult
= FireCommandStateChange(canGoBack
, 2);
1493 hResult
= FireCommandStateChange(canGoForward
, 1);
1497 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1499 CComPtr
<ITravelLog
> travelLog
;
1501 MENUITEMINFO menuItemInfo
;
1504 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1506 position
= GetMenuItemCount(theMenu
);
1507 hResult
= GetTravelLog(&travelLog
);
1508 if (FAILED(hResult
))
1510 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1511 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1512 if (SUCCEEDED(hResult
))
1514 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1515 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1516 menuItemInfo
.fType
= MF_SEPARATOR
;
1517 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1518 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1522 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1524 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1525 CComPtr
<ITravelLog
> travelLog
;
1527 OLECMD commandList
[5];
1528 HMENU toolbarMenuBar
;
1530 MENUITEMINFO menuItemInfo
;
1533 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1534 if (gotoMenu
!= NULL
)
1535 UpdateGotoMenu(gotoMenu
);
1537 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1538 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1539 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1540 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1541 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1543 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1544 IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1545 if (SUCCEEDED(hResult
))
1546 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1547 if (FAILED(hResult
))
1548 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1551 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1552 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1554 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1555 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1556 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1557 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1558 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1559 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1560 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1561 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1563 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1564 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1565 menuItemInfo
.hSubMenu
= toolbarMenu
;
1566 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1568 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1571 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1573 CComPtr
<IUnknown
> int1Retry
;
1574 CComPtr
<IUnknown
> int2Retry
;
1579 if (int1
== NULL
|| int2
== NULL
)
1581 hResult
= int1
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&int1Retry
));
1582 if (FAILED(hResult
))
1584 hResult
= int2
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&int2Retry
));
1585 if (FAILED(hResult
))
1587 if (int1Retry
== int2Retry
)
1592 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1594 RECT availableBounds
;
1595 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
1597 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1598 for (INT x
= 0; x
< 3; x
++)
1600 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1602 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1603 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1604 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1605 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1608 *prcBorder
= availableBounds
;
1612 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1617 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1619 for (INT x
= 0; x
< 3; x
++)
1621 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1623 fClientBars
[x
].borderSpace
= *pbw
;
1624 // if this bar changed size, it cascades and forces all subsequent bars to resize
1629 return E_INVALIDARG
;
1632 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1633 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1635 CComPtr
<IOleCommandTarget
> commandTarget
;
1638 if (prgCmds
== NULL
)
1639 return E_INVALIDARG
;
1640 if (pguidCmdGroup
== NULL
)
1642 if (fCurrentShellView
.p
!= NULL
)
1644 hResult
= fCurrentShellView
->QueryInterface(IID_IOleCommandTarget
,
1645 reinterpret_cast<void **>(&commandTarget
));
1646 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1647 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1656 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1660 switch (prgCmds
->cmdID
)
1662 case 0x1c: // search
1663 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1665 case 0x1d: // history
1666 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1668 case 0x1e: // favorites
1669 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1671 case 0x23: // folders
1672 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1682 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1686 switch (prgCmds
->cmdID
)
1688 case 0xa022: // up level
1689 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1690 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1691 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1701 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1702 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1706 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1711 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1714 if (nCmdexecopt
== 1)
1716 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1720 // update zones part of the status bar
1723 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1724 V_VT(pvaOut
) = VT_INT_PTR
;
1725 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1726 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1729 // indicate if this cabinet was opened as a browser
1735 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1744 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1749 // what is theater mode and why do we receive this?
1753 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1758 // initialize favorites menu
1762 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1767 // refresh on toolbar clicked
1770 // tell the view if it should hide the task pane or not
1771 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1774 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1779 return NavigateToParent();
1782 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1787 return DoFolderOptions();
1790 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1795 // Reset All Folders option in Folder Options
1806 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1814 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1819 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1821 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1822 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1824 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1827 lpMenuWidths
->width
[0] = 2;
1828 lpMenuWidths
->width
[2] = 3;
1829 lpMenuWidths
->width
[4] = 1;
1833 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1835 CComPtr
<IShellMenu
> shellMenu
;
1838 if (IsMenu(hmenuShared
) == FALSE
)
1840 hResult
= GetMenuBand(IID_IShellMenu
, reinterpret_cast<void **>(&shellMenu
));
1841 if (FAILED(hResult
))
1843 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1844 if (FAILED(hResult
))
1846 fCurrentMenuBar
= hmenuShared
;
1850 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1852 if (hmenuShared
== fCurrentMenuBar
)
1853 fCurrentMenuBar
= NULL
;
1857 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1862 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1867 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1872 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1874 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1877 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1882 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1890 *lphwnd
= fToolbarProxy
.m_hWnd
;
1893 *lphwnd
= fStatusBar
;
1896 // find the directory browser and return it
1897 // this should be used only to determine if a tree is present
1900 // is this a progress dialog?
1906 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1907 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1916 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1921 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1929 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1933 *ppshv
= fCurrentShellView
;
1934 if (fCurrentShellView
.p
!= NULL
)
1935 fCurrentShellView
.p
->AddRef();
1939 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1944 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1949 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1950 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1955 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1960 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
1965 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
1966 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1971 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1973 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
1974 // the returned interface has a method GetPropertyBag on it
1975 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
1976 return this->QueryInterface(riid
, ppvObject
);
1977 if (IsEqualIID(guidService
, SID_SShellBrowser
))
1978 return this->QueryInterface(riid
, ppvObject
);
1979 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
1980 return this->QueryInterface(riid
, ppvObject
);
1981 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
1982 return this->QueryInterface(riid
, ppvObject
);
1983 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
1984 return this->QueryInterface(riid
, ppvObject
);
1985 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
1986 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
1987 return E_NOINTERFACE
;
1990 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
1992 if (ppvObject
== NULL
)
1998 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2003 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2008 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2009 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2014 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2015 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2020 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2025 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2030 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2035 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2040 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2044 // called by toolbar when displaying tooltips
2047 if (fTravelLog
.p
== NULL
)
2049 hResult
= CreateTravelLog(IID_ITravelLog
, reinterpret_cast<void **>(&fTravelLog
));
2050 if (FAILED(hResult
))
2053 *pptl
= fTravelLog
.p
;
2054 fTravelLog
.p
->AddRef();
2058 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2063 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2068 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2073 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPCITEMIDLIST
*ppidlOut
)
2078 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2083 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2088 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2093 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2098 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2103 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2108 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2113 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2118 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2123 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2128 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPCITEMIDLIST
*ppidl
)
2130 // called by explorer bar to get current pidl
2133 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2137 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2142 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2147 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2152 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2154 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2155 return E_INVALIDARG
;
2156 *ppole
= fHistoryObject
;
2157 if (fHistoryObject
!= NULL
)
2158 fHistoryObject
->AddRef();
2159 *pstm
= fHistoryStream
;
2160 if (fHistoryStream
!= NULL
)
2161 fHistoryStream
->AddRef();
2162 *ppbc
= fHistoryBindContext
;
2163 if (fHistoryBindContext
!= NULL
)
2164 fHistoryBindContext
->AddRef();
2165 fHistoryObject
= NULL
;
2166 fHistoryStream
= NULL
;
2167 fHistoryBindContext
= NULL
;
2173 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2178 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2183 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2188 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2189 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2194 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2199 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2204 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2209 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2214 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2219 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2224 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2229 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2234 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2239 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2244 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2249 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2254 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2259 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2264 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2265 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2270 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2275 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2280 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2285 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2290 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2295 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2300 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2305 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2310 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2315 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2320 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2325 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2330 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2335 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2340 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2345 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2350 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2355 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2360 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2365 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2370 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2375 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2376 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2381 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2382 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2387 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2392 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2397 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2402 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2407 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2412 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2417 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2422 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2427 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2432 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2437 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2442 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2447 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2452 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2457 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2462 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2467 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2472 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2477 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2482 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2483 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2488 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2493 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2498 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2503 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2508 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2513 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2518 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2520 CComPtr
<ITravelLog
> travelLog
;
2523 hResult
= GetTravelLog(&travelLog
);
2524 if (FAILED(hResult
))
2526 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2529 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2531 CComPtr
<ITravelLog
> travelLog
;
2534 hResult
= GetTravelLog(&travelLog
);
2535 if (FAILED(hResult
))
2537 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2540 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2545 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2550 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2551 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2556 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2560 V_VT(&level
) = VT_I4
;
2562 return Refresh2(&level
);
2565 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2567 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2570 hResult
= fCurrentShellView
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
2571 if (FAILED(hResult
))
2573 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2576 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2581 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2586 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2591 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2596 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2601 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2606 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2613 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2618 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2623 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2628 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2633 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2638 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2643 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2648 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2655 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2660 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2665 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2670 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2675 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2680 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2685 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2690 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2695 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2700 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2705 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2710 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2715 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2720 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2725 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2730 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2735 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2740 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2745 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2750 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2755 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2760 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2765 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2770 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2771 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2776 // called from drive combo box to navigate to a directory
2777 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2778 return E_INVALIDARG
;
2779 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2780 return E_INVALIDARG
;
2781 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2782 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2783 if (FAILED(hResult
))
2788 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2793 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2794 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2799 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2804 // called to show search bar
2805 if (V_VT(pvaClsid
) != VT_BSTR
)
2806 return E_INVALIDARG
;
2807 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2808 // TODO: properly compute the value of vertical
2810 return ShowBand(classID
, vertical
);
2813 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2818 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2823 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2828 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2833 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2838 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2843 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2848 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2853 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2858 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2863 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2868 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2873 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2878 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2883 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2888 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2893 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(LPWINDOWDATA pWinData
)
2895 if (pWinData
== NULL
)
2898 pWinData
->dwWindowID
= -1;
2900 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2901 pWinData
->lpszUrl
= NULL
;
2902 pWinData
->lpszUrlLocation
= NULL
;
2903 pWinData
->lpszTitle
= NULL
;
2907 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2912 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2917 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2919 CComPtr
<IPersistHistory
> viewPersistHistory
;
2920 CComPtr
<IOleObject
> viewHistoryObject
;
2921 persistState oldState
;
2926 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2927 if (FAILED(hResult
))
2929 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2931 if (oldState
.browseType
!= 2)
2933 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2935 return E_OUTOFMEMORY
;
2936 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2937 if (FAILED(hResult
))
2942 if (numRead
!= oldState
.pidlSize
)
2947 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
2948 IID_IOleObject
, reinterpret_cast<void **>(&viewHistoryObject
));
2949 fHistoryObject
= viewHistoryObject
;
2950 fHistoryStream
= pStream
;
2951 fHistoryBindContext
= pbc
;
2952 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
2953 fHistoryObject
= NULL
;
2954 fHistoryStream
= NULL
;
2955 fHistoryBindContext
= NULL
;
2957 if (FAILED(hResult
))
2962 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
2964 CComPtr
<IPersistHistory
> viewPersistHistory
;
2965 persistState newState
;
2968 hResult
= fCurrentShellView
->GetItemObject(
2969 SVGIO_BACKGROUND
, IID_IPersistHistory
, reinterpret_cast<void **>(&viewPersistHistory
));
2970 memset(&newState
, 0, sizeof(newState
));
2971 newState
.dwSize
= sizeof(newState
);
2972 newState
.browseType
= 2;
2973 newState
.browserIndex
= GetBrowserIndex();
2974 if (viewPersistHistory
.p
!= NULL
)
2976 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
2977 if (FAILED(hResult
))
2980 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
2981 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
2982 if (FAILED(hResult
))
2984 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
2985 if (FAILED(hResult
))
2987 if (viewPersistHistory
.p
!= NULL
)
2989 hResult
= viewPersistHistory
->SaveHistory(pStream
);
2990 if (FAILED(hResult
))
2996 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3001 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3006 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3008 // TODO: rip down everything
3013 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3015 CComPtr
<IDockingWindow
> dockingWindow
;
3016 RECT availableBounds
;
3017 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3020 if (wParam
!= SIZE_MINIMIZED
)
3022 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3023 for (INT x
= 0; x
< 3; x
++)
3025 if (fClientBars
[x
].clientBar
!= NULL
)
3027 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3028 IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
3029 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3031 hResult
= dockingWindow
->ResizeBorderDW(
3032 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3042 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3046 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3047 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3048 UpdateViewMenu(theMenu
);
3049 return RelayMsgToShellView(uMsg
, wParam
, lParam
, bHandled
);
3052 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3054 if (fCurrentShellViewWindow
!= NULL
)
3055 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3059 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3064 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3068 hResult
= DoFolderOptions();
3072 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3075 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3076 #endif /* __REACTOS__ */
3080 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3083 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3084 #endif /* __REACTOS__ */
3088 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3090 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3094 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3102 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3106 hResult
= GoForward();
3110 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3114 hResult
= NavigateToParent();
3118 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3126 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3130 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3131 PSHOpenNewFrame Func
;
3134 hShlwapi
= LoadLibrary(TEXT("browseui.dll"));
3135 if (hShlwapi
!= NULL
)
3136 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(hShlwapi
, (LPCSTR
)103));
3141 LPITEMIDLIST desktopPIDL
;
3143 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3144 if (SUCCEEDED(hResult
))
3146 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3152 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3154 fStatusBarVisible
= !fStatusBarVisible
;
3155 // TODO: trigger a relayout of contained items
3159 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3161 CComPtr
<IOleCommandTarget
> commandTarget
;
3164 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3165 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3166 if (FAILED(hResult
))
3168 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3172 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3174 CComPtr
<IOleCommandTarget
> commandTarget
;
3177 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3178 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3179 if (FAILED(hResult
))
3181 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3185 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3187 CComPtr
<IOleCommandTarget
> commandTarget
;
3190 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3191 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3192 if (FAILED(hResult
))
3194 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3198 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3200 CComPtr
<IOleCommandTarget
> commandTarget
;
3203 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3204 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3205 if (FAILED(hResult
))
3207 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3211 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3213 CComPtr
<IOleCommandTarget
> commandTarget
;
3216 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3217 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3218 if (FAILED(hResult
))
3220 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3224 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3226 CComPtr
<IOleCommandTarget
> commandTarget
;
3229 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3230 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3231 if (FAILED(hResult
))
3233 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3237 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3242 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3244 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3245 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3249 //static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
3251 // return DefWindowProc(hwnd, uMsg, wParam, lParam);
3254 static void ExplorerMessageLoop()
3261 Ret
= (GetMessage(&Msg
, NULL
, 0, 0) != 0);
3268 TranslateMessage(&Msg
);
3269 DispatchMessage(&Msg
);
3274 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3276 CComPtr
<IShellBrowser
> shellBrowser
;
3277 CComObject
<CShellBrowser
> *theCabinet
;
3278 IEThreadParamBlock
*parameters
;
3281 parameters
= (IEThreadParamBlock
*)lpThreadParameter
;
3282 OleInitialize(NULL
);
3283 ATLTRY (theCabinet
= new CComObject
<CShellBrowser
>);
3284 if (theCabinet
== NULL
)
3285 return E_OUTOFMEMORY
;
3286 hResult
= theCabinet
->QueryInterface(IID_IShellBrowser
, reinterpret_cast<void **>(&shellBrowser
));
3287 if (FAILED(hResult
))
3292 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3293 if (FAILED(hResult
))
3295 ExplorerMessageLoop();