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
= NULL
;
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
);
928 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
930 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
933 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
934 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
936 CComPtr
<IObjectWithSite
> objectWithSite
;
937 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
938 CComPtr
<IShellView
> saveCurrentShellView
;
939 CComPtr
<IShellView
> newShellView
;
940 CComPtr
<ITravelLog
> travelLog
;
941 HWND newShellViewWindow
;
942 BOOL windowUpdateIsLocked
;
943 RECT shellViewWindowBounds
;
946 wchar_t newTitle
[MAX_PATH
];
950 if (newShellFolder
== NULL
)
953 hResult
= GetTravelLog(&travelLog
);
954 if (FAILED_UNEXPECTEDLY(hResult
))
958 if (flags
& BTP_UPDATE_CUR_HISTORY
)
960 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
961 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
962 // what to do with error? Do we want to halt browse because state save failed?
965 if (fCurrentShellView
)
967 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
970 // create view object
971 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
972 if (FAILED_UNEXPECTEDLY(hResult
))
974 previousView
= fCurrentShellViewWindow
;
976 // enter updating section
977 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
978 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
979 if (fCurrentShellView
!= NULL
)
980 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
983 hResult
= newShellView
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
984 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
985 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
987 // update folder and view
988 saveCurrentShellFolder
= fCurrentShellFolder
;
989 saveCurrentShellView
= fCurrentShellView
;
990 fCurrentShellFolder
= newShellFolder
;
991 fCurrentShellView
= newShellView
;
994 if (previousView
!= NULL
)
995 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
997 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
998 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
1000 // create view window
1001 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
1002 this, &shellViewWindowBounds
, &newShellViewWindow
);
1003 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
1005 fCurrentShellView
= saveCurrentShellView
;
1006 fCurrentShellFolder
= saveCurrentShellFolder
;
1007 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
1008 if (windowUpdateIsLocked
)
1009 LockWindowUpdate(FALSE
);
1010 SetCursor(saveCursor
);
1014 if (objectWithSite
.p
!= NULL
)
1015 hResult
= objectWithSite
->SetSite(NULL
);
1017 // update current pidl
1018 ILFree(fCurrentDirectoryPIDL
);
1019 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1021 // update view window
1022 if (saveCurrentShellView
!= NULL
)
1023 saveCurrentShellView
->DestroyViewWindow();
1024 fCurrentShellViewWindow
= newShellViewWindow
;
1027 saveCurrentShellView
.Release();
1028 saveCurrentShellFolder
.Release();
1030 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1032 // leave updating section
1033 if (windowUpdateIsLocked
)
1034 LockWindowUpdate(FALSE
);
1035 SetCursor(saveCursor
);
1038 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1040 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1041 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1045 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1046 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1047 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1048 if (SUCCEEDED(hResult
))
1050 FireNavigateComplete(newTitle
);
1054 FireNavigateComplete(L
"ERROR");
1057 if (fCabinetState
.fFullPathTitle
)
1058 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1060 nameFlags
= SHGDN_FORADDRESSBAR
;
1061 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1062 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1063 if (SUCCEEDED(hResult
))
1065 SetWindowText(newTitle
);
1067 LPCITEMIDLIST pidlChild
;
1068 INT index
, indexOpen
;
1069 HIMAGELIST himlSmall
, himlLarge
;
1071 CComPtr
<IShellFolder
> sf
;
1072 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1074 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1076 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1078 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1079 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1081 /* Hack to make it possible to release the old icons */
1082 /* Something seems to go wrong with WM_SETICON */
1083 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1084 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1086 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1087 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1089 DestroyIcon(oldSmall
);
1090 DestroyIcon(oldLarge
);
1093 FireCommandStateChangeAll();
1094 hResult
= UpdateForwardBackState();
1098 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1100 CComPtr
<IServiceProvider
> serviceProvider
;
1101 CComPtr
<IBandSite
> bandSite
;
1102 CComPtr
<IDeskBand
> deskBand
;
1105 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1108 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1109 if (FAILED_UNEXPECTEDLY(hResult
))
1112 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1113 if (FAILED_UNEXPECTEDLY(hResult
))
1116 return deskBand
->QueryInterface(riid
, shellMenu
);
1119 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1121 CComPtr
<IUnknown
> newBaseBar
;
1122 CComPtr
<IDeskBar
> deskBar
;
1123 CComPtr
<IUnknown
> newBaseBarSite
;
1124 CComPtr
<IObjectWithSite
> objectWithSite
;
1125 CComPtr
<IDeskBarClient
> deskBarClient
;
1130 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1132 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1135 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1136 if (FAILED_UNEXPECTEDLY(hResult
))
1138 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1139 if (FAILED_UNEXPECTEDLY(hResult
))
1142 // tell the new base bar about the shell browser
1143 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1144 if (FAILED_UNEXPECTEDLY(hResult
))
1146 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1147 if (FAILED_UNEXPECTEDLY(hResult
))
1150 // tell the new base bar about the new base bar site
1151 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1152 if (FAILED_UNEXPECTEDLY(hResult
))
1154 hResult
= deskBar
->SetClient(newBaseBarSite
);
1155 if (FAILED_UNEXPECTEDLY(hResult
))
1158 // tell the new base bar site about the new base bar
1159 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1160 if (FAILED_UNEXPECTEDLY(hResult
))
1162 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1163 if (FAILED_UNEXPECTEDLY(hResult
))
1166 *cache
= newBaseBar
.Detach();
1168 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1171 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1173 CComPtr
<IDockingWindow
> dockingWindow
;
1174 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1175 CComPtr
<IUnknown
> baseBarSite
;
1176 CComPtr
<IUnknown
> newBand
;
1177 CComPtr
<IUnknown
> theBaseBar
;
1178 CComPtr
<IDeskBar
> deskBar
;
1182 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1183 if (FAILED_UNEXPECTEDLY(hResult
))
1185 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1186 if (FAILED_UNEXPECTEDLY(hResult
))
1188 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1189 if (FAILED_UNEXPECTEDLY(hResult
))
1191 hResult
= deskBar
->GetClient(&baseBarSite
);
1192 if (FAILED_UNEXPECTEDLY(hResult
))
1194 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1195 if (FAILED_UNEXPECTEDLY(hResult
))
1197 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1198 if (FAILED_UNEXPECTEDLY(hResult
))
1200 V_VT(&vaIn
) = VT_UNKNOWN
;
1201 V_UNKNOWN(&vaIn
) = newBand
.p
;
1202 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1203 if (FAILED_UNEXPECTEDLY(hResult
))
1205 hResult
= dockingWindow
->ShowDW(TRUE
);
1206 if (FAILED_UNEXPECTEDLY(hResult
))
1211 HRESULT
CShellBrowser::NavigateToParent()
1213 LPITEMIDLIST newDirectory
;
1216 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1217 if (newDirectory
== NULL
)
1218 return E_OUTOFMEMORY
;
1219 ILRemoveLastID(newDirectory
);
1220 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1221 ILFree(newDirectory
);
1222 if (FAILED_UNEXPECTEDLY(hResult
))
1227 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1229 PROPSHEETHEADER
*sheetInfo
;
1231 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1232 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1234 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1235 sheetInfo
->nPages
++;
1239 HRESULT
CShellBrowser::DoFolderOptions()
1241 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1242 CComPtr
<IObjectWithSite
> objectWithSite
;
1243 PROPSHEETHEADER m_PropSheet
;
1244 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1245 // CComPtr<IGlobalFolderSettings> globalSettings;
1246 // SHELLSTATE2 shellState;
1249 memset(m_psp
, 0, sizeof(m_psp
));
1250 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1252 // create sheet object
1253 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1254 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1255 if (FAILED_UNEXPECTEDLY(hResult
))
1258 // must set site in order for Apply to all Folders on Advanced page to be enabled
1259 hResult
= folderOptionsSheet
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1260 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1261 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1262 m_PropSheet
.phpage
= m_psp
;
1265 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1266 if (FAILED_UNEXPECTEDLY(hResult
))
1268 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1269 if (FAILED_UNEXPECTEDLY(hResult
))
1274 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1275 if (FAILED_UNEXPECTEDLY(hResult
))
1278 if (fCurrentShellView
!= NULL
)
1280 hResult
= fCurrentShellView
->AddPropertySheetPages(
1281 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1282 if (FAILED_UNEXPECTEDLY(hResult
))
1287 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1288 m_PropSheet
.dwFlags
= 0;
1289 m_PropSheet
.hwndParent
= m_hWnd
;
1290 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1291 m_PropSheet
.pszCaption
= _T("Folder Options");
1292 m_PropSheet
.nStartPage
= 0;
1293 PropertySheet(&m_PropSheet
);
1297 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1299 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1300 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1302 const _ATL_MSG
*previousMessage
;
1304 WNDPROC saveWindowProc
;
1307 hWnd
= pThis
->m_hWnd
;
1308 previousMessage
= pThis
->m_pCurrentMsg
;
1309 pThis
->m_pCurrentMsg
= &msg
;
1311 CComPtr
<IMenuBand
> menuBand
;
1312 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1313 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1315 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1316 if (hResult
== S_OK
)
1319 wParam
= msg
.wParam
;
1320 lParam
= msg
.lParam
;
1324 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1325 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1326 if (handled
== FALSE
)
1328 if (uMsg
== WM_NCDESTROY
)
1330 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1331 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1332 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1333 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1334 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1337 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1339 pThis
->m_pCurrentMsg
= previousMessage
;
1340 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1342 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1343 pThis
->m_hWnd
= NULL
;
1344 pThis
->OnFinalMessage(hWnd
);
1349 void CShellBrowser::RepositionBars()
1355 GetClientRect(&clientRect
);
1357 if (fStatusBarVisible
&& fStatusBar
)
1359 ::GetWindowRect(fStatusBar
, &statusRect
);
1360 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1361 clientRect
.right
- clientRect
.left
,
1362 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1363 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1366 for (x
= 0; x
< 3; x
++)
1368 HWND hwnd
= fClientBars
[x
].hwnd
;
1369 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1370 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1372 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1373 fClientBars
[x
].hwnd
= hwnd
;
1377 RECT toolbarRect
= clientRect
;
1378 if (borderSpace
.top
!= 0)
1380 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1382 else if (borderSpace
.bottom
!= 0)
1384 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1386 else if (borderSpace
.left
!= 0)
1388 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1390 else if (borderSpace
.right
!= 0)
1392 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1395 ::SetWindowPos(hwnd
, NULL
,
1398 toolbarRect
.right
- toolbarRect
.left
,
1399 toolbarRect
.bottom
- toolbarRect
.top
,
1400 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1402 if (borderSpace
.top
!= 0)
1404 clientRect
.top
= toolbarRect
.bottom
;
1406 else if (borderSpace
.bottom
!= 0)
1408 clientRect
.bottom
= toolbarRect
.top
;
1410 else if (borderSpace
.left
!= 0)
1412 clientRect
.left
= toolbarRect
.right
;
1414 else if (borderSpace
.right
!= 0)
1416 clientRect
.right
= toolbarRect
.left
;
1420 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1421 clientRect
.right
- clientRect
.left
,
1422 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1425 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1428 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1429 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1432 params
.rgvarg
= arguments
;
1433 params
.rgdispidNamedArgs
= NULL
;
1434 params
.cArgs
= argCount
;
1435 params
.cNamedArgs
= 0;
1436 IUnknown
** pp
= vec
.begin();
1437 while (pp
< vec
.end())
1441 CComPtr
<IDispatch
> theDispatch
;
1443 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1444 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1449 while (pp
< vec2
.end())
1453 CComPtr
<IDispatch
> theDispatch
;
1455 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1456 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1463 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1465 // these two variants intentionally to do use CComVariant because it would double free/release
1466 // or does not need to dispose at all
1469 CComBSTR
tempString(newDirectory
);
1471 V_VT(&varArgs
) = VT_BSTR
;
1472 V_BSTR(&varArgs
) = tempString
.m_str
;
1474 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1475 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1476 V_VT(&varArg
[1]) = VT_DISPATCH
;
1477 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1479 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1482 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1486 V_VT(&varArg
[0]) = VT_BOOL
;
1487 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1488 V_VT(&varArg
[1]) = VT_I4
;
1489 V_I4(&varArg
[1]) = commandID
;
1491 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1494 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1496 return FireCommandStateChange(false, -1);
1499 HRESULT
CShellBrowser::UpdateForwardBackState()
1501 CComPtr
<ITravelLog
> travelLog
;
1502 CComPtr
<ITravelEntry
> unusedEntry
;
1508 canGoForward
= false;
1509 hResult
= GetTravelLog(&travelLog
);
1510 if (FAILED_UNEXPECTEDLY(hResult
))
1512 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1513 if (SUCCEEDED(hResult
))
1516 unusedEntry
.Release();
1518 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1519 if (SUCCEEDED(hResult
))
1521 canGoForward
= true;
1522 unusedEntry
.Release();
1524 hResult
= FireCommandStateChange(canGoBack
, 2);
1525 hResult
= FireCommandStateChange(canGoForward
, 1);
1529 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1531 CComPtr
<ITravelLog
> travelLog
;
1533 MENUITEMINFO menuItemInfo
;
1536 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1538 position
= GetMenuItemCount(theMenu
);
1539 hResult
= GetTravelLog(&travelLog
);
1540 if (FAILED_UNEXPECTEDLY(hResult
))
1542 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1543 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1544 if (SUCCEEDED(hResult
))
1546 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1547 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1548 menuItemInfo
.fType
= MF_SEPARATOR
;
1549 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1550 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1554 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1556 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1557 CComPtr
<ITravelLog
> travelLog
;
1559 OLECMD commandList
[5];
1560 HMENU toolbarMenuBar
;
1562 MENUITEMINFO menuItemInfo
;
1565 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1566 if (gotoMenu
!= NULL
)
1567 UpdateGotoMenu(gotoMenu
);
1569 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1570 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1571 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1572 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1573 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1575 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1576 IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1577 if (SUCCEEDED(hResult
))
1578 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1579 if (FAILED_UNEXPECTEDLY(hResult
))
1580 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1583 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1584 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1585 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1586 DestroyMenu(menuItemInfo
.hSubMenu
);
1588 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1589 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1590 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1591 DestroyMenu(toolbarMenuBar
);
1593 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1594 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1595 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1596 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1597 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1598 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1599 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1600 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1602 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1603 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1604 menuItemInfo
.hSubMenu
= toolbarMenu
;
1605 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1607 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1610 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1612 CComPtr
<IUnknown
> int1Retry
;
1613 CComPtr
<IUnknown
> int2Retry
;
1618 if (int1
== NULL
|| int2
== NULL
)
1620 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1621 if (FAILED_UNEXPECTEDLY(hResult
))
1623 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1624 if (FAILED_UNEXPECTEDLY(hResult
))
1626 if (int1Retry
== int2Retry
)
1631 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1633 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1635 RECT availableBounds
;
1637 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1638 for (INT x
= 0; x
< 3; x
++)
1640 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1642 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1643 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1644 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1645 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1648 *prcBorder
= availableBounds
;
1652 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1657 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1659 for (INT x
= 0; x
< 3; x
++)
1661 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1663 fClientBars
[x
].borderSpace
= *pbw
;
1664 // if this bar changed size, it cascades and forces all subsequent bars to resize
1669 return E_INVALIDARG
;
1672 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1673 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1675 CComPtr
<IOleCommandTarget
> commandTarget
;
1678 if (prgCmds
== NULL
)
1679 return E_INVALIDARG
;
1680 if (pguidCmdGroup
== NULL
)
1682 if (fCurrentShellView
.p
!= NULL
)
1684 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1685 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1686 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1695 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1699 switch (prgCmds
->cmdID
)
1701 case 0x1c: // search
1702 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1704 case 0x1d: // history
1705 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1707 case 0x1e: // favorites
1708 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1710 case 0x23: // folders
1711 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1721 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1725 switch (prgCmds
->cmdID
)
1727 case 0xa022: // up level
1728 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1729 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1730 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1740 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1741 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1745 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1750 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1753 if (nCmdexecopt
== 1)
1755 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1759 // update zones part of the status bar
1762 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1763 V_VT(pvaOut
) = VT_INT_PTR
;
1764 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1765 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1768 // indicate if this cabinet was opened as a browser
1774 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1783 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1788 // what is theater mode and why do we receive this?
1792 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1797 // initialize favorites menu
1801 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1806 // refresh on toolbar clicked
1809 // tell the view if it should hide the task pane or not
1810 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1813 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1818 return NavigateToParent();
1821 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1826 return DoFolderOptions();
1829 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1834 // Reset All Folders option in Folder Options
1845 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1853 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1858 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1860 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1862 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1864 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1867 DestroyMenu(mainMenu
);
1869 lpMenuWidths
->width
[0] = 2;
1870 lpMenuWidths
->width
[2] = 3;
1871 lpMenuWidths
->width
[4] = 1;
1875 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1877 CComPtr
<IShellMenu
> shellMenu
;
1880 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
1882 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1883 if (FAILED_UNEXPECTEDLY(hResult
))
1885 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1886 if (FAILED_UNEXPECTEDLY(hResult
))
1888 fCurrentMenuBar
= hmenuShared
;
1892 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1894 if (hmenuShared
== fCurrentMenuBar
)
1896 //DestroyMenu(fCurrentMenuBar);
1897 SetMenuSB(NULL
, NULL
, NULL
);
1902 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1907 ::SetWindowText(fStatusBar
, pszStatusText
);
1916 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1921 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1923 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1928 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1930 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1933 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1938 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1946 *lphwnd
= fToolbarProxy
.m_hWnd
;
1949 *lphwnd
= fStatusBar
;
1952 // find the directory browser and return it
1953 // this should be used only to determine if a tree is present
1956 // is this a progress dialog?
1962 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1963 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1972 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1977 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1985 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1989 *ppshv
= fCurrentShellView
;
1990 if (fCurrentShellView
.p
!= NULL
)
1991 fCurrentShellView
.p
->AddRef();
1995 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2000 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2005 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2006 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2011 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2016 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2021 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2022 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2027 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2029 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2030 // the returned interface has a method GetPropertyBag on it
2031 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2032 return this->QueryInterface(riid
, ppvObject
);
2033 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2034 return this->QueryInterface(riid
, ppvObject
);
2035 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2036 return this->QueryInterface(riid
, ppvObject
);
2037 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2038 return this->QueryInterface(riid
, ppvObject
);
2039 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2040 return this->QueryInterface(riid
, ppvObject
);
2041 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2042 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2043 if (IsEqualIID(riid
, IID_IShellBrowser
))
2044 return this->QueryInterface(riid
, ppvObject
);
2045 return E_NOINTERFACE
;
2048 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2050 if (ppvObject
== NULL
)
2056 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2061 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2066 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2067 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2072 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2073 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2078 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2083 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2088 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2093 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2098 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2102 // called by toolbar when displaying tooltips
2107 if (fTravelLog
.p
== NULL
)
2109 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2110 if (FAILED_UNEXPECTEDLY(hResult
))
2113 *pptl
= fTravelLog
.p
;
2114 fTravelLog
.p
->AddRef();
2118 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2123 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2128 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2133 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2138 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2143 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2148 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2153 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2158 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2163 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2168 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2173 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2178 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2183 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2188 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2190 // called by explorer bar to get current pidl
2193 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2197 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2202 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2207 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2212 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2214 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2215 return E_INVALIDARG
;
2216 *ppole
= fHistoryObject
;
2217 if (fHistoryObject
!= NULL
)
2218 fHistoryObject
->AddRef();
2219 *pstm
= fHistoryStream
;
2220 if (fHistoryStream
!= NULL
)
2221 fHistoryStream
->AddRef();
2222 *ppbc
= fHistoryBindContext
;
2223 if (fHistoryBindContext
!= NULL
)
2224 fHistoryBindContext
->AddRef();
2225 fHistoryObject
= NULL
;
2226 fHistoryStream
= NULL
;
2227 fHistoryBindContext
= NULL
;
2233 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2238 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2243 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2248 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2249 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2254 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2259 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2264 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2269 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2274 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2279 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2284 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2286 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2290 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2295 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2300 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2305 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2310 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2315 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2320 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2325 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2326 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2331 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2336 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2341 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2346 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2351 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2356 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2361 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2366 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2371 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2376 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2381 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2386 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2391 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2396 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2401 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2406 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2411 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2416 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2421 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2426 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2431 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2436 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2437 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2442 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2443 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2448 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2453 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2458 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2463 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2468 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2473 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2478 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2483 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2488 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2493 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2498 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2503 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2508 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2513 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2518 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2523 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2528 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2533 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2538 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2543 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2544 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2549 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2554 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2559 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2564 extern HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
);
2565 extern HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
);
2566 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2568 for (int i
= 0; i
< 3; i
++)
2570 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2574 if (!fCurrentShellView
)
2577 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2580 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2585 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2590 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2592 CComPtr
<ITravelLog
> travelLog
;
2595 hResult
= GetTravelLog(&travelLog
);
2596 if (FAILED_UNEXPECTEDLY(hResult
))
2598 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2601 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2603 CComPtr
<ITravelLog
> travelLog
;
2606 hResult
= GetTravelLog(&travelLog
);
2607 if (FAILED_UNEXPECTEDLY(hResult
))
2609 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2612 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2617 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2622 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2623 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2628 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2632 V_VT(&level
) = VT_I4
;
2634 return Refresh2(&level
);
2637 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2639 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2642 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2643 if (FAILED_UNEXPECTEDLY(hResult
))
2645 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2648 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2653 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2658 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2663 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2668 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2673 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2678 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2685 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2690 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2695 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2700 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2705 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2710 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2715 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2720 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2727 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2732 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2737 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2742 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2747 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2752 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2757 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2762 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2767 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2772 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2777 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2782 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2787 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2792 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2797 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2802 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2807 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2812 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2817 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2822 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2827 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2832 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2837 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2842 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2843 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2848 // called from drive combo box to navigate to a directory
2849 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2850 return E_INVALIDARG
;
2851 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2852 return E_INVALIDARG
;
2853 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2854 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2855 if (FAILED_UNEXPECTEDLY(hResult
))
2860 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2865 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2866 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2871 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2876 // called to show search bar
2877 if (V_VT(pvaClsid
) != VT_BSTR
)
2878 return E_INVALIDARG
;
2879 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2880 // TODO: properly compute the value of vertical
2882 return ShowBand(classID
, vertical
);
2885 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2890 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2895 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2900 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2905 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2910 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2915 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2920 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2925 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2930 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2935 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2940 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2945 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2950 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2955 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2960 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2965 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2967 if (pWinData
== NULL
)
2970 pWinData
->dwWindowID
= -1;
2972 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2973 pWinData
->lpszUrl
= NULL
;
2974 pWinData
->lpszUrlLocation
= NULL
;
2975 pWinData
->lpszTitle
= NULL
;
2979 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2984 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2989 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2991 CComPtr
<IPersistHistory
> viewPersistHistory
;
2992 CComPtr
<IOleObject
> viewHistoryObject
;
2993 persistState oldState
;
2998 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2999 if (FAILED_UNEXPECTEDLY(hResult
))
3001 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3003 if (oldState
.browseType
!= 2)
3005 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3007 return E_OUTOFMEMORY
;
3008 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3009 if (FAILED_UNEXPECTEDLY(hResult
))
3014 if (numRead
!= oldState
.pidlSize
)
3019 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3020 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3021 fHistoryObject
= viewHistoryObject
;
3022 fHistoryStream
= pStream
;
3023 fHistoryBindContext
= pbc
;
3024 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
3025 fHistoryObject
= NULL
;
3026 fHistoryStream
= NULL
;
3027 fHistoryBindContext
= NULL
;
3029 if (FAILED_UNEXPECTEDLY(hResult
))
3034 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3036 CComPtr
<IPersistHistory
> viewPersistHistory
;
3037 persistState newState
;
3040 hResult
= fCurrentShellView
->GetItemObject(
3041 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3042 memset(&newState
, 0, sizeof(newState
));
3043 newState
.dwSize
= sizeof(newState
);
3044 newState
.browseType
= 2;
3045 newState
.browserIndex
= GetBrowserIndex();
3046 if (viewPersistHistory
.p
!= NULL
)
3048 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3049 if (FAILED_UNEXPECTEDLY(hResult
))
3052 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3053 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3054 if (FAILED_UNEXPECTEDLY(hResult
))
3056 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3057 if (FAILED_UNEXPECTEDLY(hResult
))
3059 if (viewPersistHistory
.p
!= NULL
)
3061 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3062 if (FAILED_UNEXPECTEDLY(hResult
))
3068 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3073 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3078 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3080 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3084 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3087 // TODO: rip down everything
3089 fCurrentShellView
->DestroyViewWindow();
3090 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3091 ReleaseCComPtrExpectZero(fCurrentShellView
);
3093 for (int i
= 0; i
< 3; i
++)
3095 if (fClientBars
[i
].clientBar
== NULL
)
3097 IDockingWindow
* pdw
;
3098 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3099 if (FAILED_UNEXPECTEDLY(hr
))
3104 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3106 ReleaseCComPtrExpectZero(fTravelLog
);
3108 fCurrentShellFolder
.Release();
3109 ILFree(fCurrentDirectoryPIDL
);
3110 ::DestroyWindow(fStatusBar
);
3111 DestroyMenu(fCurrentMenuBar
);
3117 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3119 CComPtr
<IDockingWindow
> dockingWindow
;
3120 RECT availableBounds
;
3121 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3124 if (wParam
!= SIZE_MINIMIZED
)
3126 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3127 for (INT x
= 0; x
< 3; x
++)
3129 if (fClientBars
[x
].clientBar
!= NULL
)
3131 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3132 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3133 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3135 hResult
= dockingWindow
->ResizeBorderDW(
3136 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3146 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3149 LPARAM menuIndex
= lParam
;
3151 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3153 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3157 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3161 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3163 UpdateViewMenu(theMenu
);
3166 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3170 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3174 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3179 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3184 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3186 if (fCurrentShellViewWindow
!= NULL
)
3187 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3191 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3196 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3200 hResult
= DoFolderOptions();
3204 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3207 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3208 #endif /* __REACTOS__ */
3212 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3215 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3216 #endif /* __REACTOS__ */
3220 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3222 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3226 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3234 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3238 hResult
= GoForward();
3242 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3246 hResult
= NavigateToParent();
3250 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3258 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3262 // FIXME: This does not appear to be what windows does.
3263 hResult
= NavigateToParent();
3267 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3271 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3272 PSHOpenNewFrame Func
= NULL
;
3273 HMODULE Module
= GetModuleHandle(TEXT("browseui.dll"));
3275 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(Module
, (LPCSTR
) 103));
3278 LPITEMIDLIST desktopPIDL
;
3280 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3281 if (SUCCEEDED(hResult
))
3283 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3289 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3291 fStatusBarVisible
= !fStatusBarVisible
;
3292 // TODO: trigger a relayout of contained items
3296 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3298 CComPtr
<IOleCommandTarget
> commandTarget
;
3301 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3302 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3303 if (FAILED_UNEXPECTEDLY(hResult
))
3305 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3309 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3311 CComPtr
<IOleCommandTarget
> commandTarget
;
3314 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3315 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3316 if (FAILED_UNEXPECTEDLY(hResult
))
3318 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3322 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3324 CComPtr
<IOleCommandTarget
> commandTarget
;
3327 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3328 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3329 if (FAILED_UNEXPECTEDLY(hResult
))
3331 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3335 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3337 CComPtr
<IOleCommandTarget
> commandTarget
;
3340 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3341 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3342 if (FAILED_UNEXPECTEDLY(hResult
))
3344 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3348 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3350 CComPtr
<IOleCommandTarget
> commandTarget
;
3353 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3354 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3355 if (FAILED_UNEXPECTEDLY(hResult
))
3357 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3361 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3363 CComPtr
<IOleCommandTarget
> commandTarget
;
3366 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3367 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3368 if (FAILED_UNEXPECTEDLY(hResult
))
3370 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3374 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3379 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3381 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3382 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3386 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3388 CComPtr
<CShellBrowser
> theCabinet
;
3393 // Tell the thread ref we are using it.
3394 if (parameters
&& parameters
->offsetF8
)
3395 parameters
->offsetF8
->AddRef();
3397 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3398 if (theCabinet
== NULL
)
3400 return E_OUTOFMEMORY
;
3403 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3404 if (FAILED_UNEXPECTEDLY(hResult
))
3405 return E_OUTOFMEMORY
;
3407 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3411 // Error: continue or exit?
3415 if (Msg
.message
== WM_QUIT
)
3418 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3420 TranslateMessage(&Msg
);
3421 DispatchMessage(&Msg
);
3425 int nrc
= theCabinet
->Release();
3428 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3431 theCabinet
.Detach();
3433 // Tell the thread ref we are not using it anymore.
3434 if (parameters
&& parameters
->offsetF8
)
3435 parameters
->offsetF8
->Release();
3440 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3443 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3445 OleInitialize(NULL
);
3447 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3451 SHDestroyIETHREADPARAM(parameters
);