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
32 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
34 #include "newatlinterfaces.h"
38 **Provide implementation of new and delete that use LocalAlloc
39 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
40 view doesn't restore the selection correctly.
41 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
42 **Add brand band bitmaps to shell32.dll
43 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
44 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
45 current state overwrites the wrong entry's contents. This needs to be changed.
46 ****Fix close of browser window to release all objects
47 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
48 **When a new bar is added to base bar site, how is base bar told so it can resize?
49 **Does the base bar site have a classid?
50 **What should refresh command send to views to make them refresh?
51 **When new bar is created, what status notifications need to be fired?
52 **How does keyboard filtering dispatch?
53 **For deferred persist history load, how does the view connect up and get the state?
54 How does context menu send open, cut, rename commands to its site (the shell view)?
55 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
57 **Route View->Toolbars commands to internet toolbar
58 **Handle travel log items in View->Go
59 **Fix ShowBrowserBar to pass correct size on when bar is shown
60 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
61 ****Make ShowToolbar check if bar is already created before creating it again
62 ****Shell should fill in the list of explorer bars in the View submenus
63 **Add folder menu in the file menu
64 **Fix CShellBrowser::GetBorderDW to compute available size correctly
65 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
66 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
67 Make folders toolbar item update state appropriately
68 Read list of bands from registry on launch
69 Read list of bars from registry on launch
70 If the folders or search bars don't exist, disable the toolbar buttons
71 If the favorites or history bars don't exist, disable the toolbar butons
72 Fix Apply to all Folders in Folder Options
73 Implement close command
74 Add explorer band context menu to file menu
75 Add code to allow restore of internet toolbar from registry
76 Fix code that calls FireNavigateComplete to pass the correct new path
78 What are the other command ids for QueryStatus/FireCommandStateChange?
80 Add handler for cabinet settings change
81 Add handler for system metrics change (renegotiate border space?)
82 Add handler for theme change and forward to contained windows
84 When folders are shown, the status bar text should change
85 Add code to save/restore shell view settings
86 Implement tabbing between frames
87 Fix handling of focus everywhere
88 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
90 The status bar doesn't show help text for items owned by frame during menu tracking
91 Stub out frame command handlers
92 "Arrange icons by" group is not checked properly
94 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
95 the icon is always an open folder with magnifying glass
96 Fix bars to calculate height correctly
97 Hookup policies for everything...
98 Investigate toolbar message WM_USER+93
99 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
101 Vertical Explorer Bar CATID_InfoBand
102 Horizontal Explorer Bar CATID_CommBand
103 Desk Band CATID_DeskBand
106 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
107 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
109 create key here with CLSID of bar to register tool band
110 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
115 #pragma comment(linker, \
116 "\"/manifestdependency:type='Win32' "\
117 "name='Microsoft.Windows.Common-Controls' "\
118 "version='6.0.0.0' "\
119 "processorArchitecture='*' "\
120 "publicKeyToken='6595b64144ccf1df' "\
124 struct categoryCacheHeader
126 long dwSize
; // size of header only
127 long version
; // currently 1
128 SYSTEMTIME writeTime
; // time we were written to registry
129 long classCount
; // number of classes following
132 static const unsigned int folderOptionsPageCountMax
= 20;
133 static const long BTP_UPDATE_CUR_HISTORY
= 1;
134 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
136 BOOL createNewStuff
= false;
139 // this class is private to browseui.dll and is not registered externally?
140 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
143 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
144 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
145 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
148 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
151 HMENU
SHGetMenuFromID(HMENU topMenu
, int theID
)
153 MENUITEMINFO menuItemInfo
;
155 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
156 menuItemInfo
.fMask
= MIIM_SUBMENU
;
157 if (!GetMenuItemInfo(topMenu
, theID
, FALSE
, &menuItemInfo
))
159 return menuItemInfo
.hSubMenu
;
162 void SHCheckMenuItem(HMENU theMenu
, int theID
, BOOL checked
)
164 MENUITEMINFO menuItemInfo
;
166 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
167 menuItemInfo
.fMask
= MIIM_STATE
;
168 if (GetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
))
171 menuItemInfo
.fState
|= MF_CHECKED
;
173 menuItemInfo
.fState
&= ~MF_CHECKED
;
174 SetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
);
178 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
180 MENUITEMINFO menuItemInfo
;
184 menuItemCount
= GetMenuItemCount(theMenu
);
186 while (curIndex
< menuItemCount
)
188 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
189 menuItemInfo
.fMask
= MIIM_ID
;
190 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
191 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
193 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
201 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
203 CComPtr
<IShellFolder
> desktop
;
205 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
206 if (FAILED_UNEXPECTEDLY(hr
))
208 if (path
== NULL
|| path
->mkid
.cb
== 0)
210 *newFolder
= desktop
;
211 desktop
.p
->AddRef ();
214 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
217 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
218 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
223 class CToolbarProxy
:
224 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
227 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
229 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
234 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
235 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
237 BEGIN_MSG_MAP(CToolbarProxy
)
238 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
239 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
243 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
248 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
249 if (myWindow
!= NULL
)
251 SubclassWindow(myWindow
);
252 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
253 hResult
= explorerToolbar
->QueryInterface(
254 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
258 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
264 if (fExplorerToolbar
.p
!= NULL
)
266 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
267 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
268 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
269 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
274 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
280 if (fExplorerToolbar
.p
!= NULL
)
281 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
286 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
287 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
291 class CShellBrowser
:
292 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
293 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
294 public IShellBrowser
,
296 public IServiceProvider
,
297 public IProfferServiceImpl
<CShellBrowser
>,
298 public IShellBrowserService
,
300 public ITravelLogClient
,
301 public IPersistHistory
,
302 public IDockingWindowSite
,
303 public IOleCommandTarget
,
304 public IBrowserService2
,
305 public IConnectionPointContainerImpl
<CShellBrowser
>,
306 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
307 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
314 CComPtr
<IUnknown
> clientBar
;
317 static const int BIInternetToolbar
= 0;
318 static const int BIVerticalBaseBar
= 1;
319 static const int BIHorizontalBaseBar
= 2;
321 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
322 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
323 CComPtr
<IShellView
> fCurrentShellView
; //
324 LPITEMIDLIST fCurrentDirectoryPIDL
; //
326 bool fStatusBarVisible
;
327 CToolbarProxy fToolbarProxy
;
328 barInfo fClientBars
[3];
329 CComPtr
<ITravelLog
> fTravelLog
;
330 HMENU fCurrentMenuBar
;
331 CABINETSTATE fCabinetState
;
332 // The next three fields support persisted history for shell views.
333 // They do not need to be reference counted.
334 IOleObject
*fHistoryObject
;
335 IStream
*fHistoryStream
;
336 IBindCtx
*fHistoryBindContext
;
340 ULONG
InternalAddRef()
342 OutputDebugString(_T("AddRef\n"));
343 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
345 ULONG
InternalRelease()
347 OutputDebugString(_T("Release\n"));
348 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
354 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
356 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
357 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
358 FOLDERSETTINGS
*folderSettings
, long flags
);
359 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
360 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
361 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
362 HRESULT
NavigateToParent();
363 HRESULT
DoFolderOptions();
364 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
365 void RepositionBars();
366 virtual WNDPROC
GetWindowProc()
370 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
371 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
372 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
373 HRESULT
FireCommandStateChangeAll();
374 HRESULT
UpdateForwardBackState();
375 void UpdateGotoMenu(HMENU theMenu
);
376 void UpdateViewMenu(HMENU theMenu
);
378 /* // *** IDockingWindowFrame methods ***
379 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
380 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
381 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
384 // *** IDockingWindowSite methods ***
385 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
386 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
387 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
389 // *** IOleCommandTarget methods ***
390 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
391 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
392 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
393 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
395 // *** IOleWindow methods ***
396 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
397 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
399 // *** IShellBrowser methods ***
400 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
401 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
402 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
403 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
404 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
405 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
406 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
407 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
408 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
409 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
410 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
411 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
412 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
414 // *** IDropTarget methods ***
415 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
416 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
417 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
418 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
420 // *** IServiceProvider methods ***
421 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
423 // *** IShellBowserService methods ***
424 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
426 // *** IDispatch methods ***
427 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
428 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
429 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
430 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
431 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
432 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
434 // *** IBrowserService methods ***
435 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
436 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
437 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
438 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
439 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
440 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
441 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
442 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
443 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
444 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
445 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
446 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
447 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
448 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
449 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
450 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
451 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
452 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
453 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
454 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
455 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
456 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
457 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
458 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
459 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
460 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
461 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
462 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
463 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
464 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
466 // *** IBrowserService2 methods ***
467 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
468 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
469 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
470 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
471 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
472 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
473 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
474 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
475 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
476 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
477 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
478 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
479 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
480 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
481 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
482 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
483 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
484 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
485 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
486 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
487 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
488 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
489 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
490 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
491 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
492 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
493 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
494 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
495 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
496 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
497 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
498 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
499 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
500 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
501 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
502 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
503 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
504 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
505 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
506 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
507 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
508 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
509 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
510 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
511 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
512 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
513 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
514 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
515 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
516 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
517 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
518 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
519 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
520 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
521 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
522 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
523 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
524 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
525 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
526 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
527 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
528 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
529 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
530 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
531 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
533 // *** IWebBrowser methods ***
534 virtual HRESULT STDMETHODCALLTYPE
GoBack();
535 virtual HRESULT STDMETHODCALLTYPE
GoForward();
536 virtual HRESULT STDMETHODCALLTYPE
GoHome();
537 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
538 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
539 VARIANT
*PostData
, VARIANT
*Headers
);
540 virtual HRESULT STDMETHODCALLTYPE
Refresh();
541 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
542 virtual HRESULT STDMETHODCALLTYPE
Stop();
543 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
544 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
545 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
546 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
547 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
548 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
549 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
550 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
551 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
552 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
553 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
554 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
555 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
556 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
557 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
558 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
559 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
561 // *** IWebBrowserApp methods ***
562 virtual HRESULT STDMETHODCALLTYPE
Quit();
563 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
564 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
565 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
566 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
567 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
568 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
569 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
570 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
571 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
572 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
573 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
574 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
575 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
576 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
577 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
578 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
579 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
580 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
581 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
583 // *** IWebBrowser2 methods ***
584 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
585 VARIANT
*PostData
, VARIANT
*Headers
);
586 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
587 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
588 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
589 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
590 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
591 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
592 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
593 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
594 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
595 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
596 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
597 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
598 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
599 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
600 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
601 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
602 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
603 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
604 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
606 // *** ITravelLogClient methods ***
607 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
608 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
609 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
611 // *** IPersist methods ***
612 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
614 // *** IPersistHistory methods ***
615 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
616 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
617 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
618 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
621 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
622 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
623 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
624 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
625 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
626 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
627 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
628 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
629 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
630 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
631 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
632 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
633 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
634 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
635 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
636 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
637 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
638 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
639 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
640 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
641 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
642 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
643 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
644 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
645 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
647 static ATL::CWndClassInfo
& GetWndClassInfo()
649 static ATL::CWndClassInfo wc
=
651 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
652 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
653 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
654 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
659 BEGIN_MSG_MAP(CShellBrowser
)
660 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
661 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
662 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
663 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
664 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
665 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
666 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
667 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
668 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
669 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
670 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
671 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
672 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
673 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
674 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
675 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
676 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
677 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
678 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
679 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
680 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
681 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
682 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
683 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
684 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
685 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
686 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
689 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
690 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
691 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
692 END_CONNECTION_POINT_MAP()
694 BEGIN_COM_MAP(CShellBrowser
)
695 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
696 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
697 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
698 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
699 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
700 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
701 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
702 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
703 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
704 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
705 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
706 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
707 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
708 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
709 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
710 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
711 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
712 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
716 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
718 CShellBrowser::CShellBrowser()
720 fCurrentShellViewWindow
= NULL
;
721 fCurrentDirectoryPIDL
= NULL
;
723 fStatusBarVisible
= true;
724 memset(fClientBars
, 0, sizeof(fClientBars
));
725 fCurrentMenuBar
= NULL
;
726 fHistoryObject
= NULL
;
727 fHistoryStream
= NULL
;
728 fHistoryBindContext
= NULL
;
731 CShellBrowser::~CShellBrowser()
735 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
737 CComPtr
<IPersistStreamInit
> persistStreamInit
;
739 CComPtr
<IUnknown
> clientBar
;
741 _AtlInitialConstruct();
743 fCabinetState
.cLength
= sizeof(fCabinetState
);
744 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
749 Create(HWND_DESKTOP
);
754 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
755 if (FAILED_UNEXPECTEDLY(hResult
))
758 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &clientBar
));
759 if (FAILED_UNEXPECTEDLY(hResult
))
763 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
766 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
767 if (FAILED_UNEXPECTEDLY(hResult
))
770 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
771 if (FAILED_UNEXPECTEDLY(hResult
))
774 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
775 if (FAILED_UNEXPECTEDLY(hResult
))
778 // TODO: create settingsStream from registry entry
779 //if (settingsStream.p)
781 // hResult = persistStreamInit->Load(settingsStream);
782 // if (FAILED_UNEXPECTEDLY(hResult))
787 hResult
= persistStreamInit
->InitNew();
788 if (FAILED_UNEXPECTEDLY(hResult
))
792 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
793 if (FAILED_UNEXPECTEDLY(hResult
))
796 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
800 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
801 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
802 _AtlBaseModule
.GetModuleInstance(), 0);
803 fStatusBarVisible
= true;
807 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
808 if (FAILED_UNEXPECTEDLY(hResult
))
811 ShowWindow(SW_SHOWNORMAL
);
816 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
818 CComPtr
<IShellFolder
> newFolder
;
819 FOLDERSETTINGS newFolderSettings
;
822 // called by shell view to browse to new folder
823 // also called by explorer band to navigate to new folder
824 hResult
= SHBindToFolder(pidl
, &newFolder
);
825 if (FAILED_UNEXPECTEDLY(hResult
))
828 newFolderSettings
.ViewMode
= FVM_ICON
;
829 newFolderSettings
.fFlags
= 0;
830 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
831 if (FAILED_UNEXPECTEDLY(hResult
))
836 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
838 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
841 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
843 LPCITEMIDLIST pidlnext
;
848 if (! _ILIsDesktop(pidl
))
850 length
= pidl
->mkid
.cb
;
852 reinterpret_cast<LPCITEMIDLIST
>(
853 reinterpret_cast<const BYTE
*>(pidl
) + length
);
854 if (pidlnext
->mkid
.cb
!= 0)
860 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
861 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
863 CComPtr
<IShellFolder
> psf
;
864 LPITEMIDLIST pidlChild
;
865 LPITEMIDLIST pidlParent
;
872 if (ppidlLast
!= NULL
)
874 if (_ILIsPidlSimple(pidl
))
876 if (ppidlLast
!= NULL
)
877 *ppidlLast
= ILClone(pidl
);
878 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
882 pidlChild
= ILClone(ILFindLastID(pidl
));
883 pidlParent
= ILClone(pidl
);
884 ILRemoveLastID(pidlParent
);
885 hResult
= SHGetDesktopFolder(&psf
);
886 if (SUCCEEDED(hResult
))
887 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
888 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
889 *ppidlLast
= pidlChild
;
897 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
898 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
900 CComPtr
<IShellFolder
> parentFolder
;
901 LPITEMIDLIST childPIDL
;
905 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
906 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
907 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
909 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
914 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
916 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
919 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
920 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
922 CComPtr
<IObjectWithSite
> objectWithSite
;
923 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
924 CComPtr
<IShellView
> saveCurrentShellView
;
925 CComPtr
<IShellView
> newShellView
;
926 CComPtr
<ITravelLog
> travelLog
;
927 HWND newShellViewWindow
;
928 BOOL windowUpdateIsLocked
;
929 RECT shellViewWindowBounds
;
932 wchar_t newTitle
[MAX_PATH
];
936 if (newShellFolder
== NULL
)
939 hResult
= GetTravelLog(&travelLog
);
940 if (FAILED_UNEXPECTEDLY(hResult
))
944 if (flags
& BTP_UPDATE_CUR_HISTORY
)
946 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
947 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
948 // what to do with error? Do we want to halt browse because state save failed?
951 if (fCurrentShellView
)
953 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
956 // create view object
957 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
958 if (FAILED_UNEXPECTEDLY(hResult
))
960 previousView
= fCurrentShellViewWindow
;
962 // enter updating section
963 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
964 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
965 if (fCurrentShellView
!= NULL
)
966 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
969 hResult
= newShellView
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
970 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
971 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
973 // update folder and view
974 saveCurrentShellFolder
= fCurrentShellFolder
;
975 saveCurrentShellView
= fCurrentShellView
;
976 fCurrentShellFolder
= newShellFolder
;
977 fCurrentShellView
= newShellView
;
980 if (previousView
!= NULL
)
981 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
983 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
984 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
986 // create view window
987 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
988 this, &shellViewWindowBounds
, &newShellViewWindow
);
989 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
991 fCurrentShellView
= saveCurrentShellView
;
992 fCurrentShellFolder
= saveCurrentShellFolder
;
993 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
994 if (windowUpdateIsLocked
)
995 LockWindowUpdate(FALSE
);
996 SetCursor(saveCursor
);
1000 if (objectWithSite
.p
!= NULL
)
1001 hResult
= objectWithSite
->SetSite(NULL
);
1003 // update current pidl
1004 ILFree(fCurrentDirectoryPIDL
);
1005 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1007 // update view window
1008 if (saveCurrentShellView
!= NULL
)
1009 saveCurrentShellView
->DestroyViewWindow();
1010 fCurrentShellViewWindow
= newShellViewWindow
;
1013 saveCurrentShellView
.Release();
1014 saveCurrentShellFolder
.Release();
1016 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1018 // leave updating section
1019 if (windowUpdateIsLocked
)
1020 LockWindowUpdate(FALSE
);
1021 SetCursor(saveCursor
);
1024 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1026 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1027 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1031 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1032 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1033 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1034 if (SUCCEEDED(hResult
))
1036 FireNavigateComplete(newTitle
);
1040 FireNavigateComplete(L
"ERROR");
1043 if (fCabinetState
.fFullPathTitle
)
1044 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1046 nameFlags
= SHGDN_FORADDRESSBAR
;
1047 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1048 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1049 if (SUCCEEDED(hResult
))
1051 SetWindowText(newTitle
);
1053 LPCITEMIDLIST pidlChild
;
1054 INT index
, indexOpen
;
1055 HIMAGELIST himlSmall
, himlLarge
;
1057 CComPtr
<IShellFolder
> sf
;
1058 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1060 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1062 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1064 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1065 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1067 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1068 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1071 // TODO: Update the window icon
1073 FireCommandStateChangeAll();
1074 hResult
= UpdateForwardBackState();
1078 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1080 CComPtr
<IServiceProvider
> serviceProvider
;
1081 CComPtr
<IBandSite
> bandSite
;
1082 CComPtr
<IDeskBand
> deskBand
;
1085 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1086 if (FAILED_UNEXPECTEDLY(hResult
))
1088 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1089 if (FAILED_UNEXPECTEDLY(hResult
))
1091 return deskBand
->QueryInterface(riid
, shellMenu
);
1094 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1096 CComPtr
<IUnknown
> newBaseBar
;
1097 CComPtr
<IDeskBar
> deskBar
;
1098 CComPtr
<IUnknown
> newBaseBarSite
;
1099 CComPtr
<IObjectWithSite
> objectWithSite
;
1100 CComPtr
<IDeskBarClient
> deskBarClient
;
1105 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1107 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1110 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1111 if (FAILED_UNEXPECTEDLY(hResult
))
1113 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1114 if (FAILED_UNEXPECTEDLY(hResult
))
1117 // tell the new base bar about the shell browser
1118 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1119 if (FAILED_UNEXPECTEDLY(hResult
))
1121 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1122 if (FAILED_UNEXPECTEDLY(hResult
))
1125 // tell the new base bar about the new base bar site
1126 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1127 if (FAILED_UNEXPECTEDLY(hResult
))
1129 hResult
= deskBar
->SetClient(newBaseBarSite
);
1130 if (FAILED_UNEXPECTEDLY(hResult
))
1133 // tell the new base bar site about the new base bar
1134 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1135 if (FAILED_UNEXPECTEDLY(hResult
))
1137 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1138 if (FAILED_UNEXPECTEDLY(hResult
))
1141 *cache
= newBaseBar
.Detach();
1143 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1146 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1148 CComPtr
<IDockingWindow
> dockingWindow
;
1149 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1150 CComPtr
<IUnknown
> baseBarSite
;
1151 CComPtr
<IUnknown
> newBand
;
1152 CComPtr
<IUnknown
> theBaseBar
;
1153 CComPtr
<IDeskBar
> deskBar
;
1159 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1160 if (FAILED_UNEXPECTEDLY(hResult
))
1162 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1163 if (FAILED_UNEXPECTEDLY(hResult
))
1165 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1166 if (FAILED_UNEXPECTEDLY(hResult
))
1168 hResult
= deskBar
->GetClient(&baseBarSite
);
1169 if (FAILED_UNEXPECTEDLY(hResult
))
1171 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1172 if (FAILED_UNEXPECTEDLY(hResult
))
1174 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1175 if (FAILED_UNEXPECTEDLY(hResult
))
1177 V_VT(&vaIn
) = VT_UNKNOWN
;
1178 V_UNKNOWN(&vaIn
) = newBand
.p
;
1179 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1180 if (FAILED_UNEXPECTEDLY(hResult
))
1182 hResult
= dockingWindow
->ShowDW(TRUE
);
1183 if (FAILED_UNEXPECTEDLY(hResult
))
1188 HRESULT
CShellBrowser::NavigateToParent()
1190 LPITEMIDLIST newDirectory
;
1193 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1194 if (newDirectory
== NULL
)
1195 return E_OUTOFMEMORY
;
1196 ILRemoveLastID(newDirectory
);
1197 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1198 ILFree(newDirectory
);
1199 if (FAILED_UNEXPECTEDLY(hResult
))
1204 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1206 PROPSHEETHEADER
*sheetInfo
;
1208 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1209 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1211 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1212 sheetInfo
->nPages
++;
1216 HRESULT
CShellBrowser::DoFolderOptions()
1218 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1219 CComPtr
<IObjectWithSite
> objectWithSite
;
1220 PROPSHEETHEADER m_PropSheet
;
1221 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1222 // CComPtr<IGlobalFolderSettings> globalSettings;
1223 // SHELLSTATE2 shellState;
1226 memset(m_psp
, 0, sizeof(m_psp
));
1227 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1229 // create sheet object
1230 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1231 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1232 if (FAILED_UNEXPECTEDLY(hResult
))
1235 // must set site in order for Apply to all Folders on Advanced page to be enabled
1236 hResult
= folderOptionsSheet
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1237 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1238 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1239 m_PropSheet
.phpage
= m_psp
;
1242 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1243 if (FAILED_UNEXPECTEDLY(hResult
))
1245 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1246 if (FAILED_UNEXPECTEDLY(hResult
))
1251 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1252 if (FAILED_UNEXPECTEDLY(hResult
))
1255 if (fCurrentShellView
!= NULL
)
1257 hResult
= fCurrentShellView
->AddPropertySheetPages(
1258 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1259 if (FAILED_UNEXPECTEDLY(hResult
))
1264 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1265 m_PropSheet
.dwFlags
= 0;
1266 m_PropSheet
.hwndParent
= m_hWnd
;
1267 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1268 m_PropSheet
.pszCaption
= _T("Folder Options");
1269 m_PropSheet
.nStartPage
= 0;
1270 PropertySheet(&m_PropSheet
);
1274 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1276 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1277 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1279 const _ATL_MSG
*previousMessage
;
1281 WNDPROC saveWindowProc
;
1284 hWnd
= pThis
->m_hWnd
;
1285 previousMessage
= pThis
->m_pCurrentMsg
;
1286 pThis
->m_pCurrentMsg
= &msg
;
1288 CComPtr
<IMenuBand
> menuBand
;
1289 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1290 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1292 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1293 if (hResult
== S_OK
)
1296 wParam
= msg
.wParam
;
1297 lParam
= msg
.lParam
;
1301 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1302 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1303 if (handled
== FALSE
)
1305 if (uMsg
== WM_NCDESTROY
)
1307 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1308 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1309 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1310 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1311 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1314 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1316 pThis
->m_pCurrentMsg
= previousMessage
;
1317 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1319 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1320 pThis
->m_hWnd
= NULL
;
1321 pThis
->OnFinalMessage(hWnd
);
1326 void CShellBrowser::RepositionBars()
1332 GetClientRect(&clientRect
);
1334 if (fStatusBarVisible
&& fStatusBar
)
1336 ::GetWindowRect(fStatusBar
, &statusRect
);
1337 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1338 clientRect
.right
- clientRect
.left
,
1339 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1340 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1343 for (x
= 0; x
< 3; x
++)
1345 HWND hwnd
= fClientBars
[x
].hwnd
;
1346 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1347 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1349 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1350 fClientBars
[x
].hwnd
= hwnd
;
1354 RECT toolbarRect
= clientRect
;
1355 if (borderSpace
.top
!= 0)
1357 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1359 else if (borderSpace
.bottom
!= 0)
1361 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1363 else if (borderSpace
.left
!= 0)
1365 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1367 else if (borderSpace
.right
!= 0)
1369 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1372 ::SetWindowPos(hwnd
, NULL
,
1375 toolbarRect
.right
- toolbarRect
.left
,
1376 toolbarRect
.bottom
- toolbarRect
.top
,
1377 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1379 if (borderSpace
.top
!= 0)
1381 clientRect
.top
= toolbarRect
.bottom
;
1383 else if (borderSpace
.bottom
!= 0)
1385 clientRect
.bottom
= toolbarRect
.top
;
1387 else if (borderSpace
.left
!= 0)
1389 clientRect
.left
= toolbarRect
.right
;
1391 else if (borderSpace
.right
!= 0)
1393 clientRect
.right
= toolbarRect
.left
;
1397 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1398 clientRect
.right
- clientRect
.left
,
1399 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1402 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1405 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1406 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1409 params
.rgvarg
= arguments
;
1410 params
.rgdispidNamedArgs
= NULL
;
1411 params
.cArgs
= argCount
;
1412 params
.cNamedArgs
= 0;
1413 IUnknown
** pp
= vec
.begin();
1414 while (pp
< vec
.end())
1418 CComPtr
<IDispatch
> theDispatch
;
1420 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1421 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1426 while (pp
< vec2
.end())
1430 CComPtr
<IDispatch
> theDispatch
;
1432 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1433 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1440 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1442 // these two variants intentionally to do use CComVariant because it would double free/release
1443 // or does not need to dispose at all
1446 CComBSTR
tempString(newDirectory
);
1448 V_VT(&varArgs
) = VT_BSTR
;
1449 V_BSTR(&varArgs
) = tempString
.m_str
;
1451 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1452 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1453 V_VT(&varArg
[1]) = VT_DISPATCH
;
1454 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1456 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1459 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1463 V_VT(&varArg
[0]) = VT_BOOL
;
1464 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1465 V_VT(&varArg
[1]) = VT_I4
;
1466 V_I4(&varArg
[1]) = commandID
;
1468 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1471 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1473 return FireCommandStateChange(false, -1);
1476 HRESULT
CShellBrowser::UpdateForwardBackState()
1478 CComPtr
<ITravelLog
> travelLog
;
1479 CComPtr
<ITravelEntry
> unusedEntry
;
1485 canGoForward
= false;
1486 hResult
= GetTravelLog(&travelLog
);
1487 if (FAILED_UNEXPECTEDLY(hResult
))
1489 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1490 if (SUCCEEDED(hResult
))
1493 unusedEntry
.Release();
1495 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1496 if (SUCCEEDED(hResult
))
1498 canGoForward
= true;
1499 unusedEntry
.Release();
1501 hResult
= FireCommandStateChange(canGoBack
, 2);
1502 hResult
= FireCommandStateChange(canGoForward
, 1);
1506 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1508 CComPtr
<ITravelLog
> travelLog
;
1510 MENUITEMINFO menuItemInfo
;
1513 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1515 position
= GetMenuItemCount(theMenu
);
1516 hResult
= GetTravelLog(&travelLog
);
1517 if (FAILED_UNEXPECTEDLY(hResult
))
1519 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1520 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1521 if (SUCCEEDED(hResult
))
1523 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1524 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1525 menuItemInfo
.fType
= MF_SEPARATOR
;
1526 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1527 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1531 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1533 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1534 CComPtr
<ITravelLog
> travelLog
;
1536 OLECMD commandList
[5];
1537 HMENU toolbarMenuBar
;
1539 MENUITEMINFO menuItemInfo
;
1542 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1543 if (gotoMenu
!= NULL
)
1544 UpdateGotoMenu(gotoMenu
);
1546 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1547 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1548 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1549 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1550 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1552 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1553 IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1554 if (SUCCEEDED(hResult
))
1555 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1556 if (FAILED_UNEXPECTEDLY(hResult
))
1557 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1560 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1561 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1562 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1563 DestroyMenu(menuItemInfo
.hSubMenu
);
1565 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1566 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1567 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1568 DestroyMenu(toolbarMenuBar
);
1570 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1571 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1572 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1573 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1574 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1575 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1576 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1577 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1579 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1580 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1581 menuItemInfo
.hSubMenu
= toolbarMenu
;
1582 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1584 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1587 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1589 CComPtr
<IUnknown
> int1Retry
;
1590 CComPtr
<IUnknown
> int2Retry
;
1595 if (int1
== NULL
|| int2
== NULL
)
1597 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1598 if (FAILED_UNEXPECTEDLY(hResult
))
1600 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1601 if (FAILED_UNEXPECTEDLY(hResult
))
1603 if (int1Retry
== int2Retry
)
1608 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1610 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1612 RECT availableBounds
;
1614 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1615 for (INT x
= 0; x
< 3; x
++)
1617 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1619 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1620 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1621 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1622 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1625 *prcBorder
= availableBounds
;
1629 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1634 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1636 for (INT x
= 0; x
< 3; x
++)
1638 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1640 fClientBars
[x
].borderSpace
= *pbw
;
1641 // if this bar changed size, it cascades and forces all subsequent bars to resize
1646 return E_INVALIDARG
;
1649 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1650 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1652 CComPtr
<IOleCommandTarget
> commandTarget
;
1655 if (prgCmds
== NULL
)
1656 return E_INVALIDARG
;
1657 if (pguidCmdGroup
== NULL
)
1659 if (fCurrentShellView
.p
!= NULL
)
1661 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1662 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1663 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1672 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1676 switch (prgCmds
->cmdID
)
1678 case 0x1c: // search
1679 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1681 case 0x1d: // history
1682 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1684 case 0x1e: // favorites
1685 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1687 case 0x23: // folders
1688 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1698 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1702 switch (prgCmds
->cmdID
)
1704 case 0xa022: // up level
1705 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1706 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1707 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1717 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1718 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1722 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1727 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1730 if (nCmdexecopt
== 1)
1732 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1736 // update zones part of the status bar
1739 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1740 V_VT(pvaOut
) = VT_INT_PTR
;
1741 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1742 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1745 // indicate if this cabinet was opened as a browser
1751 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1760 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1765 // what is theater mode and why do we receive this?
1769 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1774 // initialize favorites menu
1778 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1783 // refresh on toolbar clicked
1786 // tell the view if it should hide the task pane or not
1787 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1790 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1795 return NavigateToParent();
1798 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1803 return DoFolderOptions();
1806 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1811 // Reset All Folders option in Folder Options
1822 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1830 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1835 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1837 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1838 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1840 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1843 DestroyMenu(mainMenu
);
1845 lpMenuWidths
->width
[0] = 2;
1846 lpMenuWidths
->width
[2] = 3;
1847 lpMenuWidths
->width
[4] = 1;
1851 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1853 CComPtr
<IShellMenu
> shellMenu
;
1856 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
1858 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1859 if (FAILED_UNEXPECTEDLY(hResult
))
1861 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1862 if (FAILED_UNEXPECTEDLY(hResult
))
1864 fCurrentMenuBar
= hmenuShared
;
1868 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1870 if (hmenuShared
== fCurrentMenuBar
)
1872 //DestroyMenu(fCurrentMenuBar);
1873 SetMenuSB(NULL
, NULL
, NULL
);
1878 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1883 ::SetWindowText(fStatusBar
, pszStatusText
);
1892 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1897 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1899 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1904 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1906 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1909 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1914 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1922 *lphwnd
= fToolbarProxy
.m_hWnd
;
1925 *lphwnd
= fStatusBar
;
1928 // find the directory browser and return it
1929 // this should be used only to determine if a tree is present
1932 // is this a progress dialog?
1938 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1939 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1948 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1953 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1961 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1965 *ppshv
= fCurrentShellView
;
1966 if (fCurrentShellView
.p
!= NULL
)
1967 fCurrentShellView
.p
->AddRef();
1971 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1976 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1981 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1982 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1987 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
1992 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
1997 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
1998 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2003 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2005 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2006 // the returned interface has a method GetPropertyBag on it
2007 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2008 return this->QueryInterface(riid
, ppvObject
);
2009 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2010 return this->QueryInterface(riid
, ppvObject
);
2011 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2012 return this->QueryInterface(riid
, ppvObject
);
2013 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2014 return this->QueryInterface(riid
, ppvObject
);
2015 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2016 return this->QueryInterface(riid
, ppvObject
);
2017 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2018 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2019 if (IsEqualIID(riid
, IID_IShellBrowser
))
2020 return this->QueryInterface(riid
, ppvObject
);
2021 return E_NOINTERFACE
;
2024 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2026 if (ppvObject
== NULL
)
2032 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2037 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2042 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2043 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2048 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2049 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2054 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2059 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2064 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2069 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2074 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2078 // called by toolbar when displaying tooltips
2083 if (fTravelLog
.p
== NULL
)
2085 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2086 if (FAILED_UNEXPECTEDLY(hResult
))
2089 *pptl
= fTravelLog
.p
;
2090 fTravelLog
.p
->AddRef();
2094 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2099 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2104 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2109 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2114 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2119 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2124 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2129 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2134 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2139 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2144 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2149 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2154 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2159 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2164 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2166 // called by explorer bar to get current pidl
2169 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2173 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2178 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2183 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2188 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2190 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2191 return E_INVALIDARG
;
2192 *ppole
= fHistoryObject
;
2193 if (fHistoryObject
!= NULL
)
2194 fHistoryObject
->AddRef();
2195 *pstm
= fHistoryStream
;
2196 if (fHistoryStream
!= NULL
)
2197 fHistoryStream
->AddRef();
2198 *ppbc
= fHistoryBindContext
;
2199 if (fHistoryBindContext
!= NULL
)
2200 fHistoryBindContext
->AddRef();
2201 fHistoryObject
= NULL
;
2202 fHistoryStream
= NULL
;
2203 fHistoryBindContext
= NULL
;
2209 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2214 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2219 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2224 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2225 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2230 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2235 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2240 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2245 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2250 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2255 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2260 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2262 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2266 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2271 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2276 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2281 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2286 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2291 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2296 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2301 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2302 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2307 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2312 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2317 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2322 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2327 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2332 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2337 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2342 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2347 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2352 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2357 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2362 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2367 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2372 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2377 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2382 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2387 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2392 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2397 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2402 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2407 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2412 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2413 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2418 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2419 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2424 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2429 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2434 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2439 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2444 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2449 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2454 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2459 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2464 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2469 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2474 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2479 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2484 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2489 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2494 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2499 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2504 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2509 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2514 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2519 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2520 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2525 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2530 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2535 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2540 extern HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
);
2541 extern HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
);
2542 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2544 for (int i
= 0; i
< 3; i
++)
2546 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2550 if (fCurrentShellView
->TranslateAcceleratorW(pmsg
) != S_OK
)
2552 if (TranslateAcceleratorSB(pmsg
, 0) != S_OK
)
2559 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2564 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2569 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2571 CComPtr
<ITravelLog
> travelLog
;
2574 hResult
= GetTravelLog(&travelLog
);
2575 if (FAILED_UNEXPECTEDLY(hResult
))
2577 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2580 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2582 CComPtr
<ITravelLog
> travelLog
;
2585 hResult
= GetTravelLog(&travelLog
);
2586 if (FAILED_UNEXPECTEDLY(hResult
))
2588 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2591 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2596 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2601 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2602 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2607 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2611 V_VT(&level
) = VT_I4
;
2613 return Refresh2(&level
);
2616 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2618 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2621 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2622 if (FAILED_UNEXPECTEDLY(hResult
))
2624 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2627 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2632 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2637 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2642 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2647 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2652 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2657 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2664 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2669 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2674 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2679 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2684 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2689 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2694 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2699 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2706 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2711 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2716 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2721 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2726 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2731 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2736 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2741 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2746 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2751 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2756 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2761 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2766 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2771 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2776 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2781 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2786 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2791 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2796 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2801 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2806 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2811 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2816 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2821 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2822 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2827 // called from drive combo box to navigate to a directory
2828 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2829 return E_INVALIDARG
;
2830 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2831 return E_INVALIDARG
;
2832 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2833 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2834 if (FAILED_UNEXPECTEDLY(hResult
))
2839 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2844 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2845 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2850 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2855 // called to show search bar
2856 if (V_VT(pvaClsid
) != VT_BSTR
)
2857 return E_INVALIDARG
;
2858 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2859 // TODO: properly compute the value of vertical
2861 return ShowBand(classID
, vertical
);
2864 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2869 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2874 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2879 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2884 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2889 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2894 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2899 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2904 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2909 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2914 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2919 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2924 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2929 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2934 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2939 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2944 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2946 if (pWinData
== NULL
)
2949 pWinData
->dwWindowID
= -1;
2951 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2952 pWinData
->lpszUrl
= NULL
;
2953 pWinData
->lpszUrlLocation
= NULL
;
2954 pWinData
->lpszTitle
= NULL
;
2958 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2963 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2968 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2970 CComPtr
<IPersistHistory
> viewPersistHistory
;
2971 CComPtr
<IOleObject
> viewHistoryObject
;
2972 persistState oldState
;
2977 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2978 if (FAILED_UNEXPECTEDLY(hResult
))
2980 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2982 if (oldState
.browseType
!= 2)
2984 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2986 return E_OUTOFMEMORY
;
2987 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2988 if (FAILED_UNEXPECTEDLY(hResult
))
2993 if (numRead
!= oldState
.pidlSize
)
2998 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
2999 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3000 fHistoryObject
= viewHistoryObject
;
3001 fHistoryStream
= pStream
;
3002 fHistoryBindContext
= pbc
;
3003 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
3004 fHistoryObject
= NULL
;
3005 fHistoryStream
= NULL
;
3006 fHistoryBindContext
= NULL
;
3008 if (FAILED_UNEXPECTEDLY(hResult
))
3013 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3015 CComPtr
<IPersistHistory
> viewPersistHistory
;
3016 persistState newState
;
3019 hResult
= fCurrentShellView
->GetItemObject(
3020 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3021 memset(&newState
, 0, sizeof(newState
));
3022 newState
.dwSize
= sizeof(newState
);
3023 newState
.browseType
= 2;
3024 newState
.browserIndex
= GetBrowserIndex();
3025 if (viewPersistHistory
.p
!= NULL
)
3027 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3028 if (FAILED_UNEXPECTEDLY(hResult
))
3031 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3032 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3033 if (FAILED_UNEXPECTEDLY(hResult
))
3035 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3036 if (FAILED_UNEXPECTEDLY(hResult
))
3038 if (viewPersistHistory
.p
!= NULL
)
3040 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3041 if (FAILED_UNEXPECTEDLY(hResult
))
3047 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3052 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3057 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3059 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3064 void ReleaseCComPtrExpectZero(CComPtr
<T
>& cptr
, BOOL forceRelease
= FALSE
)
3068 int nrc
= cptr
->Release();
3071 DbgPrint("WARNING: Unexpected RefCount > 0!\n");
3076 nrc
= cptr
->Release();
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
)
3150 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3151 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3152 UpdateViewMenu(theMenu
);
3153 return RelayMsgToShellView(uMsg
, wParam
, lParam
, bHandled
);
3156 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3158 if (fCurrentShellViewWindow
!= NULL
)
3159 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3163 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3168 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3172 hResult
= DoFolderOptions();
3176 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3179 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3180 #endif /* __REACTOS__ */
3184 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3187 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3188 #endif /* __REACTOS__ */
3192 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3194 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3198 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3206 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3210 hResult
= GoForward();
3214 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3218 hResult
= NavigateToParent();
3222 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3230 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3234 // FIXME: This does not appear to be what windows does.
3235 hResult
= NavigateToParent();
3239 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3243 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3244 PSHOpenNewFrame Func
= NULL
;
3245 HMODULE Module
= GetModuleHandle(TEXT("browseui.dll"));
3247 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(Module
, (LPCSTR
) 103));
3250 LPITEMIDLIST desktopPIDL
;
3252 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3253 if (SUCCEEDED(hResult
))
3255 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3261 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3263 fStatusBarVisible
= !fStatusBarVisible
;
3264 // TODO: trigger a relayout of contained items
3268 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3270 CComPtr
<IOleCommandTarget
> commandTarget
;
3273 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3274 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3275 if (FAILED_UNEXPECTEDLY(hResult
))
3277 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3281 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3283 CComPtr
<IOleCommandTarget
> commandTarget
;
3286 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3287 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3288 if (FAILED_UNEXPECTEDLY(hResult
))
3290 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3294 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3296 CComPtr
<IOleCommandTarget
> commandTarget
;
3299 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3300 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3301 if (FAILED_UNEXPECTEDLY(hResult
))
3303 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3307 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3309 CComPtr
<IOleCommandTarget
> commandTarget
;
3312 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3313 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3314 if (FAILED_UNEXPECTEDLY(hResult
))
3316 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3320 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3322 CComPtr
<IOleCommandTarget
> commandTarget
;
3325 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3326 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3327 if (FAILED_UNEXPECTEDLY(hResult
))
3329 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3333 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3335 CComPtr
<IOleCommandTarget
> commandTarget
;
3338 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3339 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3340 if (FAILED_UNEXPECTEDLY(hResult
))
3342 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3346 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3351 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3353 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3354 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3358 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3360 CComPtr
<CShellBrowser
> theCabinet
;
3365 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3366 if (theCabinet
== NULL
)
3368 return E_OUTOFMEMORY
;
3371 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3372 if (FAILED_UNEXPECTEDLY(hResult
))
3373 return E_OUTOFMEMORY
;
3375 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3379 // Error: continue or exit?
3383 if (Msg
.message
== WM_QUIT
)
3386 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3388 TranslateMessage(&Msg
);
3389 DispatchMessage(&Msg
);
3393 //TerminateProcess(GetCurrentProcess(), hResult);
3395 int nrc
= theCabinet
->Release();
3398 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked, process will never terminate. Terminating forcefully.\n", nrc
);
3400 //TerminateProcess(GetCurrentProcess(), 1);
3403 theCabinet
.Detach();
3408 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3411 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3413 OleInitialize(NULL
);
3415 ATLTRY(hr
= ExplorerMessageLoop(parameters
));