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