xref: /reactos/dll/win32/browseui/shellbrowser.cpp (revision 7abc8be1)
1 /*
2  * ReactOS Explorer
3  *
4  * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
5  *
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.
10  *
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.
15  *
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
19  */
20 
21 #include "precomp.h"
22 
23 #include <shellapi.h>
24 #include <htiframe.h>
25 #include <strsafe.h>
26 #include <undocshell.h>
27 
28 extern HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow);
29 
30 #include "newatlinterfaces.h"
31 
32 /*
33 TODO:
34   **Provide implementation of new and delete that use LocalAlloc
35   **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
36         view doesn't restore the selection correctly.
37   **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
38   **Add brand band bitmaps to shell32.dll
39   **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
40 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
41         current state overwrites the wrong entry's contents. This needs to be changed.
42 ****Fix close of browser window to release all objects
43 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
44   **When a new bar is added to base bar site, how is base bar told so it can resize?
45   **Does the base bar site have a classid?
46   **What should refresh command send to views to make them refresh?
47   **When new bar is created, what status notifications need to be fired?
48   **How does keyboard filtering dispatch?
49   **For deferred persist history load, how does the view connect up and get the state?
50     How does context menu send open, cut, rename commands to its site (the shell view)?
51   **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
52 
53   **Route View->Toolbars commands to internet toolbar
54   **Handle travel log items in View->Go
55   **Fix ShowBrowserBar to pass correct size on when bar is shown
56 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
57 ****Make ShowToolbar check if bar is already created before creating it again
58 ****Shell should fill in the list of explorer bars in the View submenus
59   **Add folder menu in the file menu
60   **Fix CShellBrowser::GetBorderDW to compute available size correctly
61   **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
62   **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
63     Make folders toolbar item update state appropriately
64     Read list of bands from registry on launch
65     Read list of bars from registry on launch
66     If the folders or search bars don't exist, disable the toolbar buttons
67     If the favorites or history bars don't exist, disable the toolbar butons
68     Fix Apply to all Folders in Folder Options
69     Implement close command
70     Add explorer band context menu to file menu
71     Add code to allow restore of internet toolbar from registry
72     Fix code that calls FireNavigateComplete to pass the correct new path
73 
74     What are the other command ids for QueryStatus/FireCommandStateChange?
75 
76     Add handler for cabinet settings change
77     Add handler for system metrics change (renegotiate border space?)
78     Add handler for theme change and forward to contained windows
79 
80     When folders are shown, the status bar text should change
81     Add code to save/restore shell view settings
82     Implement tabbing between frames
83     Fix handling of focus everywhere
84     Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
85 
86     The status bar doesn't show help text for items owned by frame during menu tracking
87     Stub out frame command handlers
88     "Arrange icons by" group is not checked properly
89 
90     When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
91         the icon is always an open folder with magnifying glass
92     Fix bars to calculate height correctly
93     Hookup policies for everything...
94     Investigate toolbar message WM_USER+93
95     Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
96 
97     Vertical Explorer Bar		CATID_InfoBand
98     Horizontal Explorer Bar		CATID_CommBand
99     Desk Band					CATID_DeskBand
100 
101     cache of bars
102     HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
103     HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
104 
105     create key here with CLSID of bar to register tool band
106     HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
107 
108 */
109 
110 #ifndef __GNUC__
111 #pragma comment(linker, \
112     "\"/manifestdependency:type='Win32' "\
113     "name='Microsoft.Windows.Common-Controls' "\
114     "version='6.0.0.0' "\
115     "processorArchitecture='*' "\
116     "publicKeyToken='6595b64144ccf1df' "\
117     "language='*'\"")
118 #endif // __GNUC__
119 
120 static const unsigned int                   folderOptionsPageCountMax = 20;
121 static const long                           BTP_DONT_UPDATE_HISTORY = 0;
122 static const long                           BTP_UPDATE_CUR_HISTORY = 1;
123 static const long                           BTP_UPDATE_NEXT_HISTORY = 2;
124 
125 BOOL                                        createNewStuff = false;
126 
127 
128 // this class is private to browseui.dll and is not registered externally?
129 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
130 
131 void DeleteMenuItems(HMENU theMenu, unsigned int firstIDToDelete, unsigned int lastIDToDelete)
132 {
133     MENUITEMINFO                            menuItemInfo;
134     int                                     menuItemCount;
135     int                                     curIndex;
136 
137     menuItemCount = GetMenuItemCount(theMenu);
138     curIndex = 0;
139     while (curIndex < menuItemCount)
140     {
141         menuItemInfo.cbSize = sizeof(menuItemInfo);
142         menuItemInfo.fMask = MIIM_ID;
143         if (GetMenuItemInfo(theMenu, curIndex, TRUE, &menuItemInfo) &&
144             menuItemInfo.wID >= firstIDToDelete && menuItemInfo.wID <= lastIDToDelete)
145         {
146             DeleteMenu(theMenu, curIndex, MF_BYPOSITION);
147             menuItemCount--;
148         }
149         else
150             curIndex++;
151     }
152 }
153 
154 HRESULT WINAPI SHBindToFolder(LPCITEMIDLIST path, IShellFolder **newFolder)
155 {
156     CComPtr<IShellFolder>                   desktop;
157 
158     HRESULT hr = ::SHGetDesktopFolder(&desktop);
159     if (FAILED_UNEXPECTEDLY(hr))
160         return E_FAIL;
161     if (path == NULL || path->mkid.cb == 0)
162     {
163         *newFolder = desktop;
164         desktop.p->AddRef ();
165         return S_OK;
166     }
167     return desktop->BindToObject (path, NULL, IID_PPV_ARG(IShellFolder, newFolder));
168 }
169 
170 static const TCHAR szCabinetWndClass[] = TEXT("CabinetWClass");
171 //static const TCHAR szExploreWndClass[] = TEXT("ExploreWClass");
172 
173 class CDockManager;
174 class CShellBrowser;
175 
176 class CToolbarProxy :
177     public CWindowImpl<CToolbarProxy, CWindow, CControlWinTraits>
178 {
179 private:
180     CComPtr<IExplorerToolbar>               fExplorerToolbar;
181 public:
182     void Initialize(HWND parent, IUnknown *explorerToolbar);
183     void Destroy();
184 private:
185 
186     // message handlers
187     LRESULT OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
188     LRESULT OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
189 
190     BEGIN_MSG_MAP(CToolbarProxy)
191         MESSAGE_HANDLER(TB_ADDBITMAP, OnAddBitmap)
192         MESSAGE_RANGE_HANDLER(WM_USER, 0x7fff, OnForwardMessage)
193     END_MSG_MAP()
194 };
195 
196 void CToolbarProxy::Initialize(HWND parent, IUnknown *explorerToolbar)
197 {
198     HWND                                    myWindow;
199     HRESULT                                 hResult;
200 
201     myWindow = SHCreateWorkerWindowW(0, parent, 0, WS_CHILD, NULL, 0);
202     if (myWindow != NULL)
203     {
204         SubclassWindow(myWindow);
205         SetWindowPos(NULL, -32000, -32000, 0, 0, SWP_NOOWNERZORDER | SWP_NOZORDER);
206         hResult = explorerToolbar->QueryInterface(
207             IID_PPV_ARG(IExplorerToolbar, &fExplorerToolbar));
208     }
209 }
210 
211 void CToolbarProxy::Destroy()
212 {
213     DestroyWindow();
214     fExplorerToolbar = NULL;
215 }
216 
217 LRESULT CToolbarProxy::OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
218 {
219     long int                                result;
220     HRESULT                                 hResult;
221 
222     result = 0;
223     if (fExplorerToolbar.p != NULL)
224     {
225         hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 1, (long)wParam,
226             reinterpret_cast<TBADDBITMAP *>(lParam), &result, RGB(192, 192, 192));
227         hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 2, (long)wParam,
228             reinterpret_cast<TBADDBITMAP *>(lParam), &result, RGB(192, 192, 192));
229     }
230     return result;
231 }
232 
233 LRESULT CToolbarProxy::OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
234 {
235     LRESULT                                 result;
236     HRESULT                                 hResult;
237 
238     result = 0;
239     if (fExplorerToolbar.p != NULL)
240         hResult = fExplorerToolbar->SendToolbarMsg(&CGID_ShellBrowser, uMsg, wParam, lParam, &result);
241     return result;
242 }
243 
244 /*
245 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
246     where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
247     rebar
248 */
249 
250 struct MenuBandInfo {
251     GUID barGuid;
252     BOOL fVertical;
253 };
254 
255 class CShellBrowser :
256     public CWindowImpl<CShellBrowser, CWindow, CFrameWinTraits>,
257     public CComObjectRootEx<CComMultiThreadModelNoCS>,
258     public IShellBrowser,
259     public IDropTarget,
260     public IServiceProvider,
261     public IProfferServiceImpl<CShellBrowser>,
262     public IShellBrowserService,
263     public IWebBrowser2,
264     public ITravelLogClient,
265     public IPersistHistory,
266     public IDockingWindowSite,
267     public IOleCommandTarget,
268     public IBrowserService2,
269     public IConnectionPointContainerImpl<CShellBrowser>,
270     public MyIConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents2>,
271     public MyIConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents>
272 {
273 private:
274     class barInfo
275     {
276     public:
277         barInfo()
278         {
279             memset(&borderSpace, 0, sizeof(borderSpace));
280             hwnd = NULL;
281         }
282 
283         RECT                                borderSpace;
284         CComPtr<IUnknown>                   clientBar;
285         HWND                                hwnd;
286     };
287     static const int                        BIInternetToolbar = 0;
288     static const int                        BIVerticalBaseBar = 1;
289     static const int                        BIHorizontalBaseBar = 2;
290 
291     HWND                                    fCurrentShellViewWindow;    // our currently hosted shell view window
292     CComPtr<IShellFolder>                   fCurrentShellFolder;        //
293     CComPtr<IShellView>                     fCurrentShellView;          //
294     LPITEMIDLIST                            fCurrentDirectoryPIDL;      //
295     HWND                                    fStatusBar;
296     bool                                    fStatusBarVisible;
297     CToolbarProxy                           fToolbarProxy;
298     barInfo                                 fClientBars[3];
299     CComPtr<ITravelLog>                     fTravelLog;
300     HMENU                                   fCurrentMenuBar;
301     CABINETSTATE                            fCabinetState;
302     // The next three fields support persisted history for shell views.
303     // They do not need to be reference counted.
304     IOleObject                              *fHistoryObject;
305     IStream                                 *fHistoryStream;
306     IBindCtx                                *fHistoryBindContext;
307     HDSA menuDsa;
308     HACCEL m_hAccel;
309 public:
310 #if 0
311     ULONG InternalAddRef()
312     {
313         OutputDebugString(_T("AddRef\n"));
314         return CComObjectRootEx<CComMultiThreadModelNoCS>::InternalAddRef();
315     }
316     ULONG InternalRelease()
317     {
318         OutputDebugString(_T("Release\n"));
319         return CComObjectRootEx<CComMultiThreadModelNoCS>::InternalRelease();
320     }
321 #endif
322 
323     CShellBrowser();
324     ~CShellBrowser();
325     HRESULT Initialize(LPITEMIDLIST pidl, DWORD dwFlags);
326 public:
327     HRESULT BrowseToPIDL(LPCITEMIDLIST pidl, long flags);
328     HRESULT BrowseToPath(IShellFolder *newShellFolder, LPCITEMIDLIST absolutePIDL,
329         FOLDERSETTINGS *folderSettings, long flags);
330     HRESULT GetMenuBand(REFIID riid, void **shellMenu);
331     HRESULT GetBaseBar(bool vertical, REFIID riid, void **theBaseBar);
332     BOOL IsBandLoaded(const CLSID clsidBand, bool verticali, DWORD *pdwBandID);
333     HRESULT ShowBand(const CLSID &classID, bool vertical);
334     HRESULT NavigateToParent();
335     HRESULT DoFolderOptions();
336     static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
337     void RepositionBars();
338     HRESULT BuildExplorerBandMenu();
339     HRESULT BuildExplorerBandCategory(HMENU hBandsMenu, CATID category, DWORD dwPos, UINT *nbFound);
340     BOOL IsBuiltinBand(CLSID &bandID);
341     virtual WNDPROC GetWindowProc()
342     {
343         return WindowProc;
344     }
345     HRESULT FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments);
346     HRESULT FireNavigateComplete(const wchar_t *newDirectory);
347     HRESULT FireCommandStateChange(bool newState, int commandID);
348     HRESULT FireCommandStateChangeAll();
349     HRESULT UpdateForwardBackState();
350     HRESULT UpdateUpState();
351     void UpdateGotoMenu(HMENU theMenu);
352     void UpdateViewMenu(HMENU theMenu);
353 
354 /*    // *** IDockingWindowFrame methods ***
355     virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
356     virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
357     virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
358     */
359 
360     // *** IDockingWindowSite methods ***
361     virtual HRESULT STDMETHODCALLTYPE GetBorderDW(IUnknown* punkObj, LPRECT prcBorder);
362     virtual HRESULT STDMETHODCALLTYPE RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw);
363     virtual HRESULT STDMETHODCALLTYPE SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw);
364 
365     // *** IOleCommandTarget methods ***
366     virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds,
367         OLECMD prgCmds[  ], OLECMDTEXT *pCmdText);
368     virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID,
369         DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut);
370 
371     // *** IOleWindow methods ***
372     virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
373     virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
374 
375     // *** IShellBrowser methods ***
376     virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);
377     virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject);
378     virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared);
379     virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(LPCOLESTR pszStatusText);
380     virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(BOOL fEnable);
381     virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(MSG *pmsg, WORD wID);
382     virtual HRESULT STDMETHODCALLTYPE BrowseObject(LPCITEMIDLIST pidl, UINT wFlags);
383     virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(DWORD grfMode, IStream **ppStrm);
384     virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND *lphwnd);
385     virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret);
386     virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(IShellView **ppshv);
387     virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(IShellView *ppshv);
388     virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags);
389 
390     // *** IDropTarget methods ***
391     virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
392     virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
393     virtual HRESULT STDMETHODCALLTYPE DragLeave();
394     virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
395 
396     // *** IServiceProvider methods ***
397     virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject);
398 
399     // *** IShellBowserService methods ***
400     virtual HRESULT STDMETHODCALLTYPE GetPropertyBag(long flags, REFIID riid, void **ppvObject);
401 
402     // *** IDispatch methods ***
403     virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);
404     virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);
405     virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
406         REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);
407     virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
408         DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
409 
410     // *** IBrowserService methods ***
411     virtual HRESULT STDMETHODCALLTYPE GetParentSite(IOleInPlaceSite **ppipsite);
412     virtual HRESULT STDMETHODCALLTYPE SetTitle(IShellView *psv, LPCWSTR pszName);
413     virtual HRESULT STDMETHODCALLTYPE GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName);
414     virtual HRESULT STDMETHODCALLTYPE GetOleObject(IOleObject **ppobjv);
415     virtual HRESULT STDMETHODCALLTYPE GetTravelLog(ITravelLog **pptl);
416     virtual HRESULT STDMETHODCALLTYPE ShowControlWindow(UINT id, BOOL fShow);
417     virtual HRESULT STDMETHODCALLTYPE IsControlWindowShown(UINT id, BOOL *pfShown);
418     virtual HRESULT STDMETHODCALLTYPE IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags);
419     virtual HRESULT STDMETHODCALLTYPE IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPITEMIDLIST *ppidlOut);
420     virtual HRESULT STDMETHODCALLTYPE DisplayParseError(HRESULT hres, LPCWSTR pwszPath);
421     virtual HRESULT STDMETHODCALLTYPE NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF);
422     virtual HRESULT STDMETHODCALLTYPE SetNavigateState(BNSTATE bnstate);
423     virtual HRESULT STDMETHODCALLTYPE GetNavigateState(BNSTATE *pbnstate);
424     virtual HRESULT STDMETHODCALLTYPE NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse);
425     virtual HRESULT STDMETHODCALLTYPE UpdateWindowList();
426     virtual HRESULT STDMETHODCALLTYPE UpdateBackForwardState();
427     virtual HRESULT STDMETHODCALLTYPE SetFlags(DWORD dwFlags, DWORD dwFlagMask);
428     virtual HRESULT STDMETHODCALLTYPE GetFlags(DWORD *pdwFlags);
429     virtual HRESULT STDMETHODCALLTYPE CanNavigateNow( void);
430     virtual HRESULT STDMETHODCALLTYPE GetPidl(LPITEMIDLIST *ppidl);
431     virtual HRESULT STDMETHODCALLTYPE SetReferrer(LPCITEMIDLIST pidl);
432     virtual DWORD STDMETHODCALLTYPE GetBrowserIndex();
433     virtual HRESULT STDMETHODCALLTYPE GetBrowserByIndex(DWORD dwID, IUnknown **ppunk);
434     virtual HRESULT STDMETHODCALLTYPE GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc);
435     virtual HRESULT STDMETHODCALLTYPE SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor);
436     virtual HRESULT STDMETHODCALLTYPE CacheOLEServer(IOleObject *pole);
437     virtual HRESULT STDMETHODCALLTYPE GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut);
438     virtual HRESULT STDMETHODCALLTYPE OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut);
439     virtual HRESULT STDMETHODCALLTYPE GetPalette(HPALETTE *hpal);
440     virtual HRESULT STDMETHODCALLTYPE RegisterWindow(BOOL fForceRegister, int swc);
441 
442     // *** IBrowserService2 methods ***
443     virtual LRESULT STDMETHODCALLTYPE WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
444     virtual HRESULT STDMETHODCALLTYPE SetAsDefFolderSettings();
445     virtual HRESULT STDMETHODCALLTYPE GetViewRect(RECT *prc);
446     virtual HRESULT STDMETHODCALLTYPE OnSize(WPARAM wParam);
447     virtual HRESULT STDMETHODCALLTYPE OnCreate(struct tagCREATESTRUCTW *pcs);
448     virtual LRESULT STDMETHODCALLTYPE OnCommand(WPARAM wParam, LPARAM lParam);
449     virtual HRESULT STDMETHODCALLTYPE OnDestroy();
450     virtual LRESULT STDMETHODCALLTYPE OnNotify(struct tagNMHDR *pnm);
451     virtual HRESULT STDMETHODCALLTYPE OnSetFocus();
452     virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivateBS(BOOL fActive);
453     virtual HRESULT STDMETHODCALLTYPE ReleaseShellView();
454     virtual HRESULT STDMETHODCALLTYPE ActivatePendingView();
455     virtual HRESULT STDMETHODCALLTYPE CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd);
456     virtual HRESULT STDMETHODCALLTYPE CreateBrowserPropSheetExt(REFIID riid, void **ppv);
457     virtual HRESULT STDMETHODCALLTYPE GetViewWindow(HWND *phwndView);
458     virtual HRESULT STDMETHODCALLTYPE GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd);
459     virtual LPBASEBROWSERDATA STDMETHODCALLTYPE PutBaseBrowserData( void);
460     virtual HRESULT STDMETHODCALLTYPE InitializeTravelLog(ITravelLog *ptl, DWORD dw);
461     virtual HRESULT STDMETHODCALLTYPE SetTopBrowser();
462     virtual HRESULT STDMETHODCALLTYPE Offline(int iCmd);
463     virtual HRESULT STDMETHODCALLTYPE AllowViewResize(BOOL f);
464     virtual HRESULT STDMETHODCALLTYPE SetActivateState(UINT u);
465     virtual HRESULT STDMETHODCALLTYPE UpdateSecureLockIcon(int eSecureLock);
466     virtual HRESULT STDMETHODCALLTYPE InitializeDownloadManager();
467     virtual HRESULT STDMETHODCALLTYPE InitializeTransitionSite();
468     virtual HRESULT STDMETHODCALLTYPE _Initialize(HWND hwnd, IUnknown *pauto);
469     virtual HRESULT STDMETHODCALLTYPE _CancelPendingNavigationAsync( void);
470     virtual HRESULT STDMETHODCALLTYPE _CancelPendingView();
471     virtual HRESULT STDMETHODCALLTYPE _MaySaveChanges();
472     virtual HRESULT STDMETHODCALLTYPE _PauseOrResumeView(BOOL fPaused);
473     virtual HRESULT STDMETHODCALLTYPE _DisableModeless();
474     virtual HRESULT STDMETHODCALLTYPE _NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags);
475     virtual HRESULT STDMETHODCALLTYPE _TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew);
476     virtual HRESULT STDMETHODCALLTYPE _SwitchActivationNow();
477     virtual HRESULT STDMETHODCALLTYPE _ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup,
478         DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
479     virtual HRESULT STDMETHODCALLTYPE _SendChildren(
480         HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam);
481     virtual HRESULT STDMETHODCALLTYPE GetFolderSetData(struct tagFolderSetData *pfsd);
482     virtual HRESULT STDMETHODCALLTYPE _OnFocusChange(UINT itb);
483     virtual HRESULT STDMETHODCALLTYPE v_ShowHideChildWindows(BOOL fChildOnly);
484     virtual UINT STDMETHODCALLTYPE _get_itbLastFocus();
485     virtual HRESULT STDMETHODCALLTYPE _put_itbLastFocus(UINT itbLastFocus);
486     virtual HRESULT STDMETHODCALLTYPE _UIActivateView(UINT uState);
487     virtual HRESULT STDMETHODCALLTYPE _GetViewBorderRect(RECT *prc);
488     virtual HRESULT STDMETHODCALLTYPE _UpdateViewRectSize();
489     virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorder(UINT itb);
490     virtual HRESULT STDMETHODCALLTYPE _ResizeView();
491     virtual HRESULT STDMETHODCALLTYPE _GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon);
492     virtual IStream *STDMETHODCALLTYPE v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName);
493     virtual LRESULT STDMETHODCALLTYPE ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
494     virtual HRESULT STDMETHODCALLTYPE SetAcceleratorMenu(HACCEL hacc);
495     virtual int STDMETHODCALLTYPE _GetToolbarCount();
496     virtual LPTOOLBARITEM STDMETHODCALLTYPE _GetToolbarItem(int itb);
497     virtual HRESULT STDMETHODCALLTYPE _SaveToolbars(IStream *pstm);
498     virtual HRESULT STDMETHODCALLTYPE _LoadToolbars(IStream *pstm);
499     virtual HRESULT STDMETHODCALLTYPE _CloseAndReleaseToolbars(BOOL fClose);
500     virtual HRESULT STDMETHODCALLTYPE v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext,
501         int citb, LPTOOLBARITEM *pptbi, HWND *phwnd);
502     virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor);
503     virtual UINT STDMETHODCALLTYPE _FindTBar(IUnknown *punkSrc);
504     virtual HRESULT STDMETHODCALLTYPE _SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg);
505     virtual HRESULT STDMETHODCALLTYPE v_MayTranslateAccelerator(MSG *pmsg);
506     virtual HRESULT STDMETHODCALLTYPE _GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor);
507     virtual HRESULT STDMETHODCALLTYPE v_CheckZoneCrossing(LPCITEMIDLIST pidl);
508 
509     // *** IWebBrowser methods ***
510     virtual HRESULT STDMETHODCALLTYPE GoBack();
511     virtual HRESULT STDMETHODCALLTYPE GoForward();
512     virtual HRESULT STDMETHODCALLTYPE GoHome();
513     virtual HRESULT STDMETHODCALLTYPE GoSearch();
514     virtual HRESULT STDMETHODCALLTYPE Navigate(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName,
515         VARIANT *PostData, VARIANT *Headers);
516     virtual HRESULT STDMETHODCALLTYPE Refresh();
517     virtual HRESULT STDMETHODCALLTYPE Refresh2(VARIANT *Level);
518     virtual HRESULT STDMETHODCALLTYPE Stop();
519     virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppDisp);
520     virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppDisp);
521     virtual HRESULT STDMETHODCALLTYPE get_Container(IDispatch **ppDisp);
522     virtual HRESULT STDMETHODCALLTYPE get_Document(IDispatch **ppDisp);
523     virtual HRESULT STDMETHODCALLTYPE get_TopLevelContainer(VARIANT_BOOL *pBool);
524     virtual HRESULT STDMETHODCALLTYPE get_Type(BSTR *Type);
525     virtual HRESULT STDMETHODCALLTYPE get_Left(long *pl);
526     virtual HRESULT STDMETHODCALLTYPE put_Left(long Left);
527     virtual HRESULT STDMETHODCALLTYPE get_Top(long *pl);
528     virtual HRESULT STDMETHODCALLTYPE put_Top(long Top);
529     virtual HRESULT STDMETHODCALLTYPE get_Width(long *pl);
530     virtual HRESULT STDMETHODCALLTYPE put_Width(long Width);
531     virtual HRESULT STDMETHODCALLTYPE get_Height(long *pl);
532     virtual HRESULT STDMETHODCALLTYPE put_Height(long Height);
533     virtual HRESULT STDMETHODCALLTYPE get_LocationName(BSTR *LocationName);
534     virtual HRESULT STDMETHODCALLTYPE get_LocationURL(BSTR *LocationURL);
535     virtual HRESULT STDMETHODCALLTYPE get_Busy(VARIANT_BOOL *pBool);
536 
537     // *** IWebBrowserApp methods ***
538     virtual HRESULT STDMETHODCALLTYPE Quit();
539     virtual HRESULT STDMETHODCALLTYPE ClientToWindow(int *pcx, int *pcy);
540     virtual HRESULT STDMETHODCALLTYPE PutProperty(BSTR Property, VARIANT vtValue);
541     virtual HRESULT STDMETHODCALLTYPE GetProperty(BSTR Property, VARIANT *pvtValue);
542     virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR *Name);
543     virtual HRESULT STDMETHODCALLTYPE get_HWND(SHANDLE_PTR *pHWND);
544     virtual HRESULT STDMETHODCALLTYPE get_FullName(BSTR *FullName);
545     virtual HRESULT STDMETHODCALLTYPE get_Path(BSTR *Path);
546     virtual HRESULT STDMETHODCALLTYPE get_Visible(VARIANT_BOOL *pBool);
547     virtual HRESULT STDMETHODCALLTYPE put_Visible(VARIANT_BOOL Value);
548     virtual HRESULT STDMETHODCALLTYPE get_StatusBar(VARIANT_BOOL *pBool);
549     virtual HRESULT STDMETHODCALLTYPE put_StatusBar(VARIANT_BOOL Value);
550     virtual HRESULT STDMETHODCALLTYPE get_StatusText(BSTR *StatusText);
551     virtual HRESULT STDMETHODCALLTYPE put_StatusText(BSTR StatusText);
552     virtual HRESULT STDMETHODCALLTYPE get_ToolBar(int *Value);
553     virtual HRESULT STDMETHODCALLTYPE put_ToolBar(int Value);
554     virtual HRESULT STDMETHODCALLTYPE get_MenuBar(VARIANT_BOOL *Value);
555     virtual HRESULT STDMETHODCALLTYPE put_MenuBar(VARIANT_BOOL Value);
556     virtual HRESULT STDMETHODCALLTYPE get_FullScreen(VARIANT_BOOL *pbFullScreen);
557     virtual HRESULT STDMETHODCALLTYPE put_FullScreen(VARIANT_BOOL bFullScreen);
558 
559     // *** IWebBrowser2 methods ***
560     virtual HRESULT STDMETHODCALLTYPE Navigate2(VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName,
561         VARIANT *PostData, VARIANT *Headers);
562     virtual HRESULT STDMETHODCALLTYPE QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf);
563     virtual HRESULT STDMETHODCALLTYPE ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt,
564         VARIANT *pvaIn, VARIANT *pvaOut);
565     virtual HRESULT STDMETHODCALLTYPE ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize);
566     virtual HRESULT STDMETHODCALLTYPE get_ReadyState(READYSTATE *plReadyState);
567     virtual HRESULT STDMETHODCALLTYPE get_Offline(VARIANT_BOOL *pbOffline);
568     virtual HRESULT STDMETHODCALLTYPE put_Offline(VARIANT_BOOL bOffline);
569     virtual HRESULT STDMETHODCALLTYPE get_Silent(VARIANT_BOOL *pbSilent);
570     virtual HRESULT STDMETHODCALLTYPE put_Silent(VARIANT_BOOL bSilent);
571     virtual HRESULT STDMETHODCALLTYPE get_RegisterAsBrowser(VARIANT_BOOL *pbRegister);
572     virtual HRESULT STDMETHODCALLTYPE put_RegisterAsBrowser(VARIANT_BOOL bRegister);
573     virtual HRESULT STDMETHODCALLTYPE get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister);
574     virtual HRESULT STDMETHODCALLTYPE put_RegisterAsDropTarget(VARIANT_BOOL bRegister);
575     virtual HRESULT STDMETHODCALLTYPE get_TheaterMode(VARIANT_BOOL *pbRegister);
576     virtual HRESULT STDMETHODCALLTYPE put_TheaterMode(VARIANT_BOOL bRegister);
577     virtual HRESULT STDMETHODCALLTYPE get_AddressBar(VARIANT_BOOL *Value);
578     virtual HRESULT STDMETHODCALLTYPE put_AddressBar(VARIANT_BOOL Value);
579     virtual HRESULT STDMETHODCALLTYPE get_Resizable(VARIANT_BOOL *Value);
580     virtual HRESULT STDMETHODCALLTYPE put_Resizable(VARIANT_BOOL Value);
581 
582     // *** ITravelLogClient methods ***
583     virtual HRESULT STDMETHODCALLTYPE FindWindowByIndex(DWORD dwID, IUnknown **ppunk);
584     virtual HRESULT STDMETHODCALLTYPE GetWindowData(IStream *pStream, LPWINDOWDATA pWinData);
585     virtual HRESULT STDMETHODCALLTYPE LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition);
586 
587     // *** IPersist methods ***
588     virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID);
589 
590     // *** IPersistHistory methods ***
591     virtual HRESULT STDMETHODCALLTYPE LoadHistory(IStream *pStream, IBindCtx *pbc);
592     virtual HRESULT STDMETHODCALLTYPE SaveHistory(IStream *pStream);
593     virtual HRESULT STDMETHODCALLTYPE SetPositionCookie(DWORD dwPositioncookie);
594     virtual HRESULT STDMETHODCALLTYPE GetPositionCookie(DWORD *pdwPositioncookie);
595 
596     // message handlers
597     LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
598     LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
599     LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
600     LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
601     LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
602     LRESULT RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
603     LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
604     LRESULT OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
605     LRESULT OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
606     LRESULT OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
607     LRESULT OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
608     LRESULT OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
609     LRESULT OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
610     LRESULT OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
611     LRESULT OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
612     LRESULT OnBackspace(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
613     LRESULT OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
614     LRESULT OnOrganizeFavorites(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
615     LRESULT OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
616     LRESULT OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
617     LRESULT OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
618     LRESULT OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
619     LRESULT OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
620     LRESULT OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
621     LRESULT OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
622     LRESULT OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
623     LRESULT OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
624     LRESULT OnExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
625     LRESULT RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
626     HRESULT OnSearch();
627 
628     static ATL::CWndClassInfo& GetWndClassInfo()
629     {
630         static ATL::CWndClassInfo wc =
631         {
632             { sizeof(WNDCLASSEX), CS_DBLCLKS, StartWindowProc,
633               0, 0, NULL, LoadIcon(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET)),
634               LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), NULL, szCabinetWndClass, NULL },
635             NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
636         };
637         return wc;
638     }
639 
640     BEGIN_MSG_MAP(CShellBrowser)
641         MESSAGE_HANDLER(WM_CREATE, OnCreate)
642         MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
643         MESSAGE_HANDLER(WM_SIZE, OnSize)
644         MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
645         MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
646         MESSAGE_HANDLER(WM_MEASUREITEM, RelayMsgToShellView)
647         MESSAGE_HANDLER(WM_DRAWITEM, RelayMsgToShellView)
648         MESSAGE_HANDLER(WM_MENUSELECT, RelayMsgToShellView)
649         MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
650         COMMAND_ID_HANDLER(IDM_FILE_CLOSE, OnClose)
651         COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS, OnFolderOptions)
652         COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE, OnMapNetworkDrive)
653         COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE, OnDisconnectNetworkDrive)
654         COMMAND_ID_HANDLER(IDM_HELP_ABOUT, OnAboutReactOS)
655         COMMAND_ID_HANDLER(IDM_GOTO_BACK, OnGoBack)
656         COMMAND_ID_HANDLER(IDM_GOTO_FORWARD, OnGoForward)
657         COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL, OnGoUpLevel)
658         COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE, OnGoHome)
659         COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES, OnOrganizeFavorites)
660         COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR, OnToggleStatusBarVisible)
661         COMMAND_ID_HANDLER(IDM_VIEW_REFRESH, OnRefresh)
662         COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS, OnToggleToolbarLock)
663         COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS, OnToggleToolbarBandVisible)
664         COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR, OnToggleAddressBandVisible)
665         COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR, OnToggleLinksBandVisible)
666         COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS, OnToggleTextLabels)
667         COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE, OnToolbarCustomize)
668         COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH, OnExplorerBar)
669         COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS, OnExplorerBar)
670         COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY, OnExplorerBar)
671         COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES, OnExplorerBar)
672         COMMAND_ID_HANDLER(IDM_BACKSPACE, OnBackspace)
673         COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, OnGoTravel)
674         COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM, IDM_EXPLORERBAND_ENDCUSTOM, OnExplorerBar)
675         MESSAGE_HANDLER(WM_COMMAND, RelayCommands)
676     END_MSG_MAP()
677 
678     BEGIN_CONNECTION_POINT_MAP(CShellBrowser)
679         CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2)
680         CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents)
681     END_CONNECTION_POINT_MAP()
682 
683     BEGIN_COM_MAP(CShellBrowser)
684         COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite)
685         COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
686         COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDockingWindowSite)
687         COM_INTERFACE_ENTRY_IID(IID_IShellBrowser, IShellBrowser)
688         COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget)
689         COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
690         COM_INTERFACE_ENTRY_IID(IID_IProfferService, IProfferService)
691         COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService, IShellBrowserService)
692         COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
693         COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer, IConnectionPointContainer)
694         COM_INTERFACE_ENTRY_IID(IID_IWebBrowser, IWebBrowser)
695         COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp, IWebBrowserApp)
696         COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2, IWebBrowser2)
697         COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient, ITravelLogClient)
698         COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist)
699         COM_INTERFACE_ENTRY_IID(IID_IPersistHistory, IPersistHistory)
700         COM_INTERFACE_ENTRY_IID(IID_IBrowserService, IBrowserService)
701         COM_INTERFACE_ENTRY_IID(IID_IBrowserService2, IBrowserService2)
702     END_COM_MAP()
703 };
704 
705 extern HRESULT CreateProgressDialog(REFIID riid, void **ppv);
706 
707 CShellBrowser::CShellBrowser()
708 {
709     fCurrentShellViewWindow = NULL;
710     fCurrentDirectoryPIDL = NULL;
711     fStatusBar = NULL;
712     fStatusBarVisible = true;
713     fCurrentMenuBar = NULL;
714     fHistoryObject = NULL;
715     fHistoryStream = NULL;
716     fHistoryBindContext = NULL;
717 }
718 
719 CShellBrowser::~CShellBrowser()
720 {
721     if (menuDsa)
722         DSA_Destroy(menuDsa);
723 }
724 
725 HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, DWORD dwFlags)
726 {
727     CComPtr<IPersistStreamInit>             persistStreamInit;
728     HRESULT                                 hResult;
729     CComPtr<IUnknown> clientBar;
730 
731     _AtlInitialConstruct();
732 
733     menuDsa = DSA_Create(sizeof(MenuBandInfo), 5);
734     if (!menuDsa)
735         return E_OUTOFMEMORY;
736 
737     fCabinetState.cLength = sizeof(fCabinetState);
738     if (ReadCabinetState(&fCabinetState, sizeof(fCabinetState)) == FALSE)
739     {
740     }
741 
742     // create window
743     Create(HWND_DESKTOP);
744     if (m_hWnd == NULL)
745         return E_FAIL;
746 
747     hResult = CInternetToolbar_CreateInstance(IID_PPV_ARG(IUnknown, &clientBar));
748     if (FAILED_UNEXPECTEDLY(hResult))
749         return hResult;
750 
751     fClientBars[BIInternetToolbar].clientBar = clientBar;
752 
753     // create interfaces
754     hResult = clientBar->QueryInterface(IID_PPV_ARG(IPersistStreamInit, &persistStreamInit));
755     if (FAILED_UNEXPECTEDLY(hResult))
756         return hResult;
757 
758     hResult = IUnknown_SetSite(clientBar, static_cast<IShellBrowser *>(this));
759     if (FAILED_UNEXPECTEDLY(hResult))
760         return hResult;
761 
762     hResult = IUnknown_Exec(clientBar, CGID_PrivCITCommands, 1, 1 /* or 0 */, NULL, NULL);
763     if (FAILED_UNEXPECTEDLY(hResult))
764         return hResult;
765 
766     // TODO: create settingsStream from registry entry
767     //if (settingsStream.p)
768     //{
769     //    hResult = persistStreamInit->Load(settingsStream);
770     //    if (FAILED_UNEXPECTEDLY(hResult))
771     //        return hResult;
772     //}
773     //else
774     {
775         hResult = persistStreamInit->InitNew();
776         if (FAILED_UNEXPECTEDLY(hResult))
777             return hResult;
778     }
779 
780     hResult = IUnknown_ShowDW(clientBar, TRUE);
781     if (FAILED_UNEXPECTEDLY(hResult))
782         return hResult;
783 
784     fToolbarProxy.Initialize(m_hWnd, clientBar);
785 
786 
787     // create status bar
788     fStatusBar = CreateWindow(STATUSCLASSNAMEW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
789                     SBT_NOBORDERS | SBT_TOOLTIPS, 0, 0, 500, 20, m_hWnd, (HMENU)0xa001,
790                     _AtlBaseModule.GetModuleInstance(), 0);
791     fStatusBarVisible = true;
792 
793 
794     // browse
795     hResult = BrowseToPIDL(pidl, BTP_UPDATE_NEXT_HISTORY);
796     if (FAILED_UNEXPECTEDLY(hResult))
797         return hResult;
798 
799     if ((dwFlags & SBSP_EXPLOREMODE) != NULL)
800         ShowBand(CLSID_ExplorerBand, true);
801 
802     ShowWindow(SW_SHOWNORMAL);
803 
804     return S_OK;
805 }
806 
807 HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags)
808 {
809     CComPtr<IShellFolder>                   newFolder;
810     FOLDERSETTINGS                          newFolderSettings;
811     HRESULT                                 hResult;
812 
813     // called by shell view to browse to new folder
814     // also called by explorer band to navigate to new folder
815     hResult = SHBindToFolder(pidl, &newFolder);
816     if (FAILED_UNEXPECTEDLY(hResult))
817         return hResult;
818 
819     newFolderSettings.ViewMode = FVM_ICON;
820     newFolderSettings.fFlags = 0;
821     hResult = BrowseToPath(newFolder, pidl, &newFolderSettings, flags);
822     if (FAILED_UNEXPECTEDLY(hResult))
823         return hResult;
824     return S_OK;
825 }
826 
827 BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
828 {
829     LPCITEMIDLIST                           pidlnext;
830     WORD                                    length;
831     BOOL                                    ret;
832 
833     ret = TRUE;
834     if (! _ILIsDesktop(pidl))
835     {
836         length = pidl->mkid.cb;
837         pidlnext =
838             reinterpret_cast<LPCITEMIDLIST>(
839                 reinterpret_cast<const BYTE *>(pidl) + length);
840         if (pidlnext->mkid.cb != 0)
841             ret = FALSE;
842     }
843     return ret;
844 }
845 
846 HRESULT WINAPI SHBindToFolderIDListParent(IShellFolder *unused, LPCITEMIDLIST pidl,
847     const IID *riid, LPVOID *ppv, LPITEMIDLIST *ppidlLast)
848 {
849     CComPtr<IShellFolder>                   psf;
850     LPITEMIDLIST                            pidlChild;
851     LPITEMIDLIST                            pidlParent;
852     HRESULT                                 hResult;
853 
854     hResult = E_FAIL;
855     if (ppv == NULL)
856         return E_POINTER;
857     *ppv = NULL;
858     if (ppidlLast != NULL)
859         *ppidlLast = NULL;
860     if (_ILIsPidlSimple(pidl))
861     {
862         if (ppidlLast != NULL)
863             *ppidlLast = ILClone(pidl);
864         hResult = SHGetDesktopFolder((IShellFolder **)ppv);
865     }
866     else
867     {
868         pidlChild = ILClone(ILFindLastID(pidl));
869         pidlParent = ILClone(pidl);
870         ILRemoveLastID(pidlParent);
871         hResult = SHGetDesktopFolder(&psf);
872         if (SUCCEEDED(hResult))
873             hResult = psf->BindToObject(pidlParent, NULL, *riid, ppv);
874         if (SUCCEEDED(hResult) && ppidlLast != NULL)
875             *ppidlLast = pidlChild;
876         else
877             ILFree(pidlChild);
878         ILFree(pidlParent);
879     }
880     return hResult;
881 }
882 
883 HRESULT IEGetNameAndFlagsEx(LPITEMIDLIST pidl, SHGDNF uFlags, long param10,
884     LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
885 {
886     CComPtr<IShellFolder>                   parentFolder;
887     LPITEMIDLIST                            childPIDL = NULL;
888     STRRET                                  L108;
889     HRESULT                                 hResult;
890 
891     hResult = SHBindToFolderIDListParent(NULL, pidl, &IID_PPV_ARG(IShellFolder, &parentFolder), &childPIDL);
892     if (FAILED(hResult))
893         goto cleanup;
894 
895     hResult = parentFolder->GetDisplayNameOf(childPIDL, uFlags, &L108);
896     if (FAILED(hResult))
897         goto cleanup;
898 
899     StrRetToBufW(&L108, childPIDL, pszBuf, cchBuf);
900     if (rgfInOut)
901     {
902         hResult = parentFolder->GetAttributesOf(1, const_cast<LPCITEMIDLIST *>(&childPIDL), rgfInOut);
903         if (FAILED(hResult))
904             goto cleanup;
905     }
906 
907     hResult = S_OK;
908 
909 cleanup:
910     if (childPIDL)
911         ILFree(childPIDL);
912     return hResult;
913 }
914 
915 long IEGetNameAndFlags(LPITEMIDLIST pidl, SHGDNF uFlags, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
916 {
917     return IEGetNameAndFlagsEx(pidl, uFlags, 0, pszBuf, cchBuf, rgfInOut);
918 }
919 
920 HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder,
921     LPCITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags)
922 {
923     CComPtr<IObjectWithSite>                objectWithSite;
924     CComPtr<IShellFolder>                   saveCurrentShellFolder;
925     CComPtr<IShellView>                     saveCurrentShellView;
926     CComPtr<IShellView>                     newShellView;
927     CComPtr<ITravelLog>                     travelLog;
928     HWND                                    newShellViewWindow;
929     BOOL                                    windowUpdateIsLocked;
930     RECT                                    shellViewWindowBounds;
931     HWND                                    previousView;
932     HCURSOR                                 saveCursor;
933     wchar_t                                 newTitle[MAX_PATH];
934     SHGDNF                                  nameFlags;
935     HRESULT                                 hResult;
936 
937     if (newShellFolder == NULL)
938         return E_INVALIDARG;
939 
940     hResult = GetTravelLog(&travelLog);
941     if (FAILED_UNEXPECTEDLY(hResult))
942         return hResult;
943 
944     // update history
945     if (flags & BTP_UPDATE_CUR_HISTORY)
946     {
947         if (travelLog->CountEntries(static_cast<IDropTarget *>(this)) > 0)
948             hResult = travelLog->UpdateEntry(static_cast<IDropTarget *>(this), FALSE);
949         // what to do with error? Do we want to halt browse because state save failed?
950     }
951 
952     if (fCurrentShellView)
953     {
954         fCurrentShellView->UIActivate(SVUIA_DEACTIVATE);
955     }
956 
957     // create view object
958     hResult = newShellFolder->CreateViewObject(m_hWnd, IID_PPV_ARG(IShellView, &newShellView));
959     if (FAILED_UNEXPECTEDLY(hResult))
960         return hResult;
961     previousView = fCurrentShellViewWindow;
962 
963     // enter updating section
964     saveCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
965     windowUpdateIsLocked = LockWindowUpdate(TRUE);
966     if (fCurrentShellView != NULL)
967         ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 0, 0);
968 
969     // set site
970     hResult = IUnknown_SetSite(newShellView, static_cast<IDropTarget *>(this));
971 
972     // update folder and view
973     saveCurrentShellFolder = fCurrentShellFolder;
974     saveCurrentShellView = fCurrentShellView;
975     fCurrentShellFolder = newShellFolder;
976     fCurrentShellView = newShellView;
977 
978     // get boundary
979     if (previousView != NULL)
980         ::GetWindowRect(previousView, &shellViewWindowBounds);
981     else
982         ZeroMemory(&shellViewWindowBounds, sizeof(shellViewWindowBounds));
983     ::MapWindowPoints(0, m_hWnd, reinterpret_cast<POINT *>(&shellViewWindowBounds), 2);
984 
985     // create view window
986     hResult = newShellView->CreateViewWindow(saveCurrentShellView, folderSettings,
987         this, &shellViewWindowBounds, &newShellViewWindow);
988     if (FAILED_UNEXPECTEDLY(hResult) || newShellViewWindow == NULL)
989     {
990         fCurrentShellView = saveCurrentShellView;
991         fCurrentShellFolder = saveCurrentShellFolder;
992         ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 1, 0);
993         if (windowUpdateIsLocked)
994             LockWindowUpdate(FALSE);
995         SetCursor(saveCursor);
996         return hResult;
997     }
998 
999     if (objectWithSite.p != NULL)
1000         hResult = objectWithSite->SetSite(NULL);
1001 
1002     // update current pidl
1003     ILFree(fCurrentDirectoryPIDL);
1004     fCurrentDirectoryPIDL = ILClone(absolutePIDL);
1005 
1006     // update view window
1007     if (saveCurrentShellView != NULL)
1008         saveCurrentShellView->DestroyViewWindow();
1009     fCurrentShellViewWindow = newShellViewWindow;
1010 
1011     // no use
1012     saveCurrentShellView.Release();
1013     saveCurrentShellFolder.Release();
1014 
1015     hResult = newShellView->UIActivate(SVUIA_ACTIVATE_FOCUS);
1016 
1017     // leave updating section
1018     if (windowUpdateIsLocked)
1019         LockWindowUpdate(FALSE);
1020     SetCursor(saveCursor);
1021 
1022     // update history
1023     if (flags & BTP_UPDATE_NEXT_HISTORY)
1024     {
1025         hResult = travelLog->AddEntry(static_cast<IDropTarget *>(this), FALSE);
1026         hResult = travelLog->UpdateEntry(static_cast<IDropTarget *>(this), FALSE);
1027     }
1028 
1029     // completed
1030     nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING;
1031     hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle,
1032         sizeof(newTitle) / sizeof(wchar_t), NULL);
1033     if (SUCCEEDED(hResult))
1034     {
1035         FireNavigateComplete(newTitle);
1036     }
1037     else
1038     {
1039         FireNavigateComplete(L"ERROR");
1040     }
1041 
1042     if (fCabinetState.fFullPathTitle)
1043         nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING;
1044     else
1045         nameFlags = SHGDN_FORADDRESSBAR;
1046     hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle,
1047         sizeof(newTitle) / sizeof(wchar_t), NULL);
1048     if (SUCCEEDED(hResult))
1049     {
1050         SetWindowText(newTitle);
1051 
1052         LPCITEMIDLIST pidlChild;
1053         INT index, indexOpen;
1054         HIMAGELIST himlSmall, himlLarge;
1055 
1056         CComPtr<IShellFolder> sf;
1057         hResult = SHBindToParent(absolutePIDL, IID_PPV_ARG(IShellFolder, &sf), &pidlChild);
1058         if (SUCCEEDED(hResult))
1059         {
1060             index = SHMapPIDLToSystemImageListIndex(sf, pidlChild, &indexOpen);
1061 
1062             Shell_GetImageLists(&himlLarge, &himlSmall);
1063 
1064             HICON icSmall = ImageList_GetIcon(himlSmall, indexOpen, 0);
1065             HICON icLarge = ImageList_GetIcon(himlLarge, indexOpen, 0);
1066 
1067             /* Hack to make it possible to release the old icons */
1068             /* Something seems to go wrong with WM_SETICON */
1069             HICON oldSmall = (HICON)SendMessage(WM_GETICON, ICON_SMALL, 0);
1070             HICON oldLarge = (HICON)SendMessage(WM_GETICON, ICON_BIG,   0);
1071 
1072             SendMessage(WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(icSmall));
1073             SendMessage(WM_SETICON, ICON_BIG,   reinterpret_cast<LPARAM>(icLarge));
1074 
1075             DestroyIcon(oldSmall);
1076             DestroyIcon(oldLarge);
1077         }
1078     }
1079 
1080     FireCommandStateChangeAll();
1081     hResult = UpdateForwardBackState();
1082     hResult = UpdateUpState();
1083     return S_OK;
1084 }
1085 
1086 HRESULT CShellBrowser::GetMenuBand(REFIID riid, void **shellMenu)
1087 {
1088     CComPtr<IBandSite>                      bandSite;
1089     CComPtr<IDeskBand>                      deskBand;
1090     HRESULT                                 hResult;
1091 
1092     if (!fClientBars[BIInternetToolbar].clientBar)
1093         return E_FAIL;
1094 
1095     hResult = IUnknown_QueryService(fClientBars[BIInternetToolbar].clientBar, SID_IBandSite, IID_PPV_ARG(IBandSite, &bandSite));
1096     if (FAILED_UNEXPECTEDLY(hResult))
1097         return hResult;
1098 
1099     hResult = bandSite->QueryBand(1, &deskBand, NULL, NULL, 0);
1100     if (FAILED_UNEXPECTEDLY(hResult))
1101         return hResult;
1102 
1103     return deskBand->QueryInterface(riid, shellMenu);
1104 }
1105 
1106 HRESULT CShellBrowser::GetBaseBar(bool vertical, REFIID riid, void **theBaseBar)
1107 {
1108     CComPtr<IUnknown>                       newBaseBar;
1109     CComPtr<IDeskBar>                       deskBar;
1110     CComPtr<IUnknown>                       newBaseBarSite;
1111     CComPtr<IDeskBarClient>                 deskBarClient;
1112     IUnknown                                **cache;
1113     HRESULT                                 hResult;
1114 
1115     if (vertical)
1116         cache = &fClientBars[BIVerticalBaseBar].clientBar.p;
1117     else
1118         cache = &fClientBars[BIHorizontalBaseBar].clientBar.p;
1119     if (*cache == NULL)
1120     {
1121         hResult = CBaseBar_CreateInstance(IID_PPV_ARG(IUnknown, &newBaseBar), vertical);
1122         if (FAILED_UNEXPECTEDLY(hResult))
1123             return hResult;
1124         hResult = CBaseBarSite_CreateInstance(IID_PPV_ARG(IUnknown, &newBaseBarSite), vertical);
1125         if (FAILED_UNEXPECTEDLY(hResult))
1126             return hResult;
1127 
1128         // we have to store our basebar into cache now
1129         *cache = newBaseBar;
1130         newBaseBar->AddRef();
1131 
1132         // tell the new base bar about the shell browser
1133         hResult = IUnknown_SetSite(newBaseBar, static_cast<IDropTarget *>(this));
1134         if (FAILED_UNEXPECTEDLY(hResult))
1135             return hResult;
1136 
1137         // tell the new base bar about the new base bar site
1138         hResult = newBaseBar->QueryInterface(IID_PPV_ARG(IDeskBar, &deskBar));
1139         if (FAILED_UNEXPECTEDLY(hResult))
1140             return hResult;
1141         hResult = deskBar->SetClient(newBaseBarSite);
1142         if (FAILED_UNEXPECTEDLY(hResult))
1143             return hResult;
1144 
1145         // tell the new base bar site about the new base bar
1146         hResult = newBaseBarSite->QueryInterface(IID_PPV_ARG(IDeskBarClient, &deskBarClient));
1147         if (FAILED_UNEXPECTEDLY(hResult))
1148             return hResult;
1149         hResult = deskBarClient->SetDeskBarSite(newBaseBar);
1150         if (FAILED_UNEXPECTEDLY(hResult))
1151             return hResult;
1152 
1153     }
1154     return (*cache)->QueryInterface(riid, theBaseBar);
1155 }
1156 
1157 BOOL CShellBrowser::IsBandLoaded(const CLSID clsidBand, bool vertical, DWORD *pdwBandID)
1158 {
1159     HRESULT                                 hResult;
1160     CComPtr<IDeskBar>                       deskBar;
1161     CComPtr<IUnknown>                       baseBarSite;
1162     CComPtr<IBandSite>                      bandSite;
1163     CLSID                                   clsidTmp;
1164     DWORD                                   numBands;
1165     DWORD                                   dwBandID;
1166     DWORD                                   i;
1167 
1168     /* Get our basebarsite to be able to enumerate bands */
1169     hResult = GetBaseBar(vertical, IID_PPV_ARG(IDeskBar, &deskBar));
1170     if (FAILED_UNEXPECTEDLY(hResult))
1171         return FALSE;
1172     hResult = deskBar->GetClient(&baseBarSite);
1173     if (FAILED_UNEXPECTEDLY(hResult))
1174         return FALSE;
1175     hResult = baseBarSite->QueryInterface(IID_PPV_ARG(IBandSite, &bandSite));
1176     if (FAILED_UNEXPECTEDLY(hResult))
1177         return FALSE;
1178 
1179     hResult = bandSite->EnumBands(-1, &numBands);
1180     if (FAILED_UNEXPECTEDLY(hResult))
1181         return FALSE;
1182 
1183     for(i = 0; i < numBands; i++)
1184     {
1185         CComPtr<IPersist> bandPersist;
1186 
1187         hResult = bandSite->EnumBands(i, &dwBandID);
1188         if (FAILED_UNEXPECTEDLY(hResult))
1189             return FALSE;
1190 
1191         hResult = bandSite->GetBandObject(dwBandID, IID_PPV_ARG(IPersist, &bandPersist));
1192         if (FAILED_UNEXPECTEDLY(hResult))
1193             return FALSE;
1194         hResult = bandPersist->GetClassID(&clsidTmp);
1195         if (FAILED_UNEXPECTEDLY(hResult))
1196             return FALSE;
1197         if (IsEqualGUID(clsidBand, clsidTmp))
1198         {
1199             if (pdwBandID) *pdwBandID = dwBandID;
1200             return TRUE;
1201         }
1202     }
1203     return FALSE;
1204 }
1205 
1206 HRESULT CShellBrowser::ShowBand(const CLSID &classID, bool vertical)
1207 {
1208     CComPtr<IDockingWindow>                 dockingWindow;
1209     CComPtr<IUnknown>                       baseBarSite;
1210     CComPtr<IUnknown>                       newBand;
1211     CComPtr<IDeskBar>                       deskBar;
1212     VARIANT                                 vaIn;
1213     HRESULT                                 hResult;
1214     DWORD                                   dwBandID;
1215 
1216     hResult = GetBaseBar(vertical, IID_PPV_ARG(IDeskBar, &deskBar));
1217     if (FAILED_UNEXPECTEDLY(hResult))
1218         return hResult;
1219 
1220     hResult = deskBar->GetClient(&baseBarSite);
1221     if (FAILED_UNEXPECTEDLY(hResult))
1222         return hResult;
1223 
1224     hResult = deskBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &dockingWindow));
1225     if (FAILED_UNEXPECTEDLY(hResult))
1226         return hResult;
1227 
1228     if (!IsBandLoaded(classID, vertical, &dwBandID))
1229     {
1230         TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID), vertical);
1231         if (IsEqualCLSID(CLSID_ExplorerBand, classID))
1232         {
1233             TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1234             hResult = CExplorerBand_CreateInstance(IID_PPV_ARG(IUnknown, &newBand));
1235             if (FAILED_UNEXPECTEDLY(hResult))
1236                 return hResult;
1237         }
1238         else
1239         {
1240             TRACE("A different CLSID requested, using CoCreateInstance.\n");
1241             hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IUnknown, &newBand));
1242             if (FAILED_UNEXPECTEDLY(hResult))
1243                 return hResult;
1244         }
1245     }
1246     else
1247     {
1248         CComPtr<IBandSite>                  pBandSite;
1249 
1250         hResult = baseBarSite->QueryInterface(IID_PPV_ARG(IBandSite, &pBandSite));
1251         if (!SUCCEEDED(hResult))
1252         {
1253             ERR("Can't get IBandSite interface\n");
1254             return E_FAIL;
1255         }
1256         hResult = pBandSite->GetBandObject(dwBandID, IID_PPV_ARG(IUnknown, &newBand));
1257         if (!SUCCEEDED(hResult))
1258         {
1259             ERR("Can't find band object\n");
1260             return E_FAIL;
1261         }
1262 
1263         // It's hackish, but we should be able to show the wanted band until we
1264         // find the proper way to do this (but it seems to work to add a new band)
1265         // Here we'll just re-add the existing band to the site, causing it to display.
1266     }
1267     V_VT(&vaIn) = VT_UNKNOWN;
1268     V_UNKNOWN(&vaIn) = newBand.p;
1269     hResult = IUnknown_Exec(baseBarSite, CGID_IDeskBand, 1, 1, &vaIn, NULL);
1270     if (FAILED_UNEXPECTEDLY(hResult))
1271     {
1272         return hResult;
1273     }
1274 
1275     hResult = dockingWindow->ShowDW(TRUE);
1276     if (FAILED_UNEXPECTEDLY(hResult))
1277         return hResult;
1278 
1279     return S_OK;
1280 }
1281 
1282 HRESULT CShellBrowser::NavigateToParent()
1283 {
1284     LPITEMIDLIST newDirectory = ILClone(fCurrentDirectoryPIDL);
1285     if (newDirectory == NULL)
1286         return E_OUTOFMEMORY;
1287     if (_ILIsDesktop(newDirectory))
1288     {
1289         ILFree(newDirectory);
1290         return E_INVALIDARG;
1291     }
1292     ILRemoveLastID(newDirectory);
1293     HRESULT hResult = BrowseToPIDL(newDirectory, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
1294     ILFree(newDirectory);
1295     if (FAILED_UNEXPECTEDLY(hResult))
1296         return hResult;
1297     return S_OK;
1298 }
1299 
1300 BOOL CALLBACK AddFolderOptionsPage(HPROPSHEETPAGE thePage, LPARAM lParam)
1301 {
1302     PROPSHEETHEADER* sheetInfo = reinterpret_cast<PROPSHEETHEADER*>(lParam);
1303     if (sheetInfo->nPages >= folderOptionsPageCountMax)
1304         return FALSE;
1305     sheetInfo->phpage[sheetInfo->nPages] = thePage;
1306     sheetInfo->nPages++;
1307     return TRUE;
1308 }
1309 
1310 HRESULT CShellBrowser::DoFolderOptions()
1311 {
1312     CComPtr<IShellPropSheetExt>             folderOptionsSheet;
1313     PROPSHEETHEADER                         m_PropSheet;
1314     HPROPSHEETPAGE                          m_psp[folderOptionsPageCountMax];
1315 //    CComPtr<IGlobalFolderSettings>          globalSettings;
1316 //    SHELLSTATE2                             shellState;
1317     HRESULT                                 hResult;
1318 
1319     memset(m_psp, 0, sizeof(m_psp));
1320     memset(&m_PropSheet, 0, sizeof(m_PropSheet));
1321 
1322     // create sheet object
1323     hResult = CoCreateInstance(CLSID_ShellFldSetExt, NULL, CLSCTX_INPROC_SERVER,
1324         IID_PPV_ARG(IShellPropSheetExt, &folderOptionsSheet));
1325     if (FAILED_UNEXPECTEDLY(hResult))
1326         return E_FAIL;
1327 
1328     // must set site in order for Apply to all Folders on Advanced page to be enabled
1329     hResult = IUnknown_SetSite(folderOptionsSheet, static_cast<IDispatch *>(this));
1330     m_PropSheet.phpage = m_psp;
1331 
1332 #if 0
1333     hResult = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IGlobalFolderSettings, &globalSettings));
1334     if (FAILED_UNEXPECTEDLY(hResult))
1335         return E_FAIL;
1336     hResult = globalSettings->Get(&shellState, sizeof(shellState));
1337     if (FAILED_UNEXPECTEDLY(hResult))
1338         return E_FAIL;
1339 #endif
1340 
1341     // add pages
1342     hResult = folderOptionsSheet->AddPages(AddFolderOptionsPage, reinterpret_cast<LPARAM>(&m_PropSheet));
1343     if (FAILED_UNEXPECTEDLY(hResult))
1344         return E_FAIL;
1345 
1346 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1347 //              It returns 'E_NOTIMPL'
1348 #if 0
1349     if (fCurrentShellView != NULL)
1350     {
1351         hResult = fCurrentShellView->AddPropertySheetPages(
1352             0, AddFolderOptionsPage, reinterpret_cast<LPARAM>(&m_PropSheet));
1353         if (FAILED_UNEXPECTEDLY(hResult))
1354             return E_FAIL;
1355     }
1356 #endif
1357 
1358     // show sheet
1359     m_PropSheet.dwSize = sizeof(PROPSHEETHEADER);
1360     m_PropSheet.dwFlags = 0;
1361     m_PropSheet.hwndParent = m_hWnd;
1362     m_PropSheet.hInstance = _AtlBaseModule.GetResourceInstance();
1363     m_PropSheet.pszCaption = _T("Folder Options");
1364     m_PropSheet.nStartPage = 0;
1365     PropertySheet(&m_PropSheet);
1366     return S_OK;
1367 }
1368 
1369 LRESULT CALLBACK CShellBrowser::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
1370 {
1371     CShellBrowser                           *pThis = reinterpret_cast<CShellBrowser *>(hWnd);
1372     _ATL_MSG                                msg(pThis->m_hWnd, uMsg, wParam, lParam);
1373     LRESULT                                 lResult;
1374     const _ATL_MSG                          *previousMessage;
1375     BOOL                                    handled;
1376     WNDPROC                                 saveWindowProc;
1377     HRESULT                                 hResult;
1378 
1379     hWnd = pThis->m_hWnd;
1380     previousMessage = pThis->m_pCurrentMsg;
1381     pThis->m_pCurrentMsg = &msg;
1382 
1383     /* If the shell browser is initialized, let the menu band preprocess the messages */
1384     if (pThis->fCurrentDirectoryPIDL)
1385     {
1386         CComPtr<IMenuBand> menuBand;
1387         hResult = pThis->GetMenuBand(IID_PPV_ARG(IMenuBand, &menuBand));
1388         if (SUCCEEDED(hResult) && menuBand.p != NULL)
1389         {
1390             hResult = menuBand->TranslateMenuMessage(&msg, &lResult);
1391             if (hResult == S_OK)
1392                 return lResult;
1393             uMsg = msg.message;
1394             wParam = msg.wParam;
1395             lParam = msg.lParam;
1396         }
1397         menuBand.Release();
1398     }
1399 
1400     handled = pThis->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0);
1401     ATLASSERT(pThis->m_pCurrentMsg == &msg);
1402     if (handled == FALSE)
1403     {
1404         if (uMsg == WM_NCDESTROY)
1405         {
1406             saveWindowProc = reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hWnd, GWLP_WNDPROC));
1407             lResult = pThis->DefWindowProc(uMsg, wParam, lParam);
1408             if (saveWindowProc == reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hWnd, GWLP_WNDPROC)))
1409                 ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);
1410             pThis->m_dwState |= WINSTATE_DESTROYED;
1411         }
1412         else
1413             lResult = pThis->DefWindowProc(uMsg, wParam, lParam);
1414     }
1415     pThis->m_pCurrentMsg = previousMessage;
1416     if (previousMessage == NULL && (pThis->m_dwState & WINSTATE_DESTROYED) != 0)
1417     {
1418         pThis->m_dwState &= ~WINSTATE_DESTROYED;
1419         pThis->m_hWnd = NULL;
1420         pThis->OnFinalMessage(hWnd);
1421     }
1422     return lResult;
1423 }
1424 
1425 void CShellBrowser::RepositionBars()
1426 {
1427     RECT                                    clientRect;
1428     RECT                                    statusRect;
1429     int                                     x;
1430 
1431     GetClientRect(&clientRect);
1432 
1433     if (fStatusBarVisible && fStatusBar)
1434     {
1435         ::GetWindowRect(fStatusBar, &statusRect);
1436         ::SetWindowPos(fStatusBar, NULL, clientRect.left, clientRect.bottom - (statusRect.bottom - statusRect.top),
1437                             clientRect.right - clientRect.left,
1438                             statusRect.bottom - statusRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER);
1439         clientRect.bottom -= statusRect.bottom - statusRect.top;
1440     }
1441 
1442     for (x = 0; x < 3; x++)
1443     {
1444         HWND hwnd = fClientBars[x].hwnd;
1445         RECT borderSpace = fClientBars[x].borderSpace;
1446         if (hwnd == NULL && fClientBars[x].clientBar != NULL)
1447         {
1448             IUnknown_GetWindow(fClientBars[x].clientBar, &hwnd);
1449             fClientBars[x].hwnd = hwnd;
1450         }
1451         if (hwnd != NULL)
1452         {
1453             RECT toolbarRect = clientRect;
1454             if (borderSpace.top != 0)
1455             {
1456                 toolbarRect.bottom = toolbarRect.top + borderSpace.top;
1457             }
1458             else if (borderSpace.bottom != 0)
1459             {
1460                 toolbarRect.top = toolbarRect.bottom - borderSpace.bottom;
1461             }
1462             else if (borderSpace.left != 0)
1463             {
1464                 toolbarRect.right = toolbarRect.left + borderSpace.left;
1465             }
1466             else if (borderSpace.right != 0)
1467             {
1468                 toolbarRect.left = toolbarRect.right - borderSpace.right;
1469             }
1470 
1471             ::SetWindowPos(hwnd, NULL,
1472                 toolbarRect.left,
1473                 toolbarRect.top,
1474                 toolbarRect.right - toolbarRect.left,
1475                 toolbarRect.bottom - toolbarRect.top,
1476                 SWP_NOOWNERZORDER | SWP_NOZORDER);
1477 
1478             if (borderSpace.top != 0)
1479             {
1480                 clientRect.top = toolbarRect.bottom;
1481             }
1482             else if (borderSpace.bottom != 0)
1483             {
1484                 clientRect.bottom = toolbarRect.top;
1485             }
1486             else if (borderSpace.left != 0)
1487             {
1488                 clientRect.left = toolbarRect.right;
1489             }
1490             else if (borderSpace.right != 0)
1491             {
1492                 clientRect.right = toolbarRect.left;
1493             }
1494         }
1495     }
1496     ::SetWindowPos(fCurrentShellViewWindow, NULL, clientRect.left, clientRect.top,
1497                         clientRect.right - clientRect.left,
1498                         clientRect.bottom - clientRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER);
1499 }
1500 
1501 HRESULT CShellBrowser::FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments)
1502 {
1503     DISPPARAMS                          params;
1504     CComDynamicUnkArray                 &vec = IConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents2>::m_vec;
1505     CComDynamicUnkArray                 &vec2 = IConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents>::m_vec;
1506     HRESULT                             hResult;
1507 
1508     params.rgvarg = arguments;
1509     params.rgdispidNamedArgs = NULL;
1510     params.cArgs = argCount;
1511     params.cNamedArgs = 0;
1512     IUnknown** pp = vec.begin();
1513     while (pp < vec.end())
1514     {
1515         if (*pp != NULL)
1516         {
1517             CComPtr<IDispatch>          theDispatch;
1518 
1519             hResult = (*pp)->QueryInterface(IID_PPV_ARG(IDispatch, &theDispatch));
1520             hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
1521         }
1522         pp++;
1523     }
1524     pp = vec2.begin();
1525     while (pp < vec2.end())
1526     {
1527         if (*pp != NULL)
1528         {
1529             CComPtr<IDispatch>          theDispatch;
1530 
1531             hResult = (*pp)->QueryInterface(IID_PPV_ARG(IDispatch, &theDispatch));
1532             hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
1533         }
1534         pp++;
1535     }
1536     return S_OK;
1537 }
1538 
1539 HRESULT CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory)
1540 {
1541     // these two variants intentionally to do use CComVariant because it would double free/release
1542     // or does not need to dispose at all
1543     VARIANT                             varArg[2];
1544     VARIANT                             varArgs;
1545     CComBSTR                            tempString(newDirectory);
1546 
1547     V_VT(&varArgs) = VT_BSTR;
1548     V_BSTR(&varArgs) = tempString.m_str;
1549 
1550     V_VT(&varArg[0]) = VT_VARIANT | VT_BYREF;
1551     V_VARIANTREF(&varArg[0]) = &varArgs;
1552     V_VT(&varArg[1]) = VT_DISPATCH;
1553     V_DISPATCH(&varArg[1]) = (IDispatch *)this;
1554 
1555     return FireEvent(DISPID_NAVIGATECOMPLETE2, 2, varArg);
1556 }
1557 
1558 HRESULT CShellBrowser::FireCommandStateChange(bool newState, int commandID)
1559 {
1560     VARIANT                             varArg[2];
1561 
1562     V_VT(&varArg[0]) = VT_BOOL;
1563     V_BOOL(&varArg[0]) = newState ? VARIANT_TRUE : VARIANT_FALSE;
1564     V_VT(&varArg[1]) = VT_I4;
1565     V_I4(&varArg[1]) = commandID;
1566 
1567     return FireEvent(DISPID_COMMANDSTATECHANGE, 2, varArg);
1568 }
1569 
1570 HRESULT CShellBrowser::FireCommandStateChangeAll()
1571 {
1572     return FireCommandStateChange(false, -1);
1573 }
1574 
1575 HRESULT CShellBrowser::UpdateForwardBackState()
1576 {
1577     CComPtr<ITravelLog>                     travelLog;
1578     CComPtr<ITravelEntry>                   unusedEntry;
1579     bool                                    canGoBack;
1580     bool                                    canGoForward;
1581     HRESULT                                 hResult;
1582 
1583     canGoBack = false;
1584     canGoForward = false;
1585     hResult = GetTravelLog(&travelLog);
1586     if (FAILED_UNEXPECTEDLY(hResult))
1587         return hResult;
1588     hResult = travelLog->GetTravelEntry(static_cast<IDropTarget *>(this), TLOG_BACK, &unusedEntry);
1589     if (SUCCEEDED(hResult))
1590     {
1591         canGoBack = true;
1592         unusedEntry.Release();
1593     }
1594     hResult = travelLog->GetTravelEntry(static_cast<IDropTarget *>(this), TLOG_FORE, &unusedEntry);
1595     if (SUCCEEDED(hResult))
1596     {
1597         canGoForward = true;
1598         unusedEntry.Release();
1599     }
1600     hResult = FireCommandStateChange(canGoBack, 2);
1601     hResult = FireCommandStateChange(canGoForward, 1);
1602     return S_OK;
1603 }
1604 
1605 HRESULT CShellBrowser::UpdateUpState()
1606 {
1607     bool canGoUp;
1608     HRESULT hResult;
1609 
1610     canGoUp = true;
1611     if (_ILIsDesktop(fCurrentDirectoryPIDL))
1612         canGoUp = false;
1613     hResult = FireCommandStateChange(canGoUp, 3);
1614     return S_OK;
1615 }
1616 
1617 void CShellBrowser::UpdateGotoMenu(HMENU theMenu)
1618 {
1619     CComPtr<ITravelLog>                     travelLog;
1620     CComPtr<ITravelEntry>                   unusedEntry;
1621     int                                     position;
1622     MENUITEMINFO                            menuItemInfo;
1623     HRESULT                                 hResult;
1624 
1625     DeleteMenuItems(theMenu, IDM_GOTO_TRAVEL_FIRST, IDM_GOTO_TRAVEL_LAST);
1626 
1627     position = GetMenuItemCount(theMenu);
1628     hResult = GetTravelLog(&travelLog);
1629     if (FAILED_UNEXPECTEDLY(hResult))
1630         return;
1631 
1632     hResult = travelLog->GetTravelEntry(static_cast<IDropTarget *>(this),
1633                                         TLOG_BACK,
1634                                         &unusedEntry);
1635 
1636     if (SUCCEEDED(hResult))
1637     {
1638         SHEnableMenuItem(theMenu, IDM_GOTO_BACK, TRUE);
1639         unusedEntry.Release();
1640     }
1641     else
1642         SHEnableMenuItem(theMenu, IDM_GOTO_BACK, FALSE);
1643 
1644     hResult = travelLog->GetTravelEntry(static_cast<IDropTarget *>(this),
1645                                         TLOG_FORE,
1646                                         &unusedEntry);
1647 
1648     if (SUCCEEDED(hResult))
1649     {
1650         SHEnableMenuItem(theMenu, IDM_GOTO_FORWARD, TRUE);
1651         unusedEntry.Release();
1652     }
1653     else
1654         SHEnableMenuItem(theMenu, IDM_GOTO_FORWARD, FALSE);
1655 
1656     SHEnableMenuItem(theMenu,
1657                      IDM_GOTO_UPONELEVEL,
1658                      !_ILIsDesktop(fCurrentDirectoryPIDL));
1659 
1660     hResult = travelLog->InsertMenuEntries(static_cast<IDropTarget *>(this), theMenu, position,
1661         IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, TLMENUF_BACKANDFORTH | TLMENUF_CHECKCURRENT);
1662     if (SUCCEEDED(hResult))
1663     {
1664         menuItemInfo.cbSize = sizeof(menuItemInfo);
1665         menuItemInfo.fMask = MIIM_TYPE | MIIM_ID;
1666         menuItemInfo.fType = MF_SEPARATOR;
1667         menuItemInfo.wID = IDM_GOTO_TRAVEL_SEP;
1668         InsertMenuItem(theMenu, position, TRUE, &menuItemInfo);
1669     }
1670 }
1671 
1672 void CShellBrowser::UpdateViewMenu(HMENU theMenu)
1673 {
1674     CComPtr<ITravelLog>                     travelLog;
1675     HMENU                                   gotoMenu;
1676     OLECMD                                  commandList[5];
1677     HMENU                                   toolbarMenuBar;
1678     HMENU                                   toolbarMenu;
1679     MENUITEMINFO                            menuItemInfo;
1680     HRESULT                                 hResult;
1681 
1682     gotoMenu = SHGetMenuFromID(theMenu, FCIDM_MENU_EXPLORE);
1683     if (gotoMenu != NULL)
1684         UpdateGotoMenu(gotoMenu);
1685 
1686     commandList[0].cmdID = ITID_TOOLBARBANDSHOWN;
1687     commandList[1].cmdID = ITID_ADDRESSBANDSHOWN;
1688     commandList[2].cmdID = ITID_LINKSBANDSHOWN;
1689     commandList[3].cmdID = ITID_TOOLBARLOCKED;
1690     commandList[4].cmdID = ITID_CUSTOMIZEENABLED;
1691 
1692     hResult = IUnknown_QueryStatus(fClientBars[BIInternetToolbar].clientBar,
1693                                    CGID_PrivCITCommands, 5, commandList, NULL);
1694     if (FAILED_UNEXPECTEDLY(hResult))
1695         DeleteMenu(theMenu, IDM_VIEW_TOOLBARS, MF_BYCOMMAND);
1696     else
1697     {
1698         menuItemInfo.cbSize = sizeof(menuItemInfo);
1699         menuItemInfo.fMask = MIIM_SUBMENU;
1700         GetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo);
1701         DestroyMenu(menuItemInfo.hSubMenu);
1702 
1703         toolbarMenuBar = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU));
1704         toolbarMenu = GetSubMenu(toolbarMenuBar, 0);
1705         RemoveMenu(toolbarMenuBar, 0, MF_BYPOSITION);
1706         DestroyMenu(toolbarMenuBar);
1707 
1708         // TODO: Implement
1709         SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf & OLECMDF_ENABLED);
1710         SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_ENABLED);
1711         SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_ENABLED);
1712         SHEnableMenuItem(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, commandList[4].cmdf & OLECMDF_ENABLED);
1713 
1714         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf & OLECMDF_LATCHED);
1715         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_LATCHED);
1716         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_LATCHED);
1717         SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LOCKTOOLBARS, commandList[3].cmdf & OLECMDF_LATCHED);
1718         if ((commandList[4].cmdf & OLECMDF_ENABLED) == 0)
1719             DeleteMenu(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND);
1720         DeleteMenu(toolbarMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND);
1721         DeleteMenu(toolbarMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND);
1722 
1723         menuItemInfo.cbSize = sizeof(menuItemInfo);
1724         menuItemInfo.fMask = MIIM_SUBMENU;
1725         menuItemInfo.hSubMenu = toolbarMenu;
1726         SetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo);
1727     }
1728     SHCheckMenuItem(theMenu, IDM_VIEW_STATUSBAR, fStatusBarVisible ? TRUE : FALSE);
1729 }
1730 
1731 HRESULT CShellBrowser::BuildExplorerBandMenu()
1732 {
1733     HMENU                                   hBandsMenu;
1734     UINT                                    nbFound;
1735 
1736     hBandsMenu = SHGetMenuFromID(fCurrentMenuBar, IDM_VIEW_EXPLORERBAR);
1737     if (!hBandsMenu)
1738     {
1739         OutputDebugString(L"No menu !\n");
1740         return E_FAIL;
1741     }
1742     DSA_DeleteAllItems(menuDsa);
1743     BuildExplorerBandCategory(hBandsMenu, CATID_InfoBand, 4, NULL);
1744     BuildExplorerBandCategory(hBandsMenu, CATID_CommBand, 20, &nbFound);
1745     if (!nbFound)
1746     {
1747         // Remove separator
1748         DeleteMenu(hBandsMenu, IDM_EXPLORERBAR_SEPARATOR, MF_BYCOMMAND);
1749     }
1750     // Remove media menu since XP does it (according to API Monitor)
1751     DeleteMenu(hBandsMenu, IDM_EXPLORERBAR_MEDIA, MF_BYCOMMAND);
1752     return S_OK;
1753 }
1754 
1755 HRESULT CShellBrowser::BuildExplorerBandCategory(HMENU hBandsMenu, CATID category, DWORD dwPos, UINT *nbFound)
1756 {
1757     HRESULT                                 hr;
1758     CComPtr<IEnumGUID>                      pEnumGUID;
1759     WCHAR                                   wszBandName[MAX_PATH];
1760     WCHAR                                   wszBandGUID[MAX_PATH];
1761     WCHAR                                   wRegKey[MAX_PATH];
1762     UINT                                    cBands;
1763     DWORD                                   dwRead;
1764     DWORD                                   dwDataSize;
1765     GUID                                    iter;
1766     MenuBandInfo                            mbi;
1767 
1768     mbi.fVertical = IsEqualGUID(category, CATID_InfoBand);
1769     cBands = 0;
1770     hr = SHEnumClassesOfCategories(1, &category, 0, NULL, &pEnumGUID);
1771     if (FAILED_UNEXPECTEDLY(hr))
1772     {
1773         return hr;
1774     }
1775     do
1776     {
1777         pEnumGUID->Next(1, &iter, &dwRead);
1778         if (dwRead)
1779         {
1780             // Get the band name
1781             if (IsBuiltinBand(iter))
1782                 continue;
1783             if (!StringFromGUID2(iter, wszBandGUID, MAX_PATH))
1784                 continue;
1785             StringCchPrintfW(wRegKey, MAX_PATH, L"CLSID\\%s", wszBandGUID);
1786             dwDataSize = MAX_PATH;
1787             SHGetValue(HKEY_CLASSES_ROOT, wRegKey, NULL, NULL, wszBandName, &dwDataSize);
1788 
1789             mbi.barGuid = iter;
1790             InsertMenu(hBandsMenu, dwPos + cBands, MF_BYPOSITION, IDM_EXPLORERBAND_BEGINCUSTOM + DSA_GetItemCount(menuDsa), wszBandName);
1791             DSA_AppendItem(menuDsa, &mbi);
1792             cBands++;
1793         }
1794     }
1795     while (dwRead > 0);
1796     if (nbFound)
1797         *nbFound = cBands;
1798     return S_OK;
1799 }
1800 
1801 BOOL CShellBrowser::IsBuiltinBand(CLSID &bandID)
1802 {
1803     if (IsEqualCLSID(bandID, CLSID_ExplorerBand))
1804         return TRUE;
1805     if (IsEqualCLSID(bandID, CLSID_SH_SearchBand) || IsEqualCLSID(bandID, CLSID_SearchBand))
1806         return TRUE;
1807     if (IsEqualCLSID(bandID, CLSID_IE_SearchBand) || IsEqualCLSID(bandID, CLSID_FileSearchBand))
1808         return TRUE;
1809     if (IsEqualCLSID(bandID, CLSID_SH_HistBand))
1810         return TRUE;
1811     if (IsEqualCLSID(bandID, CLSID_SH_FavBand))
1812         return TRUE;
1813     if (IsEqualCLSID(bandID, CLSID_ChannelsBand))
1814         return TRUE;
1815     return FALSE;
1816 }
1817 
1818 HRESULT CShellBrowser::OnSearch()
1819 {
1820     CComPtr<IObjectWithSite>                objectWithSite;
1821     CComPtr<IContextMenu>                   contextMenu;
1822     CMINVOKECOMMANDINFO                     commandInfo;
1823     const char                              *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
1824     HRESULT                                 hResult;
1825 
1826     // TODO: Query shell if this command is enabled first
1827 
1828     memset(&commandInfo, 0, sizeof(commandInfo));
1829     commandInfo.cbSize = sizeof(commandInfo);
1830     commandInfo.hwnd = m_hWnd;
1831     commandInfo.lpParameters = searchGUID;
1832     commandInfo.nShow = SW_SHOWNORMAL;
1833 
1834     hResult = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
1835         IID_PPV_ARG(IContextMenu, &contextMenu));
1836     if (FAILED_UNEXPECTEDLY(hResult))
1837         return 0;
1838     hResult = contextMenu->QueryInterface(IID_PPV_ARG(IObjectWithSite, &objectWithSite));
1839     if (FAILED_UNEXPECTEDLY(hResult))
1840         return 0;
1841     hResult = objectWithSite->SetSite(dynamic_cast<IShellBrowser*>(this));
1842     if (FAILED_UNEXPECTEDLY(hResult))
1843         return 0;
1844     hResult = contextMenu->InvokeCommand(&commandInfo);
1845     hResult = objectWithSite->SetSite(NULL);
1846     return hResult;
1847 }
1848 
1849 bool IUnknownIsEqual(IUnknown *int1, IUnknown *int2)
1850 {
1851     CComPtr<IUnknown>                       int1Retry;
1852     CComPtr<IUnknown>                       int2Retry;
1853     HRESULT                                 hResult;
1854 
1855     if (int1 == int2)
1856         return true;
1857     if (int1 == NULL || int2 == NULL)
1858         return false;
1859     hResult = int1->QueryInterface(IID_PPV_ARG(IUnknown, &int1Retry));
1860     if (FAILED_UNEXPECTEDLY(hResult))
1861         return false;
1862     hResult = int2->QueryInterface(IID_PPV_ARG(IUnknown, &int2Retry));
1863     if (FAILED_UNEXPECTEDLY(hResult))
1864         return false;
1865     if (int1Retry == int2Retry)
1866         return true;
1867     return false;
1868 }
1869 
1870 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBorderDW(IUnknown *punkObj, LPRECT prcBorder)
1871 {
1872     static const INT excludeItems[] = { 1, 1, 1, 0xa001, 0, 0 };
1873 
1874     RECT availableBounds;
1875 
1876     GetEffectiveClientRect(m_hWnd, &availableBounds, excludeItems);
1877     for (INT x = 0; x < 3; x++)
1878     {
1879         if (fClientBars[x].clientBar.p != NULL && !IUnknownIsEqual(fClientBars[x].clientBar, punkObj))
1880         {
1881             availableBounds.top += fClientBars[x].borderSpace.top;
1882             availableBounds.left += fClientBars[x].borderSpace.left;
1883             availableBounds.bottom -= fClientBars[x].borderSpace.bottom;
1884             availableBounds.right -= fClientBars[x].borderSpace.right;
1885         }
1886     }
1887     *prcBorder = availableBounds;
1888     return S_OK;
1889 }
1890 
1891 HRESULT STDMETHODCALLTYPE CShellBrowser::RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw)
1892 {
1893     return S_OK;
1894 }
1895 
1896 HRESULT STDMETHODCALLTYPE CShellBrowser::SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw)
1897 {
1898     for (INT x = 0; x < 3; x++)
1899     {
1900         if (IUnknownIsEqual(fClientBars[x].clientBar, punkObj))
1901         {
1902             fClientBars[x].borderSpace = *pbw;
1903             // if this bar changed size, it cascades and forces all subsequent bars to resize
1904             RepositionBars();
1905             return S_OK;
1906         }
1907     }
1908     return E_INVALIDARG;
1909 }
1910 
1911 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatus(const GUID *pguidCmdGroup,
1912     ULONG cCmds, OLECMD prgCmds[  ], OLECMDTEXT *pCmdText)
1913 {
1914     CComPtr<IOleCommandTarget>              commandTarget;
1915     HRESULT                                 hResult;
1916 
1917     if (prgCmds == NULL)
1918         return E_INVALIDARG;
1919     if (pguidCmdGroup == NULL)
1920     {
1921         if (fCurrentShellView.p != NULL)
1922         {
1923             hResult = fCurrentShellView->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &commandTarget));
1924             if (SUCCEEDED(hResult) && commandTarget.p != NULL)
1925                 return commandTarget->QueryStatus(NULL, 1, prgCmds, pCmdText);
1926         }
1927         while (cCmds != 0)
1928         {
1929             prgCmds->cmdf = 0;
1930             prgCmds++;
1931             cCmds--;
1932         }
1933     }
1934     else if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
1935     {
1936         while (cCmds != 0)
1937         {
1938             switch (prgCmds->cmdID)
1939             {
1940                 case 0x1c:  // search
1941                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
1942                     break;
1943                 case 0x1d:  // history
1944                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
1945                     break;
1946                 case 0x1e:  // favorites
1947                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
1948                     break;
1949                 case 0x23:  // folders
1950                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED | OLECMDF_LATCHED;
1951                     break;
1952                 default:
1953                     prgCmds->cmdf = 0;
1954                     break;
1955             }
1956             prgCmds++;
1957             cCmds--;
1958         }
1959     }
1960     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser))
1961     {
1962         while (cCmds != 0)
1963         {
1964             switch (prgCmds->cmdID)
1965             {
1966                 case 0xa022:    // up level
1967                     prgCmds->cmdf = OLECMDF_SUPPORTED;
1968                     if (fCurrentDirectoryPIDL->mkid.cb != 0)
1969                         prgCmds->cmdf |= OLECMDF_ENABLED;
1970                     break;
1971             }
1972             prgCmds++;
1973             cCmds--;
1974         }
1975     }
1976     return S_OK;
1977 }
1978 
1979 HRESULT STDMETHODCALLTYPE CShellBrowser::Exec(const GUID *pguidCmdGroup, DWORD nCmdID,
1980     DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
1981 {
1982     HRESULT                                 hResult;
1983 
1984     if (!pguidCmdGroup)
1985     {
1986         TRACE("Unhandled null CGID %d %d %p %p\n", nCmdID, nCmdexecopt, pvaIn, pvaOut);
1987         return E_NOTIMPL;
1988     }
1989     if (IsEqualIID(*pguidCmdGroup, CGID_Explorer))
1990     {
1991         switch (nCmdID)
1992         {
1993             case 0x23:
1994                 hResult = ShowBand(CLSID_ExplorerBand, true);
1995                 return S_OK;
1996             case 0x27:
1997                 if (nCmdexecopt == 1)
1998                 {
1999                     // pvaIn is a VT_UNKNOWN with a band that is being hidden
2000                 }
2001                 else
2002                 {
2003                     // update zones part of the status bar
2004                 }
2005                 return S_OK;
2006             case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
2007                 V_VT(pvaOut) = VT_INT_PTR;
2008                 V_INTREF(pvaOut) = reinterpret_cast<INT *>(
2009                     LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU)));
2010                 return S_OK;
2011             case 0x38:
2012                 // indicate if this cabinet was opened as a browser
2013                 return S_FALSE;
2014             default:
2015                 return E_NOTIMPL;
2016         }
2017     }
2018     else if (IsEqualIID(*pguidCmdGroup, CGID_InternetButtons))
2019     {
2020         switch (nCmdID)
2021         {
2022             case 0x23:
2023                 // placeholder
2024                 return S_OK;
2025         }
2026     }
2027     else if (IsEqualIID(*pguidCmdGroup, CGID_Theater))
2028     {
2029         switch (nCmdID)
2030         {
2031             case 6:
2032                 // what is theater mode and why do we receive this?
2033                 return E_NOTIMPL;
2034         }
2035     }
2036     else if (IsEqualIID(*pguidCmdGroup, CGID_MenuBand))
2037     {
2038         switch (nCmdID)
2039         {
2040             case 14:
2041                 // initialize favorites menu
2042                 return S_OK;
2043         }
2044     }
2045     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellDocView))
2046     {
2047         switch (nCmdID)
2048         {
2049             case 0x12:
2050                 // refresh on toolbar clicked
2051                 return S_OK;
2052             case 0x26:
2053                 // called for unknown bands ?
2054                 return S_OK;
2055             case 0x4d:
2056                 // tell the view if it should hide the task pane or not
2057                 return (fClientBars[BIVerticalBaseBar].clientBar.p == NULL) ? S_FALSE : S_OK;
2058         }
2059     }
2060     else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser))
2061     {
2062         switch (nCmdID)
2063         {
2064             case 40994:
2065                 return NavigateToParent();
2066         }
2067     }
2068     else if (IsEqualIID(*pguidCmdGroup, CGID_IExplorerToolbar))
2069     {
2070         switch (nCmdID)
2071         {
2072             case 0x7063:
2073                 return DoFolderOptions();
2074         }
2075     }
2076     else if (IsEqualIID(*pguidCmdGroup, CGID_DefView))
2077     {
2078         switch (nCmdID)
2079         {
2080             case 1:
2081                 // Reset All Folders option in Folder Options
2082                 break;
2083         }
2084     }
2085     else if (IsEqualIID(*pguidCmdGroup, CLSID_CommonButtons))
2086     {
2087         // Windows seems to use this as proxy for toolbar buttons.
2088         // We use it for search band for now to remove code duplication,
2089         // let's see if it could be useful in the future.
2090         switch (nCmdID)
2091         {
2092             case 0x123:
2093                 // Show search band from toolbar
2094                 OnSearch();
2095                 return S_OK;
2096         }
2097         return E_NOTIMPL;
2098     }
2099     else
2100     {
2101         return E_NOTIMPL;
2102     }
2103     return E_NOTIMPL;
2104 }
2105 
2106 HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindow(HWND *lphwnd)
2107 {
2108     if (lphwnd == NULL)
2109         return E_POINTER;
2110     *lphwnd = m_hWnd;
2111     return S_OK;
2112 }
2113 
2114 HRESULT STDMETHODCALLTYPE CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode)
2115 {
2116     return E_NOTIMPL;
2117 }
2118 
2119 HRESULT STDMETHODCALLTYPE CShellBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
2120 {
2121     HMENU mainMenu = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU));
2122 
2123     Shell_MergeMenus(hmenuShared, mainMenu, 0, 0, FCIDM_BROWSERLAST, MM_SUBMENUSHAVEIDS);
2124 
2125     int GCCU(itemCount3) = GetMenuItemCount(hmenuShared);
2126     Unused(itemCount3);
2127 
2128     DestroyMenu(mainMenu);
2129 
2130     lpMenuWidths->width[0] = 2;
2131     lpMenuWidths->width[2] = 3;
2132     lpMenuWidths->width[4] = 1;
2133     return S_OK;
2134 }
2135 
2136 HRESULT STDMETHODCALLTYPE CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject)
2137 {
2138     CComPtr<IShellMenu>                     shellMenu;
2139     HRESULT                                 hResult;
2140 
2141     if (hmenuShared && IsMenu(hmenuShared) == FALSE)
2142         return E_FAIL;
2143     hResult = GetMenuBand(IID_PPV_ARG(IShellMenu, &shellMenu));
2144     if (FAILED_UNEXPECTEDLY(hResult))
2145         return hResult;
2146 
2147     if (!hmenuShared)
2148     {
2149         hmenuShared = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU));
2150     }
2151     // FIXME: Figure out the proper way to do this.
2152     HMENU hMenuFavs = GetSubMenu(hmenuShared, 3);
2153     if (hMenuFavs)
2154     {
2155         DeleteMenu(hMenuFavs, IDM_FAVORITES_EMPTY, MF_BYCOMMAND);
2156     }
2157 
2158     hResult = shellMenu->SetMenu(hmenuShared, m_hWnd, SMSET_DONTOWN);
2159     if (FAILED_UNEXPECTEDLY(hResult))
2160         return hResult;
2161     fCurrentMenuBar = hmenuShared;
2162     BuildExplorerBandMenu();
2163     return S_OK;
2164 }
2165 
2166 HRESULT STDMETHODCALLTYPE CShellBrowser::RemoveMenusSB(HMENU hmenuShared)
2167 {
2168     if (hmenuShared == fCurrentMenuBar)
2169     {
2170         //DestroyMenu(fCurrentMenuBar);
2171         SetMenuSB(NULL, NULL, NULL);
2172     }
2173     return S_OK;
2174 }
2175 
2176 HRESULT STDMETHODCALLTYPE CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText)
2177 {
2178     //
2179     if (pszStatusText)
2180     {
2181         ::SetWindowText(fStatusBar, pszStatusText);
2182     }
2183     else
2184     {
2185 
2186     }
2187     return S_OK;
2188 }
2189 
2190 HRESULT STDMETHODCALLTYPE CShellBrowser::EnableModelessSB(BOOL fEnable)
2191 {
2192     return E_NOTIMPL;
2193 }
2194 
2195 HRESULT STDMETHODCALLTYPE CShellBrowser::TranslateAcceleratorSB(MSG *pmsg, WORD wID)
2196 {
2197     if (!::TranslateAcceleratorW(m_hWnd, m_hAccel, pmsg))
2198         return S_FALSE;
2199     return S_OK;
2200 }
2201 
2202 HRESULT STDMETHODCALLTYPE CShellBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags)
2203 {
2204     if ((wFlags & SBSP_EXPLOREMODE) != NULL)
2205         ShowBand(CLSID_ExplorerBand, true);
2206 
2207     return BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
2208 }
2209 
2210 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)
2211 {
2212     return E_NOTIMPL;
2213 }
2214 
2215 HRESULT STDMETHODCALLTYPE CShellBrowser::GetControlWindow(UINT id, HWND *lphwnd)
2216 {
2217     if (lphwnd == NULL)
2218         return E_POINTER;
2219     *lphwnd = NULL;
2220     switch (id)
2221     {
2222         case FCW_TOOLBAR:
2223             *lphwnd = fToolbarProxy.m_hWnd;
2224             return S_OK;
2225         case FCW_STATUS:
2226             *lphwnd = fStatusBar;
2227             return S_OK;
2228         case FCW_TREE:
2229             // find the directory browser and return it
2230             // this should be used only to determine if a tree is present
2231             return S_OK;
2232         case FCW_PROGRESS:
2233             // is this a progress dialog?
2234             return S_OK;
2235     }
2236     return S_OK;
2237 }
2238 
2239 HRESULT STDMETHODCALLTYPE CShellBrowser::SendControlMsg(
2240     UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret)
2241 {
2242     LPARAM                                  result;
2243 
2244     if (pret != NULL)
2245         *pret = 0;
2246     switch (id)
2247     {
2248         case FCW_TOOLBAR:
2249             result = fToolbarProxy.SendMessage(uMsg, wParam, lParam);
2250             if (pret != NULL)
2251                 *pret = result;
2252             break;
2253         case FCW_STATUS:
2254             result = SendMessage(fStatusBar, uMsg, wParam, lParam);
2255             if (pret != NULL)
2256                 *pret = result;
2257             break;
2258     }
2259     return S_OK;
2260 }
2261 
2262 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryActiveShellView(IShellView **ppshv)
2263 {
2264     if (ppshv == NULL)
2265         return E_POINTER;
2266     *ppshv = fCurrentShellView;
2267     if (fCurrentShellView.p != NULL)
2268         fCurrentShellView.p->AddRef();
2269     return S_OK;
2270 }
2271 
2272 HRESULT STDMETHODCALLTYPE CShellBrowser::OnViewWindowActive(IShellView *ppshv)
2273 {
2274     return E_NOTIMPL;
2275 }
2276 
2277 HRESULT STDMETHODCALLTYPE CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags)
2278 {
2279     return E_NOTIMPL;
2280 }
2281 
2282 HRESULT STDMETHODCALLTYPE CShellBrowser::DragEnter(
2283     IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
2284 {
2285     return E_NOTIMPL;
2286 }
2287 
2288 HRESULT STDMETHODCALLTYPE CShellBrowser::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
2289 {
2290     return E_NOTIMPL;
2291 }
2292 
2293 HRESULT STDMETHODCALLTYPE CShellBrowser::DragLeave()
2294 {
2295     return E_NOTIMPL;
2296 }
2297 
2298 HRESULT STDMETHODCALLTYPE CShellBrowser::Drop(
2299     IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
2300 {
2301     return E_NOTIMPL;
2302 }
2303 
2304 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
2305 {
2306     // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2307     // the returned interface has a method GetPropertyBag on it
2308     if (IsEqualIID(guidService, SID_STopLevelBrowser))
2309         return this->QueryInterface(riid, ppvObject);
2310     if (IsEqualIID(guidService, SID_SShellBrowser))
2311         return this->QueryInterface(riid, ppvObject);
2312     if (IsEqualIID(guidService, SID_ITargetFrame2))
2313         return this->QueryInterface(riid, ppvObject);
2314     if (IsEqualIID(guidService, SID_IWebBrowserApp))        // without this, the internet toolbar won't reflect notifications
2315         return this->QueryInterface(riid, ppvObject);
2316     if (IsEqualIID(guidService, SID_SProxyBrowser))
2317         return this->QueryInterface(riid, ppvObject);
2318     if (IsEqualIID(guidService, SID_IExplorerToolbar))
2319         return fClientBars[BIInternetToolbar].clientBar->QueryInterface(riid, ppvObject);
2320     if (IsEqualIID(riid, IID_IShellBrowser))
2321         return this->QueryInterface(riid, ppvObject);
2322     return E_NOINTERFACE;
2323 }
2324 
2325 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPropertyBag(long flags, REFIID riid, void **ppvObject)
2326 {
2327     if (ppvObject == NULL)
2328         return E_POINTER;
2329     *ppvObject = NULL;
2330     return E_NOTIMPL;
2331 }
2332 
2333 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfoCount(UINT *pctinfo)
2334 {
2335     return E_NOTIMPL;
2336 }
2337 
2338 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
2339 {
2340     return E_NOTIMPL;
2341 }
2342 
2343 HRESULT STDMETHODCALLTYPE CShellBrowser::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames,
2344     UINT cNames, LCID lcid, DISPID *rgDispId)
2345 {
2346     return E_NOTIMPL;
2347 }
2348 
2349 HRESULT STDMETHODCALLTYPE CShellBrowser::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
2350     WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
2351 {
2352     return E_NOTIMPL;
2353 }
2354 
2355 HRESULT STDMETHODCALLTYPE CShellBrowser::GetParentSite(IOleInPlaceSite **ppipsite)
2356 {
2357     return E_NOTIMPL;
2358 }
2359 
2360 HRESULT STDMETHODCALLTYPE CShellBrowser::SetTitle(IShellView *psv, LPCWSTR pszName)
2361 {
2362     return E_NOTIMPL;
2363 }
2364 
2365 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName)
2366 {
2367     return E_NOTIMPL;
2368 }
2369 
2370 HRESULT STDMETHODCALLTYPE CShellBrowser::GetOleObject(IOleObject **ppobjv)
2371 {
2372     return E_NOTIMPL;
2373 }
2374 
2375 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTravelLog(ITravelLog **pptl)
2376 {
2377     HRESULT                                 hResult;
2378 
2379     // called by toolbar when displaying tooltips
2380     if (pptl == NULL)
2381         return E_FAIL;
2382 
2383     *pptl = NULL;
2384     if (fTravelLog.p == NULL)
2385     {
2386         hResult = CTravelLog_CreateInstance(IID_PPV_ARG(ITravelLog, &fTravelLog));
2387         if (FAILED_UNEXPECTEDLY(hResult))
2388             return hResult;
2389     }
2390     *pptl = fTravelLog.p;
2391     fTravelLog.p->AddRef();
2392     return S_OK;
2393 }
2394 
2395 HRESULT STDMETHODCALLTYPE CShellBrowser::ShowControlWindow(UINT id, BOOL fShow)
2396 {
2397     return E_NOTIMPL;
2398 }
2399 
2400 HRESULT STDMETHODCALLTYPE CShellBrowser::IsControlWindowShown(UINT id, BOOL *pfShown)
2401 {
2402     return E_NOTIMPL;
2403 }
2404 
2405 HRESULT STDMETHODCALLTYPE CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags)
2406 {
2407     return E_NOTIMPL;
2408 }
2409 
2410 HRESULT STDMETHODCALLTYPE CShellBrowser::IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPITEMIDLIST *ppidlOut)
2411 {
2412     return E_NOTIMPL;
2413 }
2414 
2415 HRESULT STDMETHODCALLTYPE CShellBrowser::DisplayParseError(HRESULT hres, LPCWSTR pwszPath)
2416 {
2417     return E_NOTIMPL;
2418 }
2419 
2420 HRESULT STDMETHODCALLTYPE CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF)
2421 {
2422     return E_NOTIMPL;
2423 }
2424 
2425 HRESULT STDMETHODCALLTYPE CShellBrowser::SetNavigateState(BNSTATE bnstate)
2426 {
2427     return E_NOTIMPL;
2428 }
2429 
2430 HRESULT STDMETHODCALLTYPE CShellBrowser::GetNavigateState(BNSTATE *pbnstate)
2431 {
2432     return E_NOTIMPL;
2433 }
2434 
2435 HRESULT STDMETHODCALLTYPE CShellBrowser::NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse)
2436 {
2437     return E_NOTIMPL;
2438 }
2439 
2440 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateWindowList()
2441 {
2442     return E_NOTIMPL;
2443 }
2444 
2445 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateBackForwardState()
2446 {
2447     return E_NOTIMPL;
2448 }
2449 
2450 HRESULT STDMETHODCALLTYPE CShellBrowser::SetFlags(DWORD dwFlags, DWORD dwFlagMask)
2451 {
2452     return E_NOTIMPL;
2453 }
2454 
2455 HRESULT STDMETHODCALLTYPE CShellBrowser::GetFlags(DWORD *pdwFlags)
2456 {
2457     return E_NOTIMPL;
2458 }
2459 
2460 HRESULT STDMETHODCALLTYPE CShellBrowser::CanNavigateNow()
2461 {
2462     return E_NOTIMPL;
2463 }
2464 
2465 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPidl(LPITEMIDLIST *ppidl)
2466 {
2467     // called by explorer bar to get current pidl
2468     if (ppidl == NULL)
2469         return E_POINTER;
2470     *ppidl = ILClone(fCurrentDirectoryPIDL);
2471     return S_OK;
2472 }
2473 
2474 HRESULT STDMETHODCALLTYPE CShellBrowser::SetReferrer(LPCITEMIDLIST pidl)
2475 {
2476     return E_NOTIMPL;
2477 }
2478 
2479 DWORD STDMETHODCALLTYPE CShellBrowser::GetBrowserIndex()
2480 {
2481     return -1;
2482 }
2483 
2484 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBrowserByIndex(DWORD dwID, IUnknown **ppunk)
2485 {
2486     return E_NOTIMPL;
2487 }
2488 
2489 HRESULT STDMETHODCALLTYPE CShellBrowser::GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc)
2490 {
2491     if (ppole == NULL || pstm == NULL || ppbc == NULL)
2492         return E_INVALIDARG;
2493     *ppole = fHistoryObject;
2494     if (fHistoryObject != NULL)
2495         fHistoryObject->AddRef();
2496     *pstm = fHistoryStream;
2497     if (fHistoryStream != NULL)
2498         fHistoryStream->AddRef();
2499     *ppbc = fHistoryBindContext;
2500     if (fHistoryBindContext != NULL)
2501         fHistoryBindContext->AddRef();
2502     fHistoryObject = NULL;
2503     fHistoryStream = NULL;
2504     fHistoryBindContext = NULL;
2505     if (*ppole == NULL)
2506         return E_FAIL;
2507     return S_OK;
2508 }
2509 
2510 HRESULT STDMETHODCALLTYPE CShellBrowser::SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor)
2511 {
2512     return E_NOTIMPL;
2513 }
2514 
2515 HRESULT STDMETHODCALLTYPE CShellBrowser::CacheOLEServer(IOleObject *pole)
2516 {
2517     return E_NOTIMPL;
2518 }
2519 
2520 HRESULT STDMETHODCALLTYPE CShellBrowser::GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut)
2521 {
2522     return E_NOTIMPL;
2523 }
2524 
2525 HRESULT STDMETHODCALLTYPE CShellBrowser::OnHttpEquiv(
2526     IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut)
2527 {
2528     return E_NOTIMPL;
2529 }
2530 
2531 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPalette(HPALETTE *hpal)
2532 {
2533     return E_NOTIMPL;
2534 }
2535 
2536 HRESULT STDMETHODCALLTYPE CShellBrowser::RegisterWindow(BOOL fForceRegister, int swc)
2537 {
2538     return E_NOTIMPL;
2539 }
2540 
2541 LRESULT STDMETHODCALLTYPE CShellBrowser::WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
2542 {
2543     return E_NOTIMPL;
2544 }
2545 
2546 HRESULT STDMETHODCALLTYPE CShellBrowser::SetAsDefFolderSettings()
2547 {
2548     return E_NOTIMPL;
2549 }
2550 
2551 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewRect(RECT *prc)
2552 {
2553     return E_NOTIMPL;
2554 }
2555 
2556 HRESULT STDMETHODCALLTYPE CShellBrowser::OnSize(WPARAM wParam)
2557 {
2558     return E_NOTIMPL;
2559 }
2560 
2561 HRESULT STDMETHODCALLTYPE CShellBrowser::OnCreate(struct tagCREATESTRUCTW *pcs)
2562 {
2563     m_hAccel = LoadAcceleratorsW(GetModuleHandle(L"browseui.dll"), MAKEINTRESOURCEW(256));
2564     return S_OK;
2565 }
2566 
2567 LRESULT STDMETHODCALLTYPE CShellBrowser::OnCommand(WPARAM wParam, LPARAM lParam)
2568 {
2569     return 0;
2570 }
2571 
2572 HRESULT STDMETHODCALLTYPE CShellBrowser::OnDestroy()
2573 {
2574     return E_NOTIMPL;
2575 }
2576 
2577 LRESULT STDMETHODCALLTYPE CShellBrowser::OnNotify(struct tagNMHDR *pnm)
2578 {
2579     return 0;
2580 }
2581 
2582 HRESULT STDMETHODCALLTYPE CShellBrowser::OnSetFocus()
2583 {
2584     return E_NOTIMPL;
2585 }
2586 
2587 HRESULT STDMETHODCALLTYPE CShellBrowser::OnFrameWindowActivateBS(BOOL fActive)
2588 {
2589     return E_NOTIMPL;
2590 }
2591 
2592 HRESULT STDMETHODCALLTYPE CShellBrowser::ReleaseShellView()
2593 {
2594     return E_NOTIMPL;
2595 }
2596 
2597 HRESULT STDMETHODCALLTYPE CShellBrowser::ActivatePendingView()
2598 {
2599     return E_NOTIMPL;
2600 }
2601 
2602 HRESULT STDMETHODCALLTYPE CShellBrowser::CreateViewWindow(
2603     IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd)
2604 {
2605     return E_NOTIMPL;
2606 }
2607 
2608 HRESULT STDMETHODCALLTYPE CShellBrowser::CreateBrowserPropSheetExt(REFIID riid, void **ppv)
2609 {
2610     return E_NOTIMPL;
2611 }
2612 
2613 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewWindow(HWND *phwndView)
2614 {
2615     return E_NOTIMPL;
2616 }
2617 
2618 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd)
2619 {
2620     return E_NOTIMPL;
2621 }
2622 
2623 LPBASEBROWSERDATA STDMETHODCALLTYPE CShellBrowser::PutBaseBrowserData()
2624 {
2625     return NULL;
2626 }
2627 
2628 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTravelLog(ITravelLog *ptl, DWORD dw)
2629 {
2630     return E_NOTIMPL;
2631 }
2632 
2633 HRESULT STDMETHODCALLTYPE CShellBrowser::SetTopBrowser()
2634 {
2635     return E_NOTIMPL;
2636 }
2637 
2638 HRESULT STDMETHODCALLTYPE CShellBrowser::Offline(int iCmd)
2639 {
2640     return E_NOTIMPL;
2641 }
2642 
2643 HRESULT STDMETHODCALLTYPE CShellBrowser::AllowViewResize(BOOL f)
2644 {
2645     return E_NOTIMPL;
2646 }
2647 
2648 HRESULT STDMETHODCALLTYPE CShellBrowser::SetActivateState(UINT u)
2649 {
2650     return E_NOTIMPL;
2651 }
2652 
2653 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateSecureLockIcon(int eSecureLock)
2654 {
2655     return E_NOTIMPL;
2656 }
2657 
2658 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeDownloadManager()
2659 {
2660     return E_NOTIMPL;
2661 }
2662 
2663 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTransitionSite()
2664 {
2665     return E_NOTIMPL;
2666 }
2667 
2668 HRESULT STDMETHODCALLTYPE CShellBrowser::_Initialize(HWND hwnd, IUnknown *pauto)
2669 {
2670     return E_NOTIMPL;
2671 }
2672 
2673 HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingNavigationAsync()
2674 {
2675     return E_NOTIMPL;
2676 }
2677 
2678 HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingView()
2679 {
2680     return E_NOTIMPL;
2681 }
2682 
2683 HRESULT STDMETHODCALLTYPE CShellBrowser::_MaySaveChanges()
2684 {
2685     return E_NOTIMPL;
2686 }
2687 
2688 HRESULT STDMETHODCALLTYPE CShellBrowser::_PauseOrResumeView(BOOL fPaused)
2689 {
2690     return E_NOTIMPL;
2691 }
2692 
2693 HRESULT STDMETHODCALLTYPE CShellBrowser::_DisableModeless()
2694 {
2695     return E_NOTIMPL;
2696 }
2697 
2698 HRESULT STDMETHODCALLTYPE CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags)
2699 {
2700     return E_NOTIMPL;
2701 }
2702 
2703 HRESULT STDMETHODCALLTYPE CShellBrowser::_TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew)
2704 {
2705     return E_NOTIMPL;
2706 }
2707 
2708 HRESULT STDMETHODCALLTYPE CShellBrowser::_SwitchActivationNow()
2709 {
2710     return E_NOTIMPL;
2711 }
2712 
2713 HRESULT STDMETHODCALLTYPE CShellBrowser::_ExecChildren(IUnknown *punkBar, BOOL fBroadcast,
2714     const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut)
2715 {
2716     return E_NOTIMPL;
2717 }
2718 
2719 HRESULT STDMETHODCALLTYPE CShellBrowser::_SendChildren(
2720     HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam)
2721 {
2722     return E_NOTIMPL;
2723 }
2724 
2725 HRESULT STDMETHODCALLTYPE CShellBrowser::GetFolderSetData(struct tagFolderSetData *pfsd)
2726 {
2727     return E_NOTIMPL;
2728 }
2729 
2730 HRESULT STDMETHODCALLTYPE CShellBrowser::_OnFocusChange(UINT itb)
2731 {
2732     return E_NOTIMPL;
2733 }
2734 
2735 HRESULT STDMETHODCALLTYPE CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly)
2736 {
2737     return E_NOTIMPL;
2738 }
2739 
2740 UINT STDMETHODCALLTYPE CShellBrowser::_get_itbLastFocus()
2741 {
2742     return 0;
2743 }
2744 
2745 HRESULT STDMETHODCALLTYPE CShellBrowser::_put_itbLastFocus(UINT itbLastFocus)
2746 {
2747     return E_NOTIMPL;
2748 }
2749 
2750 HRESULT STDMETHODCALLTYPE CShellBrowser::_UIActivateView(UINT uState)
2751 {
2752     return E_NOTIMPL;
2753 }
2754 
2755 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetViewBorderRect(RECT *prc)
2756 {
2757     return E_NOTIMPL;
2758 }
2759 
2760 HRESULT STDMETHODCALLTYPE CShellBrowser::_UpdateViewRectSize()
2761 {
2762     return E_NOTIMPL;
2763 }
2764 
2765 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorder(UINT itb)
2766 {
2767     return E_NOTIMPL;
2768 }
2769 
2770 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeView()
2771 {
2772     return E_NOTIMPL;
2773 }
2774 
2775 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon)
2776 {
2777     return E_NOTIMPL;
2778 }
2779 
2780 IStream *STDMETHODCALLTYPE CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName)
2781 {
2782     return NULL;
2783 }
2784 
2785 LRESULT STDMETHODCALLTYPE CShellBrowser::ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
2786 {
2787     return 0;
2788 }
2789 
2790 HRESULT STDMETHODCALLTYPE CShellBrowser::SetAcceleratorMenu(HACCEL hacc)
2791 {
2792     return E_NOTIMPL;
2793 }
2794 
2795 int STDMETHODCALLTYPE CShellBrowser::_GetToolbarCount()
2796 {
2797     return 0;
2798 }
2799 
2800 LPTOOLBARITEM STDMETHODCALLTYPE CShellBrowser::_GetToolbarItem(int itb)
2801 {
2802     return NULL;
2803 }
2804 
2805 HRESULT STDMETHODCALLTYPE CShellBrowser::_SaveToolbars(IStream *pstm)
2806 {
2807     return E_NOTIMPL;
2808 }
2809 
2810 HRESULT STDMETHODCALLTYPE CShellBrowser::_LoadToolbars(IStream *pstm)
2811 {
2812     return E_NOTIMPL;
2813 }
2814 
2815 HRESULT STDMETHODCALLTYPE CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose)
2816 {
2817     return E_NOTIMPL;
2818 }
2819 
2820 HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayGetNextToolbarFocus(
2821     LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd)
2822 {
2823     return E_NOTIMPL;
2824 }
2825 
2826 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor)
2827 {
2828     return E_NOTIMPL;
2829 }
2830 
2831 UINT STDMETHODCALLTYPE CShellBrowser::_FindTBar(IUnknown *punkSrc)
2832 {
2833     return 0;
2834 }
2835 
2836 HRESULT STDMETHODCALLTYPE CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg)
2837 {
2838     return E_NOTIMPL;
2839 }
2840 
2841 HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayTranslateAccelerator(MSG *pmsg)
2842 {
2843     for (int i = 0; i < 3; i++)
2844     {
2845         if (IUnknown_TranslateAcceleratorIO(fClientBars[i].clientBar, pmsg) == S_OK)
2846             return S_OK;
2847     }
2848 
2849     if (!fCurrentShellView)
2850         return S_FALSE;
2851 
2852     return fCurrentShellView->TranslateAcceleratorW(pmsg);
2853 }
2854 
2855 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor)
2856 {
2857     return E_NOTIMPL;
2858 }
2859 
2860 HRESULT STDMETHODCALLTYPE CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl)
2861 {
2862     return E_NOTIMPL;
2863 }
2864 
2865 HRESULT STDMETHODCALLTYPE CShellBrowser::GoBack()
2866 {
2867     CComPtr<ITravelLog> travelLog;
2868     HRESULT hResult = GetTravelLog(&travelLog);
2869     if (FAILED_UNEXPECTEDLY(hResult))
2870         return hResult;
2871     return travelLog->Travel(static_cast<IDropTarget *>(this), TLOG_BACK);
2872 }
2873 
2874 HRESULT STDMETHODCALLTYPE CShellBrowser::GoForward()
2875 {
2876     CComPtr<ITravelLog> travelLog;
2877     HRESULT hResult = GetTravelLog(&travelLog);
2878     if (FAILED_UNEXPECTEDLY(hResult))
2879         return hResult;
2880     return travelLog->Travel(static_cast<IDropTarget *>(this), TLOG_FORE);
2881 }
2882 
2883 HRESULT STDMETHODCALLTYPE CShellBrowser::GoHome()
2884 {
2885     return E_NOTIMPL;
2886 }
2887 
2888 HRESULT STDMETHODCALLTYPE CShellBrowser::GoSearch()
2889 {
2890     return E_NOTIMPL;
2891 }
2892 
2893 HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate(BSTR URL, VARIANT *Flags,
2894     VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
2895 {
2896     CComHeapPtr<ITEMIDLIST> pidl;
2897     HRESULT hResult;
2898     CComPtr<IShellFolder> pDesktop;
2899 
2900     hResult = SHGetDesktopFolder(&pDesktop);
2901     if (FAILED_UNEXPECTEDLY(hResult))
2902         return hResult;
2903     hResult = pDesktop->ParseDisplayName(NULL, NULL, URL, NULL, &pidl, NULL);
2904     if (FAILED_UNEXPECTEDLY(hResult))
2905         return hResult;
2906     return BrowseObject(pidl, 1);
2907 }
2908 
2909 HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh()
2910 {
2911     VARIANT                                 level;
2912 
2913     V_VT(&level) = VT_I4;
2914     V_I4(&level) = 4;
2915     return Refresh2(&level);
2916 }
2917 
2918 HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh2(VARIANT *Level)
2919 {
2920     CComPtr<IOleCommandTarget>              oleCommandTarget;
2921     HRESULT                                 hResult;
2922 
2923     hResult = fCurrentShellView->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &oleCommandTarget));
2924     if (FAILED_UNEXPECTEDLY(hResult))
2925         return hResult;
2926     return oleCommandTarget->Exec(NULL, 22, 1, Level, NULL);
2927 }
2928 
2929 HRESULT STDMETHODCALLTYPE CShellBrowser::Stop()
2930 {
2931     return E_NOTIMPL;
2932 }
2933 
2934 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Application(IDispatch **ppDisp)
2935 {
2936     return E_NOTIMPL;
2937 }
2938 
2939 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Parent(IDispatch **ppDisp)
2940 {
2941     return E_NOTIMPL;
2942 }
2943 
2944 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Container(IDispatch **ppDisp)
2945 {
2946     return E_NOTIMPL;
2947 }
2948 
2949 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Document(IDispatch **ppDisp)
2950 {
2951     return E_NOTIMPL;
2952 }
2953 
2954 HRESULT STDMETHODCALLTYPE CShellBrowser::get_TopLevelContainer(VARIANT_BOOL *pBool)
2955 {
2956     return E_NOTIMPL;
2957 }
2958 
2959 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Type(BSTR *Type)
2960 {
2961     return E_NOTIMPL;
2962 }
2963 #ifdef __exdisp_h__
2964 #define long LONG
2965 #endif
2966 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Left(long *pl)
2967 {
2968     return E_NOTIMPL;
2969 }
2970 
2971 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Left(long Left)
2972 {
2973     return E_NOTIMPL;
2974 }
2975 
2976 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Top(long *pl)
2977 {
2978     return E_NOTIMPL;
2979 }
2980 
2981 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Top(long Top)
2982 {
2983     return E_NOTIMPL;
2984 }
2985 
2986 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Width(long *pl)
2987 {
2988     return E_NOTIMPL;
2989 }
2990 
2991 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Width(long Width)
2992 {
2993     return E_NOTIMPL;
2994 }
2995 
2996 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Height(long *pl)
2997 {
2998     return E_NOTIMPL;
2999 }
3000 
3001 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Height(long Height)
3002 {
3003     return E_NOTIMPL;
3004 }
3005 #ifdef __exdisp_h__
3006 #undef long
3007 #endif
3008 HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationName(BSTR *LocationName)
3009 {
3010     return E_NOTIMPL;
3011 }
3012 
3013 HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationURL(BSTR *LocationURL)
3014 {
3015     return E_NOTIMPL;
3016 }
3017 
3018 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Busy(VARIANT_BOOL *pBool)
3019 {
3020     return E_NOTIMPL;
3021 }
3022 
3023 HRESULT STDMETHODCALLTYPE CShellBrowser::Quit()
3024 {
3025     return E_NOTIMPL;
3026 }
3027 
3028 HRESULT STDMETHODCALLTYPE CShellBrowser::ClientToWindow(int *pcx, int *pcy)
3029 {
3030     return E_NOTIMPL;
3031 }
3032 
3033 HRESULT STDMETHODCALLTYPE CShellBrowser::PutProperty(BSTR Property, VARIANT vtValue)
3034 {
3035     return E_NOTIMPL;
3036 }
3037 
3038 HRESULT STDMETHODCALLTYPE CShellBrowser::GetProperty(BSTR Property, VARIANT *pvtValue)
3039 {
3040     return E_NOTIMPL;
3041 }
3042 
3043 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Name(BSTR *Name)
3044 {
3045     return E_NOTIMPL;
3046 }
3047 
3048 HRESULT STDMETHODCALLTYPE CShellBrowser::get_HWND(SHANDLE_PTR *pHWND)
3049 {
3050     return E_NOTIMPL;
3051 }
3052 
3053 HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullName(BSTR *FullName)
3054 {
3055     return E_NOTIMPL;
3056 }
3057 
3058 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Path(BSTR *Path)
3059 {
3060     return E_NOTIMPL;
3061 }
3062 
3063 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Visible(VARIANT_BOOL *pBool)
3064 {
3065     return E_NOTIMPL;
3066 }
3067 
3068 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Visible(VARIANT_BOOL Value)
3069 {
3070     return E_NOTIMPL;
3071 }
3072 
3073 HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusBar(VARIANT_BOOL *pBool)
3074 {
3075     return E_NOTIMPL;
3076 }
3077 
3078 HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusBar(VARIANT_BOOL Value)
3079 {
3080     return E_NOTIMPL;
3081 }
3082 
3083 HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusText(BSTR *StatusText)
3084 {
3085     return E_NOTIMPL;
3086 }
3087 
3088 HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusText(BSTR StatusText)
3089 {
3090     return E_NOTIMPL;
3091 }
3092 
3093 HRESULT STDMETHODCALLTYPE CShellBrowser::get_ToolBar(int *Value)
3094 {
3095     return E_NOTIMPL;
3096 }
3097 
3098 HRESULT STDMETHODCALLTYPE CShellBrowser::put_ToolBar(int Value)
3099 {
3100     return E_NOTIMPL;
3101 }
3102 
3103 HRESULT STDMETHODCALLTYPE CShellBrowser::get_MenuBar(VARIANT_BOOL *Value)
3104 {
3105     return E_NOTIMPL;
3106 }
3107 
3108 HRESULT STDMETHODCALLTYPE CShellBrowser::put_MenuBar(VARIANT_BOOL Value)
3109 {
3110     return E_NOTIMPL;
3111 }
3112 
3113 HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullScreen(VARIANT_BOOL *pbFullScreen)
3114 {
3115     return E_NOTIMPL;
3116 }
3117 
3118 HRESULT STDMETHODCALLTYPE CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen)
3119 {
3120     return E_NOTIMPL;
3121 }
3122 
3123 HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate2(VARIANT *URL, VARIANT *Flags,
3124     VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers)
3125 {
3126     LPITEMIDLIST pidl = NULL;
3127     HRESULT hResult;
3128     // called from drive combo box to navigate to a directory
3129     // Also called by search band to display shell results folder view
3130 
3131     if (V_VT(URL) == VT_BSTR)
3132     {
3133         return this->Navigate(V_BSTR(URL), Flags, TargetFrameName, PostData, Headers);
3134     }
3135     if (V_VT(URL) == (VT_ARRAY | VT_UI1))
3136     {
3137         if (V_ARRAY(URL)->cDims != 1 || V_ARRAY(URL)->cbElements != 1)
3138             return E_INVALIDARG;
3139 
3140         pidl = static_cast<LPITEMIDLIST>(V_ARRAY(URL)->pvData);
3141     }
3142     hResult = BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
3143     if (FAILED_UNEXPECTEDLY(hResult))
3144         return hResult;
3145     return S_OK;
3146 }
3147 
3148 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf)
3149 {
3150     return E_NOTIMPL;
3151 }
3152 
3153 HRESULT STDMETHODCALLTYPE CShellBrowser::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt,
3154     VARIANT *pvaIn, VARIANT *pvaOut)
3155 {
3156     return E_NOTIMPL;
3157 }
3158 
3159 HRESULT STDMETHODCALLTYPE CShellBrowser::ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize)
3160 {
3161     CLSID                                   classID;
3162     bool                                    vertical;
3163 
3164     // called to show search bar
3165     if (V_VT(pvaClsid) != VT_BSTR)
3166         return E_INVALIDARG;
3167     CLSIDFromString(V_BSTR(pvaClsid), &classID);
3168     // TODO: properly compute the value of vertical
3169     vertical = true;
3170     return ShowBand(classID, vertical);
3171 }
3172 
3173 HRESULT STDMETHODCALLTYPE CShellBrowser::get_ReadyState(READYSTATE *plReadyState)
3174 {
3175     return E_NOTIMPL;
3176 }
3177 
3178 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Offline(VARIANT_BOOL *pbOffline)
3179 {
3180     return E_NOTIMPL;
3181 }
3182 
3183 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Offline(VARIANT_BOOL bOffline)
3184 {
3185     return E_NOTIMPL;
3186 }
3187 
3188 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Silent(VARIANT_BOOL *pbSilent)
3189 {
3190     return E_NOTIMPL;
3191 }
3192 
3193 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Silent(VARIANT_BOOL bSilent)
3194 {
3195     return E_NOTIMPL;
3196 }
3197 
3198 HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL *pbRegister)
3199 {
3200     return E_NOTIMPL;
3201 }
3202 
3203 HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister)
3204 {
3205     return E_NOTIMPL;
3206 }
3207 
3208 HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister)
3209 {
3210     return E_NOTIMPL;
3211 }
3212 
3213 HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister)
3214 {
3215     return E_NOTIMPL;
3216 }
3217 
3218 HRESULT STDMETHODCALLTYPE CShellBrowser::get_TheaterMode(VARIANT_BOOL *pbRegister)
3219 {
3220     return E_NOTIMPL;
3221 }
3222 
3223 HRESULT STDMETHODCALLTYPE CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister)
3224 {
3225     return E_NOTIMPL;
3226 }
3227 
3228 HRESULT STDMETHODCALLTYPE CShellBrowser::get_AddressBar(VARIANT_BOOL *Value)
3229 {
3230     return E_NOTIMPL;
3231 }
3232 
3233 HRESULT STDMETHODCALLTYPE CShellBrowser::put_AddressBar(VARIANT_BOOL Value)
3234 {
3235     return E_NOTIMPL;
3236 }
3237 
3238 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Resizable(VARIANT_BOOL *Value)
3239 {
3240     return E_NOTIMPL;
3241 }
3242 
3243 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Resizable(VARIANT_BOOL Value)
3244 {
3245     return E_NOTIMPL;
3246 }
3247 
3248 HRESULT STDMETHODCALLTYPE CShellBrowser::FindWindowByIndex(DWORD dwID, IUnknown **ppunk)
3249 {
3250     return E_NOTIMPL;
3251 }
3252 
3253 HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindowData(IStream *pStream, LPWINDOWDATA pWinData)
3254 {
3255     if (pWinData == NULL)
3256         return E_POINTER;
3257 
3258     pWinData->dwWindowID = -1;
3259     pWinData->uiCP = 0;
3260     pWinData->pidl = ILClone(fCurrentDirectoryPIDL);
3261     pWinData->lpszUrl = NULL;
3262     pWinData->lpszUrlLocation = NULL;
3263     pWinData->lpszTitle = NULL;
3264     return S_OK;
3265 }
3266 
3267 HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition)
3268 {
3269     return E_NOTIMPL;
3270 }
3271 
3272 HRESULT STDMETHODCALLTYPE CShellBrowser::GetClassID(CLSID *pClassID)
3273 {
3274     return E_NOTIMPL;
3275 }
3276 
3277 HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistory(IStream *pStream, IBindCtx *pbc)
3278 {
3279     CComPtr<IPersistHistory>                viewPersistHistory;
3280     CComPtr<IOleObject>                     viewHistoryObject;
3281     persistState                            oldState;
3282     ULONG                                   numRead;
3283     LPITEMIDLIST                            pidl;
3284     HRESULT                                 hResult;
3285 
3286     hResult = pStream->Read(&oldState, sizeof(oldState), &numRead);
3287     if (FAILED_UNEXPECTEDLY(hResult))
3288         return hResult;
3289     if (numRead != sizeof(oldState) || oldState.dwSize != sizeof(oldState))
3290         return E_FAIL;
3291     if (oldState.browseType != 2)
3292         return E_FAIL;
3293     pidl = static_cast<LPITEMIDLIST>(CoTaskMemAlloc(oldState.pidlSize));
3294     if (pidl == NULL)
3295         return E_OUTOFMEMORY;
3296     hResult = pStream->Read(pidl, oldState.pidlSize, &numRead);
3297     if (FAILED_UNEXPECTEDLY(hResult))
3298     {
3299         ILFree(pidl);
3300         return hResult;
3301     }
3302     if (numRead != oldState.pidlSize)
3303     {
3304         ILFree(pidl);
3305         return E_FAIL;
3306     }
3307     hResult = CoCreateInstance(oldState.persistClass, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_SERVER,
3308         IID_PPV_ARG(IOleObject, &viewHistoryObject));
3309     fHistoryObject = viewHistoryObject;
3310     fHistoryStream = pStream;
3311     fHistoryBindContext = pbc;
3312     hResult = BrowseToPIDL(pidl, BTP_DONT_UPDATE_HISTORY);
3313     fHistoryObject = NULL;
3314     fHistoryStream = NULL;
3315     fHistoryBindContext = NULL;
3316     ILFree(pidl);
3317     if (FAILED_UNEXPECTEDLY(hResult))
3318         return hResult;
3319     return S_OK;
3320 }
3321 
3322 HRESULT STDMETHODCALLTYPE CShellBrowser::SaveHistory(IStream *pStream)
3323 {
3324     CComPtr<IPersistHistory>                viewPersistHistory;
3325     persistState                            newState;
3326     HRESULT                                 hResult;
3327 
3328     hResult = fCurrentShellView->GetItemObject(
3329         SVGIO_BACKGROUND, IID_PPV_ARG(IPersistHistory, &viewPersistHistory));
3330     memset(&newState, 0, sizeof(newState));
3331     newState.dwSize = sizeof(newState);
3332     newState.browseType = 2;
3333     newState.browserIndex = GetBrowserIndex();
3334     if (viewPersistHistory.p != NULL)
3335     {
3336         hResult = viewPersistHistory->GetClassID(&newState.persistClass);
3337         if (FAILED_UNEXPECTEDLY(hResult))
3338             return hResult;
3339     }
3340     newState.pidlSize = ILGetSize(fCurrentDirectoryPIDL);
3341     hResult = pStream->Write(&newState, sizeof(newState), NULL);
3342     if (FAILED_UNEXPECTEDLY(hResult))
3343         return hResult;
3344     hResult = pStream->Write(fCurrentDirectoryPIDL, newState.pidlSize, NULL);
3345     if (FAILED_UNEXPECTEDLY(hResult))
3346         return hResult;
3347     if (viewPersistHistory.p != NULL)
3348     {
3349         hResult = viewPersistHistory->SaveHistory(pStream);
3350         if (FAILED_UNEXPECTEDLY(hResult))
3351             return hResult;
3352     }
3353     return S_OK;
3354 }
3355 
3356 HRESULT STDMETHODCALLTYPE CShellBrowser::SetPositionCookie(DWORD dwPositioncookie)
3357 {
3358     return E_NOTIMPL;
3359 }
3360 
3361 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPositionCookie(DWORD *pdwPositioncookie)
3362 {
3363     return E_NOTIMPL;
3364 }
3365 
3366 LRESULT CShellBrowser::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3367 {
3368     OnCreate(reinterpret_cast<LPCREATESTRUCT> (lParam));
3369     return 0;
3370 }
3371 
3372 LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3373 {
3374     HRESULT hr;
3375 
3376     /* The current thread is about to go down so render any IDataObject that may be left in the clipboard */
3377     OleFlushClipboard();
3378 
3379     // TODO: rip down everything
3380     {
3381         fToolbarProxy.Destroy();
3382 
3383         fCurrentShellView->DestroyViewWindow();
3384         fCurrentShellView->UIActivate(SVUIA_DEACTIVATE);
3385 
3386         for (int i = 0; i < 3; i++)
3387         {
3388             CComPtr<IDockingWindow> pdw;
3389             CComPtr<IDeskBar> bar;
3390             CComPtr<IUnknown> pBarSite;
3391             CComPtr<IDeskBarClient> pClient;
3392 
3393             if (fClientBars[i].clientBar == NULL)
3394                 continue;
3395 
3396             hr = fClientBars[i].clientBar->QueryInterface(IID_PPV_ARG(IDockingWindow, &pdw));
3397             if (FAILED_UNEXPECTEDLY(hr))
3398                 continue;
3399 
3400             /* We should destroy our basebarsite too */
3401             hr = pdw->QueryInterface(IID_PPV_ARG(IDeskBar, &bar));
3402             if (SUCCEEDED(hr))
3403             {
3404                 hr = bar->GetClient(&pBarSite);
3405                 if (SUCCEEDED(hr) && pBarSite)
3406                 {
3407                     hr = pBarSite->QueryInterface(IID_PPV_ARG(IDeskBarClient, &pClient));
3408                     if (SUCCEEDED(hr))
3409                         pClient->SetDeskBarSite(NULL);
3410                 }
3411             }
3412             pdw->CloseDW(0);
3413 
3414             pClient = NULL;
3415             pBarSite = NULL;
3416             pdw = NULL;
3417             bar = NULL;
3418             ReleaseCComPtrExpectZero(fClientBars[i].clientBar);
3419         }
3420         ReleaseCComPtrExpectZero(fCurrentShellView);
3421         ReleaseCComPtrExpectZero(fTravelLog);
3422 
3423         fCurrentShellFolder.Release();
3424         ILFree(fCurrentDirectoryPIDL);
3425         ::DestroyWindow(fStatusBar);
3426         DestroyMenu(fCurrentMenuBar);
3427     }
3428     PostQuitMessage(0);
3429     return 0;
3430 }
3431 
3432 LRESULT CShellBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3433 {
3434     CComPtr<IDockingWindow>                 dockingWindow;
3435     RECT                                    availableBounds;
3436     static const INT                        excludeItems[] = {1, 1, 1, 0xa001, 0, 0};
3437     HRESULT                                 hResult;
3438 
3439     if (wParam != SIZE_MINIMIZED)
3440     {
3441         GetEffectiveClientRect(m_hWnd, &availableBounds, excludeItems);
3442         for (INT x = 0; x < 3; x++)
3443         {
3444             if (fClientBars[x].clientBar != NULL)
3445             {
3446                 hResult = fClientBars[x].clientBar->QueryInterface(
3447                     IID_PPV_ARG(IDockingWindow, &dockingWindow));
3448                 if (SUCCEEDED(hResult) && dockingWindow != NULL)
3449                 {
3450                     hResult = dockingWindow->ResizeBorderDW(
3451                         &availableBounds, static_cast<IDropTarget *>(this), TRUE);
3452                     break;
3453                 }
3454             }
3455         }
3456         RepositionBars();
3457     }
3458     return 1;
3459 }
3460 
3461 LRESULT CShellBrowser::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3462 {
3463     HMENU  theMenu;
3464     LPARAM menuIndex = lParam;
3465 
3466     theMenu = reinterpret_cast<HMENU>(wParam);
3467 
3468     if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_FILE))
3469     {
3470         menuIndex = 0;
3471     }
3472     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_EDIT))
3473     {
3474         menuIndex = 1;
3475     }
3476     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_VIEW))
3477     {
3478         UpdateViewMenu(theMenu);
3479         menuIndex = 2;
3480     }
3481     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_FAVORITES))
3482     {
3483         menuIndex = 3;
3484     }
3485     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_TOOLS))
3486     {
3487         // FIXME: Remove once implemented
3488         SHEnableMenuItem(theMenu, IDM_TOOLS_MAPNETWORKDRIVE, FALSE);
3489         SHEnableMenuItem(theMenu, IDM_TOOLS_DISCONNECTNETWORKDRIVE, FALSE);
3490         SHEnableMenuItem(theMenu, IDM_TOOLS_SYNCHRONIZE, FALSE);
3491         menuIndex = 4;
3492     }
3493     else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_HELP))
3494     {
3495         menuIndex = 5;
3496     }
3497 
3498     LRESULT ret = RelayMsgToShellView(uMsg, wParam, menuIndex, bHandled);
3499 
3500     return ret;
3501 }
3502 
3503 LRESULT CShellBrowser::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3504 {
3505     ::SetFocus(fCurrentShellViewWindow);
3506     return 0;
3507 }
3508 
3509 LRESULT CShellBrowser::RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3510 {
3511     if (fCurrentShellViewWindow != NULL)
3512         return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam);
3513     return 0;
3514 }
3515 
3516 LRESULT CShellBrowser::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3517 {
3518     LPVOID lpEnvironment;
3519     RegenerateUserEnvironment(&lpEnvironment, TRUE);
3520 
3521     SHPropagateMessage(m_hWnd, uMsg, wParam, lParam, TRUE);
3522     return 0;
3523 }
3524 
3525 LRESULT CShellBrowser::OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3526 {
3527     return SendMessage(WM_CLOSE);
3528 }
3529 
3530 LRESULT CShellBrowser::OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3531 {
3532     HRESULT hResult = DoFolderOptions();
3533     if (FAILED(hResult))
3534         TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult);
3535     return 0;
3536 }
3537 
3538 LRESULT CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3539 {
3540 #ifndef __REACTOS__
3541     WNetConnectionDialog(m_hWnd, RESOURCETYPE_DISK);
3542 #endif /* __REACTOS__ */
3543     return 0;
3544 }
3545 
3546 LRESULT CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3547 {
3548 #ifndef __REACTOS__
3549     WNetDisconnectDialog(m_hWnd, RESOURCETYPE_DISK);
3550 #endif /* __REACTOS__ */
3551     return 0;
3552 }
3553 
3554 LRESULT CShellBrowser::OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3555 {
3556     ShellAbout(m_hWnd, _T("ReactOS"), _T(""), NULL);
3557     return 0;
3558 }
3559 
3560 LRESULT CShellBrowser::OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3561 {
3562     HRESULT hResult = GoBack();
3563     if (FAILED(hResult))
3564         TRACE("GoBack failed with hResult=%08lx\n", hResult);
3565     return 0;
3566 }
3567 
3568 LRESULT CShellBrowser::OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3569 {
3570     HRESULT hResult = GoForward();
3571     if (FAILED(hResult))
3572         TRACE("GoForward failed with hResult=%08lx\n", hResult);
3573     return 0;
3574 }
3575 
3576 LRESULT CShellBrowser::OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3577 {
3578     HRESULT hResult = NavigateToParent();
3579     if (FAILED(hResult))
3580         TRACE("NavigateToParent failed with hResult=%08lx\n", hResult);
3581     return 0;
3582 }
3583 
3584 LRESULT CShellBrowser::OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3585 {
3586     HRESULT hResult = GoHome();
3587     if (FAILED(hResult))
3588         TRACE("GoHome failed with hResult=%08lx\n", hResult);
3589     return 0;
3590 }
3591 
3592 LRESULT CShellBrowser::OnBackspace(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3593 {
3594     // FIXME: This does not appear to be what windows does.
3595     HRESULT hResult = NavigateToParent();
3596     if (FAILED(hResult))
3597         TRACE("NavigateToParent failed with hResult=%08lx\n", hResult);
3598     return 0;
3599 }
3600 
3601 LRESULT CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3602 {
3603     CComPtr<IShellFolder> psfDesktop;
3604     LPITEMIDLIST pidlFavs;
3605     HRESULT hr;
3606     hr = SHGetSpecialFolderLocation(m_hWnd, CSIDL_FAVORITES, &pidlFavs);
3607     if (FAILED(hr))
3608     {
3609         hr = SHGetSpecialFolderLocation(m_hWnd, CSIDL_COMMON_FAVORITES, &pidlFavs);
3610         if (FAILED(hr))
3611             return 0;
3612     }
3613 
3614     hr = SHGetDesktopFolder(&psfDesktop);
3615     if (FAILED_UNEXPECTEDLY(hr))
3616         return 0;
3617 
3618     hr = SHInvokeDefaultCommand(m_hWnd, psfDesktop, pidlFavs);
3619     if (FAILED_UNEXPECTEDLY(hr))
3620         return 0;
3621 
3622     return 0;
3623 }
3624 
3625 LRESULT CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3626 {
3627     fStatusBarVisible = !fStatusBarVisible;
3628     if (fStatusBar)
3629     {
3630         ::ShowWindow(fStatusBar, fStatusBarVisible ? SW_SHOW : SW_HIDE);
3631         RepositionBars();
3632     }
3633     return 0;
3634 }
3635 
3636 LRESULT CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3637 {
3638     HRESULT hResult;
3639     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3640                             CGID_PrivCITCommands, ITID_TOOLBARLOCKED, 0, NULL, NULL);
3641     return 0;
3642 }
3643 
3644 LRESULT CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3645 {
3646     HRESULT hResult;
3647     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3648                             CGID_PrivCITCommands, ITID_TOOLBARBANDSHOWN, 0, NULL, NULL);
3649     return 0;
3650 }
3651 
3652 LRESULT CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3653 {
3654     HRESULT hResult;
3655     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3656                             CGID_PrivCITCommands, ITID_ADDRESSBANDSHOWN, 0, NULL, NULL);
3657     return 0;
3658 }
3659 
3660 LRESULT CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3661 {
3662     HRESULT hResult;
3663     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3664                             CGID_PrivCITCommands, ITID_LINKSBANDSHOWN, 0, NULL, NULL);
3665     return 0;
3666 }
3667 
3668 LRESULT CShellBrowser::OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3669 {
3670     HRESULT hResult;
3671     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3672                             CGID_PrivCITCommands, ITID_TEXTLABELS, 0, NULL, NULL);
3673     return 0;
3674 }
3675 
3676 LRESULT CShellBrowser::OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3677 {
3678     HRESULT hResult;
3679     hResult = IUnknown_Exec(fClientBars[BIInternetToolbar].clientBar,
3680                             CGID_PrivCITCommands, ITID_CUSTOMIZEENABLED, 0, NULL, NULL);
3681     return 0;
3682 }
3683 
3684 LRESULT CShellBrowser::OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3685 {
3686     if (fCurrentShellView)
3687         fCurrentShellView->Refresh();
3688     return 0;
3689 }
3690 
3691 LRESULT CShellBrowser::OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3692 {
3693     return 0;
3694 }
3695 
3696 LRESULT CShellBrowser::OnExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled)
3697 {
3698     // TODO: HACK ! use the proper mechanism to show the band (i.e. pass the BSTR to basebar)
3699     if (wID >= IDM_EXPLORERBAND_BEGINCUSTOM && wID <= IDM_EXPLORERBAND_ENDCUSTOM)
3700     {
3701         MenuBandInfo *mbi;
3702         mbi = (MenuBandInfo*)DSA_GetItemPtr(menuDsa, (wID - IDM_EXPLORERBAND_BEGINCUSTOM));
3703         if (!mbi)
3704             return 0;
3705         ShowBand(mbi->barGuid, mbi->fVertical);
3706         bHandled = TRUE;
3707         return 1;
3708     }
3709     switch (wID)
3710     {
3711     case IDM_EXPLORERBAR_SEARCH:
3712         Exec(&CLSID_CommonButtons, 0x123, 1, NULL, NULL);
3713         break;
3714     case IDM_EXPLORERBAR_FOLDERS:
3715         ShowBand(CLSID_ExplorerBand, true);
3716         break;
3717     case IDM_EXPLORERBAR_HISTORY:
3718         ShowBand(CLSID_SH_HistBand, true);
3719         break;
3720     case IDM_EXPLORERBAR_FAVORITES:
3721         ShowBand(CLSID_SH_FavBand, true);
3722         break;
3723     default:
3724         WARN("Unknown id %x\n", wID);
3725     }
3726     bHandled = TRUE;
3727     return 1;
3728 }
3729 
3730 LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
3731 {
3732     if (HIWORD(wParam) == 0 && LOWORD(wParam) < FCIDM_SHVIEWLAST && fCurrentShellViewWindow != NULL)
3733         return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam);
3734     return 0;
3735 }
3736 
3737 HRESULT CShellBrowser_CreateInstance(LPITEMIDLIST pidl, DWORD dwFlags, REFIID riid, void **ppv)
3738 {
3739     return ShellObjectCreatorInit<CShellBrowser>(pidl, dwFlags, riid, ppv);
3740 }
3741