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
))
1880 // FIXME: Figure out the proper way to do this.
1881 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
1884 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
1888 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
1889 if (FAILED_UNEXPECTEDLY(hResult
))
1891 fCurrentMenuBar
= hmenuShared
;
1895 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1897 if (hmenuShared
== fCurrentMenuBar
)
1899 //DestroyMenu(fCurrentMenuBar);
1900 SetMenuSB(NULL
, NULL
, NULL
);
1905 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1910 ::SetWindowText(fStatusBar
, pszStatusText
);
1919 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1924 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1926 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1931 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1933 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1936 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1941 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1949 *lphwnd
= fToolbarProxy
.m_hWnd
;
1952 *lphwnd
= fStatusBar
;
1955 // find the directory browser and return it
1956 // this should be used only to determine if a tree is present
1959 // is this a progress dialog?
1965 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1966 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1975 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1980 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1988 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1992 *ppshv
= fCurrentShellView
;
1993 if (fCurrentShellView
.p
!= NULL
)
1994 fCurrentShellView
.p
->AddRef();
1998 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2003 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2008 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2009 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2014 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2019 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2024 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2025 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2030 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2032 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2033 // the returned interface has a method GetPropertyBag on it
2034 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2035 return this->QueryInterface(riid
, ppvObject
);
2036 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2037 return this->QueryInterface(riid
, ppvObject
);
2038 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2039 return this->QueryInterface(riid
, ppvObject
);
2040 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2041 return this->QueryInterface(riid
, ppvObject
);
2042 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2043 return this->QueryInterface(riid
, ppvObject
);
2044 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2045 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2046 if (IsEqualIID(riid
, IID_IShellBrowser
))
2047 return this->QueryInterface(riid
, ppvObject
);
2048 return E_NOINTERFACE
;
2051 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2053 if (ppvObject
== NULL
)
2059 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2064 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2069 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2070 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2075 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2076 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2081 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2086 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2091 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2096 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2101 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2105 // called by toolbar when displaying tooltips
2110 if (fTravelLog
.p
== NULL
)
2112 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2113 if (FAILED_UNEXPECTEDLY(hResult
))
2116 *pptl
= fTravelLog
.p
;
2117 fTravelLog
.p
->AddRef();
2121 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2126 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2131 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2136 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2141 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2146 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2151 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2156 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2161 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2166 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2171 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2176 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2181 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2186 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2191 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2193 // called by explorer bar to get current pidl
2196 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2200 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2205 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2210 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2215 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2217 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2218 return E_INVALIDARG
;
2219 *ppole
= fHistoryObject
;
2220 if (fHistoryObject
!= NULL
)
2221 fHistoryObject
->AddRef();
2222 *pstm
= fHistoryStream
;
2223 if (fHistoryStream
!= NULL
)
2224 fHistoryStream
->AddRef();
2225 *ppbc
= fHistoryBindContext
;
2226 if (fHistoryBindContext
!= NULL
)
2227 fHistoryBindContext
->AddRef();
2228 fHistoryObject
= NULL
;
2229 fHistoryStream
= NULL
;
2230 fHistoryBindContext
= NULL
;
2236 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2241 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2246 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2251 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2252 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2257 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2262 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2267 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2272 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2277 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2282 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2289 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2293 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2298 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2303 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2308 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2313 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2318 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2323 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2328 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2329 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2334 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2339 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2344 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2349 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2354 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2359 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2364 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2369 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2374 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2379 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2384 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2389 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2394 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2399 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2404 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2409 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2414 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2419 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2424 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2429 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2434 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2439 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2440 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2445 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2446 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2451 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2456 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2461 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2466 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2471 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2476 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2481 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2486 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2491 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2496 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2501 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2506 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2511 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2516 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2521 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2526 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2531 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2536 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2541 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2546 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2547 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2552 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2557 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2562 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2567 extern HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
);
2568 extern HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
);
2569 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2571 for (int i
= 0; i
< 3; i
++)
2573 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2577 if (!fCurrentShellView
)
2580 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2583 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2588 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2593 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2595 CComPtr
<ITravelLog
> travelLog
;
2596 HRESULT hResult
= GetTravelLog(&travelLog
);
2597 if (FAILED_UNEXPECTEDLY(hResult
))
2599 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2602 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2604 CComPtr
<ITravelLog
> travelLog
;
2605 HRESULT hResult
= GetTravelLog(&travelLog
);
2606 if (FAILED_UNEXPECTEDLY(hResult
))
2608 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2611 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2616 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2621 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2622 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2627 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2631 V_VT(&level
) = VT_I4
;
2633 return Refresh2(&level
);
2636 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2638 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2641 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2642 if (FAILED_UNEXPECTEDLY(hResult
))
2644 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2647 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2652 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2657 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2662 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2667 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2672 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2677 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2684 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2689 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2694 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2699 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2704 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2709 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2714 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2719 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2726 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2731 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2736 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2741 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2746 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2751 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2756 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2761 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2766 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2771 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2776 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2781 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2786 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2791 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2796 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2801 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2806 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2811 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2816 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2821 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2826 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2831 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2836 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2841 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2842 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2844 // called from drive combo box to navigate to a directory
2845 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2846 return E_INVALIDARG
;
2847 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2848 return E_INVALIDARG
;
2850 LPITEMIDLIST pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
2851 HRESULT hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2852 if (FAILED_UNEXPECTEDLY(hResult
))
2857 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2862 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2863 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2868 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2873 // called to show search bar
2874 if (V_VT(pvaClsid
) != VT_BSTR
)
2875 return E_INVALIDARG
;
2876 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2877 // TODO: properly compute the value of vertical
2879 return ShowBand(classID
, vertical
);
2882 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2887 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2892 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2897 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2902 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2907 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2912 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2917 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2922 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2927 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2932 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2937 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2942 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2947 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2952 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2957 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2962 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2964 if (pWinData
== NULL
)
2967 pWinData
->dwWindowID
= -1;
2969 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2970 pWinData
->lpszUrl
= NULL
;
2971 pWinData
->lpszUrlLocation
= NULL
;
2972 pWinData
->lpszTitle
= NULL
;
2976 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2981 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2986 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2988 CComPtr
<IPersistHistory
> viewPersistHistory
;
2989 CComPtr
<IOleObject
> viewHistoryObject
;
2990 persistState oldState
;
2995 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2996 if (FAILED_UNEXPECTEDLY(hResult
))
2998 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3000 if (oldState
.browseType
!= 2)
3002 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3004 return E_OUTOFMEMORY
;
3005 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3006 if (FAILED_UNEXPECTEDLY(hResult
))
3011 if (numRead
!= oldState
.pidlSize
)
3016 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3017 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3018 fHistoryObject
= viewHistoryObject
;
3019 fHistoryStream
= pStream
;
3020 fHistoryBindContext
= pbc
;
3021 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
3022 fHistoryObject
= NULL
;
3023 fHistoryStream
= NULL
;
3024 fHistoryBindContext
= NULL
;
3026 if (FAILED_UNEXPECTEDLY(hResult
))
3031 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3033 CComPtr
<IPersistHistory
> viewPersistHistory
;
3034 persistState newState
;
3037 hResult
= fCurrentShellView
->GetItemObject(
3038 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3039 memset(&newState
, 0, sizeof(newState
));
3040 newState
.dwSize
= sizeof(newState
);
3041 newState
.browseType
= 2;
3042 newState
.browserIndex
= GetBrowserIndex();
3043 if (viewPersistHistory
.p
!= NULL
)
3045 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3046 if (FAILED_UNEXPECTEDLY(hResult
))
3049 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3050 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3051 if (FAILED_UNEXPECTEDLY(hResult
))
3053 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3054 if (FAILED_UNEXPECTEDLY(hResult
))
3056 if (viewPersistHistory
.p
!= NULL
)
3058 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3059 if (FAILED_UNEXPECTEDLY(hResult
))
3065 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3070 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3075 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3077 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3081 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3084 // TODO: rip down everything
3086 fCurrentShellView
->DestroyViewWindow();
3087 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3088 ReleaseCComPtrExpectZero(fCurrentShellView
);
3090 for (int i
= 0; i
< 3; i
++)
3092 if (fClientBars
[i
].clientBar
== NULL
)
3094 IDockingWindow
* pdw
;
3095 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3096 if (FAILED_UNEXPECTEDLY(hr
))
3101 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3103 ReleaseCComPtrExpectZero(fTravelLog
);
3105 fCurrentShellFolder
.Release();
3106 ILFree(fCurrentDirectoryPIDL
);
3107 ::DestroyWindow(fStatusBar
);
3108 DestroyMenu(fCurrentMenuBar
);
3114 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3116 CComPtr
<IDockingWindow
> dockingWindow
;
3117 RECT availableBounds
;
3118 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3121 if (wParam
!= SIZE_MINIMIZED
)
3123 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3124 for (INT x
= 0; x
< 3; x
++)
3126 if (fClientBars
[x
].clientBar
!= NULL
)
3128 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3129 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3130 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3132 hResult
= dockingWindow
->ResizeBorderDW(
3133 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3143 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3146 LPARAM menuIndex
= lParam
;
3148 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3150 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3154 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3158 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3160 UpdateViewMenu(theMenu
);
3163 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3167 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3169 // FIXME: Remove once implemented
3170 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3171 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3172 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3173 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
);
3176 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3181 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3186 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3188 if (fCurrentShellViewWindow
!= NULL
)
3189 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3193 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3195 return SendMessage(WM_CLOSE
);
3198 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3200 HRESULT hResult
= DoFolderOptions();
3201 if (FAILED(hResult
))
3202 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3206 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3209 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3210 #endif /* __REACTOS__ */
3214 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3217 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3218 #endif /* __REACTOS__ */
3222 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3224 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3228 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3230 HRESULT hResult
= GoBack();
3231 if (FAILED(hResult
))
3232 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3236 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3238 HRESULT hResult
= GoForward();
3239 if (FAILED(hResult
))
3240 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3244 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3246 HRESULT hResult
= NavigateToParent();
3247 if (FAILED(hResult
))
3248 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3252 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3254 HRESULT hResult
= GoHome();
3255 if (FAILED(hResult
))
3256 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3260 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3262 // FIXME: This does not appear to be what windows does.
3263 HRESULT hResult
= NavigateToParent();
3264 if (FAILED(hResult
))
3265 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3269 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3271 CComPtr
<IShellFolder
> psfDesktop
;
3272 LPITEMIDLIST pidlFavs
;
3274 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3277 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3282 hr
= SHGetDesktopFolder(&psfDesktop
);
3283 if (FAILED_UNEXPECTEDLY(hr
))
3286 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3287 if (FAILED_UNEXPECTEDLY(hr
))
3293 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3295 /* TODO: Implement properly */
3297 LPCWSTR strSite
= L
"https://www.reactos.org/user-faq";
3299 /* TODO: Make localizable */
3300 LPCWSTR strCaption
= L
"Sorry";
3301 LPCWSTR strMessage
= L
"ReactOS could not browse to '%s' (error %d). Please make sure there is a web browser installed.";
3302 WCHAR tmpMessage
[512];
3304 /* TODO: Read from the registry */
3305 LPCWSTR strVerb
= NULL
; /* default */
3306 LPCWSTR strPath
= strSite
;
3307 LPCWSTR strParams
= NULL
;
3309 /* The return value is defined as HINSTANCE for backwards compatibility only, the cast is needed */
3310 int result
= (int) ShellExecuteW(m_hWnd
, strVerb
, strPath
, strParams
, NULL
, SW_SHOWNORMAL
);
3313 StringCchPrintfW(tmpMessage
, 512, strMessage
, strSite
, result
);
3314 MessageBoxExW(m_hWnd
, tmpMessage
, strCaption
, MB_OK
, 0);
3320 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3322 fStatusBarVisible
= !fStatusBarVisible
;
3325 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3331 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3334 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3335 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3339 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3342 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3343 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3347 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3350 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3351 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3355 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3358 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3359 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3363 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3366 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3367 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3371 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3374 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3375 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3379 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3384 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3386 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3387 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3391 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3393 CComPtr
<CShellBrowser
> theCabinet
;
3398 // Tell the thread ref we are using it.
3399 if (parameters
&& parameters
->offsetF8
)
3400 parameters
->offsetF8
->AddRef();
3402 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3403 if (theCabinet
== NULL
)
3405 return E_OUTOFMEMORY
;
3408 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3409 if (FAILED_UNEXPECTEDLY(hResult
))
3410 return E_OUTOFMEMORY
;
3412 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3416 // Error: continue or exit?
3420 if (Msg
.message
== WM_QUIT
)
3423 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3425 TranslateMessage(&Msg
);
3426 DispatchMessage(&Msg
);
3430 int nrc
= theCabinet
->Release();
3433 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3436 theCabinet
.Detach();
3438 // Tell the thread ref we are not using it anymore.
3439 if (parameters
&& parameters
->offsetF8
)
3440 parameters
->offsetF8
->Release();
3445 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3448 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3450 OleInitialize(NULL
);
3452 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3456 SHDestroyIETHREADPARAM(parameters
);