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