4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 BOOL WINAPI
Shell_GetImageLists(
28 _Out_ HIMAGELIST
*phiml
,
29 _Out_ HIMAGELIST
*phimlSmall
);
31 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
33 #include "newatlinterfaces.h"
37 **Provide implementation of new and delete that use LocalAlloc
38 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
39 view doesn't restore the selection correctly.
40 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
41 **Add brand band bitmaps to shell32.dll
42 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
43 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
44 current state overwrites the wrong entry's contents. This needs to be changed.
45 ****Fix close of browser window to release all objects
46 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
47 **When a new bar is added to base bar site, how is base bar told so it can resize?
48 **Does the base bar site have a classid?
49 **What should refresh command send to views to make them refresh?
50 **When new bar is created, what status notifications need to be fired?
51 **How does keyboard filtering dispatch?
52 **For deferred persist history load, how does the view connect up and get the state?
53 How does context menu send open, cut, rename commands to its site (the shell view)?
54 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
56 **Route View->Toolbars commands to internet toolbar
57 **Handle travel log items in View->Go
58 **Fix ShowBrowserBar to pass correct size on when bar is shown
59 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
60 ****Make ShowToolbar check if bar is already created before creating it again
61 ****Shell should fill in the list of explorer bars in the View submenus
62 **Add folder menu in the file menu
63 **Fix CShellBrowser::GetBorderDW to compute available size correctly
64 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
65 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
66 Make folders toolbar item update state appropriately
67 Read list of bands from registry on launch
68 Read list of bars from registry on launch
69 If the folders or search bars don't exist, disable the toolbar buttons
70 If the favorites or history bars don't exist, disable the toolbar butons
71 Fix Apply to all Folders in Folder Options
72 Implement close command
73 Add explorer band context menu to file menu
74 Add code to allow restore of internet toolbar from registry
75 Fix code that calls FireNavigateComplete to pass the correct new path
77 What are the other command ids for QueryStatus/FireCommandStateChange?
79 Add handler for cabinet settings change
80 Add handler for system metrics change (renegotiate border space?)
81 Add handler for theme change and forward to contained windows
83 When folders are shown, the status bar text should change
84 Add code to save/restore shell view settings
85 Implement tabbing between frames
86 Fix handling of focus everywhere
87 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
89 The status bar doesn't show help text for items owned by frame during menu tracking
90 Stub out frame command handlers
91 "Arrange icons by" group is not checked properly
93 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
94 the icon is always an open folder with magnifying glass
95 Fix bars to calculate height correctly
96 Hookup policies for everything...
97 Investigate toolbar message WM_USER+93
98 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
100 Vertical Explorer Bar CATID_InfoBand
101 Horizontal Explorer Bar CATID_CommBand
102 Desk Band CATID_DeskBand
105 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
106 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
108 create key here with CLSID of bar to register tool band
109 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
114 #pragma comment(linker, \
115 "\"/manifestdependency:type='Win32' "\
116 "name='Microsoft.Windows.Common-Controls' "\
117 "version='6.0.0.0' "\
118 "processorArchitecture='*' "\
119 "publicKeyToken='6595b64144ccf1df' "\
123 struct categoryCacheHeader
125 long dwSize
; // size of header only
126 long version
; // currently 1
127 SYSTEMTIME writeTime
; // time we were written to registry
128 long classCount
; // number of classes following
131 static const unsigned int folderOptionsPageCountMax
= 20;
132 static const long BTP_UPDATE_CUR_HISTORY
= 1;
133 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
135 BOOL createNewStuff
= false;
138 // this class is private to browseui.dll and is not registered externally?
139 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
142 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
143 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
144 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
147 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
150 HMENU
SHGetMenuFromID(HMENU topMenu
, int theID
)
152 MENUITEMINFO menuItemInfo
;
154 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
155 menuItemInfo
.fMask
= MIIM_SUBMENU
;
156 if (!GetMenuItemInfo(topMenu
, theID
, FALSE
, &menuItemInfo
))
158 return menuItemInfo
.hSubMenu
;
161 void SHCheckMenuItem(HMENU theMenu
, int theID
, BOOL checked
)
163 MENUITEMINFO menuItemInfo
;
165 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
166 menuItemInfo
.fMask
= MIIM_STATE
;
167 if (GetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
))
170 menuItemInfo
.fState
|= MF_CHECKED
;
172 menuItemInfo
.fState
&= ~MF_CHECKED
;
173 SetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
);
177 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
179 MENUITEMINFO menuItemInfo
;
183 menuItemCount
= GetMenuItemCount(theMenu
);
185 while (curIndex
< menuItemCount
)
187 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
188 menuItemInfo
.fMask
= MIIM_ID
;
189 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
190 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
192 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
200 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
202 CComPtr
<IShellFolder
> desktop
;
204 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
205 if (FAILED_UNEXPECTEDLY(hr
))
207 if (path
== NULL
|| path
->mkid
.cb
== 0)
209 *newFolder
= desktop
;
210 desktop
.p
->AddRef ();
213 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
216 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
217 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
222 class CToolbarProxy
:
223 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
226 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
228 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
233 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
234 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
236 BEGIN_MSG_MAP(CToolbarProxy
)
237 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
238 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
242 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
247 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
248 if (myWindow
!= NULL
)
250 SubclassWindow(myWindow
);
251 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
252 hResult
= explorerToolbar
->QueryInterface(
253 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
257 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
263 if (fExplorerToolbar
.p
!= NULL
)
265 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
266 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
267 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
268 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
273 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
279 if (fExplorerToolbar
.p
!= NULL
)
280 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
285 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
286 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
290 class CShellBrowser
:
291 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
292 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
293 public IShellBrowser
,
295 public IServiceProvider
,
296 public IProfferServiceImpl
<CShellBrowser
>,
297 public IShellBrowserService
,
299 public ITravelLogClient
,
300 public IPersistHistory
,
301 public IDockingWindowSite
,
302 public IOleCommandTarget
,
303 public IBrowserService2
,
304 public IConnectionPointContainerImpl
<CShellBrowser
>,
305 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
306 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
313 CComPtr
<IUnknown
> clientBar
;
316 static const int BIInternetToolbar
= 0;
317 static const int BIVerticalBaseBar
= 1;
318 static const int BIHorizontalBaseBar
= 2;
320 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
321 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
322 CComPtr
<IShellView
> fCurrentShellView
; //
323 LPITEMIDLIST fCurrentDirectoryPIDL
; //
325 bool fStatusBarVisible
;
326 CToolbarProxy fToolbarProxy
;
327 barInfo fClientBars
[3];
328 CComPtr
<ITravelLog
> fTravelLog
;
329 HMENU fCurrentMenuBar
;
330 CABINETSTATE fCabinetState
;
331 // The next three fields support persisted history for shell views.
332 // They do not need to be reference counted.
333 IOleObject
*fHistoryObject
;
334 IStream
*fHistoryStream
;
335 IBindCtx
*fHistoryBindContext
;
339 ULONG
InternalAddRef()
341 OutputDebugString(_T("AddRef\n"));
342 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
344 ULONG
InternalRelease()
346 OutputDebugString(_T("Release\n"));
347 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
353 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
355 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
356 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
357 FOLDERSETTINGS
*folderSettings
, long flags
);
358 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
359 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
360 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
361 HRESULT
NavigateToParent();
362 HRESULT
DoFolderOptions();
363 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
364 void RepositionBars();
365 virtual WNDPROC
GetWindowProc()
369 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
370 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
371 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
372 HRESULT
FireCommandStateChangeAll();
373 HRESULT
UpdateForwardBackState();
374 void UpdateGotoMenu(HMENU theMenu
);
375 void UpdateViewMenu(HMENU theMenu
);
377 /* // *** IDockingWindowFrame methods ***
378 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
379 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
380 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
383 // *** IDockingWindowSite methods ***
384 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
385 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
386 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
388 // *** IOleCommandTarget methods ***
389 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
390 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
391 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
392 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
394 // *** IOleWindow methods ***
395 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
396 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
398 // *** IShellBrowser methods ***
399 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
400 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
401 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
402 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
403 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
404 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
405 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
406 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
407 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
408 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
409 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
410 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
411 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
413 // *** IDropTarget methods ***
414 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
415 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
416 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
417 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
419 // *** IServiceProvider methods ***
420 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
422 // *** IShellBowserService methods ***
423 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
425 // *** IDispatch methods ***
426 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
427 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
428 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
429 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
430 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
431 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
433 // *** IBrowserService methods ***
434 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
435 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
436 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
437 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
438 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
439 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
440 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
441 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
442 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
443 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
444 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
445 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
446 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
447 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
448 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
449 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
450 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
451 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
452 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
453 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
454 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
455 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
456 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
457 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
458 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
459 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
460 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
461 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
462 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
463 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
465 // *** IBrowserService2 methods ***
466 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
467 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
468 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
469 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
470 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
471 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
472 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
473 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
474 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
475 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
476 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
477 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
478 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
479 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
480 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
481 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
482 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
483 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
484 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
485 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
486 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
487 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
488 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
489 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
490 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
491 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
492 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
493 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
494 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
495 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
496 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
497 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
498 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
499 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
500 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
501 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
502 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
503 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
504 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
505 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
506 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
507 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
508 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
509 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
510 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
511 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
512 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
513 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
514 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
515 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
516 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
517 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
518 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
519 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
520 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
521 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
522 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
523 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
524 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
525 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
526 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
527 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
528 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
529 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
530 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
532 // *** IWebBrowser methods ***
533 virtual HRESULT STDMETHODCALLTYPE
GoBack();
534 virtual HRESULT STDMETHODCALLTYPE
GoForward();
535 virtual HRESULT STDMETHODCALLTYPE
GoHome();
536 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
537 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
538 VARIANT
*PostData
, VARIANT
*Headers
);
539 virtual HRESULT STDMETHODCALLTYPE
Refresh();
540 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
541 virtual HRESULT STDMETHODCALLTYPE
Stop();
542 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
543 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
544 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
545 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
546 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
547 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
548 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
549 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
550 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
551 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
552 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
553 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
554 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
555 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
556 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
557 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
558 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
560 // *** IWebBrowserApp methods ***
561 virtual HRESULT STDMETHODCALLTYPE
Quit();
562 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
563 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
564 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
565 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
566 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
567 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
568 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
569 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
570 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
571 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
572 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
573 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
574 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
575 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
576 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
577 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
578 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
579 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
580 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
582 // *** IWebBrowser2 methods ***
583 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
584 VARIANT
*PostData
, VARIANT
*Headers
);
585 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
586 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
587 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
588 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
589 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
590 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
591 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
592 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
593 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
594 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
595 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
596 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
597 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
598 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
599 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
600 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
601 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
602 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
603 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
605 // *** ITravelLogClient methods ***
606 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
607 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
608 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
610 // *** IPersist methods ***
611 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
613 // *** IPersistHistory methods ***
614 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
615 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
616 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
617 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
620 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
621 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
622 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
623 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
624 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
625 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
626 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
627 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
628 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
629 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
630 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
631 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
632 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
633 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
634 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
635 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
636 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
637 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
638 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
639 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
640 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
641 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
642 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
643 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
644 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
646 static ATL::CWndClassInfo
& GetWndClassInfo()
648 static ATL::CWndClassInfo wc
=
650 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
651 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
652 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
653 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
658 BEGIN_MSG_MAP(CShellBrowser
)
659 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
660 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
661 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
662 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
663 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
664 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
665 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
666 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
667 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
668 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
669 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
670 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
671 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
672 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
673 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
674 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
675 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
676 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
677 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
678 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
679 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
680 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
681 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
682 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
683 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
684 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
685 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
688 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
689 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
690 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
691 END_CONNECTION_POINT_MAP()
693 BEGIN_COM_MAP(CShellBrowser
)
694 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
695 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
696 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
697 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
698 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
699 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
700 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
701 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
702 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
703 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
704 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
705 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
706 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
707 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
708 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
709 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
710 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
711 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
715 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
717 CShellBrowser::CShellBrowser()
719 fCurrentShellViewWindow
= NULL
;
720 fCurrentDirectoryPIDL
= NULL
;
722 fStatusBarVisible
= true;
723 memset(fClientBars
, 0, sizeof(fClientBars
));
724 fCurrentMenuBar
= NULL
;
725 fHistoryObject
= NULL
;
726 fHistoryStream
= NULL
;
727 fHistoryBindContext
= NULL
;
730 CShellBrowser::~CShellBrowser()
734 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
736 CComPtr
<IPersistStreamInit
> persistStreamInit
;
738 CComPtr
<IUnknown
> clientBar
;
740 _AtlInitialConstruct();
742 fCabinetState
.cLength
= sizeof(fCabinetState
);
743 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
748 Create(HWND_DESKTOP
);
753 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
754 if (FAILED_UNEXPECTEDLY(hResult
))
757 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &clientBar
));
758 if (FAILED_UNEXPECTEDLY(hResult
))
762 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
765 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
766 if (FAILED_UNEXPECTEDLY(hResult
))
769 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
770 if (FAILED_UNEXPECTEDLY(hResult
))
773 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
774 if (FAILED_UNEXPECTEDLY(hResult
))
777 // TODO: create settingsStream from registry entry
778 //if (settingsStream.p)
780 // hResult = persistStreamInit->Load(settingsStream);
781 // if (FAILED_UNEXPECTEDLY(hResult))
786 hResult
= persistStreamInit
->InitNew();
787 if (FAILED_UNEXPECTEDLY(hResult
))
791 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
792 if (FAILED_UNEXPECTEDLY(hResult
))
795 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
799 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
800 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
801 _AtlBaseModule
.GetModuleInstance(), 0);
802 fStatusBarVisible
= true;
806 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
807 if (FAILED_UNEXPECTEDLY(hResult
))
810 ShowWindow(SW_SHOWNORMAL
);
815 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
817 CComPtr
<IShellFolder
> newFolder
;
818 FOLDERSETTINGS newFolderSettings
;
821 // called by shell view to browse to new folder
822 // also called by explorer band to navigate to new folder
823 hResult
= SHBindToFolder(pidl
, &newFolder
);
824 if (FAILED_UNEXPECTEDLY(hResult
))
827 newFolderSettings
.ViewMode
= FVM_ICON
;
828 newFolderSettings
.fFlags
= 0;
829 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
830 if (FAILED_UNEXPECTEDLY(hResult
))
835 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
837 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
840 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
842 LPCITEMIDLIST pidlnext
;
847 if (! _ILIsDesktop(pidl
))
849 length
= pidl
->mkid
.cb
;
851 reinterpret_cast<LPCITEMIDLIST
>(
852 reinterpret_cast<const BYTE
*>(pidl
) + length
);
853 if (pidlnext
->mkid
.cb
!= 0)
859 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
860 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
862 CComPtr
<IShellFolder
> psf
;
863 LPITEMIDLIST pidlChild
;
864 LPITEMIDLIST pidlParent
;
871 if (ppidlLast
!= NULL
)
873 if (_ILIsPidlSimple(pidl
))
875 if (ppidlLast
!= NULL
)
876 *ppidlLast
= ILClone(pidl
);
877 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
881 pidlChild
= ILClone(ILFindLastID(pidl
));
882 pidlParent
= ILClone(pidl
);
883 ILRemoveLastID(pidlParent
);
884 hResult
= SHGetDesktopFolder(&psf
);
885 if (SUCCEEDED(hResult
))
886 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
887 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
888 *ppidlLast
= pidlChild
;
896 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
897 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
899 CComPtr
<IShellFolder
> parentFolder
;
900 LPITEMIDLIST childPIDL
;
904 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
908 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
912 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
915 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
924 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
926 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
929 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
930 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
932 CComPtr
<IObjectWithSite
> objectWithSite
;
933 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
934 CComPtr
<IShellView
> saveCurrentShellView
;
935 CComPtr
<IShellView
> newShellView
;
936 CComPtr
<ITravelLog
> travelLog
;
937 HWND newShellViewWindow
;
938 BOOL windowUpdateIsLocked
;
939 RECT shellViewWindowBounds
;
942 wchar_t newTitle
[MAX_PATH
];
946 if (newShellFolder
== NULL
)
949 hResult
= GetTravelLog(&travelLog
);
950 if (FAILED_UNEXPECTEDLY(hResult
))
954 if (flags
& BTP_UPDATE_CUR_HISTORY
)
956 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
957 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
958 // what to do with error? Do we want to halt browse because state save failed?
961 if (fCurrentShellView
)
963 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
966 // create view object
967 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
968 if (FAILED_UNEXPECTEDLY(hResult
))
970 previousView
= fCurrentShellViewWindow
;
972 // enter updating section
973 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
974 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
975 if (fCurrentShellView
!= NULL
)
976 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
979 hResult
= newShellView
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
980 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
981 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
983 // update folder and view
984 saveCurrentShellFolder
= fCurrentShellFolder
;
985 saveCurrentShellView
= fCurrentShellView
;
986 fCurrentShellFolder
= newShellFolder
;
987 fCurrentShellView
= newShellView
;
990 if (previousView
!= NULL
)
991 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
993 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
994 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
996 // create view window
997 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
998 this, &shellViewWindowBounds
, &newShellViewWindow
);
999 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
1001 fCurrentShellView
= saveCurrentShellView
;
1002 fCurrentShellFolder
= saveCurrentShellFolder
;
1003 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
1004 if (windowUpdateIsLocked
)
1005 LockWindowUpdate(FALSE
);
1006 SetCursor(saveCursor
);
1010 if (objectWithSite
.p
!= NULL
)
1011 hResult
= objectWithSite
->SetSite(NULL
);
1013 // update current pidl
1014 ILFree(fCurrentDirectoryPIDL
);
1015 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1017 // update view window
1018 if (saveCurrentShellView
!= NULL
)
1019 saveCurrentShellView
->DestroyViewWindow();
1020 fCurrentShellViewWindow
= newShellViewWindow
;
1023 saveCurrentShellView
.Release();
1024 saveCurrentShellFolder
.Release();
1026 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1028 // leave updating section
1029 if (windowUpdateIsLocked
)
1030 LockWindowUpdate(FALSE
);
1031 SetCursor(saveCursor
);
1034 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1036 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1037 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1041 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1042 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1043 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1044 if (SUCCEEDED(hResult
))
1046 FireNavigateComplete(newTitle
);
1050 FireNavigateComplete(L
"ERROR");
1053 if (fCabinetState
.fFullPathTitle
)
1054 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1056 nameFlags
= SHGDN_FORADDRESSBAR
;
1057 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1058 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1059 if (SUCCEEDED(hResult
))
1061 SetWindowText(newTitle
);
1063 LPCITEMIDLIST pidlChild
;
1064 INT index
, indexOpen
;
1065 HIMAGELIST himlSmall
, himlLarge
;
1067 CComPtr
<IShellFolder
> sf
;
1068 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1070 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1072 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1074 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1075 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1077 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1078 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1081 // TODO: Update the window icon
1083 FireCommandStateChangeAll();
1084 hResult
= UpdateForwardBackState();
1088 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1090 CComPtr
<IServiceProvider
> serviceProvider
;
1091 CComPtr
<IBandSite
> bandSite
;
1092 CComPtr
<IDeskBand
> deskBand
;
1095 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1098 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1099 if (FAILED_UNEXPECTEDLY(hResult
))
1102 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1103 if (FAILED_UNEXPECTEDLY(hResult
))
1106 return deskBand
->QueryInterface(riid
, shellMenu
);
1109 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1111 CComPtr
<IUnknown
> newBaseBar
;
1112 CComPtr
<IDeskBar
> deskBar
;
1113 CComPtr
<IUnknown
> newBaseBarSite
;
1114 CComPtr
<IObjectWithSite
> objectWithSite
;
1115 CComPtr
<IDeskBarClient
> deskBarClient
;
1120 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1122 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1125 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1126 if (FAILED_UNEXPECTEDLY(hResult
))
1128 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1129 if (FAILED_UNEXPECTEDLY(hResult
))
1132 // tell the new base bar about the shell browser
1133 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1134 if (FAILED_UNEXPECTEDLY(hResult
))
1136 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1137 if (FAILED_UNEXPECTEDLY(hResult
))
1140 // tell the new base bar about the new base bar site
1141 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1142 if (FAILED_UNEXPECTEDLY(hResult
))
1144 hResult
= deskBar
->SetClient(newBaseBarSite
);
1145 if (FAILED_UNEXPECTEDLY(hResult
))
1148 // tell the new base bar site about the new base bar
1149 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1150 if (FAILED_UNEXPECTEDLY(hResult
))
1152 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1153 if (FAILED_UNEXPECTEDLY(hResult
))
1156 *cache
= newBaseBar
.Detach();
1158 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1161 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1163 CComPtr
<IDockingWindow
> dockingWindow
;
1164 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1165 CComPtr
<IUnknown
> baseBarSite
;
1166 CComPtr
<IUnknown
> newBand
;
1167 CComPtr
<IUnknown
> theBaseBar
;
1168 CComPtr
<IDeskBar
> deskBar
;
1174 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1175 if (FAILED_UNEXPECTEDLY(hResult
))
1177 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1178 if (FAILED_UNEXPECTEDLY(hResult
))
1180 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1181 if (FAILED_UNEXPECTEDLY(hResult
))
1183 hResult
= deskBar
->GetClient(&baseBarSite
);
1184 if (FAILED_UNEXPECTEDLY(hResult
))
1186 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1187 if (FAILED_UNEXPECTEDLY(hResult
))
1189 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1190 if (FAILED_UNEXPECTEDLY(hResult
))
1192 V_VT(&vaIn
) = VT_UNKNOWN
;
1193 V_UNKNOWN(&vaIn
) = newBand
.p
;
1194 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1195 if (FAILED_UNEXPECTEDLY(hResult
))
1197 hResult
= dockingWindow
->ShowDW(TRUE
);
1198 if (FAILED_UNEXPECTEDLY(hResult
))
1203 HRESULT
CShellBrowser::NavigateToParent()
1205 LPITEMIDLIST newDirectory
;
1208 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1209 if (newDirectory
== NULL
)
1210 return E_OUTOFMEMORY
;
1211 ILRemoveLastID(newDirectory
);
1212 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1213 ILFree(newDirectory
);
1214 if (FAILED_UNEXPECTEDLY(hResult
))
1219 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1221 PROPSHEETHEADER
*sheetInfo
;
1223 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1224 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1226 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1227 sheetInfo
->nPages
++;
1231 HRESULT
CShellBrowser::DoFolderOptions()
1233 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1234 CComPtr
<IObjectWithSite
> objectWithSite
;
1235 PROPSHEETHEADER m_PropSheet
;
1236 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1237 // CComPtr<IGlobalFolderSettings> globalSettings;
1238 // SHELLSTATE2 shellState;
1241 memset(m_psp
, 0, sizeof(m_psp
));
1242 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1244 // create sheet object
1245 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1246 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1247 if (FAILED_UNEXPECTEDLY(hResult
))
1250 // must set site in order for Apply to all Folders on Advanced page to be enabled
1251 hResult
= folderOptionsSheet
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1252 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1253 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1254 m_PropSheet
.phpage
= m_psp
;
1257 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1258 if (FAILED_UNEXPECTEDLY(hResult
))
1260 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1261 if (FAILED_UNEXPECTEDLY(hResult
))
1266 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1267 if (FAILED_UNEXPECTEDLY(hResult
))
1270 if (fCurrentShellView
!= NULL
)
1272 hResult
= fCurrentShellView
->AddPropertySheetPages(
1273 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1274 if (FAILED_UNEXPECTEDLY(hResult
))
1279 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1280 m_PropSheet
.dwFlags
= 0;
1281 m_PropSheet
.hwndParent
= m_hWnd
;
1282 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1283 m_PropSheet
.pszCaption
= _T("Folder Options");
1284 m_PropSheet
.nStartPage
= 0;
1285 PropertySheet(&m_PropSheet
);
1289 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1291 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1292 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1294 const _ATL_MSG
*previousMessage
;
1296 WNDPROC saveWindowProc
;
1299 hWnd
= pThis
->m_hWnd
;
1300 previousMessage
= pThis
->m_pCurrentMsg
;
1301 pThis
->m_pCurrentMsg
= &msg
;
1303 CComPtr
<IMenuBand
> menuBand
;
1304 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1305 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1307 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1308 if (hResult
== S_OK
)
1311 wParam
= msg
.wParam
;
1312 lParam
= msg
.lParam
;
1316 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1317 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1318 if (handled
== FALSE
)
1320 if (uMsg
== WM_NCDESTROY
)
1322 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1323 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1324 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1325 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1326 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1329 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1331 pThis
->m_pCurrentMsg
= previousMessage
;
1332 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1334 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1335 pThis
->m_hWnd
= NULL
;
1336 pThis
->OnFinalMessage(hWnd
);
1341 void CShellBrowser::RepositionBars()
1347 GetClientRect(&clientRect
);
1349 if (fStatusBarVisible
&& fStatusBar
)
1351 ::GetWindowRect(fStatusBar
, &statusRect
);
1352 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1353 clientRect
.right
- clientRect
.left
,
1354 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1355 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1358 for (x
= 0; x
< 3; x
++)
1360 HWND hwnd
= fClientBars
[x
].hwnd
;
1361 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1362 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1364 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1365 fClientBars
[x
].hwnd
= hwnd
;
1369 RECT toolbarRect
= clientRect
;
1370 if (borderSpace
.top
!= 0)
1372 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1374 else if (borderSpace
.bottom
!= 0)
1376 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1378 else if (borderSpace
.left
!= 0)
1380 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1382 else if (borderSpace
.right
!= 0)
1384 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1387 ::SetWindowPos(hwnd
, NULL
,
1390 toolbarRect
.right
- toolbarRect
.left
,
1391 toolbarRect
.bottom
- toolbarRect
.top
,
1392 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1394 if (borderSpace
.top
!= 0)
1396 clientRect
.top
= toolbarRect
.bottom
;
1398 else if (borderSpace
.bottom
!= 0)
1400 clientRect
.bottom
= toolbarRect
.top
;
1402 else if (borderSpace
.left
!= 0)
1404 clientRect
.left
= toolbarRect
.right
;
1406 else if (borderSpace
.right
!= 0)
1408 clientRect
.right
= toolbarRect
.left
;
1412 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1413 clientRect
.right
- clientRect
.left
,
1414 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1417 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1420 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1421 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1424 params
.rgvarg
= arguments
;
1425 params
.rgdispidNamedArgs
= NULL
;
1426 params
.cArgs
= argCount
;
1427 params
.cNamedArgs
= 0;
1428 IUnknown
** pp
= vec
.begin();
1429 while (pp
< vec
.end())
1433 CComPtr
<IDispatch
> theDispatch
;
1435 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1436 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1441 while (pp
< vec2
.end())
1445 CComPtr
<IDispatch
> theDispatch
;
1447 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1448 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1455 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1457 // these two variants intentionally to do use CComVariant because it would double free/release
1458 // or does not need to dispose at all
1461 CComBSTR
tempString(newDirectory
);
1463 V_VT(&varArgs
) = VT_BSTR
;
1464 V_BSTR(&varArgs
) = tempString
.m_str
;
1466 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1467 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1468 V_VT(&varArg
[1]) = VT_DISPATCH
;
1469 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1471 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1474 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1478 V_VT(&varArg
[0]) = VT_BOOL
;
1479 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1480 V_VT(&varArg
[1]) = VT_I4
;
1481 V_I4(&varArg
[1]) = commandID
;
1483 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1486 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1488 return FireCommandStateChange(false, -1);
1491 HRESULT
CShellBrowser::UpdateForwardBackState()
1493 CComPtr
<ITravelLog
> travelLog
;
1494 CComPtr
<ITravelEntry
> unusedEntry
;
1500 canGoForward
= false;
1501 hResult
= GetTravelLog(&travelLog
);
1502 if (FAILED_UNEXPECTEDLY(hResult
))
1504 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1505 if (SUCCEEDED(hResult
))
1508 unusedEntry
.Release();
1510 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1511 if (SUCCEEDED(hResult
))
1513 canGoForward
= true;
1514 unusedEntry
.Release();
1516 hResult
= FireCommandStateChange(canGoBack
, 2);
1517 hResult
= FireCommandStateChange(canGoForward
, 1);
1521 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1523 CComPtr
<ITravelLog
> travelLog
;
1525 MENUITEMINFO menuItemInfo
;
1528 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1530 position
= GetMenuItemCount(theMenu
);
1531 hResult
= GetTravelLog(&travelLog
);
1532 if (FAILED_UNEXPECTEDLY(hResult
))
1534 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1535 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1536 if (SUCCEEDED(hResult
))
1538 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1539 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1540 menuItemInfo
.fType
= MF_SEPARATOR
;
1541 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1542 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1546 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1548 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1549 CComPtr
<ITravelLog
> travelLog
;
1551 OLECMD commandList
[5];
1552 HMENU toolbarMenuBar
;
1554 MENUITEMINFO menuItemInfo
;
1557 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1558 if (gotoMenu
!= NULL
)
1559 UpdateGotoMenu(gotoMenu
);
1561 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1562 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1563 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1564 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1565 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1567 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1568 IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1569 if (SUCCEEDED(hResult
))
1570 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1571 if (FAILED_UNEXPECTEDLY(hResult
))
1572 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1575 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1576 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1577 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1578 DestroyMenu(menuItemInfo
.hSubMenu
);
1580 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1581 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1582 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1583 DestroyMenu(toolbarMenuBar
);
1585 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1586 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1587 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1588 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1589 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1590 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1591 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1592 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1594 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1595 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1596 menuItemInfo
.hSubMenu
= toolbarMenu
;
1597 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1599 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1602 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1604 CComPtr
<IUnknown
> int1Retry
;
1605 CComPtr
<IUnknown
> int2Retry
;
1610 if (int1
== NULL
|| int2
== NULL
)
1612 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1613 if (FAILED_UNEXPECTEDLY(hResult
))
1615 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1616 if (FAILED_UNEXPECTEDLY(hResult
))
1618 if (int1Retry
== int2Retry
)
1623 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1625 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1627 RECT availableBounds
;
1629 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1630 for (INT x
= 0; x
< 3; x
++)
1632 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1634 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1635 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1636 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1637 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1640 *prcBorder
= availableBounds
;
1644 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1649 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1651 for (INT x
= 0; x
< 3; x
++)
1653 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1655 fClientBars
[x
].borderSpace
= *pbw
;
1656 // if this bar changed size, it cascades and forces all subsequent bars to resize
1661 return E_INVALIDARG
;
1664 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1665 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1667 CComPtr
<IOleCommandTarget
> commandTarget
;
1670 if (prgCmds
== NULL
)
1671 return E_INVALIDARG
;
1672 if (pguidCmdGroup
== NULL
)
1674 if (fCurrentShellView
.p
!= NULL
)
1676 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1677 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1678 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1687 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1691 switch (prgCmds
->cmdID
)
1693 case 0x1c: // search
1694 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1696 case 0x1d: // history
1697 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1699 case 0x1e: // favorites
1700 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1702 case 0x23: // folders
1703 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1713 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1717 switch (prgCmds
->cmdID
)
1719 case 0xa022: // up level
1720 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1721 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1722 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1732 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1733 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1737 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1742 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1745 if (nCmdexecopt
== 1)
1747 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1751 // update zones part of the status bar
1754 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1755 V_VT(pvaOut
) = VT_INT_PTR
;
1756 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1757 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1760 // indicate if this cabinet was opened as a browser
1766 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1775 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1780 // what is theater mode and why do we receive this?
1784 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1789 // initialize favorites menu
1793 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1798 // refresh on toolbar clicked
1801 // tell the view if it should hide the task pane or not
1802 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1805 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1810 return NavigateToParent();
1813 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1818 return DoFolderOptions();
1821 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1826 // Reset All Folders option in Folder Options
1837 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1845 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1850 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1852 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1854 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1856 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1859 DestroyMenu(mainMenu
);
1861 lpMenuWidths
->width
[0] = 2;
1862 lpMenuWidths
->width
[2] = 3;
1863 lpMenuWidths
->width
[4] = 1;
1867 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1869 CComPtr
<IShellMenu
> shellMenu
;
1872 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
1874 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1875 if (FAILED_UNEXPECTEDLY(hResult
))
1877 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1878 if (FAILED_UNEXPECTEDLY(hResult
))
1880 fCurrentMenuBar
= hmenuShared
;
1884 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1886 if (hmenuShared
== fCurrentMenuBar
)
1888 //DestroyMenu(fCurrentMenuBar);
1889 SetMenuSB(NULL
, NULL
, NULL
);
1894 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1899 ::SetWindowText(fStatusBar
, pszStatusText
);
1908 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1913 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1915 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1920 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1922 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1925 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1930 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1938 *lphwnd
= fToolbarProxy
.m_hWnd
;
1941 *lphwnd
= fStatusBar
;
1944 // find the directory browser and return it
1945 // this should be used only to determine if a tree is present
1948 // is this a progress dialog?
1954 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1955 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1964 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1969 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1977 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1981 *ppshv
= fCurrentShellView
;
1982 if (fCurrentShellView
.p
!= NULL
)
1983 fCurrentShellView
.p
->AddRef();
1987 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1992 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1997 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1998 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2003 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2008 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2013 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2014 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2019 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2021 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2022 // the returned interface has a method GetPropertyBag on it
2023 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2024 return this->QueryInterface(riid
, ppvObject
);
2025 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2026 return this->QueryInterface(riid
, ppvObject
);
2027 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2028 return this->QueryInterface(riid
, ppvObject
);
2029 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2030 return this->QueryInterface(riid
, ppvObject
);
2031 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2032 return this->QueryInterface(riid
, ppvObject
);
2033 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2034 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2035 if (IsEqualIID(riid
, IID_IShellBrowser
))
2036 return this->QueryInterface(riid
, ppvObject
);
2037 return E_NOINTERFACE
;
2040 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2042 if (ppvObject
== NULL
)
2048 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2053 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2058 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2059 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2064 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2065 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2070 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2075 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2080 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2085 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2090 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2094 // called by toolbar when displaying tooltips
2099 if (fTravelLog
.p
== NULL
)
2101 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2102 if (FAILED_UNEXPECTEDLY(hResult
))
2105 *pptl
= fTravelLog
.p
;
2106 fTravelLog
.p
->AddRef();
2110 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2115 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2120 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2125 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2130 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2135 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2140 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2145 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2150 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2155 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2165 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2170 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2180 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2182 // called by explorer bar to get current pidl
2185 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2189 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2194 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2199 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2204 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2206 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2207 return E_INVALIDARG
;
2208 *ppole
= fHistoryObject
;
2209 if (fHistoryObject
!= NULL
)
2210 fHistoryObject
->AddRef();
2211 *pstm
= fHistoryStream
;
2212 if (fHistoryStream
!= NULL
)
2213 fHistoryStream
->AddRef();
2214 *ppbc
= fHistoryBindContext
;
2215 if (fHistoryBindContext
!= NULL
)
2216 fHistoryBindContext
->AddRef();
2217 fHistoryObject
= NULL
;
2218 fHistoryStream
= NULL
;
2219 fHistoryBindContext
= NULL
;
2225 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2230 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2235 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2240 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2241 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2246 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2251 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2256 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2261 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2266 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2271 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2276 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2278 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2282 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2292 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2297 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2302 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2307 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2312 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2317 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2318 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2323 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2328 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2333 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2338 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2343 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2353 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2358 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2363 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2368 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2373 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2378 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2383 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2388 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2398 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2403 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2408 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2413 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2418 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2423 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2428 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2429 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2434 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2435 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2440 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2445 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2450 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2455 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2460 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2465 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2470 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2475 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2480 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2485 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2490 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2495 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2500 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2505 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2510 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2515 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2520 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2525 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2530 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2535 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2536 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2541 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2546 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2551 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2556 extern HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
);
2557 extern HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
);
2558 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2560 for (int i
= 0; i
< 3; i
++)
2562 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2566 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2569 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2574 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2579 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2581 CComPtr
<ITravelLog
> travelLog
;
2584 hResult
= GetTravelLog(&travelLog
);
2585 if (FAILED_UNEXPECTEDLY(hResult
))
2587 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2590 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2592 CComPtr
<ITravelLog
> travelLog
;
2595 hResult
= GetTravelLog(&travelLog
);
2596 if (FAILED_UNEXPECTEDLY(hResult
))
2598 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2601 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2606 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2611 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2612 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2617 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2621 V_VT(&level
) = VT_I4
;
2623 return Refresh2(&level
);
2626 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2628 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2631 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2632 if (FAILED_UNEXPECTEDLY(hResult
))
2634 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2637 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2642 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2647 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2652 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2657 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2662 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2667 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2674 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2679 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2684 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2689 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2694 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2699 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2704 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2709 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2716 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2721 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2726 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2731 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2736 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2741 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2746 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2751 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2756 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2761 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2766 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2771 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2776 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2781 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2786 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2791 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2796 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2801 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2806 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2811 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2816 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2821 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2826 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2831 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2832 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2837 // called from drive combo box to navigate to a directory
2838 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2839 return E_INVALIDARG
;
2840 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2841 return E_INVALIDARG
;
2842 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2843 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2844 if (FAILED_UNEXPECTEDLY(hResult
))
2849 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2854 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2855 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2860 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2865 // called to show search bar
2866 if (V_VT(pvaClsid
) != VT_BSTR
)
2867 return E_INVALIDARG
;
2868 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2869 // TODO: properly compute the value of vertical
2871 return ShowBand(classID
, vertical
);
2874 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2879 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2884 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2889 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2894 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2899 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2904 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2909 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2914 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2919 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2924 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2929 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2934 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2939 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2944 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2949 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2954 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2956 if (pWinData
== NULL
)
2959 pWinData
->dwWindowID
= -1;
2961 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2962 pWinData
->lpszUrl
= NULL
;
2963 pWinData
->lpszUrlLocation
= NULL
;
2964 pWinData
->lpszTitle
= NULL
;
2968 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2973 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2978 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2980 CComPtr
<IPersistHistory
> viewPersistHistory
;
2981 CComPtr
<IOleObject
> viewHistoryObject
;
2982 persistState oldState
;
2987 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2988 if (FAILED_UNEXPECTEDLY(hResult
))
2990 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2992 if (oldState
.browseType
!= 2)
2994 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2996 return E_OUTOFMEMORY
;
2997 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2998 if (FAILED_UNEXPECTEDLY(hResult
))
3003 if (numRead
!= oldState
.pidlSize
)
3008 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3009 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3010 fHistoryObject
= viewHistoryObject
;
3011 fHistoryStream
= pStream
;
3012 fHistoryBindContext
= pbc
;
3013 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
3014 fHistoryObject
= NULL
;
3015 fHistoryStream
= NULL
;
3016 fHistoryBindContext
= NULL
;
3018 if (FAILED_UNEXPECTEDLY(hResult
))
3023 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3025 CComPtr
<IPersistHistory
> viewPersistHistory
;
3026 persistState newState
;
3029 hResult
= fCurrentShellView
->GetItemObject(
3030 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3031 memset(&newState
, 0, sizeof(newState
));
3032 newState
.dwSize
= sizeof(newState
);
3033 newState
.browseType
= 2;
3034 newState
.browserIndex
= GetBrowserIndex();
3035 if (viewPersistHistory
.p
!= NULL
)
3037 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3038 if (FAILED_UNEXPECTEDLY(hResult
))
3041 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3042 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3043 if (FAILED_UNEXPECTEDLY(hResult
))
3045 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3046 if (FAILED_UNEXPECTEDLY(hResult
))
3048 if (viewPersistHistory
.p
!= NULL
)
3050 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3051 if (FAILED_UNEXPECTEDLY(hResult
))
3057 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3062 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3067 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3069 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3074 void ReleaseCComPtrExpectZero(CComPtr
<T
>& cptr
, BOOL forceRelease
= FALSE
)
3078 int nrc
= cptr
->Release();
3081 DbgPrint("WARNING: Unexpected RefCount > 0!\n");
3086 nrc
= cptr
->Release();
3094 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3097 // TODO: rip down everything
3099 fCurrentShellView
->DestroyViewWindow();
3100 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3101 ReleaseCComPtrExpectZero(fCurrentShellView
);
3103 for (int i
= 0; i
< 3; i
++)
3105 if (fClientBars
[i
].clientBar
== NULL
)
3107 IDockingWindow
* pdw
;
3108 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3109 if (FAILED_UNEXPECTEDLY(hr
))
3114 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3116 ReleaseCComPtrExpectZero(fTravelLog
);
3118 fCurrentShellFolder
.Release();
3119 ILFree(fCurrentDirectoryPIDL
);
3120 ::DestroyWindow(fStatusBar
);
3121 DestroyMenu(fCurrentMenuBar
);
3127 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3129 CComPtr
<IDockingWindow
> dockingWindow
;
3130 RECT availableBounds
;
3131 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3134 if (wParam
!= SIZE_MINIMIZED
)
3136 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3137 for (INT x
= 0; x
< 3; x
++)
3139 if (fClientBars
[x
].clientBar
!= NULL
)
3141 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3142 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3143 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3145 hResult
= dockingWindow
->ResizeBorderDW(
3146 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3156 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3159 LPARAM menuIndex
= lParam
;
3161 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3163 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3167 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3171 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3173 UpdateViewMenu(theMenu
);
3176 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3180 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3184 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3189 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3194 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3196 if (fCurrentShellViewWindow
!= NULL
)
3197 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3201 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3206 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3210 hResult
= DoFolderOptions();
3214 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3217 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3218 #endif /* __REACTOS__ */
3222 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3225 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3226 #endif /* __REACTOS__ */
3230 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3232 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3236 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3244 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3248 hResult
= GoForward();
3252 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3256 hResult
= NavigateToParent();
3260 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3268 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3272 // FIXME: This does not appear to be what windows does.
3273 hResult
= NavigateToParent();
3277 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3281 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3282 PSHOpenNewFrame Func
= NULL
;
3283 HMODULE Module
= GetModuleHandle(TEXT("browseui.dll"));
3285 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(Module
, (LPCSTR
) 103));
3288 LPITEMIDLIST desktopPIDL
;
3290 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3291 if (SUCCEEDED(hResult
))
3293 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3299 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3301 fStatusBarVisible
= !fStatusBarVisible
;
3302 // TODO: trigger a relayout of contained items
3306 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3308 CComPtr
<IOleCommandTarget
> commandTarget
;
3311 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3312 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3313 if (FAILED_UNEXPECTEDLY(hResult
))
3315 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3319 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3321 CComPtr
<IOleCommandTarget
> commandTarget
;
3324 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3325 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3326 if (FAILED_UNEXPECTEDLY(hResult
))
3328 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3332 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3334 CComPtr
<IOleCommandTarget
> commandTarget
;
3337 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3338 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3339 if (FAILED_UNEXPECTEDLY(hResult
))
3341 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3345 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3347 CComPtr
<IOleCommandTarget
> commandTarget
;
3350 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3351 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3352 if (FAILED_UNEXPECTEDLY(hResult
))
3354 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3358 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3360 CComPtr
<IOleCommandTarget
> commandTarget
;
3363 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3364 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3365 if (FAILED_UNEXPECTEDLY(hResult
))
3367 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3371 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3373 CComPtr
<IOleCommandTarget
> commandTarget
;
3376 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3377 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3378 if (FAILED_UNEXPECTEDLY(hResult
))
3380 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3384 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3389 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3391 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3392 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3396 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3398 CComPtr
<CShellBrowser
> theCabinet
;
3403 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3404 if (theCabinet
== NULL
)
3406 return E_OUTOFMEMORY
;
3409 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3410 if (FAILED_UNEXPECTEDLY(hResult
))
3411 return E_OUTOFMEMORY
;
3413 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3417 // Error: continue or exit?
3421 if (Msg
.message
== WM_QUIT
)
3424 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3426 TranslateMessage(&Msg
);
3427 DispatchMessage(&Msg
);
3431 //TerminateProcess(GetCurrentProcess(), hResult);
3433 int nrc
= theCabinet
->Release();
3436 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked, process will never terminate. Terminating forcefully.\n", nrc
);
3438 //TerminateProcess(GetCurrentProcess(), 1);
3441 theCabinet
.Detach();
3446 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3449 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3451 OleInitialize(NULL
);
3453 ATLTRY(hr
= ExplorerMessageLoop(parameters
));