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
28 BOOL WINAPI
Shell_GetImageLists(
29 _Out_ HIMAGELIST
*phiml
,
30 _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
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
638 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
639 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
640 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
641 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
642 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
643 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
644 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
645 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
646 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
648 static ATL::CWndClassInfo
& GetWndClassInfo()
650 static ATL::CWndClassInfo wc
=
652 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
653 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
654 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
655 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
660 BEGIN_MSG_MAP(CShellBrowser
)
661 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
662 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
663 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
664 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
665 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
666 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
667 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
668 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
669 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
670 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
671 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
672 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
673 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
674 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
675 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
676 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
677 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
678 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
679 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
680 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
681 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
682 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
683 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
684 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
685 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
686 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
687 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
688 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
691 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
692 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
693 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
694 END_CONNECTION_POINT_MAP()
696 BEGIN_COM_MAP(CShellBrowser
)
697 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
698 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
699 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
700 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
701 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
702 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
703 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
704 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
705 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
706 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
707 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
708 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
709 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
710 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
711 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
712 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
713 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
714 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
718 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
720 CShellBrowser::CShellBrowser()
722 fCurrentShellViewWindow
= NULL
;
723 fCurrentDirectoryPIDL
= NULL
;
725 fStatusBarVisible
= true;
726 memset(fClientBars
, 0, sizeof(fClientBars
));
727 fCurrentMenuBar
= NULL
;
728 fHistoryObject
= NULL
;
729 fHistoryStream
= NULL
;
730 fHistoryBindContext
= NULL
;
733 CShellBrowser::~CShellBrowser()
737 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
739 CComPtr
<IPersistStreamInit
> persistStreamInit
;
741 CComPtr
<IUnknown
> clientBar
;
743 _AtlInitialConstruct();
745 fCabinetState
.cLength
= sizeof(fCabinetState
);
746 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
751 Create(HWND_DESKTOP
);
756 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
757 if (FAILED_UNEXPECTEDLY(hResult
))
760 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &clientBar
));
761 if (FAILED_UNEXPECTEDLY(hResult
))
765 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
768 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
769 if (FAILED_UNEXPECTEDLY(hResult
))
772 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
773 if (FAILED_UNEXPECTEDLY(hResult
))
776 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
777 if (FAILED_UNEXPECTEDLY(hResult
))
780 // TODO: create settingsStream from registry entry
781 //if (settingsStream.p)
783 // hResult = persistStreamInit->Load(settingsStream);
784 // if (FAILED_UNEXPECTEDLY(hResult))
789 hResult
= persistStreamInit
->InitNew();
790 if (FAILED_UNEXPECTEDLY(hResult
))
794 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
795 if (FAILED_UNEXPECTEDLY(hResult
))
798 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
802 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
803 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
804 _AtlBaseModule
.GetModuleInstance(), 0);
805 fStatusBarVisible
= true;
809 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
810 if (FAILED_UNEXPECTEDLY(hResult
))
813 ShowWindow(SW_SHOWNORMAL
);
818 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
820 CComPtr
<IShellFolder
> newFolder
;
821 FOLDERSETTINGS newFolderSettings
;
824 // called by shell view to browse to new folder
825 // also called by explorer band to navigate to new folder
826 hResult
= SHBindToFolder(pidl
, &newFolder
);
827 if (FAILED_UNEXPECTEDLY(hResult
))
830 newFolderSettings
.ViewMode
= FVM_ICON
;
831 newFolderSettings
.fFlags
= 0;
832 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
833 if (FAILED_UNEXPECTEDLY(hResult
))
838 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
840 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
843 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
845 LPCITEMIDLIST pidlnext
;
850 if (! _ILIsDesktop(pidl
))
852 length
= pidl
->mkid
.cb
;
854 reinterpret_cast<LPCITEMIDLIST
>(
855 reinterpret_cast<const BYTE
*>(pidl
) + length
);
856 if (pidlnext
->mkid
.cb
!= 0)
862 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
863 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
865 CComPtr
<IShellFolder
> psf
;
866 LPITEMIDLIST pidlChild
;
867 LPITEMIDLIST pidlParent
;
874 if (ppidlLast
!= NULL
)
876 if (_ILIsPidlSimple(pidl
))
878 if (ppidlLast
!= NULL
)
879 *ppidlLast
= ILClone(pidl
);
880 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
884 pidlChild
= ILClone(ILFindLastID(pidl
));
885 pidlParent
= ILClone(pidl
);
886 ILRemoveLastID(pidlParent
);
887 hResult
= SHGetDesktopFolder(&psf
);
888 if (SUCCEEDED(hResult
))
889 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
890 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
891 *ppidlLast
= pidlChild
;
899 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
900 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
902 CComPtr
<IShellFolder
> parentFolder
;
903 LPITEMIDLIST childPIDL
= NULL
;
907 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
911 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
915 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
918 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
931 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
933 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
936 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
937 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
939 CComPtr
<IObjectWithSite
> objectWithSite
;
940 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
941 CComPtr
<IShellView
> saveCurrentShellView
;
942 CComPtr
<IShellView
> newShellView
;
943 CComPtr
<ITravelLog
> travelLog
;
944 HWND newShellViewWindow
;
945 BOOL windowUpdateIsLocked
;
946 RECT shellViewWindowBounds
;
949 wchar_t newTitle
[MAX_PATH
];
953 if (newShellFolder
== NULL
)
956 hResult
= GetTravelLog(&travelLog
);
957 if (FAILED_UNEXPECTEDLY(hResult
))
961 if (flags
& BTP_UPDATE_CUR_HISTORY
)
963 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
964 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
965 // what to do with error? Do we want to halt browse because state save failed?
968 if (fCurrentShellView
)
970 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
973 // create view object
974 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
975 if (FAILED_UNEXPECTEDLY(hResult
))
977 previousView
= fCurrentShellViewWindow
;
979 // enter updating section
980 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
981 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
982 if (fCurrentShellView
!= NULL
)
983 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
986 hResult
= newShellView
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
987 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
988 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
990 // update folder and view
991 saveCurrentShellFolder
= fCurrentShellFolder
;
992 saveCurrentShellView
= fCurrentShellView
;
993 fCurrentShellFolder
= newShellFolder
;
994 fCurrentShellView
= newShellView
;
997 if (previousView
!= NULL
)
998 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
1000 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
1001 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
1003 // create view window
1004 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
1005 this, &shellViewWindowBounds
, &newShellViewWindow
);
1006 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
1008 fCurrentShellView
= saveCurrentShellView
;
1009 fCurrentShellFolder
= saveCurrentShellFolder
;
1010 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
1011 if (windowUpdateIsLocked
)
1012 LockWindowUpdate(FALSE
);
1013 SetCursor(saveCursor
);
1017 if (objectWithSite
.p
!= NULL
)
1018 hResult
= objectWithSite
->SetSite(NULL
);
1020 // update current pidl
1021 ILFree(fCurrentDirectoryPIDL
);
1022 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1024 // update view window
1025 if (saveCurrentShellView
!= NULL
)
1026 saveCurrentShellView
->DestroyViewWindow();
1027 fCurrentShellViewWindow
= newShellViewWindow
;
1030 saveCurrentShellView
.Release();
1031 saveCurrentShellFolder
.Release();
1033 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1035 // leave updating section
1036 if (windowUpdateIsLocked
)
1037 LockWindowUpdate(FALSE
);
1038 SetCursor(saveCursor
);
1041 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1043 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1044 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1048 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1049 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1050 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1051 if (SUCCEEDED(hResult
))
1053 FireNavigateComplete(newTitle
);
1057 FireNavigateComplete(L
"ERROR");
1060 if (fCabinetState
.fFullPathTitle
)
1061 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1063 nameFlags
= SHGDN_FORADDRESSBAR
;
1064 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1065 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1066 if (SUCCEEDED(hResult
))
1068 SetWindowText(newTitle
);
1070 LPCITEMIDLIST pidlChild
;
1071 INT index
, indexOpen
;
1072 HIMAGELIST himlSmall
, himlLarge
;
1074 CComPtr
<IShellFolder
> sf
;
1075 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1077 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1079 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1081 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1082 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1084 /* Hack to make it possible to release the old icons */
1085 /* Something seems to go wrong with WM_SETICON */
1086 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1087 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1089 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1090 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1092 DestroyIcon(oldSmall
);
1093 DestroyIcon(oldLarge
);
1096 FireCommandStateChangeAll();
1097 hResult
= UpdateForwardBackState();
1101 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1103 CComPtr
<IBandSite
> bandSite
;
1104 CComPtr
<IDeskBand
> deskBand
;
1107 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1110 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1111 if (FAILED_UNEXPECTEDLY(hResult
))
1114 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1115 if (FAILED_UNEXPECTEDLY(hResult
))
1118 return deskBand
->QueryInterface(riid
, shellMenu
);
1121 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1123 CComPtr
<IUnknown
> newBaseBar
;
1124 CComPtr
<IDeskBar
> deskBar
;
1125 CComPtr
<IUnknown
> newBaseBarSite
;
1126 CComPtr
<IDeskBarClient
> deskBarClient
;
1131 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1133 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1136 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1137 if (FAILED_UNEXPECTEDLY(hResult
))
1139 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1140 if (FAILED_UNEXPECTEDLY(hResult
))
1143 // tell the new base bar about the shell browser
1144 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1145 if (FAILED_UNEXPECTEDLY(hResult
))
1148 // tell the new base bar about the new base bar site
1149 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1150 if (FAILED_UNEXPECTEDLY(hResult
))
1152 hResult
= deskBar
->SetClient(newBaseBarSite
);
1153 if (FAILED_UNEXPECTEDLY(hResult
))
1156 // tell the new base bar site about the new base bar
1157 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1158 if (FAILED_UNEXPECTEDLY(hResult
))
1160 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1161 if (FAILED_UNEXPECTEDLY(hResult
))
1164 *cache
= newBaseBar
.Detach();
1166 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1169 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1171 CComPtr
<IDockingWindow
> dockingWindow
;
1172 CComPtr
<IUnknown
> baseBarSite
;
1173 CComPtr
<IUnknown
> newBand
;
1174 CComPtr
<IUnknown
> theBaseBar
;
1175 CComPtr
<IDeskBar
> deskBar
;
1179 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1180 if (FAILED_UNEXPECTEDLY(hResult
))
1182 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1183 if (FAILED_UNEXPECTEDLY(hResult
))
1185 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1186 if (FAILED_UNEXPECTEDLY(hResult
))
1188 hResult
= deskBar
->GetClient(&baseBarSite
);
1189 if (FAILED_UNEXPECTEDLY(hResult
))
1191 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1192 if (FAILED_UNEXPECTEDLY(hResult
))
1194 V_VT(&vaIn
) = VT_UNKNOWN
;
1195 V_UNKNOWN(&vaIn
) = newBand
.p
;
1196 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1197 if (FAILED_UNEXPECTEDLY(hResult
))
1199 hResult
= dockingWindow
->ShowDW(TRUE
);
1200 if (FAILED_UNEXPECTEDLY(hResult
))
1205 HRESULT
CShellBrowser::NavigateToParent()
1207 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1208 if (newDirectory
== NULL
)
1209 return E_OUTOFMEMORY
;
1210 ILRemoveLastID(newDirectory
);
1211 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1212 ILFree(newDirectory
);
1213 if (FAILED_UNEXPECTEDLY(hResult
))
1218 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1220 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1221 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1223 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1224 sheetInfo
->nPages
++;
1228 HRESULT
CShellBrowser::DoFolderOptions()
1230 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1231 PROPSHEETHEADER m_PropSheet
;
1232 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1233 // CComPtr<IGlobalFolderSettings> globalSettings;
1234 // SHELLSTATE2 shellState;
1237 memset(m_psp
, 0, sizeof(m_psp
));
1238 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1240 // create sheet object
1241 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1242 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1243 if (FAILED_UNEXPECTEDLY(hResult
))
1246 // must set site in order for Apply to all Folders on Advanced page to be enabled
1247 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1248 m_PropSheet
.phpage
= m_psp
;
1251 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1252 if (FAILED_UNEXPECTEDLY(hResult
))
1254 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1255 if (FAILED_UNEXPECTEDLY(hResult
))
1260 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1261 if (FAILED_UNEXPECTEDLY(hResult
))
1264 if (fCurrentShellView
!= NULL
)
1266 hResult
= fCurrentShellView
->AddPropertySheetPages(
1267 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1268 if (FAILED_UNEXPECTEDLY(hResult
))
1273 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1274 m_PropSheet
.dwFlags
= 0;
1275 m_PropSheet
.hwndParent
= m_hWnd
;
1276 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1277 m_PropSheet
.pszCaption
= _T("Folder Options");
1278 m_PropSheet
.nStartPage
= 0;
1279 PropertySheet(&m_PropSheet
);
1283 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1285 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1286 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1288 const _ATL_MSG
*previousMessage
;
1290 WNDPROC saveWindowProc
;
1293 hWnd
= pThis
->m_hWnd
;
1294 previousMessage
= pThis
->m_pCurrentMsg
;
1295 pThis
->m_pCurrentMsg
= &msg
;
1297 CComPtr
<IMenuBand
> menuBand
;
1298 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1299 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1301 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1302 if (hResult
== S_OK
)
1305 wParam
= msg
.wParam
;
1306 lParam
= msg
.lParam
;
1310 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1311 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1312 if (handled
== FALSE
)
1314 if (uMsg
== WM_NCDESTROY
)
1316 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1317 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1318 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1319 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1320 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1323 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1325 pThis
->m_pCurrentMsg
= previousMessage
;
1326 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1328 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1329 pThis
->m_hWnd
= NULL
;
1330 pThis
->OnFinalMessage(hWnd
);
1335 void CShellBrowser::RepositionBars()
1341 GetClientRect(&clientRect
);
1343 if (fStatusBarVisible
&& fStatusBar
)
1345 ::GetWindowRect(fStatusBar
, &statusRect
);
1346 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1347 clientRect
.right
- clientRect
.left
,
1348 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1349 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1352 for (x
= 0; x
< 3; x
++)
1354 HWND hwnd
= fClientBars
[x
].hwnd
;
1355 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1356 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1358 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1359 fClientBars
[x
].hwnd
= hwnd
;
1363 RECT toolbarRect
= clientRect
;
1364 if (borderSpace
.top
!= 0)
1366 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1368 else if (borderSpace
.bottom
!= 0)
1370 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1372 else if (borderSpace
.left
!= 0)
1374 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1376 else if (borderSpace
.right
!= 0)
1378 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1381 ::SetWindowPos(hwnd
, NULL
,
1384 toolbarRect
.right
- toolbarRect
.left
,
1385 toolbarRect
.bottom
- toolbarRect
.top
,
1386 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1388 if (borderSpace
.top
!= 0)
1390 clientRect
.top
= toolbarRect
.bottom
;
1392 else if (borderSpace
.bottom
!= 0)
1394 clientRect
.bottom
= toolbarRect
.top
;
1396 else if (borderSpace
.left
!= 0)
1398 clientRect
.left
= toolbarRect
.right
;
1400 else if (borderSpace
.right
!= 0)
1402 clientRect
.right
= toolbarRect
.left
;
1406 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1407 clientRect
.right
- clientRect
.left
,
1408 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1411 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1414 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1415 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1418 params
.rgvarg
= arguments
;
1419 params
.rgdispidNamedArgs
= NULL
;
1420 params
.cArgs
= argCount
;
1421 params
.cNamedArgs
= 0;
1422 IUnknown
** pp
= vec
.begin();
1423 while (pp
< vec
.end())
1427 CComPtr
<IDispatch
> theDispatch
;
1429 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1430 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1435 while (pp
< vec2
.end())
1439 CComPtr
<IDispatch
> theDispatch
;
1441 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1442 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1449 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1451 // these two variants intentionally to do use CComVariant because it would double free/release
1452 // or does not need to dispose at all
1455 CComBSTR
tempString(newDirectory
);
1457 V_VT(&varArgs
) = VT_BSTR
;
1458 V_BSTR(&varArgs
) = tempString
.m_str
;
1460 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1461 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1462 V_VT(&varArg
[1]) = VT_DISPATCH
;
1463 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1465 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1468 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1472 V_VT(&varArg
[0]) = VT_BOOL
;
1473 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1474 V_VT(&varArg
[1]) = VT_I4
;
1475 V_I4(&varArg
[1]) = commandID
;
1477 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1480 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1482 return FireCommandStateChange(false, -1);
1485 HRESULT
CShellBrowser::UpdateForwardBackState()
1487 CComPtr
<ITravelLog
> travelLog
;
1488 CComPtr
<ITravelEntry
> unusedEntry
;
1494 canGoForward
= false;
1495 hResult
= GetTravelLog(&travelLog
);
1496 if (FAILED_UNEXPECTEDLY(hResult
))
1498 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1499 if (SUCCEEDED(hResult
))
1502 unusedEntry
.Release();
1504 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1505 if (SUCCEEDED(hResult
))
1507 canGoForward
= true;
1508 unusedEntry
.Release();
1510 hResult
= FireCommandStateChange(canGoBack
, 2);
1511 hResult
= FireCommandStateChange(canGoForward
, 1);
1515 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1517 CComPtr
<ITravelLog
> travelLog
;
1519 MENUITEMINFO menuItemInfo
;
1522 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1524 position
= GetMenuItemCount(theMenu
);
1525 hResult
= GetTravelLog(&travelLog
);
1526 if (FAILED_UNEXPECTEDLY(hResult
))
1528 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1529 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1530 if (SUCCEEDED(hResult
))
1532 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1533 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1534 menuItemInfo
.fType
= MF_SEPARATOR
;
1535 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1536 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1540 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1542 CComPtr
<ITravelLog
> travelLog
;
1544 OLECMD commandList
[5];
1545 HMENU toolbarMenuBar
;
1547 MENUITEMINFO menuItemInfo
;
1550 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1551 if (gotoMenu
!= NULL
)
1552 UpdateGotoMenu(gotoMenu
);
1554 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1555 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1556 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1557 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1558 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1560 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1561 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1562 if (FAILED_UNEXPECTEDLY(hResult
))
1563 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1566 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1567 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1568 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1569 DestroyMenu(menuItemInfo
.hSubMenu
);
1571 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1572 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1573 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1574 DestroyMenu(toolbarMenuBar
);
1577 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1578 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1579 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1580 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1582 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1583 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1584 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1585 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1586 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1587 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1588 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1589 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1591 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1592 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1593 menuItemInfo
.hSubMenu
= toolbarMenu
;
1594 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1596 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1599 SHEnableMenuItem(theMenu
, IDM_VIEW_EXPLORERBAR
, FALSE
);
1602 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1604 CComPtr
<IUnknown
> int1Retry
;
1605 CComPtr
<IUnknown
> int2Retry
;
1610 if (int1
== NULL
|| int2
== NULL
)
1612 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1613 if (FAILED_UNEXPECTEDLY(hResult
))
1615 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1616 if (FAILED_UNEXPECTEDLY(hResult
))
1618 if (int1Retry
== int2Retry
)
1623 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1625 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1627 RECT availableBounds
;
1629 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1630 for (INT x
= 0; x
< 3; x
++)
1632 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1634 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1635 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1636 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1637 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1640 *prcBorder
= availableBounds
;
1644 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1649 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1651 for (INT x
= 0; x
< 3; x
++)
1653 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1655 fClientBars
[x
].borderSpace
= *pbw
;
1656 // if this bar changed size, it cascades and forces all subsequent bars to resize
1661 return E_INVALIDARG
;
1664 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1665 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1667 CComPtr
<IOleCommandTarget
> commandTarget
;
1670 if (prgCmds
== NULL
)
1671 return E_INVALIDARG
;
1672 if (pguidCmdGroup
== NULL
)
1674 if (fCurrentShellView
.p
!= NULL
)
1676 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1677 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1678 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1687 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1691 switch (prgCmds
->cmdID
)
1693 case 0x1c: // search
1694 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1696 case 0x1d: // history
1697 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1699 case 0x1e: // favorites
1700 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1702 case 0x23: // folders
1703 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1713 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1717 switch (prgCmds
->cmdID
)
1719 case 0xa022: // up level
1720 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1721 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1722 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1732 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1733 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1737 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1742 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1745 if (nCmdexecopt
== 1)
1747 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1751 // update zones part of the status bar
1754 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1755 V_VT(pvaOut
) = VT_INT_PTR
;
1756 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1757 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1760 // indicate if this cabinet was opened as a browser
1766 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1775 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1780 // what is theater mode and why do we receive this?
1784 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1789 // initialize favorites menu
1793 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1798 // refresh on toolbar clicked
1801 // tell the view if it should hide the task pane or not
1802 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1805 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1810 return NavigateToParent();
1813 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1818 return DoFolderOptions();
1821 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1826 // Reset All Folders option in Folder Options
1837 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1845 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1850 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1852 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1854 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1856 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1859 DestroyMenu(mainMenu
);
1861 lpMenuWidths
->width
[0] = 2;
1862 lpMenuWidths
->width
[2] = 3;
1863 lpMenuWidths
->width
[4] = 1;
1867 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1869 CComPtr
<IShellMenu
> shellMenu
;
1872 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
1874 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1875 if (FAILED_UNEXPECTEDLY(hResult
))
1877 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
1878 if (FAILED_UNEXPECTEDLY(hResult
))
1880 fCurrentMenuBar
= hmenuShared
;
1884 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1886 if (hmenuShared
== fCurrentMenuBar
)
1888 //DestroyMenu(fCurrentMenuBar);
1889 SetMenuSB(NULL
, NULL
, NULL
);
1894 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1899 ::SetWindowText(fStatusBar
, pszStatusText
);
1908 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1913 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1915 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1920 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1922 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1925 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1930 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1938 *lphwnd
= fToolbarProxy
.m_hWnd
;
1941 *lphwnd
= fStatusBar
;
1944 // find the directory browser and return it
1945 // this should be used only to determine if a tree is present
1948 // is this a progress dialog?
1954 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1955 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1964 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1969 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1977 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1981 *ppshv
= fCurrentShellView
;
1982 if (fCurrentShellView
.p
!= NULL
)
1983 fCurrentShellView
.p
->AddRef();
1987 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1992 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1997 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1998 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2003 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2008 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2013 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2014 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2019 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2021 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2022 // the returned interface has a method GetPropertyBag on it
2023 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2024 return this->QueryInterface(riid
, ppvObject
);
2025 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2026 return this->QueryInterface(riid
, ppvObject
);
2027 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2028 return this->QueryInterface(riid
, ppvObject
);
2029 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2030 return this->QueryInterface(riid
, ppvObject
);
2031 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2032 return this->QueryInterface(riid
, ppvObject
);
2033 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2034 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2035 if (IsEqualIID(riid
, IID_IShellBrowser
))
2036 return this->QueryInterface(riid
, ppvObject
);
2037 return E_NOINTERFACE
;
2040 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2042 if (ppvObject
== NULL
)
2048 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2053 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2058 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2059 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2064 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2065 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2070 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2075 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2080 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2085 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2090 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2094 // called by toolbar when displaying tooltips
2099 if (fTravelLog
.p
== NULL
)
2101 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2102 if (FAILED_UNEXPECTEDLY(hResult
))
2105 *pptl
= fTravelLog
.p
;
2106 fTravelLog
.p
->AddRef();
2110 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2115 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2120 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2125 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2130 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2135 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2140 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2145 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2150 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2155 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2165 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2170 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2180 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2182 // called by explorer bar to get current pidl
2185 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2189 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2194 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2199 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2204 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2206 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2207 return E_INVALIDARG
;
2208 *ppole
= fHistoryObject
;
2209 if (fHistoryObject
!= NULL
)
2210 fHistoryObject
->AddRef();
2211 *pstm
= fHistoryStream
;
2212 if (fHistoryStream
!= NULL
)
2213 fHistoryStream
->AddRef();
2214 *ppbc
= fHistoryBindContext
;
2215 if (fHistoryBindContext
!= NULL
)
2216 fHistoryBindContext
->AddRef();
2217 fHistoryObject
= NULL
;
2218 fHistoryStream
= NULL
;
2219 fHistoryBindContext
= NULL
;
2225 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2230 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2235 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2240 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2241 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2246 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2251 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2256 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2261 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2266 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2271 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2276 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2278 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2282 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2292 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2297 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2302 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2307 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2312 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2317 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2318 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2323 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2328 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2333 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2338 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2343 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2353 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2358 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2363 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2368 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2373 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2378 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2383 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2388 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2398 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2403 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2408 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2413 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2418 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2423 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2428 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2429 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2434 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2435 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2440 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2445 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2450 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2455 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2460 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2465 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2470 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2475 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2480 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2485 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2490 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2495 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2500 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2505 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2510 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2515 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2520 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2525 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2530 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2535 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2536 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2541 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2546 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2551 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2556 extern HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
);
2557 extern HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
);
2558 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2560 for (int i
= 0; i
< 3; i
++)
2562 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2566 if (!fCurrentShellView
)
2569 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2572 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2577 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2582 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2584 CComPtr
<ITravelLog
> travelLog
;
2585 HRESULT hResult
= GetTravelLog(&travelLog
);
2586 if (FAILED_UNEXPECTEDLY(hResult
))
2588 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2591 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2593 CComPtr
<ITravelLog
> travelLog
;
2594 HRESULT hResult
= GetTravelLog(&travelLog
);
2595 if (FAILED_UNEXPECTEDLY(hResult
))
2597 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2600 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2605 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2610 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2611 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2616 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2620 V_VT(&level
) = VT_I4
;
2622 return Refresh2(&level
);
2625 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2627 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2630 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2631 if (FAILED_UNEXPECTEDLY(hResult
))
2633 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2636 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2641 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2646 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2651 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2656 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2661 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2666 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2673 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2678 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2683 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2688 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2693 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2698 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2703 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2708 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2715 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2720 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2725 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2730 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2735 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2740 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2745 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2750 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2755 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2760 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2765 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2770 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2775 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2780 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2785 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2790 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2795 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2800 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2805 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2810 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2815 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2820 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2825 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2830 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2831 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2833 // called from drive combo box to navigate to a directory
2834 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2835 return E_INVALIDARG
;
2836 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2837 return E_INVALIDARG
;
2839 LPITEMIDLIST pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
2840 HRESULT hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2841 if (FAILED_UNEXPECTEDLY(hResult
))
2846 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2851 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2852 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2857 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2862 // called to show search bar
2863 if (V_VT(pvaClsid
) != VT_BSTR
)
2864 return E_INVALIDARG
;
2865 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2866 // TODO: properly compute the value of vertical
2868 return ShowBand(classID
, vertical
);
2871 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2876 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2881 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2886 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2891 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2896 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2901 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2906 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2911 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2916 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2921 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2926 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2931 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2936 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2941 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2946 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2951 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2953 if (pWinData
== NULL
)
2956 pWinData
->dwWindowID
= -1;
2958 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2959 pWinData
->lpszUrl
= NULL
;
2960 pWinData
->lpszUrlLocation
= NULL
;
2961 pWinData
->lpszTitle
= NULL
;
2965 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2970 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2975 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2977 CComPtr
<IPersistHistory
> viewPersistHistory
;
2978 CComPtr
<IOleObject
> viewHistoryObject
;
2979 persistState oldState
;
2984 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2985 if (FAILED_UNEXPECTEDLY(hResult
))
2987 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2989 if (oldState
.browseType
!= 2)
2991 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
2993 return E_OUTOFMEMORY
;
2994 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
2995 if (FAILED_UNEXPECTEDLY(hResult
))
3000 if (numRead
!= oldState
.pidlSize
)
3005 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3006 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3007 fHistoryObject
= viewHistoryObject
;
3008 fHistoryStream
= pStream
;
3009 fHistoryBindContext
= pbc
;
3010 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
3011 fHistoryObject
= NULL
;
3012 fHistoryStream
= NULL
;
3013 fHistoryBindContext
= NULL
;
3015 if (FAILED_UNEXPECTEDLY(hResult
))
3020 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3022 CComPtr
<IPersistHistory
> viewPersistHistory
;
3023 persistState newState
;
3026 hResult
= fCurrentShellView
->GetItemObject(
3027 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3028 memset(&newState
, 0, sizeof(newState
));
3029 newState
.dwSize
= sizeof(newState
);
3030 newState
.browseType
= 2;
3031 newState
.browserIndex
= GetBrowserIndex();
3032 if (viewPersistHistory
.p
!= NULL
)
3034 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3035 if (FAILED_UNEXPECTEDLY(hResult
))
3038 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3039 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3040 if (FAILED_UNEXPECTEDLY(hResult
))
3042 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3043 if (FAILED_UNEXPECTEDLY(hResult
))
3045 if (viewPersistHistory
.p
!= NULL
)
3047 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3048 if (FAILED_UNEXPECTEDLY(hResult
))
3054 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3059 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3064 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3066 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3070 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3073 // TODO: rip down everything
3075 fCurrentShellView
->DestroyViewWindow();
3076 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3077 ReleaseCComPtrExpectZero(fCurrentShellView
);
3079 for (int i
= 0; i
< 3; i
++)
3081 if (fClientBars
[i
].clientBar
== NULL
)
3083 IDockingWindow
* pdw
;
3084 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3085 if (FAILED_UNEXPECTEDLY(hr
))
3090 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3092 ReleaseCComPtrExpectZero(fTravelLog
);
3094 fCurrentShellFolder
.Release();
3095 ILFree(fCurrentDirectoryPIDL
);
3096 ::DestroyWindow(fStatusBar
);
3097 DestroyMenu(fCurrentMenuBar
);
3103 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3105 CComPtr
<IDockingWindow
> dockingWindow
;
3106 RECT availableBounds
;
3107 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3110 if (wParam
!= SIZE_MINIMIZED
)
3112 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3113 for (INT x
= 0; x
< 3; x
++)
3115 if (fClientBars
[x
].clientBar
!= NULL
)
3117 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3118 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3119 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3121 hResult
= dockingWindow
->ResizeBorderDW(
3122 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3132 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3135 LPARAM menuIndex
= lParam
;
3137 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3139 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3143 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3147 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3149 UpdateViewMenu(theMenu
);
3152 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3156 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3158 // FIXME: Remove once implemented
3159 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3160 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3161 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3162 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
);
3165 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3170 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3175 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3177 if (fCurrentShellViewWindow
!= NULL
)
3178 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3182 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3184 return SendMessage(WM_CLOSE
);
3187 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3189 HRESULT hResult
= DoFolderOptions();
3190 if (FAILED(hResult
))
3191 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3195 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3198 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3199 #endif /* __REACTOS__ */
3203 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3206 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3207 #endif /* __REACTOS__ */
3211 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3213 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3217 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3219 HRESULT hResult
= GoBack();
3220 if (FAILED(hResult
))
3221 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3225 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3227 HRESULT hResult
= GoForward();
3228 if (FAILED(hResult
))
3229 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3233 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3235 HRESULT hResult
= NavigateToParent();
3236 if (FAILED(hResult
))
3237 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3241 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3243 HRESULT hResult
= GoHome();
3244 if (FAILED(hResult
))
3245 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3249 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3251 // FIXME: This does not appear to be what windows does.
3252 HRESULT hResult
= NavigateToParent();
3253 if (FAILED(hResult
))
3254 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3258 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3260 CComPtr
<IShellFolder
> psfDesktop
;
3261 LPITEMIDLIST pidlFavs
;
3263 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3266 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3271 hr
= SHGetDesktopFolder(&psfDesktop
);
3272 if (FAILED_UNEXPECTEDLY(hr
))
3275 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3276 if (FAILED_UNEXPECTEDLY(hr
))
3282 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3284 /* TODO: Implement properly */
3286 LPCWSTR strSite
= L
"https://www.reactos.org/user-faq";
3288 /* TODO: Make localizable */
3289 LPCWSTR strCaption
= L
"Sorry";
3290 LPCWSTR strMessage
= L
"ReactOS could not browse to '%s' (error %d). Please make sure there is a web browser installed.";
3291 WCHAR tmpMessage
[512];
3293 /* TODO: Read from the registry */
3294 LPCWSTR strVerb
= NULL
; /* default */
3295 LPCWSTR strPath
= strSite
;
3296 LPCWSTR strParams
= NULL
;
3298 /* The return value is defined as HINSTANCE for backwards compatibility only, the cast is needed */
3299 int result
= (int) ShellExecuteW(m_hWnd
, strVerb
, strPath
, strParams
, NULL
, SW_SHOWNORMAL
);
3302 StringCchPrintfW(tmpMessage
, 512, strMessage
, strSite
, result
);
3303 MessageBoxExW(m_hWnd
, tmpMessage
, strCaption
, MB_OK
, 0);
3309 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3311 fStatusBarVisible
= !fStatusBarVisible
;
3312 // TODO: trigger a relayout of contained items
3316 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3319 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3320 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3324 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3327 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3328 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3332 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3335 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3336 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3340 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3343 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3344 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3348 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3351 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3352 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3356 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3359 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3360 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3364 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3369 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3371 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3372 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3376 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3378 CComPtr
<CShellBrowser
> theCabinet
;
3383 // Tell the thread ref we are using it.
3384 if (parameters
&& parameters
->offsetF8
)
3385 parameters
->offsetF8
->AddRef();
3387 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3388 if (theCabinet
== NULL
)
3390 return E_OUTOFMEMORY
;
3393 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3394 if (FAILED_UNEXPECTEDLY(hResult
))
3395 return E_OUTOFMEMORY
;
3397 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3401 // Error: continue or exit?
3405 if (Msg
.message
== WM_QUIT
)
3408 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3410 TranslateMessage(&Msg
);
3411 DispatchMessage(&Msg
);
3415 int nrc
= theCabinet
->Release();
3418 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3421 theCabinet
.Detach();
3423 // Tell the thread ref we are not using it anymore.
3424 if (parameters
&& parameters
->offsetF8
)
3425 parameters
->offsetF8
->Release();
3430 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3433 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3435 OleInitialize(NULL
);
3437 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3441 SHDestroyIETHREADPARAM(parameters
);