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
);
820 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
822 CComPtr
<IShellFolder
> newFolder
;
823 FOLDERSETTINGS newFolderSettings
;
826 // called by shell view to browse to new folder
827 // also called by explorer band to navigate to new folder
828 hResult
= SHBindToFolder(pidl
, &newFolder
);
829 newFolderSettings
.ViewMode
= FVM_LIST
;
830 newFolderSettings
.fFlags
= 0;
831 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
837 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
839 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
842 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
844 LPCITEMIDLIST pidlnext
;
849 if (! _ILIsDesktop(pidl
))
851 length
= pidl
->mkid
.cb
;
853 reinterpret_cast<LPCITEMIDLIST
>(
854 reinterpret_cast<const BYTE
*>(pidl
) + length
);
855 if (pidlnext
->mkid
.cb
!= 0)
861 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
862 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
864 CComPtr
<IShellFolder
> psf
;
865 LPITEMIDLIST pidlChild
;
866 LPITEMIDLIST pidlParent
;
873 if (ppidlLast
!= NULL
)
875 if (_ILIsPidlSimple(pidl
))
877 if (ppidlLast
!= NULL
)
878 *ppidlLast
= ILClone(pidl
);
879 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
883 pidlChild
= ILClone(ILFindLastID(pidl
));
884 pidlParent
= ILClone(pidl
);
885 ILRemoveLastID(pidlParent
);
886 hResult
= SHGetDesktopFolder(&psf
);
887 if (SUCCEEDED(hResult
))
888 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
889 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
890 *ppidlLast
= pidlChild
;
898 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
899 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
901 CComPtr
<IShellFolder
> parentFolder
;
902 LPITEMIDLIST childPIDL
;
906 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_IShellFolder
,
907 reinterpret_cast<void **>(&parentFolder
), &childPIDL
);
908 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
909 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
911 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
916 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
918 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
921 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
922 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
924 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
925 CComPtr
<IObjectWithSite
> objectWithSite
;
926 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
927 CComPtr
<IShellView
> saveCurrentShellView
;
928 CComPtr
<IShellView
> newShellView
;
929 CComPtr
<ITravelLog
> travelLog
;
930 HWND newShellViewWindow
;
931 BOOL windowUpdateIsLocked
;
932 RECT shellViewWindowBounds
;
935 wchar_t newTitle
[MAX_PATH
];
939 if (newShellFolder
== NULL
)
942 hResult
= GetTravelLog(&travelLog
);
947 if (flags
& BTP_UPDATE_CUR_HISTORY
)
949 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
950 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
951 // what to do with error? Do we want to halt browse because state save failed?
954 // create view object
955 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_IShellView
, reinterpret_cast<void **>(&newShellView
));
958 previousView
= fCurrentShellViewWindow
;
960 // enter updating section
961 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
962 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
963 if (fCurrentShellView
!= NULL
)
964 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
967 hResult
= newShellView
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
968 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
969 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
971 // update folder and view
972 saveCurrentShellFolder
= fCurrentShellFolder
;
973 saveCurrentShellView
= fCurrentShellView
;
974 fCurrentShellFolder
= newShellFolder
;
975 fCurrentShellView
= newShellView
;
978 if (previousView
!= NULL
)
979 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
981 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
982 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
984 // create view window
985 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
986 this, &shellViewWindowBounds
, &newShellViewWindow
);
987 if (FAILED(hResult
) || newShellViewWindow
== NULL
)
989 fCurrentShellView
= saveCurrentShellView
;
990 fCurrentShellFolder
= saveCurrentShellFolder
;
991 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
992 if (windowUpdateIsLocked
)
993 LockWindowUpdate(FALSE
);
994 SetCursor(saveCursor
);
998 if (objectWithSite
.p
!= NULL
)
999 hResult
= objectWithSite
->SetSite(NULL
);
1001 // update current pidl
1002 ILFree(fCurrentDirectoryPIDL
);
1003 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1005 // update view window
1006 if (saveCurrentShellView
!= NULL
)
1007 saveCurrentShellView
->DestroyViewWindow();
1008 fCurrentShellViewWindow
= newShellViewWindow
;
1010 // get command target
1011 oleCommandTarget
.Release();
1012 hResult
= newShellView
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1015 saveCurrentShellView
.Release();
1016 saveCurrentShellFolder
.Release();
1018 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1020 // leave updating section
1021 if (windowUpdateIsLocked
)
1022 LockWindowUpdate(FALSE
);
1023 SetCursor(saveCursor
);
1026 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1028 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1029 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1033 FireNavigateComplete(L
"c:\\temp"); // TODO: use real path here
1034 if (fCabinetState
.fFullPathTitle
)
1035 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1037 nameFlags
= SHGDN_FORADDRESSBAR
;
1038 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1039 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1040 if (SUCCEEDED(hResult
))
1041 SetWindowText(newTitle
);
1043 // TODO: Update the window icon
1045 FireCommandStateChangeAll();
1046 hResult
= UpdateForwardBackState();
1050 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1052 CComPtr
<IServiceProvider
> serviceProvider
;
1053 CComPtr
<IBandSite
> bandSite
;
1054 CComPtr
<IDeskBand
> deskBand
;
1057 if (fClientBars
[BIInternetToolbar
].clientBar
.p
== NULL
)
1059 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1060 IID_IServiceProvider
, reinterpret_cast<void **>(&serviceProvider
));
1061 if (FAILED(hResult
))
1063 hResult
= serviceProvider
->QueryService(SID_IBandSite
, IID_IBandSite
, reinterpret_cast<void **>(&bandSite
));
1064 if (FAILED(hResult
))
1066 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1067 if (FAILED(hResult
))
1069 return deskBand
->QueryInterface(riid
, shellMenu
);
1072 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1074 CComPtr
<IUnknown
> newBaseBar
;
1075 CComPtr
<IDeskBar
> deskBar
;
1076 CComPtr
<IUnknown
> newBaseBarSite
;
1077 CComPtr
<IObjectWithSite
> objectWithSite
;
1078 CComPtr
<IDeskBarClient
> deskBarClient
;
1083 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1085 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1088 hResult
= CreateBaseBar(IID_IUnknown
, reinterpret_cast<void **>(&newBaseBar
));
1089 if (FAILED(hResult
))
1091 hResult
= CreateBaseBarSite(IID_IUnknown
, reinterpret_cast<void **>(&newBaseBarSite
));
1092 if (FAILED(hResult
))
1095 // tell the new base bar about the shell browser
1096 hResult
= newBaseBar
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1097 if (FAILED(hResult
))
1099 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1100 if (FAILED(hResult
))
1103 // tell the new base bar about the new base bar site
1104 hResult
= newBaseBar
->QueryInterface(IID_IDeskBar
, reinterpret_cast<void **>(&deskBar
));
1105 if (FAILED(hResult
))
1107 hResult
= deskBar
->SetClient(newBaseBarSite
);
1108 if (FAILED(hResult
))
1111 // tell the new base bar site about the new base bar
1112 hResult
= newBaseBarSite
->QueryInterface(IID_IDeskBarClient
, reinterpret_cast<void **>(&deskBarClient
));
1113 if (FAILED(hResult
))
1115 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1116 if (FAILED(hResult
))
1119 *cache
= newBaseBar
.Detach();
1121 return (*cache
)->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(theBaseBar
));
1124 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1126 CComPtr
<IDockingWindow
> dockingWindow
;
1127 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1128 CComPtr
<IUnknown
> baseBarSite
;
1129 CComPtr
<IUnknown
> newBand
;
1130 CComPtr
<IUnknown
> theBaseBar
;
1131 CComPtr
<IDeskBar
> deskBar
;
1135 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1136 if (FAILED(hResult
))
1138 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_IUnknown
,
1139 reinterpret_cast<void **>(&newBand
));
1140 if (FAILED(hResult
))
1142 hResult
= theBaseBar
->QueryInterface(IID_IDeskBar
, reinterpret_cast<void **>(&deskBar
));
1143 if (FAILED(hResult
))
1145 hResult
= deskBar
->GetClient(&baseBarSite
);
1146 if (FAILED(hResult
))
1148 hResult
= theBaseBar
->QueryInterface(IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
1149 if (FAILED(hResult
))
1151 hResult
= baseBarSite
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1152 if (FAILED(hResult
))
1154 V_VT(&vaIn
) = VT_UNKNOWN
;
1155 V_UNKNOWN(&vaIn
) = newBand
.p
;
1156 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1157 if (FAILED(hResult
))
1159 hResult
= dockingWindow
->ShowDW(TRUE
);
1160 if (FAILED(hResult
))
1165 HRESULT
CShellBrowser::NavigateToParent()
1167 LPITEMIDLIST newDirectory
;
1170 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1171 if (newDirectory
== NULL
)
1172 return E_OUTOFMEMORY
;
1173 ILRemoveLastID(newDirectory
);
1174 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1175 ILFree(newDirectory
);
1176 if (FAILED(hResult
))
1181 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1183 PROPSHEETHEADER
*sheetInfo
;
1185 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1186 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1188 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1189 sheetInfo
->nPages
++;
1193 HRESULT
CShellBrowser::DoFolderOptions()
1195 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1196 CComPtr
<IObjectWithSite
> objectWithSite
;
1197 PROPSHEETHEADER m_PropSheet
;
1198 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1199 // CComPtr<IGlobalFolderSettings> globalSettings;
1200 // SHELLSTATE2 shellState;
1203 memset(m_psp
, 0, sizeof(m_psp
));
1204 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1206 // create sheet object
1207 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1208 IID_IShellPropSheetExt
, reinterpret_cast<void **>(&folderOptionsSheet
));
1209 if (FAILED(hResult
))
1212 // must set site in order for Apply to all Folders on Advanced page to be enabled
1213 hResult
= folderOptionsSheet
->QueryInterface(IID_IObjectWithSite
, reinterpret_cast<void **>(&objectWithSite
));
1214 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1215 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1216 m_PropSheet
.phpage
= m_psp
;
1219 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_IGlobalFolderSettings
, (void **)&globalSettings
);
1220 if (FAILED(hResult
))
1222 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1223 if (FAILED(hResult
))
1228 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1229 if (FAILED(hResult
))
1232 if (fCurrentShellView
!= NULL
)
1234 hResult
= fCurrentShellView
->AddPropertySheetPages(
1235 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1236 if (FAILED(hResult
))
1241 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1242 m_PropSheet
.dwFlags
= 0;
1243 m_PropSheet
.hwndParent
= m_hWnd
;
1244 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1245 m_PropSheet
.pszCaption
= _T("Folder Options");
1246 m_PropSheet
.nStartPage
= 0;
1247 PropertySheet(&m_PropSheet
);
1251 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1253 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1254 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1256 CComPtr
<IMenuBand
> menuBand
;
1257 const _ATL_MSG
*previousMessage
;
1259 WNDPROC saveWindowProc
;
1262 hWnd
= pThis
->m_hWnd
;
1263 previousMessage
= pThis
->m_pCurrentMsg
;
1264 pThis
->m_pCurrentMsg
= &msg
;
1266 hResult
= pThis
->GetMenuBand(IID_IMenuBand
, reinterpret_cast<void **>(&menuBand
));
1267 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1269 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1270 if (hResult
== S_OK
)
1273 wParam
= msg
.wParam
;
1274 lParam
= msg
.lParam
;
1277 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1278 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1279 if (handled
== FALSE
)
1281 if (uMsg
== WM_NCDESTROY
)
1283 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1284 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1285 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1286 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1287 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1290 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1292 pThis
->m_pCurrentMsg
= previousMessage
;
1293 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1295 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1296 pThis
->m_hWnd
= NULL
;
1297 pThis
->OnFinalMessage(hWnd
);
1302 void CShellBrowser::RepositionBars()
1310 GetClientRect(&clientRect
);
1312 if (fStatusBarVisible
)
1314 ::GetWindowRect(fStatusBar
, &statusRect
);
1315 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1316 clientRect
.right
- clientRect
.left
,
1317 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1318 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1321 for (x
= 0; x
< 3; x
++)
1323 CComPtr
<IOleWindow
> oleWindow
;
1325 if (fClientBars
[x
].hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1327 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
1328 IID_IOleWindow
, reinterpret_cast<void **>(&oleWindow
));
1329 if (SUCCEEDED(hResult
))
1330 hResult
= oleWindow
->GetWindow(&fClientBars
[x
].hwnd
);
1332 if (fClientBars
[x
].hwnd
!= NULL
)
1334 toolbarRect
= clientRect
;
1335 if (fClientBars
[x
].borderSpace
.top
!= 0)
1336 toolbarRect
.bottom
= toolbarRect
.top
+ fClientBars
[x
].borderSpace
.top
;
1337 else if (fClientBars
[x
].borderSpace
.bottom
!= 0)
1338 toolbarRect
.top
= toolbarRect
.bottom
- fClientBars
[x
].borderSpace
.bottom
;
1339 if (fClientBars
[x
].borderSpace
.left
!= 0)
1340 toolbarRect
.right
= toolbarRect
.left
+ fClientBars
[x
].borderSpace
.left
;
1341 else if (fClientBars
[x
].borderSpace
.right
!= 0)
1342 toolbarRect
.left
= toolbarRect
.right
- fClientBars
[x
].borderSpace
.right
;
1343 ::SetWindowPos(fClientBars
[x
].hwnd
, NULL
, toolbarRect
.left
, toolbarRect
.top
,
1344 toolbarRect
.right
- toolbarRect
.left
,
1345 toolbarRect
.bottom
- toolbarRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1346 clientRect
.top
+= fClientBars
[x
].borderSpace
.top
;
1347 clientRect
.left
+= fClientBars
[x
].borderSpace
.left
;
1348 clientRect
.bottom
+= fClientBars
[x
].borderSpace
.bottom
;
1349 clientRect
.right
+= fClientBars
[x
].borderSpace
.right
;
1352 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1353 clientRect
.right
- clientRect
.left
,
1354 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1357 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1360 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1361 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1364 params
.rgvarg
= arguments
;
1365 params
.rgdispidNamedArgs
= NULL
;
1366 params
.cArgs
= argCount
;
1367 params
.cNamedArgs
= 0;
1368 IUnknown
** pp
= vec
.begin();
1369 while (pp
< vec
.end())
1373 CComPtr
<IDispatch
> theDispatch
;
1375 hResult
= (*pp
)->QueryInterface(IID_IDispatch
, reinterpret_cast<void **>(&theDispatch
));
1376 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1381 while (pp
< vec2
.end())
1385 CComPtr
<IDispatch
> theDispatch
;
1387 hResult
= (*pp
)->QueryInterface(IID_IDispatch
, reinterpret_cast<void **>(&theDispatch
));
1388 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1395 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1397 // these two variants intentionally to do use CComVariant because it would double free/release
1398 // or does not need to dispose at all
1401 CComBSTR
tempString(newDirectory
);
1403 V_VT(&varArgs
) = VT_BSTR
;
1404 V_BSTR(&varArgs
) = tempString
.m_str
;
1406 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1407 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1408 V_VT(&varArg
[1]) = VT_DISPATCH
;
1409 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1411 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1414 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1418 V_VT(&varArg
[0]) = VT_BOOL
;
1419 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1420 V_VT(&varArg
[1]) = VT_I4
;
1421 V_I4(&varArg
[1]) = commandID
;
1423 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1426 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1428 return FireCommandStateChange(false, -1);
1431 HRESULT
CShellBrowser::UpdateForwardBackState()
1433 CComPtr
<ITravelLog
> travelLog
;
1434 CComPtr
<ITravelEntry
> unusedEntry
;
1440 canGoForward
= false;
1441 hResult
= GetTravelLog(&travelLog
);
1442 if (FAILED(hResult
))
1444 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1445 if (SUCCEEDED(hResult
))
1448 unusedEntry
.Release();
1450 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1451 if (SUCCEEDED(hResult
))
1453 canGoForward
= true;
1454 unusedEntry
.Release();
1456 hResult
= FireCommandStateChange(canGoBack
, 2);
1457 hResult
= FireCommandStateChange(canGoForward
, 1);
1461 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1463 CComPtr
<ITravelLog
> travelLog
;
1465 MENUITEMINFO menuItemInfo
;
1468 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1470 position
= GetMenuItemCount(theMenu
);
1471 hResult
= GetTravelLog(&travelLog
);
1472 if (FAILED(hResult
))
1474 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1475 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1476 if (SUCCEEDED(hResult
))
1478 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1479 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1480 menuItemInfo
.fType
= MF_SEPARATOR
;
1481 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1482 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1486 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1488 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1489 CComPtr
<ITravelLog
> travelLog
;
1491 OLECMD commandList
[5];
1492 HMENU toolbarMenuBar
;
1494 MENUITEMINFO menuItemInfo
;
1497 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1498 if (gotoMenu
!= NULL
)
1499 UpdateGotoMenu(gotoMenu
);
1501 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1502 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1503 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1504 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1505 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1507 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1508 IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
1509 if (SUCCEEDED(hResult
))
1510 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1511 if (FAILED(hResult
))
1512 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1515 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1516 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1518 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1519 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1520 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1521 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1522 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1523 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1524 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1525 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1527 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1528 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1529 menuItemInfo
.hSubMenu
= toolbarMenu
;
1530 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1532 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1535 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1537 CComPtr
<IUnknown
> int1Retry
;
1538 CComPtr
<IUnknown
> int2Retry
;
1543 if (int1
== NULL
|| int2
== NULL
)
1545 hResult
= int1
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&int1Retry
));
1546 if (FAILED(hResult
))
1548 hResult
= int2
->QueryInterface(IID_IUnknown
, reinterpret_cast<void **>(&int2Retry
));
1549 if (FAILED(hResult
))
1551 if (int1Retry
== int2Retry
)
1556 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1558 RECT availableBounds
;
1559 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
1561 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1562 for (INT x
= 0; x
< 3; x
++)
1564 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1566 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1567 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1568 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1569 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1572 *prcBorder
= availableBounds
;
1576 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1581 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1583 for (INT x
= 0; x
< 3; x
++)
1585 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1587 fClientBars
[x
].borderSpace
= *pbw
;
1588 // if this bar changed size, it cascades and forces all subsequent bars to resize
1593 return E_INVALIDARG
;
1596 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1597 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1599 CComPtr
<IOleCommandTarget
> commandTarget
;
1602 if (prgCmds
== NULL
)
1603 return E_INVALIDARG
;
1604 if (pguidCmdGroup
== NULL
)
1606 if (fCurrentShellView
.p
!= NULL
)
1608 hResult
= fCurrentShellView
->QueryInterface(IID_IOleCommandTarget
,
1609 reinterpret_cast<void **>(&commandTarget
));
1610 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1611 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1620 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1624 switch (prgCmds
->cmdID
)
1626 case 0x1c: // search
1627 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1629 case 0x1d: // history
1630 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1632 case 0x1e: // favorites
1633 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1635 case 0x23: // folders
1636 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1646 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1650 switch (prgCmds
->cmdID
)
1652 case 0xa022: // up level
1653 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1654 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1655 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1665 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1666 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1670 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1675 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1678 if (nCmdexecopt
== 1)
1680 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1684 // update zones part of the status bar
1687 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1688 V_VT(pvaOut
) = VT_INT_PTR
;
1689 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1690 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1693 // indicate if this cabinet was opened as a browser
1699 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1708 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1713 // what is theater mode and why do we receive this?
1717 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1722 // initialize favorites menu
1726 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1731 // refresh on toolbar clicked
1734 // tell the view if it should hide the task pane or not
1735 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1738 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1743 return NavigateToParent();
1746 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1751 return DoFolderOptions();
1754 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1759 // Reset All Folders option in Folder Options
1770 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1778 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1783 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1785 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1786 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1788 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1791 lpMenuWidths
->width
[0] = 2;
1792 lpMenuWidths
->width
[2] = 3;
1793 lpMenuWidths
->width
[4] = 1;
1797 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1799 CComPtr
<IShellMenu
> shellMenu
;
1802 if (IsMenu(hmenuShared
) == FALSE
)
1804 hResult
= GetMenuBand(IID_IShellMenu
, reinterpret_cast<void **>(&shellMenu
));
1805 if (FAILED(hResult
))
1807 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1808 if (FAILED(hResult
))
1810 fCurrentMenuBar
= hmenuShared
;
1814 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1816 if (hmenuShared
== fCurrentMenuBar
)
1817 fCurrentMenuBar
= NULL
;
1821 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1826 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1831 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1836 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1838 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1841 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1846 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1854 *lphwnd
= fToolbarProxy
.m_hWnd
;
1857 *lphwnd
= fStatusBar
;
1860 // find the directory browser and return it
1861 // this should be used only to determine if a tree is present
1864 // is this a progress dialog?
1870 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1871 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1880 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1885 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1893 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1897 *ppshv
= fCurrentShellView
;
1898 if (fCurrentShellView
.p
!= NULL
)
1899 fCurrentShellView
.p
->AddRef();
1903 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1908 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1913 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1914 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1919 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1924 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
1929 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
1930 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1935 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
1937 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
1938 // the returned interface has a method GetPropertyBag on it
1939 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
1940 return this->QueryInterface(riid
, ppvObject
);
1941 if (IsEqualIID(guidService
, SID_SShellBrowser
))
1942 return this->QueryInterface(riid
, ppvObject
);
1943 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
1944 return this->QueryInterface(riid
, ppvObject
);
1945 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
1946 return this->QueryInterface(riid
, ppvObject
);
1947 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
1948 return this->QueryInterface(riid
, ppvObject
);
1949 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
1950 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
1951 if (IsEqualIID(riid
, IID_IShellBrowser
))
1952 return this->QueryInterface(riid
, ppvObject
);
1953 return E_NOINTERFACE
;
1956 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
1958 if (ppvObject
== NULL
)
1964 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
1969 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
1974 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
1975 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
1980 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
1981 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
1986 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
1991 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
1996 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2001 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2006 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2010 // called by toolbar when displaying tooltips
2013 if (fTravelLog
.p
== NULL
)
2015 hResult
= CreateTravelLog(IID_ITravelLog
, reinterpret_cast<void **>(&fTravelLog
));
2016 if (FAILED(hResult
))
2019 *pptl
= fTravelLog
.p
;
2020 fTravelLog
.p
->AddRef();
2024 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2029 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2034 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2039 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2044 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2049 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2054 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2059 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2064 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2069 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2074 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2079 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2084 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2089 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2094 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2096 // called by explorer bar to get current pidl
2099 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2103 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2108 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2113 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2118 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2120 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2121 return E_INVALIDARG
;
2122 *ppole
= fHistoryObject
;
2123 if (fHistoryObject
!= NULL
)
2124 fHistoryObject
->AddRef();
2125 *pstm
= fHistoryStream
;
2126 if (fHistoryStream
!= NULL
)
2127 fHistoryStream
->AddRef();
2128 *ppbc
= fHistoryBindContext
;
2129 if (fHistoryBindContext
!= NULL
)
2130 fHistoryBindContext
->AddRef();
2131 fHistoryObject
= NULL
;
2132 fHistoryStream
= NULL
;
2133 fHistoryBindContext
= NULL
;
2139 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2144 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2149 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2154 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2155 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2165 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2170 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2180 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2185 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2190 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2195 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2200 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2205 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2210 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2215 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2220 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2225 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2230 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2231 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2236 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2241 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2246 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2251 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2256 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2261 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2266 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2271 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2276 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2281 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2286 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2291 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2296 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2301 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2306 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2311 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2316 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2321 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2326 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2331 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2336 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2341 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2342 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2347 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2348 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2353 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2358 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2363 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2368 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2373 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2378 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2383 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2388 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2398 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2403 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2408 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2413 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2418 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2423 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2428 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2433 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2438 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2443 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2448 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2449 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2454 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2459 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2464 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2469 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2474 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2479 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2484 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2486 CComPtr
<ITravelLog
> travelLog
;
2489 hResult
= GetTravelLog(&travelLog
);
2490 if (FAILED(hResult
))
2492 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2495 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2497 CComPtr
<ITravelLog
> travelLog
;
2500 hResult
= GetTravelLog(&travelLog
);
2501 if (FAILED(hResult
))
2503 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2506 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2511 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2516 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2517 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2522 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2526 V_VT(&level
) = VT_I4
;
2528 return Refresh2(&level
);
2531 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2533 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2536 hResult
= fCurrentShellView
->QueryInterface(IID_IOleCommandTarget
, reinterpret_cast<void **>(&oleCommandTarget
));
2537 if (FAILED(hResult
))
2539 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2542 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2547 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2552 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2557 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2562 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2567 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2572 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2579 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2584 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2589 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2594 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2599 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2604 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2609 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2614 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2621 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2626 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2631 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2636 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2641 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2646 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2651 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2656 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2661 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2666 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2671 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2676 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2681 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2686 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2691 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2696 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2701 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2706 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2711 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2716 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2721 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2726 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2731 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2736 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2737 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2742 // called from drive combo box to navigate to a directory
2743 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2744 return E_INVALIDARG
;
2745 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2746 return E_INVALIDARG
;
2747 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2748 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2749 if (FAILED(hResult
))
2754 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2759 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2760 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2765 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2770 // called to show search bar
2771 if (V_VT(pvaClsid
) != VT_BSTR
)
2772 return E_INVALIDARG
;
2773 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2774 // TODO: properly compute the value of vertical
2776 return ShowBand(classID
, vertical
);
2779 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2784 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2789 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2794 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2799 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2804 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2809 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2814 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2819 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2824 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2829 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2834 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2839 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2844 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2849 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2854 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2859 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2861 if (pWinData
== NULL
)
2864 pWinData
->dwWindowID
= -1;
2866 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2867 pWinData
->lpszUrl
= NULL
;
2868 pWinData
->lpszUrlLocation
= NULL
;
2869 pWinData
->lpszTitle
= NULL
;
2873 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2878 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2883 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2885 CComPtr
<IPersistHistory
> viewPersistHistory
;
2886 CComPtr
<IOleObject
> viewHistoryObject
;
2887 persistState oldState
;
2892 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2893 if (FAILED(hResult
))
2895 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2897 if (oldState
.browseType
!= 2)
2899 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2901 return E_OUTOFMEMORY
;
2902 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2903 if (FAILED(hResult
))
2908 if (numRead
!= oldState
.pidlSize
)
2913 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
2914 IID_IOleObject
, reinterpret_cast<void **>(&viewHistoryObject
));
2915 fHistoryObject
= viewHistoryObject
;
2916 fHistoryStream
= pStream
;
2917 fHistoryBindContext
= pbc
;
2918 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
2919 fHistoryObject
= NULL
;
2920 fHistoryStream
= NULL
;
2921 fHistoryBindContext
= NULL
;
2923 if (FAILED(hResult
))
2928 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
2930 CComPtr
<IPersistHistory
> viewPersistHistory
;
2931 persistState newState
;
2934 hResult
= fCurrentShellView
->GetItemObject(
2935 SVGIO_BACKGROUND
, IID_IPersistHistory
, reinterpret_cast<void **>(&viewPersistHistory
));
2936 memset(&newState
, 0, sizeof(newState
));
2937 newState
.dwSize
= sizeof(newState
);
2938 newState
.browseType
= 2;
2939 newState
.browserIndex
= GetBrowserIndex();
2940 if (viewPersistHistory
.p
!= NULL
)
2942 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
2943 if (FAILED(hResult
))
2946 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
2947 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
2948 if (FAILED(hResult
))
2950 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
2951 if (FAILED(hResult
))
2953 if (viewPersistHistory
.p
!= NULL
)
2955 hResult
= viewPersistHistory
->SaveHistory(pStream
);
2956 if (FAILED(hResult
))
2962 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
2967 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
2972 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2974 // TODO: rip down everything
2979 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
2981 CComPtr
<IDockingWindow
> dockingWindow
;
2982 RECT availableBounds
;
2983 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
2986 if (wParam
!= SIZE_MINIMIZED
)
2988 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
2989 for (INT x
= 0; x
< 3; x
++)
2991 if (fClientBars
[x
].clientBar
!= NULL
)
2993 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
2994 IID_IDockingWindow
, reinterpret_cast<void **>(&dockingWindow
));
2995 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
2997 hResult
= dockingWindow
->ResizeBorderDW(
2998 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3008 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3012 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3013 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3014 UpdateViewMenu(theMenu
);
3015 return RelayMsgToShellView(uMsg
, wParam
, lParam
, bHandled
);
3018 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3020 if (fCurrentShellViewWindow
!= NULL
)
3021 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3025 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3030 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3034 hResult
= DoFolderOptions();
3038 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3041 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3042 #endif /* __REACTOS__ */
3046 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3049 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3050 #endif /* __REACTOS__ */
3054 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3056 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3060 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3068 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3072 hResult
= GoForward();
3076 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3080 hResult
= NavigateToParent();
3084 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3092 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3096 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3097 PSHOpenNewFrame Func
;
3100 hShlwapi
= LoadLibrary(TEXT("browseui.dll"));
3101 if (hShlwapi
!= NULL
)
3102 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(hShlwapi
, (LPCSTR
)103));
3107 LPITEMIDLIST desktopPIDL
;
3109 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3110 if (SUCCEEDED(hResult
))
3112 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3118 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3120 fStatusBarVisible
= !fStatusBarVisible
;
3121 // TODO: trigger a relayout of contained items
3125 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3127 CComPtr
<IOleCommandTarget
> commandTarget
;
3130 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3131 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3132 if (FAILED(hResult
))
3134 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3138 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3140 CComPtr
<IOleCommandTarget
> commandTarget
;
3143 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3144 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3145 if (FAILED(hResult
))
3147 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3151 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3153 CComPtr
<IOleCommandTarget
> commandTarget
;
3156 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3157 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3158 if (FAILED(hResult
))
3160 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3164 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3166 CComPtr
<IOleCommandTarget
> commandTarget
;
3169 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3170 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3171 if (FAILED(hResult
))
3173 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3177 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3179 CComPtr
<IOleCommandTarget
> commandTarget
;
3182 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3183 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3184 if (FAILED(hResult
))
3186 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3190 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3192 CComPtr
<IOleCommandTarget
> commandTarget
;
3195 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3196 IID_IOleCommandTarget
, reinterpret_cast<void **>(&commandTarget
));
3197 if (FAILED(hResult
))
3199 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3203 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3208 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3210 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3211 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3215 //static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
3217 // return DefWindowProc(hwnd, uMsg, wParam, lParam);
3220 static void ExplorerMessageLoop()
3227 Ret
= (GetMessage(&Msg
, NULL
, 0, 0) != 0);
3234 TranslateMessage(&Msg
);
3235 DispatchMessage(&Msg
);
3237 if (Msg
.message
== WM_QUIT
)
3243 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3245 CComPtr
<IShellBrowser
> shellBrowser
;
3246 CComObject
<CShellBrowser
> *theCabinet
;
3247 IEThreadParamBlock
*parameters
;
3250 parameters
= (IEThreadParamBlock
*)lpThreadParameter
;
3251 OleInitialize(NULL
);
3252 ATLTRY (theCabinet
= new CComObject
<CShellBrowser
>);
3253 if (theCabinet
== NULL
)
3254 return E_OUTOFMEMORY
;
3255 hResult
= theCabinet
->QueryInterface(IID_IShellBrowser
, reinterpret_cast<void **>(&shellBrowser
));
3256 if (FAILED(hResult
))
3261 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3262 if (FAILED(hResult
))
3264 ExplorerMessageLoop();