4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include "newatlinterfaces.h"
30 **Provide implementation of new and delete that use LocalAlloc
31 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
32 view doesn't restore the selection correctly.
33 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
34 **Add brand band bitmaps to shell32.dll
35 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
36 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
37 current state overwrites the wrong entry's contents. This needs to be changed.
38 ****Fix close of browser window to release all objects
39 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
40 **When a new bar is added to base bar site, how is base bar told so it can resize?
41 **Does the base bar site have a classid?
42 **What should refresh command send to views to make them refresh?
43 **When new bar is created, what status notifications need to be fired?
44 **How does keyboard filtering dispatch?
45 **For deferred persist history load, how does the view connect up and get the state?
46 How does context menu send open, cut, rename commands to its site (the shell view)?
47 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
49 **Route View->Toolbars commands to internet toolbar
50 **Handle travel log items in View->Go
51 **Fix ShowBrowserBar to pass correct size on when bar is shown
52 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
53 ****Make ShowToolbar check if bar is already created before creating it again
54 ****Shell should fill in the list of explorer bars in the View submenus
55 **Add folder menu in the file menu
56 **Fix CShellBrowser::GetBorderDW to compute available size correctly
57 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
58 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
59 Make folders toolbar item update state appropriately
60 Read list of bands from registry on launch
61 Read list of bars from registry on launch
62 If the folders or search bars don't exist, disable the toolbar buttons
63 If the favorites or history bars don't exist, disable the toolbar butons
64 Fix Apply to all Folders in Folder Options
65 Implement close command
66 Add explorer band context menu to file menu
67 Add code to allow restore of internet toolbar from registry
68 Fix code that calls FireNavigateComplete to pass the correct new path
70 What are the other command ids for QueryStatus/FireCommandStateChange?
72 Add handler for cabinet settings change
73 Add handler for system metrics change (renegotiate border space?)
74 Add handler for theme change and forward to contained windows
76 When folders are shown, the status bar text should change
77 Add code to save/restore shell view settings
78 Implement tabbing between frames
79 Fix handling of focus everywhere
80 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
82 The status bar doesn't show help text for items owned by frame during menu tracking
83 Stub out frame command handlers
84 "Arrange icons by" group is not checked properly
86 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
87 the icon is always an open folder with magnifying glass
88 Fix bars to calculate height correctly
89 Hookup policies for everything...
90 Investigate toolbar message WM_USER+93
91 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
93 Vertical Explorer Bar CATID_InfoBand
94 Horizontal Explorer Bar CATID_CommBand
95 Desk Band CATID_DeskBand
98 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
99 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
101 create key here with CLSID of bar to register tool band
102 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
107 #pragma comment(linker, \
108 "\"/manifestdependency:type='Win32' "\
109 "name='Microsoft.Windows.Common-Controls' "\
110 "version='6.0.0.0' "\
111 "processorArchitecture='*' "\
112 "publicKeyToken='6595b64144ccf1df' "\
116 struct categoryCacheHeader
118 long dwSize
; // size of header only
119 long version
; // currently 1
120 SYSTEMTIME writeTime
; // time we were written to registry
121 long classCount
; // number of classes following
124 static const unsigned int folderOptionsPageCountMax
= 20;
125 static const long BTP_UPDATE_CUR_HISTORY
= 1;
126 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
128 BOOL createNewStuff
= false;
131 // this class is private to browseui.dll and is not registered externally?
132 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
135 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
136 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
137 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
140 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
143 HMENU
SHGetMenuFromID(HMENU topMenu
, int theID
)
145 MENUITEMINFO menuItemInfo
;
147 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
148 menuItemInfo
.fMask
= MIIM_SUBMENU
;
149 if (!GetMenuItemInfo(topMenu
, theID
, FALSE
, &menuItemInfo
))
151 return menuItemInfo
.hSubMenu
;
154 void SHCheckMenuItem(HMENU theMenu
, int theID
, BOOL checked
)
156 MENUITEMINFO menuItemInfo
;
158 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
159 menuItemInfo
.fMask
= MIIM_STATE
;
160 if (GetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
))
163 menuItemInfo
.fState
|= MF_CHECKED
;
165 menuItemInfo
.fState
&= ~MF_CHECKED
;
166 SetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
);
170 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
172 MENUITEMINFO menuItemInfo
;
176 menuItemCount
= GetMenuItemCount(theMenu
);
178 while (curIndex
< menuItemCount
)
180 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
181 menuItemInfo
.fMask
= MIIM_ID
;
182 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
183 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
185 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
193 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
195 CComPtr
<IShellFolder
> desktop
;
197 ::SHGetDesktopFolder(&desktop
);
200 if (path
== NULL
|| path
->mkid
.cb
== 0)
202 *newFolder
= desktop
;
203 desktop
.p
->AddRef ();
206 return desktop
->BindToObject (path
, NULL
, IID_IShellFolder
, reinterpret_cast<void **>(newFolder
));
209 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
210 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
215 class CToolbarProxy
:
216 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
219 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
221 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
226 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
227 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
229 BEGIN_MSG_MAP(CToolbarProxy
)
230 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
231 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
235 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
240 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
241 if (myWindow
!= NULL
)
243 SubclassWindow(myWindow
);
244 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
245 hResult
= explorerToolbar
->QueryInterface(
246 IID_IExplorerToolbar
, reinterpret_cast<void **>(&fExplorerToolbar
));
250 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
256 if (fExplorerToolbar
.p
!= NULL
)
258 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
259 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
260 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
261 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
266 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
272 if (fExplorerToolbar
.p
!= NULL
)
273 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
278 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
279 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
283 class CShellBrowser
:
284 public CWindowImpl
<CShellBrowser
, CWindow
, CControlWinTraits
>,
285 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
286 public IShellBrowser
,
288 public IServiceProvider
,
289 public IProfferServiceImpl
<CShellBrowser
>,
290 public IShellBrowserService
,
292 public ITravelLogClient
,
293 public IPersistHistory
,
294 public IDockingWindowSite
,
295 public IOleCommandTarget
,
296 public IBrowserService2
,
297 public IConnectionPointContainerImpl
<CShellBrowser
>,
298 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
299 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
306 CComPtr
<IUnknown
> clientBar
;
309 static const int BIInternetToolbar
= 0;
310 static const int BIVerticalBaseBar
= 1;
311 static const int BIHorizontalBaseBar
= 2;
313 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
314 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
315 CComPtr
<IShellView
> fCurrentShellView
; //
316 LPITEMIDLIST fCurrentDirectoryPIDL
; //
318 bool fStatusBarVisible
;
319 CToolbarProxy fToolbarProxy
;
320 barInfo fClientBars
[3];
321 CComPtr
<ITravelLog
> fTravelLog
;
322 HMENU fCurrentMenuBar
;
323 CABINETSTATE fCabinetState
;
324 // The next three fields support persisted history for shell views.
325 // They do not need to be reference counted.
326 IOleObject
*fHistoryObject
;
327 IStream
*fHistoryStream
;
328 IBindCtx
*fHistoryBindContext
;
331 ULONG
InternalAddRef()
333 OutputDebugString(_T("AddRef\n"));
334 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
336 ULONG
InternalRelease()
338 OutputDebugString(_T("Release\n"));
339 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
345 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
347 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
348 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
349 FOLDERSETTINGS
*folderSettings
, long flags
);
350 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
351 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
352 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
353 HRESULT
NavigateToParent();
354 HRESULT
DoFolderOptions();
355 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
356 void RepositionBars();
357 virtual WNDPROC
GetWindowProc()
361 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
362 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
363 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
364 HRESULT
FireCommandStateChangeAll();
365 HRESULT
UpdateForwardBackState();
366 void UpdateGotoMenu(HMENU theMenu
);
367 void UpdateViewMenu(HMENU theMenu
);
369 /* // *** IDockingWindowFrame methods ***
370 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
371 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
372 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
375 // *** IDockingWindowSite methods ***
376 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
377 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
378 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
380 // *** IOleCommandTarget methods ***
381 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
382 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
383 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
384 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
386 // *** IOleWindow methods ***
387 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
388 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
390 // *** IShellBrowser methods ***
391 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
392 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
393 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
394 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
395 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
396 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
397 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
398 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
399 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
400 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
401 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
402 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
403 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
405 // *** IDropTarget methods ***
406 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
407 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
408 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
409 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
411 // *** IServiceProvider methods ***
412 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
414 // *** IShellBowserService methods ***
415 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
417 // *** IDispatch methods ***
418 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
419 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
420 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
421 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
422 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
423 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
425 // *** IBrowserService methods ***
426 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
427 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
428 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
429 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
430 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
431 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
432 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
433 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
434 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
435 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
436 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
437 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
438 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
439 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
440 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
441 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
442 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
443 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
444 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
445 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
446 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
447 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
448 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
449 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
450 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
451 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
452 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
453 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
454 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
455 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
457 // *** IBrowserService2 methods ***
458 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
459 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
460 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
461 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
462 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
463 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
464 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
465 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
466 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
467 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
468 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
469 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
470 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
471 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
472 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
473 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
474 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
475 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
476 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
477 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
478 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
479 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
480 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
481 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
482 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
483 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
484 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
485 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
486 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
487 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
488 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
489 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
490 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
491 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
492 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
493 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
494 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
495 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
496 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
497 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
498 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
499 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
500 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
501 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
502 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
503 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
504 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
505 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
506 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
507 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
508 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
509 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
510 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
511 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
512 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
513 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
514 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
515 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
516 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
517 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
518 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
519 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
520 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
521 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
522 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
524 // *** IWebBrowser methods ***
525 virtual HRESULT STDMETHODCALLTYPE
GoBack();
526 virtual HRESULT STDMETHODCALLTYPE
GoForward();
527 virtual HRESULT STDMETHODCALLTYPE
GoHome();
528 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
529 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
530 VARIANT
*PostData
, VARIANT
*Headers
);
531 virtual HRESULT STDMETHODCALLTYPE
Refresh();
532 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
533 virtual HRESULT STDMETHODCALLTYPE
Stop();
534 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
535 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
536 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
537 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
538 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
539 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
540 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
541 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
542 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
543 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
544 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
545 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
546 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
547 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
548 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
549 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
550 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
552 // *** IWebBrowserApp methods ***
553 virtual HRESULT STDMETHODCALLTYPE
Quit();
554 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
555 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
556 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
557 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
558 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
559 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
560 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
561 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
562 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
563 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
564 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
565 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
566 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
567 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
568 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
569 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
570 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
571 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
572 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
574 // *** IWebBrowser2 methods ***
575 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
576 VARIANT
*PostData
, VARIANT
*Headers
);
577 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
578 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
579 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
580 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
581 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
582 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
583 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
584 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
585 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
586 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
587 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
588 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
589 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
590 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
591 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
592 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
593 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
594 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
595 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
597 // *** ITravelLogClient methods ***
598 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
599 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
600 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
602 // *** IPersist methods ***
603 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
605 // *** IPersistHistory methods ***
606 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
607 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
608 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
609 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
612 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
613 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
614 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
615 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
616 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
617 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
618 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
619 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
620 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
621 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
622 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
623 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
624 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
625 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
626 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
627 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
628 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
629 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
630 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
631 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
632 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
633 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
634 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
636 static ATL::CWndClassInfo
& GetWndClassInfo()
638 static ATL::CWndClassInfo wc
=
640 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
641 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
642 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
643 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
648 BEGIN_MSG_MAP(CShellBrowser
)
649 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
650 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
651 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
652 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
653 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
654 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
655 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
656 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
657 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
658 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
659 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
660 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
661 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
662 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
663 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
664 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
665 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
666 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
667 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
668 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
669 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
670 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
671 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
672 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
673 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
676 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
677 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
678 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
679 END_CONNECTION_POINT_MAP()
681 BEGIN_COM_MAP(CShellBrowser
)
682 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
683 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
684 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
685 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
686 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
687 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
688 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
689 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
690 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
691 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
692 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
693 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
694 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
695 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
696 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
697 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
698 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
699 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
703 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
705 CShellBrowser::CShellBrowser()
707 fCurrentShellViewWindow
= NULL
;
708 fCurrentDirectoryPIDL
= NULL
;
710 fStatusBarVisible
= true;
711 for (INT x
= 0; x
< 3; x
++)
712 fClientBars
[x
].hwnd
= NULL
;
713 fCurrentMenuBar
= NULL
;
714 fHistoryObject
= NULL
;
715 fHistoryStream
= NULL
;
716 fHistoryBindContext
= NULL
;
719 CShellBrowser::~CShellBrowser()
723 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
725 CComPtr
<IDockingWindow
> dockingWindow
;
726 CComPtr
<IStream
> settingsStream
;
727 CComPtr
<IPersistStreamInit
> persistStreamInit
;
728 CComPtr
<IOleCommandTarget
> commandTarget
;
729 CComPtr
<IObjectWithSite
> objectSite
;
730 RECT bounds
= {0, 0, 800, 591};
733 _AtlInitialConstruct();
735 fCabinetState
.cLength
= sizeof(fCabinetState
);
736 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
741 Create(HWND_DESKTOP
, bounds
, NULL
, WS_OVERLAPPEDWINDOW
| WS_CLIPSIBLINGS
| WS_CLIPCHILDREN
, 0, 0U);
746 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
, (void **)&fClientBars
[BIInternetToolbar
].clientBar
);
750 hResult
= CreateInternetToolbar(IID_IUnknown
, (void **)&fClientBars
[BIInternetToolbar
].clientBar
);
756 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
757 IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
760 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
761 IID_IPersistStreamInit
, reinterpret_cast<void **>(&persistStreamInit
));
764 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
765 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
768 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
769 IID_IObjectWithSite
, reinterpret_cast<void **>(&objectSite
));
773 hResult
= objectSite
->SetSite(static_cast<IShellBrowser
*>(this));
777 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
781 // TODO: create settingsStream from registry entry
782 if (settingsStream
.p
== NULL
)
784 hResult
= persistStreamInit
->InitNew();
790 hResult
= persistStreamInit
->Load(settingsStream
);
794 hResult
= dockingWindow
->ShowDW(TRUE
);
798 fToolbarProxy
.Initialize(m_hWnd
, fClientBars
[BIInternetToolbar
].clientBar
);
801 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
802 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
803 _AtlBaseModule
.GetModuleInstance(), 0);
804 fStatusBarVisible
= true;
806 FOLDERSETTINGS newFolderSettings
;
809 newFolderSettings
.ViewMode
= FVM_LIST
;
810 newFolderSettings
.fFlags
= 0;
811 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
815 ShowWindow(SW_SHOWNORMAL
);
818 // test code to make brand band animate
820 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
821 CComPtr
<IServiceProvider
> serviceProvider
;
822 CComPtr
<IBandSite
> bandSite
;
823 CComPtr
<IDeskBand
> deskBand
;
824 CComPtr
<IWinEventHandler
> winEventHandler
;
827 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
829 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->
830 QueryInterface(IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
831 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_IBandSite
, reinterpret_cast<void **>(&bandSite
));
832 hResult
= bandSite
->QueryBand(5, &deskBand
, NULL
, NULL
, 0);
833 deskBand
->QueryInterface(IID_IWinEventHandler
, reinterpret_cast<void **>(&winEventHandler
));
834 winEventHandler
->IsWindowOwner(NULL
);
835 deskBand
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
836 oleCommandTarget
->QueryStatus(&CGID_BrandCmdGroup
, 0, NULL
, NULL
);
837 oleCommandTarget
->Exec(&CGID_BrandCmdGroup
, BBID_STARTANIMATION
, 0, NULL
, NULL
);
843 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
845 CComPtr
<IShellFolder
> newFolder
;
846 FOLDERSETTINGS newFolderSettings
;
849 // called by shell view to browse to new folder
850 // also called by explorer band to navigate to new folder
851 hResult
= SHBindToFolder(pidl
, &newFolder
);
852 newFolderSettings
.ViewMode
= FVM_LIST
;
853 newFolderSettings
.fFlags
= 0;
854 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
860 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
862 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
865 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
867 LPCITEMIDLIST pidlnext
;
872 if (! _ILIsDesktop(pidl
))
874 length
= pidl
->mkid
.cb
;
876 reinterpret_cast<LPCITEMIDLIST
>(
877 reinterpret_cast<const BYTE
*>(pidl
) + length
);
878 if (pidlnext
->mkid
.cb
!= 0)
884 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
885 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
887 CComPtr
<IShellFolder
> psf
;
888 LPITEMIDLIST pidlChild
;
889 LPITEMIDLIST pidlParent
;
896 if (ppidlLast
!= NULL
)
898 if (_ILIsPidlSimple(pidl
))
900 if (ppidlLast
!= NULL
)
901 *ppidlLast
= ILClone(pidl
);
902 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
906 pidlChild
= ILClone(ILFindLastID(pidl
));
907 pidlParent
= ILClone(pidl
);
908 ILRemoveLastID(pidlParent
);
909 hResult
= SHGetDesktopFolder(&psf
);
910 if (SUCCEEDED(hResult
))
911 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
912 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
913 *ppidlLast
= pidlChild
;
921 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
922 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
924 CComPtr
<IShellFolder
> parentFolder
;
925 LPITEMIDLIST childPIDL
;
929 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_IShellFolder
,
930 reinterpret_cast<void **>(&parentFolder
), &childPIDL
);
931 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
932 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
934 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
939 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
941 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
944 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
945 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
947 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
948 CComPtr
<IObjectWithSite
> objectWithSite
;
949 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
950 CComPtr
<IShellView
> saveCurrentShellView
;
951 CComPtr
<IShellView
> newShellView
;
952 CComPtr
<ITravelLog
> travelLog
;
953 HWND newShellViewWindow
;
954 BOOL windowUpdateIsLocked
;
955 RECT shellViewWindowBounds
;
958 wchar_t newTitle
[MAX_PATH
];
962 if (newShellFolder
== NULL
)
965 hResult
= GetTravelLog(&travelLog
);
970 if (flags
& BTP_UPDATE_CUR_HISTORY
)
972 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
973 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
974 // what to do with error? Do we want to halt browse because state save failed?
977 // create view object
978 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_IShellView
, reinterpret_cast<void **>(&newShellView
));
981 previousView
= fCurrentShellViewWindow
;
983 // enter updating section
984 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
985 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
986 if (fCurrentShellView
!= NULL
)
987 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
990 hResult
= newShellView
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
991 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
992 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
994 // update folder and view
995 saveCurrentShellFolder
= fCurrentShellFolder
;
996 saveCurrentShellView
= fCurrentShellView
;
997 fCurrentShellFolder
= newShellFolder
;
998 fCurrentShellView
= newShellView
;
1001 if (previousView
!= NULL
)
1002 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
1004 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
1005 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
1007 // create view window
1008 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
1009 this, &shellViewWindowBounds
, &newShellViewWindow
);
1010 if (FAILED(hResult
) || newShellViewWindow
== NULL
)
1012 fCurrentShellView
= saveCurrentShellView
;
1013 fCurrentShellFolder
= saveCurrentShellFolder
;
1014 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
1015 if (windowUpdateIsLocked
)
1016 LockWindowUpdate(FALSE
);
1017 SetCursor(saveCursor
);
1021 if (objectWithSite
.p
!= NULL
)
1022 hResult
= objectWithSite
->SetSite(NULL
);
1024 // update current pidl
1025 ILFree(fCurrentDirectoryPIDL
);
1026 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1028 // update view window
1029 if (saveCurrentShellView
!= NULL
)
1030 saveCurrentShellView
->DestroyViewWindow();
1031 fCurrentShellViewWindow
= newShellViewWindow
;
1033 // get command target
1034 oleCommandTarget
.Release();
1035 hResult
= newShellView
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1038 saveCurrentShellView
.Release();
1039 saveCurrentShellFolder
.Release();
1041 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1043 // leave updating section
1044 if (windowUpdateIsLocked
)
1045 LockWindowUpdate(FALSE
);
1046 SetCursor(saveCursor
);
1049 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1051 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1052 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1056 FireNavigateComplete(L
"c:\\temp"); // TODO: use real path here
1057 if (fCabinetState
.fFullPathTitle
)
1058 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1060 nameFlags
= SHGDN_FORADDRESSBAR
;
1061 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1062 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1063 if (SUCCEEDED(hResult
))
1064 SetWindowText(newTitle
);
1066 // TODO: Update the window icon
1068 FireCommandStateChangeAll();
1069 hResult
= UpdateForwardBackState();
1073 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1075 CComPtr
<IServiceProvider
> serviceProvider
;
1076 CComPtr
<IBandSite
> bandSite
;
1077 CComPtr
<IDeskBand
> deskBand
;
1080 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
1082 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1083 IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1084 if (FAILED(hResult
))
1086 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_IBandSite
, reinterpret_cast<void **>(&bandSite
));
1087 if (FAILED(hResult
))
1089 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1090 if (FAILED(hResult
))
1092 return deskBand
->QueryInterface(riid
, shellMenu
);
1095 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1097 CComPtr
<IUnknown
> newBaseBar
;
1098 CComPtr
<IDeskBar
> deskBar
;
1099 CComPtr
<IUnknown
> newBaseBarSite
;
1100 CComPtr
<IObjectWithSite
> objectWithSite
;
1101 CComPtr
<IDeskBarClient
> deskBarClient
;
1106 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1108 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1111 hResult
= CreateBaseBar(IID_IUnknown
, reinterpret_cast<void **>(&newBaseBar
));
1112 if (FAILED(hResult
))
1114 hResult
= CreateBaseBarSite(IID_IUnknown
, reinterpret_cast<void **>(&newBaseBarSite
));
1115 if (FAILED(hResult
))
1118 // tell the new base bar about the shell browser
1119 hResult
= newBaseBar
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1120 if (FAILED(hResult
))
1122 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1123 if (FAILED(hResult
))
1126 // tell the new base bar about the new base bar site
1127 hResult
= newBaseBar
->QueryInterface(IID_IDeskBar
, reinterpret_cast<void **>(&deskBar
));
1128 if (FAILED(hResult
))
1130 hResult
= deskBar
->SetClient(newBaseBarSite
);
1131 if (FAILED(hResult
))
1134 // tell the new base bar site about the new base bar
1135 hResult
= newBaseBarSite
->QueryInterface(IID_IDeskBarClient
, reinterpret_cast<void **>(&deskBarClient
));
1136 if (FAILED(hResult
))
1138 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1139 if (FAILED(hResult
))
1142 *cache
= newBaseBar
.Detach();
1144 return (*cache
)->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(theBaseBar
));
1147 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1149 CComPtr
<IDockingWindow
> dockingWindow
;
1150 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1151 CComPtr
<IUnknown
> baseBarSite
;
1152 CComPtr
<IUnknown
> newBand
;
1153 CComPtr
<IUnknown
> theBaseBar
;
1154 CComPtr
<IDeskBar
> deskBar
;
1158 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1159 if (FAILED(hResult
))
1161 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
,
1162 reinterpret_cast<void **>(&newBand
));
1163 if (FAILED(hResult
))
1165 hResult
= theBaseBar
->QueryInterface(IID_IDeskBar
, reinterpret_cast<void **>(&deskBar
));
1166 if (FAILED(hResult
))
1168 hResult
= deskBar
->GetClient(&baseBarSite
);
1169 if (FAILED(hResult
))
1171 hResult
= theBaseBar
->QueryInterface(IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
1172 if (FAILED(hResult
))
1174 hResult
= baseBarSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1175 if (FAILED(hResult
))
1177 V_VT(&vaIn
) = VT_UNKNOWN
;
1178 V_UNKNOWN(&vaIn
) = newBand
.p
;
1179 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1180 if (FAILED(hResult
))
1182 hResult
= dockingWindow
->ShowDW(TRUE
);
1183 if (FAILED(hResult
))
1188 HRESULT
CShellBrowser::NavigateToParent()
1190 LPITEMIDLIST newDirectory
;
1193 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1194 if (newDirectory
== NULL
)
1195 return E_OUTOFMEMORY
;
1196 ILRemoveLastID(newDirectory
);
1197 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1198 ILFree(newDirectory
);
1199 if (FAILED(hResult
))
1204 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1206 PROPSHEETHEADER
*sheetInfo
;
1208 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1209 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1211 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1212 sheetInfo
->nPages
++;
1216 HRESULT
CShellBrowser::DoFolderOptions()
1218 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1219 CComPtr
<IObjectWithSite
> objectWithSite
;
1220 PROPSHEETHEADER m_PropSheet
;
1221 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1222 // CComPtr<IGlobalFolderSettings> globalSettings;
1223 // SHELLSTATE2 shellState;
1226 memset(m_psp
, 0, sizeof(m_psp
));
1227 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1229 // create sheet object
1230 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1231 IID_IShellPropSheetExt
, reinterpret_cast<void **>(&folderOptionsSheet
));
1232 if (FAILED(hResult
))
1235 // must set site in order for Apply to all Folders on Advanced page to be enabled
1236 hResult
= folderOptionsSheet
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1237 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1238 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1239 m_PropSheet
.phpage
= m_psp
;
1242 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_IGlobalFolderSettings
, (void **)&globalSettings
);
1243 if (FAILED(hResult
))
1245 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1246 if (FAILED(hResult
))
1251 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1252 if (FAILED(hResult
))
1255 if (fCurrentShellView
!= NULL
)
1257 hResult
= fCurrentShellView
->AddPropertySheetPages(
1258 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1259 if (FAILED(hResult
))
1264 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1265 m_PropSheet
.dwFlags
= 0;
1266 m_PropSheet
.hwndParent
= m_hWnd
;
1267 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1268 m_PropSheet
.pszCaption
= _T("Folder Options");
1269 m_PropSheet
.nStartPage
= 0;
1270 PropertySheet(&m_PropSheet
);
1274 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1276 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1277 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1279 CComPtr
<IMenuBand
> menuBand
;
1280 const _ATL_MSG
*previousMessage
;
1282 WNDPROC saveWindowProc
;
1285 hWnd
= pThis
->m_hWnd
;
1286 previousMessage
= pThis
->m_pCurrentMsg
;
1287 pThis
->m_pCurrentMsg
= &msg
;
1289 hResult
= pThis
->GetMenuBand(IID_IMenuBand
, reinterpret_cast<void **>(&menuBand
));
1290 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1292 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1293 if (hResult
== S_OK
)
1296 wParam
= msg
.wParam
;
1297 lParam
= msg
.lParam
;
1300 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1301 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1302 if (handled
== FALSE
)
1304 if (uMsg
== WM_NCDESTROY
)
1306 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1307 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1308 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1309 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1310 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1313 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1315 pThis
->m_pCurrentMsg
= previousMessage
;
1316 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1318 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1319 pThis
->m_hWnd
= NULL
;
1320 pThis
->OnFinalMessage(hWnd
);
1325 void CShellBrowser::RepositionBars()
1333 GetClientRect(&clientRect
);
1335 if (fStatusBarVisible
)
1337 ::GetWindowRect(fStatusBar
, &statusRect
);
1338 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1339 clientRect
.right
- clientRect
.left
,
1340 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1341 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1344 for (x
= 0; x
< 3; x
++)
1346 CComPtr
<IOleWindow
> oleWindow
;
1348 if (fClientBars
[x
].hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1350 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
1351 IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
1352 if (SUCCEEDED(hResult
))
1353 hResult
= oleWindow
->GetWindow(&fClientBars
[x
].hwnd
);
1355 if (fClientBars
[x
].hwnd
!= NULL
)
1357 toolbarRect
= clientRect
;
1358 if (fClientBars
[x
].borderSpace
.top
!= 0)
1359 toolbarRect
.bottom
= toolbarRect
.top
+ fClientBars
[x
].borderSpace
.top
;
1360 else if (fClientBars
[x
].borderSpace
.bottom
!= 0)
1361 toolbarRect
.top
= toolbarRect
.bottom
- fClientBars
[x
].borderSpace
.bottom
;
1362 if (fClientBars
[x
].borderSpace
.left
!= 0)
1363 toolbarRect
.right
= toolbarRect
.left
+ fClientBars
[x
].borderSpace
.left
;
1364 else if (fClientBars
[x
].borderSpace
.right
!= 0)
1365 toolbarRect
.left
= toolbarRect
.right
- fClientBars
[x
].borderSpace
.right
;
1366 ::SetWindowPos(fClientBars
[x
].hwnd
, NULL
, toolbarRect
.left
, toolbarRect
.top
,
1367 toolbarRect
.right
- toolbarRect
.left
,
1368 toolbarRect
.bottom
- toolbarRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1369 clientRect
.top
+= fClientBars
[x
].borderSpace
.top
;
1370 clientRect
.left
+= fClientBars
[x
].borderSpace
.left
;
1371 clientRect
.bottom
+= fClientBars
[x
].borderSpace
.bottom
;
1372 clientRect
.right
+= fClientBars
[x
].borderSpace
.right
;
1375 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1376 clientRect
.right
- clientRect
.left
,
1377 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1380 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1383 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1384 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1387 params
.rgvarg
= arguments
;
1388 params
.rgdispidNamedArgs
= NULL
;
1389 params
.cArgs
= argCount
;
1390 params
.cNamedArgs
= 0;
1391 IUnknown
** pp
= vec
.begin();
1392 while (pp
< vec
.end())
1396 CComPtr
<IDispatch
> theDispatch
;
1398 hResult
= (*pp
)->QueryInterface(IID_IDispatch
, reinterpret_cast<void **>(&theDispatch
));
1399 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1404 while (pp
< vec2
.end())
1408 CComPtr
<IDispatch
> theDispatch
;
1410 hResult
= (*pp
)->QueryInterface(IID_IDispatch
, reinterpret_cast<void **>(&theDispatch
));
1411 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1418 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1420 // these two variants intentionally to do use CComVariant because it would double free/release
1421 // or does not need to dispose at all
1424 CComBSTR
tempString(newDirectory
);
1426 V_VT(&varArgs
) = VT_BSTR
;
1427 V_BSTR(&varArgs
) = tempString
.m_str
;
1429 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1430 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1431 V_VT(&varArg
[1]) = VT_DISPATCH
;
1432 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1434 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1437 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1441 V_VT(&varArg
[0]) = VT_BOOL
;
1442 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1443 V_VT(&varArg
[1]) = VT_I4
;
1444 V_I4(&varArg
[1]) = commandID
;
1446 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1449 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1451 return FireCommandStateChange(false, -1);
1454 HRESULT
CShellBrowser::UpdateForwardBackState()
1456 CComPtr
<ITravelLog
> travelLog
;
1457 CComPtr
<ITravelEntry
> unusedEntry
;
1463 canGoForward
= false;
1464 hResult
= GetTravelLog(&travelLog
);
1465 if (FAILED(hResult
))
1467 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1468 if (SUCCEEDED(hResult
))
1471 unusedEntry
.Release();
1473 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1474 if (SUCCEEDED(hResult
))
1476 canGoForward
= true;
1477 unusedEntry
.Release();
1479 hResult
= FireCommandStateChange(canGoBack
, 2);
1480 hResult
= FireCommandStateChange(canGoForward
, 1);
1484 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1486 CComPtr
<ITravelLog
> travelLog
;
1488 MENUITEMINFO menuItemInfo
;
1491 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1493 position
= GetMenuItemCount(theMenu
);
1494 hResult
= GetTravelLog(&travelLog
);
1495 if (FAILED(hResult
))
1497 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1498 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1499 if (SUCCEEDED(hResult
))
1501 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1502 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1503 menuItemInfo
.fType
= MF_SEPARATOR
;
1504 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1505 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1509 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1511 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1512 CComPtr
<ITravelLog
> travelLog
;
1514 OLECMD commandList
[5];
1515 HMENU toolbarMenuBar
;
1517 MENUITEMINFO menuItemInfo
;
1520 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1521 if (gotoMenu
!= NULL
)
1522 UpdateGotoMenu(gotoMenu
);
1524 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1525 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1526 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1527 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1528 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1530 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1531 IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1532 if (SUCCEEDED(hResult
))
1533 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1534 if (FAILED(hResult
))
1535 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1538 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1539 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1541 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1542 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1543 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1544 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1545 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1546 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1547 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1548 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1550 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1551 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1552 menuItemInfo
.hSubMenu
= toolbarMenu
;
1553 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1555 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1558 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1560 CComPtr
<IUnknown
> int1Retry
;
1561 CComPtr
<IUnknown
> int2Retry
;
1566 if (int1
== NULL
|| int2
== NULL
)
1568 hResult
= int1
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&int1Retry
));
1569 if (FAILED(hResult
))
1571 hResult
= int2
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&int2Retry
));
1572 if (FAILED(hResult
))
1574 if (int1Retry
== int2Retry
)
1579 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1581 RECT availableBounds
;
1582 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
1584 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1585 for (INT x
= 0; x
< 3; x
++)
1587 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1589 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1590 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1591 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1592 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1595 *prcBorder
= availableBounds
;
1599 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1604 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1606 for (INT x
= 0; x
< 3; x
++)
1608 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1610 fClientBars
[x
].borderSpace
= *pbw
;
1611 // if this bar changed size, it cascades and forces all subsequent bars to resize
1616 return E_INVALIDARG
;
1619 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1620 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1622 CComPtr
<IOleCommandTarget
> commandTarget
;
1625 if (prgCmds
== NULL
)
1626 return E_INVALIDARG
;
1627 if (pguidCmdGroup
== NULL
)
1629 if (fCurrentShellView
.p
!= NULL
)
1631 hResult
= fCurrentShellView
->QueryInterface(IID_IOleCommandTarget
,
1632 reinterpret_cast<void **>(&commandTarget
));
1633 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1634 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1643 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1647 switch (prgCmds
->cmdID
)
1649 case 0x1c: // search
1650 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1652 case 0x1d: // history
1653 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1655 case 0x1e: // favorites
1656 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1658 case 0x23: // folders
1659 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1669 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1673 switch (prgCmds
->cmdID
)
1675 case 0xa022: // up level
1676 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1677 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1678 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1688 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1689 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1693 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1698 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1701 if (nCmdexecopt
== 1)
1703 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1707 // update zones part of the status bar
1710 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1711 V_VT(pvaOut
) = VT_INT_PTR
;
1712 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1713 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1716 // indicate if this cabinet was opened as a browser
1722 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1731 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1736 // what is theater mode and why do we receive this?
1740 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1745 // initialize favorites menu
1749 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1754 // refresh on toolbar clicked
1757 // tell the view if it should hide the task pane or not
1758 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1761 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1766 return NavigateToParent();
1769 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1774 return DoFolderOptions();
1777 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1782 // Reset All Folders option in Folder Options
1793 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1801 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1806 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1808 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1809 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1811 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1814 lpMenuWidths
->width
[0] = 2;
1815 lpMenuWidths
->width
[2] = 3;
1816 lpMenuWidths
->width
[4] = 1;
1820 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1822 CComPtr
<IShellMenu
> shellMenu
;
1825 if (IsMenu(hmenuShared
) == FALSE
)
1827 hResult
= GetMenuBand(IID_IShellMenu
, reinterpret_cast<void **>(&shellMenu
));
1828 if (FAILED(hResult
))
1830 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1831 if (FAILED(hResult
))
1833 fCurrentMenuBar
= hmenuShared
;
1837 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1839 if (hmenuShared
== fCurrentMenuBar
)
1840 fCurrentMenuBar
= NULL
;
1844 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1849 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1854 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1859 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1861 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1864 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1869 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1877 *lphwnd
= fToolbarProxy
.m_hWnd
;
1880 *lphwnd
= fStatusBar
;
1883 // find the directory browser and return it
1884 // this should be used only to determine if a tree is present
1887 // is this a progress dialog?
1893 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1894 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1903 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1908 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1916 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1920 *ppshv
= fCurrentShellView
;
1921 if (fCurrentShellView
.p
!= NULL
)
1922 fCurrentShellView
.p
->AddRef();
1926 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1931 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1936 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1937 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1942 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1947 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
1952 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
1953 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1958 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1960 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
1961 // the returned interface has a method GetPropertyBag on it
1962 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
1963 return this->QueryInterface(riid
, ppvObject
);
1964 if (IsEqualIID(guidService
, SID_SShellBrowser
))
1965 return this->QueryInterface(riid
, ppvObject
);
1966 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
1967 return this->QueryInterface(riid
, ppvObject
);
1968 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
1969 return this->QueryInterface(riid
, ppvObject
);
1970 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
1971 return this->QueryInterface(riid
, ppvObject
);
1972 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
1973 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
1974 return E_NOINTERFACE
;
1977 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
1979 if (ppvObject
== NULL
)
1985 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
1990 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1995 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
1996 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2001 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2002 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2007 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2012 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2017 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2022 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2027 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2031 // called by toolbar when displaying tooltips
2034 if (fTravelLog
.p
== NULL
)
2036 hResult
= CreateTravelLog(IID_ITravelLog
, reinterpret_cast<void **>(&fTravelLog
));
2037 if (FAILED(hResult
))
2040 *pptl
= fTravelLog
.p
;
2041 fTravelLog
.p
->AddRef();
2045 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2050 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2055 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2060 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2065 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2070 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2075 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2080 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2085 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2090 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2095 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2100 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2105 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2110 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2115 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2117 // called by explorer bar to get current pidl
2120 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2124 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2129 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2134 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2139 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2141 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2142 return E_INVALIDARG
;
2143 *ppole
= fHistoryObject
;
2144 if (fHistoryObject
!= NULL
)
2145 fHistoryObject
->AddRef();
2146 *pstm
= fHistoryStream
;
2147 if (fHistoryStream
!= NULL
)
2148 fHistoryStream
->AddRef();
2149 *ppbc
= fHistoryBindContext
;
2150 if (fHistoryBindContext
!= NULL
)
2151 fHistoryBindContext
->AddRef();
2152 fHistoryObject
= NULL
;
2153 fHistoryStream
= NULL
;
2154 fHistoryBindContext
= NULL
;
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2165 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2170 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2176 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2181 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2186 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2191 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2196 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2201 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2206 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2211 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2216 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2221 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2226 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2231 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2236 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2241 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2246 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2251 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2252 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2257 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2262 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2267 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2272 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2277 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2282 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2292 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2297 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2302 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2307 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2312 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2317 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2322 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2327 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2332 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2337 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2342 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2347 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2352 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2357 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2362 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2363 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2368 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2369 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2374 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2379 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2384 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2389 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2394 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2399 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2404 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2409 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2414 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2419 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2424 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2429 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2434 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2439 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2444 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2449 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2454 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2459 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2464 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2469 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2470 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2475 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2480 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2485 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2490 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2495 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2500 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2505 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2507 CComPtr
<ITravelLog
> travelLog
;
2510 hResult
= GetTravelLog(&travelLog
);
2511 if (FAILED(hResult
))
2513 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2516 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2518 CComPtr
<ITravelLog
> travelLog
;
2521 hResult
= GetTravelLog(&travelLog
);
2522 if (FAILED(hResult
))
2524 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2527 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2532 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2537 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2538 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2543 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2547 V_VT(&level
) = VT_I4
;
2549 return Refresh2(&level
);
2552 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2554 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2557 hResult
= fCurrentShellView
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
2558 if (FAILED(hResult
))
2560 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2563 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2568 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2573 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2578 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2583 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2588 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2593 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2600 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2605 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2610 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2615 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2620 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2625 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2630 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2635 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2642 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2647 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2652 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2657 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2662 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2667 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2672 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2677 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2682 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2687 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2692 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2697 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2702 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2707 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2712 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2717 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2722 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2727 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2732 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2737 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2742 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2747 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2752 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2757 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2758 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2763 // called from drive combo box to navigate to a directory
2764 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2765 return E_INVALIDARG
;
2766 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2767 return E_INVALIDARG
;
2768 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2769 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2770 if (FAILED(hResult
))
2775 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2780 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2781 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2786 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2791 // called to show search bar
2792 if (V_VT(pvaClsid
) != VT_BSTR
)
2793 return E_INVALIDARG
;
2794 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2795 // TODO: properly compute the value of vertical
2797 return ShowBand(classID
, vertical
);
2800 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2805 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2810 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2815 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2820 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2825 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2830 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2835 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2840 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2845 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2850 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2855 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2860 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2865 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2870 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2875 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2880 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2882 if (pWinData
== NULL
)
2885 pWinData
->dwWindowID
= -1;
2887 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2888 pWinData
->lpszUrl
= NULL
;
2889 pWinData
->lpszUrlLocation
= NULL
;
2890 pWinData
->lpszTitle
= NULL
;
2894 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2899 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2904 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2906 CComPtr
<IPersistHistory
> viewPersistHistory
;
2907 CComPtr
<IOleObject
> viewHistoryObject
;
2908 persistState oldState
;
2913 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2914 if (FAILED(hResult
))
2916 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2918 if (oldState
.browseType
!= 2)
2920 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2922 return E_OUTOFMEMORY
;
2923 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2924 if (FAILED(hResult
))
2929 if (numRead
!= oldState
.pidlSize
)
2934 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
2935 IID_IOleObject
, reinterpret_cast<void **>(&viewHistoryObject
));
2936 fHistoryObject
= viewHistoryObject
;
2937 fHistoryStream
= pStream
;
2938 fHistoryBindContext
= pbc
;
2939 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
2940 fHistoryObject
= NULL
;
2941 fHistoryStream
= NULL
;
2942 fHistoryBindContext
= NULL
;
2944 if (FAILED(hResult
))
2949 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
2951 CComPtr
<IPersistHistory
> viewPersistHistory
;
2952 persistState newState
;
2955 hResult
= fCurrentShellView
->GetItemObject(
2956 SVGIO_BACKGROUND
, IID_IPersistHistory
, reinterpret_cast<void **>(&viewPersistHistory
));
2957 memset(&newState
, 0, sizeof(newState
));
2958 newState
.dwSize
= sizeof(newState
);
2959 newState
.browseType
= 2;
2960 newState
.browserIndex
= GetBrowserIndex();
2961 if (viewPersistHistory
.p
!= NULL
)
2963 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
2964 if (FAILED(hResult
))
2967 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
2968 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
2969 if (FAILED(hResult
))
2971 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
2972 if (FAILED(hResult
))
2974 if (viewPersistHistory
.p
!= NULL
)
2976 hResult
= viewPersistHistory
->SaveHistory(pStream
);
2977 if (FAILED(hResult
))
2983 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
2988 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
2993 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2995 // TODO: rip down everything
3000 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3002 CComPtr
<IDockingWindow
> dockingWindow
;
3003 RECT availableBounds
;
3004 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3007 if (wParam
!= SIZE_MINIMIZED
)
3009 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3010 for (INT x
= 0; x
< 3; x
++)
3012 if (fClientBars
[x
].clientBar
!= NULL
)
3014 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3015 IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
3016 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3018 hResult
= dockingWindow
->ResizeBorderDW(
3019 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3029 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3033 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3034 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3035 UpdateViewMenu(theMenu
);
3036 return RelayMsgToShellView(uMsg
, wParam
, lParam
, bHandled
);
3039 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3041 if (fCurrentShellViewWindow
!= NULL
)
3042 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3046 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3051 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3055 hResult
= DoFolderOptions();
3059 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3062 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3063 #endif /* __REACTOS__ */
3067 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3070 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3071 #endif /* __REACTOS__ */
3075 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3077 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3081 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3089 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3093 hResult
= GoForward();
3097 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3101 hResult
= NavigateToParent();
3105 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3113 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3117 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3118 PSHOpenNewFrame Func
;
3121 hShlwapi
= LoadLibrary(TEXT("browseui.dll"));
3122 if (hShlwapi
!= NULL
)
3123 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(hShlwapi
, (LPCSTR
)103));
3128 LPITEMIDLIST desktopPIDL
;
3130 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3131 if (SUCCEEDED(hResult
))
3133 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3139 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3141 fStatusBarVisible
= !fStatusBarVisible
;
3142 // TODO: trigger a relayout of contained items
3146 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3148 CComPtr
<IOleCommandTarget
> commandTarget
;
3151 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3152 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3153 if (FAILED(hResult
))
3155 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3159 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(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_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3172 LRESULT
CShellBrowser::OnToggleAddressBandVisible(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_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3185 LRESULT
CShellBrowser::OnToggleLinksBandVisible(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_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3198 LRESULT
CShellBrowser::OnToggleTextLabels(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_TEXTLABELS
, 0, NULL
, NULL
);
3211 LRESULT
CShellBrowser::OnToolbarCustomize(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_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3224 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3229 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3231 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3232 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3236 //static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
3238 // return DefWindowProc(hwnd, uMsg, wParam, lParam);
3241 static void ExplorerMessageLoop()
3248 Ret
= (GetMessage(&Msg
, NULL
, 0, 0) != 0);
3255 TranslateMessage(&Msg
);
3256 DispatchMessage(&Msg
);
3261 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3263 CComPtr
<IShellBrowser
> shellBrowser
;
3264 CComObject
<CShellBrowser
> *theCabinet
;
3265 IEThreadParamBlock
*parameters
;
3268 parameters
= (IEThreadParamBlock
*)lpThreadParameter
;
3269 OleInitialize(NULL
);
3270 ATLTRY (theCabinet
= new CComObject
<CShellBrowser
>);
3271 if (theCabinet
== NULL
)
3272 return E_OUTOFMEMORY
;
3273 hResult
= theCabinet
->QueryInterface(IID_IShellBrowser
, reinterpret_cast<void **>(&shellBrowser
));
3274 if (FAILED(hResult
))
3279 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3280 if (FAILED(hResult
))
3282 ExplorerMessageLoop();