4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 BOOL WINAPI
Shell_GetImageLists(
28 _Out_ HIMAGELIST
*phiml
,
29 _Out_ HIMAGELIST
*phimlSmall
32 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
34 #include "newatlinterfaces.h"
38 **Provide implementation of new and delete that use LocalAlloc
39 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
40 view doesn't restore the selection correctly.
41 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
42 **Add brand band bitmaps to shell32.dll
43 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
44 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
45 current state overwrites the wrong entry's contents. This needs to be changed.
46 ****Fix close of browser window to release all objects
47 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
48 **When a new bar is added to base bar site, how is base bar told so it can resize?
49 **Does the base bar site have a classid?
50 **What should refresh command send to views to make them refresh?
51 **When new bar is created, what status notifications need to be fired?
52 **How does keyboard filtering dispatch?
53 **For deferred persist history load, how does the view connect up and get the state?
54 How does context menu send open, cut, rename commands to its site (the shell view)?
55 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
57 **Route View->Toolbars commands to internet toolbar
58 **Handle travel log items in View->Go
59 **Fix ShowBrowserBar to pass correct size on when bar is shown
60 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
61 ****Make ShowToolbar check if bar is already created before creating it again
62 ****Shell should fill in the list of explorer bars in the View submenus
63 **Add folder menu in the file menu
64 **Fix CShellBrowser::GetBorderDW to compute available size correctly
65 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
66 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
67 Make folders toolbar item update state appropriately
68 Read list of bands from registry on launch
69 Read list of bars from registry on launch
70 If the folders or search bars don't exist, disable the toolbar buttons
71 If the favorites or history bars don't exist, disable the toolbar butons
72 Fix Apply to all Folders in Folder Options
73 Implement close command
74 Add explorer band context menu to file menu
75 Add code to allow restore of internet toolbar from registry
76 Fix code that calls FireNavigateComplete to pass the correct new path
78 What are the other command ids for QueryStatus/FireCommandStateChange?
80 Add handler for cabinet settings change
81 Add handler for system metrics change (renegotiate border space?)
82 Add handler for theme change and forward to contained windows
84 When folders are shown, the status bar text should change
85 Add code to save/restore shell view settings
86 Implement tabbing between frames
87 Fix handling of focus everywhere
88 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
90 The status bar doesn't show help text for items owned by frame during menu tracking
91 Stub out frame command handlers
92 "Arrange icons by" group is not checked properly
94 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
95 the icon is always an open folder with magnifying glass
96 Fix bars to calculate height correctly
97 Hookup policies for everything...
98 Investigate toolbar message WM_USER+93
99 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
101 Vertical Explorer Bar CATID_InfoBand
102 Horizontal Explorer Bar CATID_CommBand
103 Desk Band CATID_DeskBand
106 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
107 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
109 create key here with CLSID of bar to register tool band
110 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
115 #pragma comment(linker, \
116 "\"/manifestdependency:type='Win32' "\
117 "name='Microsoft.Windows.Common-Controls' "\
118 "version='6.0.0.0' "\
119 "processorArchitecture='*' "\
120 "publicKeyToken='6595b64144ccf1df' "\
124 struct categoryCacheHeader
126 long dwSize
; // size of header only
127 long version
; // currently 1
128 SYSTEMTIME writeTime
; // time we were written to registry
129 long classCount
; // number of classes following
132 static const unsigned int folderOptionsPageCountMax
= 20;
133 static const long BTP_UPDATE_CUR_HISTORY
= 1;
134 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
136 BOOL createNewStuff
= false;
139 // this class is private to browseui.dll and is not registered externally?
140 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
143 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
144 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
145 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
148 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
151 HMENU
SHGetMenuFromID(HMENU topMenu
, int theID
)
153 MENUITEMINFO menuItemInfo
;
155 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
156 menuItemInfo
.fMask
= MIIM_SUBMENU
;
157 if (!GetMenuItemInfo(topMenu
, theID
, FALSE
, &menuItemInfo
))
159 return menuItemInfo
.hSubMenu
;
162 void SHCheckMenuItem(HMENU theMenu
, int theID
, BOOL checked
)
164 MENUITEMINFO menuItemInfo
;
166 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
167 menuItemInfo
.fMask
= MIIM_STATE
;
168 if (GetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
))
171 menuItemInfo
.fState
|= MF_CHECKED
;
173 menuItemInfo
.fState
&= ~MF_CHECKED
;
174 SetMenuItemInfo(theMenu
, theID
, FALSE
, &menuItemInfo
);
178 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
180 MENUITEMINFO menuItemInfo
;
184 menuItemCount
= GetMenuItemCount(theMenu
);
186 while (curIndex
< menuItemCount
)
188 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
189 menuItemInfo
.fMask
= MIIM_ID
;
190 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
191 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
193 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
201 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
203 CComPtr
<IShellFolder
> desktop
;
205 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
206 if (FAILED_UNEXPECTEDLY(hr
))
208 if (path
== NULL
|| path
->mkid
.cb
== 0)
210 *newFolder
= desktop
;
211 desktop
.p
->AddRef ();
214 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
217 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
218 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
223 class CToolbarProxy
:
224 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
227 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
229 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
234 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
235 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
237 BEGIN_MSG_MAP(CToolbarProxy
)
238 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
239 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
243 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
248 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
249 if (myWindow
!= NULL
)
251 SubclassWindow(myWindow
);
252 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
253 hResult
= explorerToolbar
->QueryInterface(
254 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
258 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
264 if (fExplorerToolbar
.p
!= NULL
)
266 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
267 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
268 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
269 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
274 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
280 if (fExplorerToolbar
.p
!= NULL
)
281 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
286 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
287 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
291 class CShellBrowser
:
292 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
293 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
294 public IShellBrowser
,
296 public IServiceProvider
,
297 public IProfferServiceImpl
<CShellBrowser
>,
298 public IShellBrowserService
,
300 public ITravelLogClient
,
301 public IPersistHistory
,
302 public IDockingWindowSite
,
303 public IOleCommandTarget
,
304 public IBrowserService2
,
305 public IConnectionPointContainerImpl
<CShellBrowser
>,
306 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
307 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
314 CComPtr
<IUnknown
> clientBar
;
317 static const int BIInternetToolbar
= 0;
318 static const int BIVerticalBaseBar
= 1;
319 static const int BIHorizontalBaseBar
= 2;
321 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
322 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
323 CComPtr
<IShellView
> fCurrentShellView
; //
324 LPITEMIDLIST fCurrentDirectoryPIDL
; //
326 bool fStatusBarVisible
;
327 CToolbarProxy fToolbarProxy
;
328 barInfo fClientBars
[3];
329 CComPtr
<ITravelLog
> fTravelLog
;
330 HMENU fCurrentMenuBar
;
331 CABINETSTATE fCabinetState
;
332 // The next three fields support persisted history for shell views.
333 // They do not need to be reference counted.
334 IOleObject
*fHistoryObject
;
335 IStream
*fHistoryStream
;
336 IBindCtx
*fHistoryBindContext
;
340 ULONG
InternalAddRef()
342 OutputDebugString(_T("AddRef\n"));
343 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
345 ULONG
InternalRelease()
347 OutputDebugString(_T("Release\n"));
348 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
354 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
356 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
357 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
358 FOLDERSETTINGS
*folderSettings
, long flags
);
359 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
360 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
361 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
362 HRESULT
NavigateToParent();
363 HRESULT
DoFolderOptions();
364 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
365 void RepositionBars();
366 virtual WNDPROC
GetWindowProc()
370 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
371 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
372 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
373 HRESULT
FireCommandStateChangeAll();
374 HRESULT
UpdateForwardBackState();
375 void UpdateGotoMenu(HMENU theMenu
);
376 void UpdateViewMenu(HMENU theMenu
);
378 /* // *** IDockingWindowFrame methods ***
379 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
380 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
381 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
384 // *** IDockingWindowSite methods ***
385 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
386 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
387 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
389 // *** IOleCommandTarget methods ***
390 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
391 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
392 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
393 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
395 // *** IOleWindow methods ***
396 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
397 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
399 // *** IShellBrowser methods ***
400 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
401 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
402 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
403 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
404 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
405 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
406 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
407 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
408 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
409 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
410 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
411 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
412 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
414 // *** IDropTarget methods ***
415 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
416 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
417 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
418 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
420 // *** IServiceProvider methods ***
421 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
423 // *** IShellBowserService methods ***
424 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
426 // *** IDispatch methods ***
427 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
428 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
429 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
430 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
431 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
432 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
434 // *** IBrowserService methods ***
435 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
436 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
437 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
438 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
439 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
440 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
441 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
442 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
443 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
444 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
445 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
446 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
447 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
448 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
449 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
450 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
451 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
452 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
453 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
454 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
455 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
456 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
457 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
458 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
459 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
460 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
461 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
462 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
463 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
464 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
466 // *** IBrowserService2 methods ***
467 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
468 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
469 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
470 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
471 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
472 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
473 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
474 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
475 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
476 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
477 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
478 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
479 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
480 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
481 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
482 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
483 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
484 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
485 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
486 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
487 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
488 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
489 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
490 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
491 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
492 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
493 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
494 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
495 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
496 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
497 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
498 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
499 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
500 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
501 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
502 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
503 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
504 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
505 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
506 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
507 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
508 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
509 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
510 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
511 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
512 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
513 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
514 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
515 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
516 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
517 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
518 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
519 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
520 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
521 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
522 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
523 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
524 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
525 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
526 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
527 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
528 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
529 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
530 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
531 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
533 // *** IWebBrowser methods ***
534 virtual HRESULT STDMETHODCALLTYPE
GoBack();
535 virtual HRESULT STDMETHODCALLTYPE
GoForward();
536 virtual HRESULT STDMETHODCALLTYPE
GoHome();
537 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
538 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
539 VARIANT
*PostData
, VARIANT
*Headers
);
540 virtual HRESULT STDMETHODCALLTYPE
Refresh();
541 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
542 virtual HRESULT STDMETHODCALLTYPE
Stop();
543 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
544 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
545 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
546 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
547 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
548 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
549 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
550 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
551 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
552 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
553 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
554 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
555 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
556 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
557 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
558 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
559 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
561 // *** IWebBrowserApp methods ***
562 virtual HRESULT STDMETHODCALLTYPE
Quit();
563 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
564 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
565 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
566 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
567 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
568 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
569 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
570 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
571 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
572 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
573 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
574 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
575 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
576 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
577 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
578 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
579 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
580 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
581 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
583 // *** IWebBrowser2 methods ***
584 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
585 VARIANT
*PostData
, VARIANT
*Headers
);
586 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
587 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
588 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
589 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
590 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
591 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
592 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
593 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
594 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
595 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
596 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
597 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
598 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
599 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
600 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
601 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
602 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
603 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
604 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
606 // *** ITravelLogClient methods ***
607 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
608 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
609 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
611 // *** IPersist methods ***
612 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
614 // *** IPersistHistory methods ***
615 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
616 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
617 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
618 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
621 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
622 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
623 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
624 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
625 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
626 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
627 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
628 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
629 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
630 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
631 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
632 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
633 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
634 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
635 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
636 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
637 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
638 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
639 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
640 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
641 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
642 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
643 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
644 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
645 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
647 static ATL::CWndClassInfo
& GetWndClassInfo()
649 static ATL::CWndClassInfo wc
=
651 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
652 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
653 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
654 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
659 BEGIN_MSG_MAP(CShellBrowser
)
660 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
661 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
662 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
663 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
664 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
665 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
666 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
667 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
668 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
669 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
670 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
671 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
672 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
673 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
674 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
675 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
676 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
677 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
678 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
679 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
680 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
681 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
682 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
683 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
684 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
685 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
686 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
689 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
690 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
691 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
692 END_CONNECTION_POINT_MAP()
694 BEGIN_COM_MAP(CShellBrowser
)
695 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
696 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
697 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
698 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
699 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
700 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
701 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
702 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
703 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
704 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
705 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
706 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
707 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
708 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
709 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
710 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
711 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
712 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
716 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
718 CShellBrowser::CShellBrowser()
720 fCurrentShellViewWindow
= NULL
;
721 fCurrentDirectoryPIDL
= NULL
;
723 fStatusBarVisible
= true;
724 memset(fClientBars
, 0, sizeof(fClientBars
));
725 fCurrentMenuBar
= NULL
;
726 fHistoryObject
= NULL
;
727 fHistoryStream
= NULL
;
728 fHistoryBindContext
= NULL
;
731 CShellBrowser::~CShellBrowser()
735 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
737 CComPtr
<IPersistStreamInit
> persistStreamInit
;
739 CComPtr
<IUnknown
> clientBar
;
741 _AtlInitialConstruct();
743 fCabinetState
.cLength
= sizeof(fCabinetState
);
744 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
749 Create(HWND_DESKTOP
);
754 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
755 if (FAILED_UNEXPECTEDLY(hResult
))
758 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &clientBar
));
759 if (FAILED_UNEXPECTEDLY(hResult
))
763 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
766 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
767 if (FAILED_UNEXPECTEDLY(hResult
))
770 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
771 if (FAILED_UNEXPECTEDLY(hResult
))
774 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
775 if (FAILED_UNEXPECTEDLY(hResult
))
778 // TODO: create settingsStream from registry entry
779 //if (settingsStream.p)
781 // hResult = persistStreamInit->Load(settingsStream);
782 // if (FAILED_UNEXPECTEDLY(hResult))
787 hResult
= persistStreamInit
->InitNew();
788 if (FAILED_UNEXPECTEDLY(hResult
))
792 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
793 if (FAILED_UNEXPECTEDLY(hResult
))
796 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
800 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
801 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
802 _AtlBaseModule
.GetModuleInstance(), 0);
803 fStatusBarVisible
= true;
807 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
808 if (FAILED_UNEXPECTEDLY(hResult
))
811 ShowWindow(SW_SHOWNORMAL
);
816 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
818 CComPtr
<IShellFolder
> newFolder
;
819 FOLDERSETTINGS newFolderSettings
;
822 // called by shell view to browse to new folder
823 // also called by explorer band to navigate to new folder
824 hResult
= SHBindToFolder(pidl
, &newFolder
);
825 if (FAILED_UNEXPECTEDLY(hResult
))
828 newFolderSettings
.ViewMode
= FVM_ICON
;
829 newFolderSettings
.fFlags
= 0;
830 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
831 if (FAILED_UNEXPECTEDLY(hResult
))
836 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
838 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
841 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
843 LPCITEMIDLIST pidlnext
;
848 if (! _ILIsDesktop(pidl
))
850 length
= pidl
->mkid
.cb
;
852 reinterpret_cast<LPCITEMIDLIST
>(
853 reinterpret_cast<const BYTE
*>(pidl
) + length
);
854 if (pidlnext
->mkid
.cb
!= 0)
860 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
861 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
863 CComPtr
<IShellFolder
> psf
;
864 LPITEMIDLIST pidlChild
;
865 LPITEMIDLIST pidlParent
;
872 if (ppidlLast
!= NULL
)
874 if (_ILIsPidlSimple(pidl
))
876 if (ppidlLast
!= NULL
)
877 *ppidlLast
= ILClone(pidl
);
878 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
882 pidlChild
= ILClone(ILFindLastID(pidl
));
883 pidlParent
= ILClone(pidl
);
884 ILRemoveLastID(pidlParent
);
885 hResult
= SHGetDesktopFolder(&psf
);
886 if (SUCCEEDED(hResult
))
887 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
888 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
889 *ppidlLast
= pidlChild
;
897 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
898 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
900 CComPtr
<IShellFolder
> parentFolder
;
901 LPITEMIDLIST childPIDL
;
905 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
909 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
913 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
916 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
925 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
927 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
930 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
931 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
933 CComPtr
<IObjectWithSite
> objectWithSite
;
934 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
935 CComPtr
<IShellView
> saveCurrentShellView
;
936 CComPtr
<IShellView
> newShellView
;
937 CComPtr
<ITravelLog
> travelLog
;
938 HWND newShellViewWindow
;
939 BOOL windowUpdateIsLocked
;
940 RECT shellViewWindowBounds
;
943 wchar_t newTitle
[MAX_PATH
];
947 if (newShellFolder
== NULL
)
950 hResult
= GetTravelLog(&travelLog
);
951 if (FAILED_UNEXPECTEDLY(hResult
))
955 if (flags
& BTP_UPDATE_CUR_HISTORY
)
957 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
958 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
959 // what to do with error? Do we want to halt browse because state save failed?
962 if (fCurrentShellView
)
964 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
967 // create view object
968 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
969 if (FAILED_UNEXPECTEDLY(hResult
))
971 previousView
= fCurrentShellViewWindow
;
973 // enter updating section
974 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
975 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
976 if (fCurrentShellView
!= NULL
)
977 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
980 hResult
= newShellView
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
981 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
982 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
984 // update folder and view
985 saveCurrentShellFolder
= fCurrentShellFolder
;
986 saveCurrentShellView
= fCurrentShellView
;
987 fCurrentShellFolder
= newShellFolder
;
988 fCurrentShellView
= newShellView
;
991 if (previousView
!= NULL
)
992 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
994 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
995 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
997 // create view window
998 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
999 this, &shellViewWindowBounds
, &newShellViewWindow
);
1000 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
1002 fCurrentShellView
= saveCurrentShellView
;
1003 fCurrentShellFolder
= saveCurrentShellFolder
;
1004 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
1005 if (windowUpdateIsLocked
)
1006 LockWindowUpdate(FALSE
);
1007 SetCursor(saveCursor
);
1011 if (objectWithSite
.p
!= NULL
)
1012 hResult
= objectWithSite
->SetSite(NULL
);
1014 // update current pidl
1015 ILFree(fCurrentDirectoryPIDL
);
1016 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
1018 // update view window
1019 if (saveCurrentShellView
!= NULL
)
1020 saveCurrentShellView
->DestroyViewWindow();
1021 fCurrentShellViewWindow
= newShellViewWindow
;
1024 saveCurrentShellView
.Release();
1025 saveCurrentShellFolder
.Release();
1027 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1029 // leave updating section
1030 if (windowUpdateIsLocked
)
1031 LockWindowUpdate(FALSE
);
1032 SetCursor(saveCursor
);
1035 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1037 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1038 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1042 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1043 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1044 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1045 if (SUCCEEDED(hResult
))
1047 FireNavigateComplete(newTitle
);
1051 FireNavigateComplete(L
"ERROR");
1054 if (fCabinetState
.fFullPathTitle
)
1055 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1057 nameFlags
= SHGDN_FORADDRESSBAR
;
1058 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1059 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1060 if (SUCCEEDED(hResult
))
1062 SetWindowText(newTitle
);
1064 LPCITEMIDLIST pidlChild
;
1065 INT index
, indexOpen
;
1066 HIMAGELIST himlSmall
, himlLarge
;
1068 CComPtr
<IShellFolder
> sf
;
1069 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1071 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1073 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1075 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1076 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1078 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1079 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1082 // TODO: Update the window icon
1084 FireCommandStateChangeAll();
1085 hResult
= UpdateForwardBackState();
1089 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1091 CComPtr
<IServiceProvider
> serviceProvider
;
1092 CComPtr
<IBandSite
> bandSite
;
1093 CComPtr
<IDeskBand
> deskBand
;
1096 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1099 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1100 if (FAILED_UNEXPECTEDLY(hResult
))
1103 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1104 if (FAILED_UNEXPECTEDLY(hResult
))
1107 return deskBand
->QueryInterface(riid
, shellMenu
);
1110 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1112 CComPtr
<IUnknown
> newBaseBar
;
1113 CComPtr
<IDeskBar
> deskBar
;
1114 CComPtr
<IUnknown
> newBaseBarSite
;
1115 CComPtr
<IObjectWithSite
> objectWithSite
;
1116 CComPtr
<IDeskBarClient
> deskBarClient
;
1121 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1123 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1126 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1127 if (FAILED_UNEXPECTEDLY(hResult
))
1129 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1130 if (FAILED_UNEXPECTEDLY(hResult
))
1133 // tell the new base bar about the shell browser
1134 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1135 if (FAILED_UNEXPECTEDLY(hResult
))
1137 hResult
= objectWithSite
->SetSite(static_cast<IDropTarget
*>(this));
1138 if (FAILED_UNEXPECTEDLY(hResult
))
1141 // tell the new base bar about the new base bar site
1142 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1143 if (FAILED_UNEXPECTEDLY(hResult
))
1145 hResult
= deskBar
->SetClient(newBaseBarSite
);
1146 if (FAILED_UNEXPECTEDLY(hResult
))
1149 // tell the new base bar site about the new base bar
1150 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1151 if (FAILED_UNEXPECTEDLY(hResult
))
1153 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1154 if (FAILED_UNEXPECTEDLY(hResult
))
1157 *cache
= newBaseBar
.Detach();
1159 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1162 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1164 CComPtr
<IDockingWindow
> dockingWindow
;
1165 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1166 CComPtr
<IUnknown
> baseBarSite
;
1167 CComPtr
<IUnknown
> newBand
;
1168 CComPtr
<IUnknown
> theBaseBar
;
1169 CComPtr
<IDeskBar
> deskBar
;
1175 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1176 if (FAILED_UNEXPECTEDLY(hResult
))
1178 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1179 if (FAILED_UNEXPECTEDLY(hResult
))
1181 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1182 if (FAILED_UNEXPECTEDLY(hResult
))
1184 hResult
= deskBar
->GetClient(&baseBarSite
);
1185 if (FAILED_UNEXPECTEDLY(hResult
))
1187 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1188 if (FAILED_UNEXPECTEDLY(hResult
))
1190 hResult
= baseBarSite
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1191 if (FAILED_UNEXPECTEDLY(hResult
))
1193 V_VT(&vaIn
) = VT_UNKNOWN
;
1194 V_UNKNOWN(&vaIn
) = newBand
.p
;
1195 hResult
= oleCommandTarget
->Exec(&CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1196 if (FAILED_UNEXPECTEDLY(hResult
))
1198 hResult
= dockingWindow
->ShowDW(TRUE
);
1199 if (FAILED_UNEXPECTEDLY(hResult
))
1204 HRESULT
CShellBrowser::NavigateToParent()
1206 LPITEMIDLIST newDirectory
;
1209 newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1210 if (newDirectory
== NULL
)
1211 return E_OUTOFMEMORY
;
1212 ILRemoveLastID(newDirectory
);
1213 hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1214 ILFree(newDirectory
);
1215 if (FAILED_UNEXPECTEDLY(hResult
))
1220 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1222 PROPSHEETHEADER
*sheetInfo
;
1224 sheetInfo
= (PROPSHEETHEADER
*)lParam
;
1225 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1227 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1228 sheetInfo
->nPages
++;
1232 HRESULT
CShellBrowser::DoFolderOptions()
1234 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1235 CComPtr
<IObjectWithSite
> objectWithSite
;
1236 PROPSHEETHEADER m_PropSheet
;
1237 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1238 // CComPtr<IGlobalFolderSettings> globalSettings;
1239 // SHELLSTATE2 shellState;
1242 memset(m_psp
, 0, sizeof(m_psp
));
1243 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1245 // create sheet object
1246 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1247 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1248 if (FAILED_UNEXPECTEDLY(hResult
))
1251 // must set site in order for Apply to all Folders on Advanced page to be enabled
1252 hResult
= folderOptionsSheet
->QueryInterface(IID_PPV_ARG(IObjectWithSite
, &objectWithSite
));
1253 if (SUCCEEDED(hResult
) && objectWithSite
.p
!= NULL
)
1254 hResult
= objectWithSite
->SetSite(static_cast<IDispatch
*>(this));
1255 m_PropSheet
.phpage
= m_psp
;
1258 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1259 if (FAILED_UNEXPECTEDLY(hResult
))
1261 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1262 if (FAILED_UNEXPECTEDLY(hResult
))
1267 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1268 if (FAILED_UNEXPECTEDLY(hResult
))
1271 if (fCurrentShellView
!= NULL
)
1273 hResult
= fCurrentShellView
->AddPropertySheetPages(
1274 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1275 if (FAILED_UNEXPECTEDLY(hResult
))
1280 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1281 m_PropSheet
.dwFlags
= 0;
1282 m_PropSheet
.hwndParent
= m_hWnd
;
1283 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1284 m_PropSheet
.pszCaption
= _T("Folder Options");
1285 m_PropSheet
.nStartPage
= 0;
1286 PropertySheet(&m_PropSheet
);
1290 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1292 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1293 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1295 const _ATL_MSG
*previousMessage
;
1297 WNDPROC saveWindowProc
;
1300 hWnd
= pThis
->m_hWnd
;
1301 previousMessage
= pThis
->m_pCurrentMsg
;
1302 pThis
->m_pCurrentMsg
= &msg
;
1304 CComPtr
<IMenuBand
> menuBand
;
1305 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1306 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1308 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1309 if (hResult
== S_OK
)
1312 wParam
= msg
.wParam
;
1313 lParam
= msg
.lParam
;
1317 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1318 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1319 if (handled
== FALSE
)
1321 if (uMsg
== WM_NCDESTROY
)
1323 saveWindowProc
= reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1324 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1325 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1326 SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1327 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1330 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1332 pThis
->m_pCurrentMsg
= previousMessage
;
1333 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1335 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1336 pThis
->m_hWnd
= NULL
;
1337 pThis
->OnFinalMessage(hWnd
);
1342 void CShellBrowser::RepositionBars()
1348 GetClientRect(&clientRect
);
1350 if (fStatusBarVisible
&& fStatusBar
)
1352 ::GetWindowRect(fStatusBar
, &statusRect
);
1353 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1354 clientRect
.right
- clientRect
.left
,
1355 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1356 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1359 for (x
= 0; x
< 3; x
++)
1361 HWND hwnd
= fClientBars
[x
].hwnd
;
1362 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1363 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1365 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1366 fClientBars
[x
].hwnd
= hwnd
;
1370 RECT toolbarRect
= clientRect
;
1371 if (borderSpace
.top
!= 0)
1373 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1375 else if (borderSpace
.bottom
!= 0)
1377 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1379 else if (borderSpace
.left
!= 0)
1381 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1383 else if (borderSpace
.right
!= 0)
1385 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1388 ::SetWindowPos(hwnd
, NULL
,
1391 toolbarRect
.right
- toolbarRect
.left
,
1392 toolbarRect
.bottom
- toolbarRect
.top
,
1393 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1395 if (borderSpace
.top
!= 0)
1397 clientRect
.top
= toolbarRect
.bottom
;
1399 else if (borderSpace
.bottom
!= 0)
1401 clientRect
.bottom
= toolbarRect
.top
;
1403 else if (borderSpace
.left
!= 0)
1405 clientRect
.left
= toolbarRect
.right
;
1407 else if (borderSpace
.right
!= 0)
1409 clientRect
.right
= toolbarRect
.left
;
1413 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1414 clientRect
.right
- clientRect
.left
,
1415 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1418 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1421 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1422 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1425 params
.rgvarg
= arguments
;
1426 params
.rgdispidNamedArgs
= NULL
;
1427 params
.cArgs
= argCount
;
1428 params
.cNamedArgs
= 0;
1429 IUnknown
** pp
= vec
.begin();
1430 while (pp
< vec
.end())
1434 CComPtr
<IDispatch
> theDispatch
;
1436 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1437 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1442 while (pp
< vec2
.end())
1446 CComPtr
<IDispatch
> theDispatch
;
1448 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1449 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1456 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1458 // these two variants intentionally to do use CComVariant because it would double free/release
1459 // or does not need to dispose at all
1462 CComBSTR
tempString(newDirectory
);
1464 V_VT(&varArgs
) = VT_BSTR
;
1465 V_BSTR(&varArgs
) = tempString
.m_str
;
1467 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1468 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1469 V_VT(&varArg
[1]) = VT_DISPATCH
;
1470 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1472 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1475 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1479 V_VT(&varArg
[0]) = VT_BOOL
;
1480 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1481 V_VT(&varArg
[1]) = VT_I4
;
1482 V_I4(&varArg
[1]) = commandID
;
1484 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1487 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1489 return FireCommandStateChange(false, -1);
1492 HRESULT
CShellBrowser::UpdateForwardBackState()
1494 CComPtr
<ITravelLog
> travelLog
;
1495 CComPtr
<ITravelEntry
> unusedEntry
;
1501 canGoForward
= false;
1502 hResult
= GetTravelLog(&travelLog
);
1503 if (FAILED_UNEXPECTEDLY(hResult
))
1505 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1506 if (SUCCEEDED(hResult
))
1509 unusedEntry
.Release();
1511 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1512 if (SUCCEEDED(hResult
))
1514 canGoForward
= true;
1515 unusedEntry
.Release();
1517 hResult
= FireCommandStateChange(canGoBack
, 2);
1518 hResult
= FireCommandStateChange(canGoForward
, 1);
1522 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1524 CComPtr
<ITravelLog
> travelLog
;
1526 MENUITEMINFO menuItemInfo
;
1529 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1531 position
= GetMenuItemCount(theMenu
);
1532 hResult
= GetTravelLog(&travelLog
);
1533 if (FAILED_UNEXPECTEDLY(hResult
))
1535 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1536 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1537 if (SUCCEEDED(hResult
))
1539 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1540 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1541 menuItemInfo
.fType
= MF_SEPARATOR
;
1542 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1543 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1547 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1549 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
1550 CComPtr
<ITravelLog
> travelLog
;
1552 OLECMD commandList
[5];
1553 HMENU toolbarMenuBar
;
1555 MENUITEMINFO menuItemInfo
;
1558 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1559 if (gotoMenu
!= NULL
)
1560 UpdateGotoMenu(gotoMenu
);
1562 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1563 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1564 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1565 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1566 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1568 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
1569 IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
1570 if (SUCCEEDED(hResult
))
1571 hResult
= oleCommandTarget
->QueryStatus(&CGID_PrivCITCommands
, 5, commandList
, NULL
);
1572 if (FAILED_UNEXPECTEDLY(hResult
))
1573 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1576 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1577 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1578 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1579 DestroyMenu(menuItemInfo
.hSubMenu
);
1581 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1582 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1583 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1584 DestroyMenu(toolbarMenuBar
);
1586 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
);
1587 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1588 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1589 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_ENABLED
);
1590 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1591 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1592 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1593 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1595 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1596 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1597 menuItemInfo
.hSubMenu
= toolbarMenu
;
1598 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1600 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1603 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1605 CComPtr
<IUnknown
> int1Retry
;
1606 CComPtr
<IUnknown
> int2Retry
;
1611 if (int1
== NULL
|| int2
== NULL
)
1613 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1614 if (FAILED_UNEXPECTEDLY(hResult
))
1616 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1617 if (FAILED_UNEXPECTEDLY(hResult
))
1619 if (int1Retry
== int2Retry
)
1624 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1626 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1628 RECT availableBounds
;
1630 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1631 for (INT x
= 0; x
< 3; x
++)
1633 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1635 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1636 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1637 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1638 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1641 *prcBorder
= availableBounds
;
1645 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1650 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1652 for (INT x
= 0; x
< 3; x
++)
1654 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1656 fClientBars
[x
].borderSpace
= *pbw
;
1657 // if this bar changed size, it cascades and forces all subsequent bars to resize
1662 return E_INVALIDARG
;
1665 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1666 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1668 CComPtr
<IOleCommandTarget
> commandTarget
;
1671 if (prgCmds
== NULL
)
1672 return E_INVALIDARG
;
1673 if (pguidCmdGroup
== NULL
)
1675 if (fCurrentShellView
.p
!= NULL
)
1677 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1678 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1679 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1688 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1692 switch (prgCmds
->cmdID
)
1694 case 0x1c: // search
1695 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1697 case 0x1d: // history
1698 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1700 case 0x1e: // favorites
1701 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1703 case 0x23: // folders
1704 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1714 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1718 switch (prgCmds
->cmdID
)
1720 case 0xa022: // up level
1721 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1722 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1723 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1733 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1734 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1738 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1743 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1746 if (nCmdexecopt
== 1)
1748 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1752 // update zones part of the status bar
1755 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1756 V_VT(pvaOut
) = VT_INT_PTR
;
1757 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1758 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1761 // indicate if this cabinet was opened as a browser
1767 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1776 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1781 // what is theater mode and why do we receive this?
1785 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1790 // initialize favorites menu
1794 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1799 // refresh on toolbar clicked
1802 // tell the view if it should hide the task pane or not
1803 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1806 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1811 return NavigateToParent();
1814 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1819 return DoFolderOptions();
1822 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1827 // Reset All Folders option in Folder Options
1838 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1846 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1851 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1853 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1854 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1856 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1859 DestroyMenu(mainMenu
);
1861 lpMenuWidths
->width
[0] = 2;
1862 lpMenuWidths
->width
[2] = 3;
1863 lpMenuWidths
->width
[4] = 1;
1867 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1869 CComPtr
<IShellMenu
> shellMenu
;
1872 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
1874 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1875 if (FAILED_UNEXPECTEDLY(hResult
))
1877 hResult
= shellMenu
->SetMenu(hmenuShared
, NULL
, SMSET_DONTOWN
);
1878 if (FAILED_UNEXPECTEDLY(hResult
))
1880 fCurrentMenuBar
= hmenuShared
;
1884 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1886 if (hmenuShared
== fCurrentMenuBar
)
1888 //DestroyMenu(fCurrentMenuBar);
1889 SetMenuSB(NULL
, NULL
, NULL
);
1894 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1899 ::SetWindowText(fStatusBar
, pszStatusText
);
1908 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1913 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1915 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1920 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1922 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1925 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1930 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1938 *lphwnd
= fToolbarProxy
.m_hWnd
;
1941 *lphwnd
= fStatusBar
;
1944 // find the directory browser and return it
1945 // this should be used only to determine if a tree is present
1948 // is this a progress dialog?
1954 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
1955 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
1964 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
1969 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
1977 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
1981 *ppshv
= fCurrentShellView
;
1982 if (fCurrentShellView
.p
!= NULL
)
1983 fCurrentShellView
.p
->AddRef();
1987 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
1992 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
1997 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
1998 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2003 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2008 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2013 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2014 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2019 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2021 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2022 // the returned interface has a method GetPropertyBag on it
2023 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2024 return this->QueryInterface(riid
, ppvObject
);
2025 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2026 return this->QueryInterface(riid
, ppvObject
);
2027 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2028 return this->QueryInterface(riid
, ppvObject
);
2029 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2030 return this->QueryInterface(riid
, ppvObject
);
2031 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2032 return this->QueryInterface(riid
, ppvObject
);
2033 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2034 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2035 if (IsEqualIID(riid
, IID_IShellBrowser
))
2036 return this->QueryInterface(riid
, ppvObject
);
2037 return E_NOINTERFACE
;
2040 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2042 if (ppvObject
== NULL
)
2048 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2053 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2058 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2059 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2064 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2065 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2070 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2075 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2080 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2085 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2090 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2094 // called by toolbar when displaying tooltips
2099 if (fTravelLog
.p
== NULL
)
2101 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2102 if (FAILED_UNEXPECTEDLY(hResult
))
2105 *pptl
= fTravelLog
.p
;
2106 fTravelLog
.p
->AddRef();
2110 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2115 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2120 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2125 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2130 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2135 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2140 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2145 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2150 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2155 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2165 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2170 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2180 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2182 // called by explorer bar to get current pidl
2185 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2189 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2194 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2199 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2204 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2206 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2207 return E_INVALIDARG
;
2208 *ppole
= fHistoryObject
;
2209 if (fHistoryObject
!= NULL
)
2210 fHistoryObject
->AddRef();
2211 *pstm
= fHistoryStream
;
2212 if (fHistoryStream
!= NULL
)
2213 fHistoryStream
->AddRef();
2214 *ppbc
= fHistoryBindContext
;
2215 if (fHistoryBindContext
!= NULL
)
2216 fHistoryBindContext
->AddRef();
2217 fHistoryObject
= NULL
;
2218 fHistoryStream
= NULL
;
2219 fHistoryBindContext
= NULL
;
2225 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2230 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2235 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2240 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2241 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2246 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2251 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2256 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2261 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2266 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2271 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2276 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2278 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2282 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2287 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2292 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2297 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2302 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2307 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2312 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2317 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2318 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2323 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2328 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2333 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2338 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2343 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2348 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2353 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2358 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2363 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2368 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2373 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2378 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2383 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2388 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2398 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2403 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2408 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2413 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2418 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2423 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2428 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2429 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2434 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2435 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2440 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2445 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2450 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2455 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2460 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2465 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2470 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2475 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2480 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2485 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2490 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2495 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2500 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2505 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2510 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2515 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2520 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2525 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2530 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2535 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2536 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2541 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2546 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2551 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2556 extern HRESULT
IUnknown_HasFocusIO(IUnknown
* punk
);
2557 extern HRESULT
IUnknown_TranslateAcceleratorIO(IUnknown
* punk
, MSG
* pmsg
);
2558 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2560 for (int i
= 0; i
< 3; i
++)
2562 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2566 if (fCurrentShellView
->TranslateAcceleratorW(pmsg
) != S_OK
)
2568 if (TranslateAcceleratorSB(pmsg
, 0) != S_OK
)
2575 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2580 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2585 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2587 CComPtr
<ITravelLog
> travelLog
;
2590 hResult
= GetTravelLog(&travelLog
);
2591 if (FAILED_UNEXPECTEDLY(hResult
))
2593 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2596 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2598 CComPtr
<ITravelLog
> travelLog
;
2601 hResult
= GetTravelLog(&travelLog
);
2602 if (FAILED_UNEXPECTEDLY(hResult
))
2604 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2607 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2612 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2617 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2618 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2623 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2627 V_VT(&level
) = VT_I4
;
2629 return Refresh2(&level
);
2632 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2634 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2637 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2638 if (FAILED_UNEXPECTEDLY(hResult
))
2640 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2643 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2648 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2653 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2658 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2663 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2668 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2673 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2680 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2685 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2690 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2695 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2700 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2705 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2710 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2715 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2722 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2727 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2732 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2737 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2742 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2747 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2752 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2757 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2762 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2767 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2772 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2777 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2782 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2787 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2792 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2797 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2802 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2807 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2812 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2817 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2822 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2827 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2832 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2837 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2838 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2843 // called from drive combo box to navigate to a directory
2844 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2845 return E_INVALIDARG
;
2846 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2847 return E_INVALIDARG
;
2848 pidl
= (LPITEMIDLIST
)V_ARRAY(URL
)->pvData
;
2849 hResult
= BrowseToPIDL((LPITEMIDLIST
)pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2850 if (FAILED_UNEXPECTEDLY(hResult
))
2855 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2860 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2861 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2866 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2871 // called to show search bar
2872 if (V_VT(pvaClsid
) != VT_BSTR
)
2873 return E_INVALIDARG
;
2874 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2875 // TODO: properly compute the value of vertical
2877 return ShowBand(classID
, vertical
);
2880 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2885 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2890 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2895 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2900 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2905 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2910 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2915 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2920 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2925 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2930 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2935 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2940 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2945 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2950 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2955 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2960 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
2962 if (pWinData
== NULL
)
2965 pWinData
->dwWindowID
= -1;
2967 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
2968 pWinData
->lpszUrl
= NULL
;
2969 pWinData
->lpszUrlLocation
= NULL
;
2970 pWinData
->lpszTitle
= NULL
;
2974 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
2979 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
2984 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
2986 CComPtr
<IPersistHistory
> viewPersistHistory
;
2987 CComPtr
<IOleObject
> viewHistoryObject
;
2988 persistState oldState
;
2993 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
2994 if (FAILED_UNEXPECTEDLY(hResult
))
2996 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
2998 if (oldState
.browseType
!= 2)
3000 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3002 return E_OUTOFMEMORY
;
3003 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3004 if (FAILED_UNEXPECTEDLY(hResult
))
3009 if (numRead
!= oldState
.pidlSize
)
3014 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3015 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3016 fHistoryObject
= viewHistoryObject
;
3017 fHistoryStream
= pStream
;
3018 fHistoryBindContext
= pbc
;
3019 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
);
3020 fHistoryObject
= NULL
;
3021 fHistoryStream
= NULL
;
3022 fHistoryBindContext
= NULL
;
3024 if (FAILED_UNEXPECTEDLY(hResult
))
3029 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3031 CComPtr
<IPersistHistory
> viewPersistHistory
;
3032 persistState newState
;
3035 hResult
= fCurrentShellView
->GetItemObject(
3036 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3037 memset(&newState
, 0, sizeof(newState
));
3038 newState
.dwSize
= sizeof(newState
);
3039 newState
.browseType
= 2;
3040 newState
.browserIndex
= GetBrowserIndex();
3041 if (viewPersistHistory
.p
!= NULL
)
3043 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3044 if (FAILED_UNEXPECTEDLY(hResult
))
3047 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3048 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3049 if (FAILED_UNEXPECTEDLY(hResult
))
3051 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3052 if (FAILED_UNEXPECTEDLY(hResult
))
3054 if (viewPersistHistory
.p
!= NULL
)
3056 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3057 if (FAILED_UNEXPECTEDLY(hResult
))
3063 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3068 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3073 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3075 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3080 void ReleaseCComPtrExpectZero(CComPtr
<T
>& cptr
, BOOL forceRelease
= FALSE
)
3084 int nrc
= cptr
->Release();
3087 DbgPrint("WARNING: Unexpected RefCount > 0!\n");
3092 nrc
= cptr
->Release();
3100 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3103 // TODO: rip down everything
3105 fCurrentShellView
->DestroyViewWindow();
3106 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3107 ReleaseCComPtrExpectZero(fCurrentShellView
);
3109 for (int i
= 0; i
< 3; i
++)
3111 if (fClientBars
[i
].clientBar
== NULL
)
3113 IDockingWindow
* pdw
;
3114 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3115 if (FAILED_UNEXPECTEDLY(hr
))
3120 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3122 ReleaseCComPtrExpectZero(fTravelLog
);
3124 fCurrentShellFolder
.Release();
3125 ILFree(fCurrentDirectoryPIDL
);
3126 ::DestroyWindow(fStatusBar
);
3127 DestroyMenu(fCurrentMenuBar
);
3133 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3135 CComPtr
<IDockingWindow
> dockingWindow
;
3136 RECT availableBounds
;
3137 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3140 if (wParam
!= SIZE_MINIMIZED
)
3142 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3143 for (INT x
= 0; x
< 3; x
++)
3145 if (fClientBars
[x
].clientBar
!= NULL
)
3147 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3148 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3149 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3151 hResult
= dockingWindow
->ResizeBorderDW(
3152 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3162 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3165 LPARAM menuIndex
= lParam
;
3167 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3169 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3173 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3177 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3179 UpdateViewMenu(theMenu
);
3182 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3186 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3190 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3195 return RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3198 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3200 if (fCurrentShellViewWindow
!= NULL
)
3201 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3205 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3210 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3214 hResult
= DoFolderOptions();
3218 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3221 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3222 #endif /* __REACTOS__ */
3226 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3229 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3230 #endif /* __REACTOS__ */
3234 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3236 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3240 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3248 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3252 hResult
= GoForward();
3256 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3260 hResult
= NavigateToParent();
3264 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3272 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3276 // FIXME: This does not appear to be what windows does.
3277 hResult
= NavigateToParent();
3281 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3285 typedef HRESULT (WINAPI
*PSHOpenNewFrame
)(LPITEMIDLIST pidl
, IUnknown
*b
, long c
, long d
);
3286 PSHOpenNewFrame Func
= NULL
;
3287 HMODULE Module
= GetModuleHandle(TEXT("browseui.dll"));
3289 Func
= reinterpret_cast<PSHOpenNewFrame
>(GetProcAddress(Module
, (LPCSTR
) 103));
3292 LPITEMIDLIST desktopPIDL
;
3294 hResult
= SHGetFolderLocation(NULL
, CSIDL_DESKTOP
, NULL
, 0, &desktopPIDL
);
3295 if (SUCCEEDED(hResult
))
3297 hResult
= Func(desktopPIDL
, NULL
, -1, 1);
3303 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3305 fStatusBarVisible
= !fStatusBarVisible
;
3306 // TODO: trigger a relayout of contained items
3310 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3312 CComPtr
<IOleCommandTarget
> commandTarget
;
3315 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3316 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3317 if (FAILED_UNEXPECTEDLY(hResult
))
3319 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3323 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3325 CComPtr
<IOleCommandTarget
> commandTarget
;
3328 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3329 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3330 if (FAILED_UNEXPECTEDLY(hResult
))
3332 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3336 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3338 CComPtr
<IOleCommandTarget
> commandTarget
;
3341 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3342 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3343 if (FAILED_UNEXPECTEDLY(hResult
))
3345 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3349 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3351 CComPtr
<IOleCommandTarget
> commandTarget
;
3354 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3355 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3356 if (FAILED_UNEXPECTEDLY(hResult
))
3358 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3362 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3364 CComPtr
<IOleCommandTarget
> commandTarget
;
3367 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3368 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3369 if (FAILED_UNEXPECTEDLY(hResult
))
3371 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3375 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3377 CComPtr
<IOleCommandTarget
> commandTarget
;
3380 hResult
= fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(
3381 IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
3382 if (FAILED_UNEXPECTEDLY(hResult
))
3384 hResult
= commandTarget
->Exec(&CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3388 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3393 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3395 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3396 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3400 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3402 CComPtr
<CShellBrowser
> theCabinet
;
3407 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3408 if (theCabinet
== NULL
)
3410 return E_OUTOFMEMORY
;
3413 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3414 if (FAILED_UNEXPECTEDLY(hResult
))
3415 return E_OUTOFMEMORY
;
3417 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3421 // Error: continue or exit?
3425 if (Msg
.message
== WM_QUIT
)
3428 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3430 TranslateMessage(&Msg
);
3431 DispatchMessage(&Msg
);
3435 //TerminateProcess(GetCurrentProcess(), hResult);
3437 int nrc
= theCabinet
->Release();
3440 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked, process will never terminate. Terminating forcefully.\n", nrc
);
3442 //TerminateProcess(GetCurrentProcess(), 1);
3445 theCabinet
.Detach();
3450 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3453 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3454 INITCOMMONCONTROLSEX iccex
=
3457 0xFFFF /* everything! */
3460 OleInitialize(NULL
);
3461 InitCommonControlsEx(&iccex
);
3463 ATLTRY(hr
= ExplorerMessageLoop(parameters
));