Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenshellbrowser.cpp
Go to the documentation of this file.
00001 /* 00002 * ReactOS Explorer 00003 * 00004 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org> 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Lesser General Public 00008 * License as published by the Free Software Foundation; either 00009 * version 2.1 of the License, or (at your option) any later version. 00010 * 00011 * This library is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 * Lesser General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU Lesser General Public 00017 * License along with this library; if not, write to the Free Software 00018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00019 */ 00020 00021 #include "precomp.h" 00022 00023 /* 00024 TODO: 00025 **Provide implementation of new and delete that use LocalAlloc 00026 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The 00027 view doesn't restore the selection correctly. 00028 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing... 00029 **Add brand band bitmaps to shell32.dll 00030 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log 00031 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the 00032 current state overwrites the wrong entry's contents. This needs to be changed. 00033 ****Fix close of browser window to release all objects 00034 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal? 00035 **When a new bar is added to base bar site, how is base bar told so it can resize? 00036 **Does the base bar site have a classid? 00037 **What should refresh command send to views to make them refresh? 00038 **When new bar is created, what status notifications need to be fired? 00039 **How does keyboard filtering dispatch? 00040 **For deferred persist history load, how does the view connect up and get the state? 00041 How does context menu send open, cut, rename commands to its site (the shell view)? 00042 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations. 00043 00044 **Route View->Toolbars commands to internet toolbar 00045 **Handle travel log items in View->Go 00046 **Fix ShowBrowserBar to pass correct size on when bar is shown 00047 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars 00048 ****Make ShowToolbar check if bar is already created before creating it again 00049 ****Shell should fill in the list of explorer bars in the View submenus 00050 **Add folder menu in the file menu 00051 **Fix CShellBrowser::GetBorderDW to compute available size correctly 00052 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder 00053 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different) 00054 Make folders toolbar item update state appropriately 00055 Read list of bands from registry on launch 00056 Read list of bars from registry on launch 00057 If the folders or search bars don't exist, disable the toolbar buttons 00058 If the favorites or history bars don't exist, disable the toolbar butons 00059 Fix Apply to all Folders in Folder Options 00060 Implement close command 00061 Add explorer band context menu to file menu 00062 Add code to allow restore of internet toolbar from registry 00063 Fix code that calls FireNavigateComplete to pass the correct new path 00064 00065 What are the other command ids for QueryStatus/FireCommandStateChange? 00066 00067 Add handler for cabinet settings change 00068 Add handler for system metrics change (renegotiate border space?) 00069 Add handler for theme change and forward to contained windows 00070 00071 When folders are shown, the status bar text should change 00072 Add code to save/restore shell view settings 00073 Implement tabbing between frames 00074 Fix handling of focus everywhere 00075 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts") 00076 00077 The status bar doesn't show help text for items owned by frame during menu tracking 00078 Stub out frame command handlers 00079 "Arrange icons by" group is not checked properly 00080 00081 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown, 00082 the icon is always an open folder with magnifying glass 00083 Fix bars to calculate height correctly 00084 Hookup policies for everything... 00085 Investigate toolbar message WM_USER+93 00086 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style 00087 00088 Vertical Explorer Bar CATID_InfoBand 00089 Horizontal Explorer Bar CATID_CommBand 00090 Desk Band CATID_DeskBand 00091 00092 cache of bars 00093 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum 00094 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum 00095 00096 create key here with CLSID of bar to register tool band 00097 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar 00098 00099 */ 00100 00101 #ifndef __GNUC__ 00102 #pragma comment(linker, \ 00103 "\"/manifestdependency:type='Win32' "\ 00104 "name='Microsoft.Windows.Common-Controls' "\ 00105 "version='6.0.0.0' "\ 00106 "processorArchitecture='*' "\ 00107 "publicKeyToken='6595b64144ccf1df' "\ 00108 "language='*'\"") 00109 #endif // __GNUC__ 00110 00111 struct categoryCacheHeader 00112 { 00113 long dwSize; // size of header only 00114 long version; // currently 1 00115 SYSTEMTIME writeTime; // time we were written to registry 00116 long classCount; // number of classes following 00117 }; 00118 00119 static const unsigned int folderOptionsPageCountMax = 20; 00120 static const long BTP_UPDATE_CUR_HISTORY = 1; 00121 static const long BTP_UPDATE_NEXT_HISTORY = 2; 00122 00123 BOOL createNewStuff = false; 00124 00125 00126 // this class is private to browseui.dll and is not registered externally? 00127 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11); 00128 00129 00130 extern HRESULT CreateTravelLog(REFIID riid, void **ppv); 00131 extern HRESULT CreateBaseBar(REFIID riid, void **ppv); 00132 extern HRESULT CreateBaseBarSite(REFIID riid, void **ppv); 00133 #ifndef ROS_Headers 00134 SHSTDAPI_(void *) SHAlloc(SIZE_T cb); 00135 #endif 00136 00137 // temporary 00138 extern HRESULT CreateInternetToolbar(REFIID riid, void **ppv); 00139 00140 00141 #ifdef SetWindowLongPtr 00142 #undef SetWindowLongPtr 00143 inline LONG_PTR SetWindowLongPtr(HWND hWnd, int nIndex, LONG_PTR dwNewLong) 00144 { 00145 return SetWindowLong(hWnd, nIndex, (LONG)dwNewLong); 00146 } 00147 #endif 00148 00149 #ifdef GetWindowLongPtr 00150 #undef GetWindowLongPtr 00151 inline LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex) 00152 { 00153 return (LONG_PTR)GetWindowLong(hWnd, nIndex); 00154 } 00155 #endif 00156 00157 HMENU SHGetMenuFromID(HMENU topMenu, int theID) 00158 { 00159 MENUITEMINFO menuItemInfo; 00160 00161 menuItemInfo.cbSize = sizeof(menuItemInfo); 00162 menuItemInfo.fMask = MIIM_SUBMENU; 00163 if (GetMenuItemInfo(topMenu, theID, FALSE, &menuItemInfo) == FALSE) 00164 return NULL; 00165 return menuItemInfo.hSubMenu; 00166 } 00167 00168 void SHCheckMenuItem(HMENU theMenu, int theID, BOOL checked) 00169 { 00170 MENUITEMINFO menuItemInfo; 00171 00172 menuItemInfo.cbSize = sizeof(menuItemInfo); 00173 menuItemInfo.fMask = MIIM_STATE; 00174 if (GetMenuItemInfo(theMenu, theID, FALSE, &menuItemInfo)) 00175 { 00176 if (checked) 00177 menuItemInfo.fState |= MF_CHECKED; 00178 else 00179 menuItemInfo.fState &= ~MF_CHECKED; 00180 SetMenuItemInfo(theMenu, theID, FALSE, &menuItemInfo); 00181 } 00182 } 00183 00184 void DeleteMenuItems(HMENU theMenu, unsigned int firstIDToDelete, unsigned int lastIDToDelete) 00185 { 00186 MENUITEMINFO menuItemInfo; 00187 int menuItemCount; 00188 int curIndex; 00189 00190 menuItemCount = GetMenuItemCount(theMenu); 00191 curIndex = 0; 00192 while (curIndex < menuItemCount) 00193 { 00194 menuItemInfo.cbSize = sizeof(menuItemInfo); 00195 menuItemInfo.fMask = MIIM_ID; 00196 if (GetMenuItemInfo(theMenu, curIndex, TRUE, &menuItemInfo) && menuItemInfo.wID >= firstIDToDelete && menuItemInfo.wID <= lastIDToDelete) 00197 { 00198 DeleteMenu(theMenu, curIndex, MF_BYPOSITION); 00199 menuItemCount--; 00200 } 00201 else 00202 curIndex++; 00203 } 00204 } 00205 00206 HRESULT WINAPI SHBindToFolder(LPITEMIDLIST path, IShellFolder **newFolder) 00207 { 00208 CComPtr<IShellFolder> desktop; 00209 00210 ::SHGetDesktopFolder(&desktop); 00211 if (desktop == NULL) 00212 return E_FAIL; 00213 if (path == NULL || path->mkid.cb == 0) 00214 { 00215 *newFolder = desktop; 00216 desktop.p->AddRef (); 00217 return S_OK; 00218 } 00219 return desktop->BindToObject (path, NULL, IID_IShellFolder, (void **)newFolder); 00220 } 00221 00222 static const TCHAR szCabinetWndClass[] = TEXT("CabinetWClassX"); 00223 static const TCHAR szExploreWndClass[] = TEXT("ExploreWClassX"); 00224 00225 class CDockManager; 00226 class CShellBrowser; 00227 00228 class CToolbarProxy : 00229 public CWindowImpl<CToolbarProxy, CWindow, CControlWinTraits> 00230 { 00231 private: 00232 CComPtr<IExplorerToolbar> fExplorerToolbar; 00233 public: 00234 void Initialize(HWND parent, IUnknown *explorerToolbar); 00235 00236 private: 00237 00238 // message handlers 00239 LRESULT OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 00240 LRESULT OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 00241 00242 BEGIN_MSG_MAP(CToolbarProxy) 00243 MESSAGE_HANDLER(TB_ADDBITMAP, OnAddBitmap) 00244 MESSAGE_RANGE_HANDLER(WM_USER, 0x7fff, OnForwardMessage) 00245 END_MSG_MAP() 00246 }; 00247 00248 void CToolbarProxy::Initialize(HWND parent, IUnknown *explorerToolbar) 00249 { 00250 HWND myWindow; 00251 HRESULT hResult; 00252 00253 myWindow = SHCreateWorkerWindowW(0, parent, 0, WS_CHILD, NULL, 0); 00254 if (myWindow != NULL) 00255 { 00256 SubclassWindow(myWindow); 00257 SetWindowPos(NULL, -32000, -32000, 0, 0, SWP_NOOWNERZORDER | SWP_NOZORDER); 00258 hResult = explorerToolbar->QueryInterface(IID_IExplorerToolbar, (void **)&fExplorerToolbar); 00259 } 00260 } 00261 00262 LRESULT CToolbarProxy::OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 00263 { 00264 long int result; 00265 HRESULT hResult; 00266 00267 result = 0; 00268 if (fExplorerToolbar.p != NULL) 00269 { 00270 hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 1, (long)wParam, (TBADDBITMAP *)lParam, &result, RGB(192, 192, 192)); 00271 hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 2, (long)wParam, (TBADDBITMAP *)lParam, &result, RGB(192, 192, 192)); 00272 } 00273 return result; 00274 } 00275 00276 LRESULT CToolbarProxy::OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 00277 { 00278 LRESULT result; 00279 HRESULT hResult; 00280 00281 result = 0; 00282 if (fExplorerToolbar.p != NULL) 00283 hResult = fExplorerToolbar->SendToolbarMsg(&CGID_ShellBrowser, uMsg, wParam, lParam, &result); 00284 return result; 00285 } 00286 00287 /* 00288 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL); 00289 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the 00290 rebar 00291 */ 00292 00293 class CShellBrowser : 00294 public CWindowImpl<CShellBrowser, CWindow, CControlWinTraits>, 00295 public CComObjectRootEx<CComMultiThreadModelNoCS>, 00296 public IShellBrowser, 00297 public IDropTarget, 00298 public IServiceProvider, 00299 public IProfferServiceImpl<CShellBrowser>, 00300 public IShellBrowserService, 00301 public IWebBrowser2, 00302 public ITravelLogClient, 00303 public IPersistHistory, 00304 public IDockingWindowSite, 00305 public IOleCommandTarget, 00306 public IBrowserService2, 00307 public IConnectionPointContainerImpl<CShellBrowser>, 00308 public MyIConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents2>, 00309 public MyIConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents> 00310 { 00311 private: 00312 class barInfo 00313 { 00314 public: 00315 RECT borderSpace; 00316 CComPtr<IUnknown> clientBar; 00317 HWND hwnd; 00318 }; 00319 static const int BIInternetToolbar = 0; 00320 static const int BIVerticalBaseBar = 1; 00321 static const int BIHorizontalBaseBar = 2; 00322 00323 HWND fCurrentShellViewWindow; // our currently hosted shell view window 00324 CComPtr<IShellFolder> fCurrentShellFolder; // 00325 CComPtr<IShellView> fCurrentShellView; // 00326 LPITEMIDLIST fCurrentDirectoryPIDL; // 00327 HWND fStatusBar; 00328 bool fStatusBarVisible; 00329 CToolbarProxy fToolbarProxy; 00330 barInfo fClientBars[3]; 00331 CComPtr<ITravelLog> fTravelLog; 00332 HMENU fCurrentMenuBar; 00333 CABINETSTATE fCabinetState; 00334 // The next three fields support persisted history for shell views. They do not need to be reference counted. 00335 IOleObject *fHistoryObject; 00336 IStream *fHistoryStream; 00337 IBindCtx *fHistoryBindContext; 00338 public: 00339 #if 0 00340 ULONG InternalAddRef() 00341 { 00342 OutputDebugString(_T("AddRef\n")); 00343 return CComObjectRootEx<CComMultiThreadModelNoCS>::InternalAddRef(); 00344 } 00345 ULONG InternalRelease() 00346 { 00347 OutputDebugString(_T("Release\n")); 00348 return CComObjectRootEx<CComMultiThreadModelNoCS>::InternalRelease(); 00349 } 00350 #endif 00351 00352 CShellBrowser(); 00353 ~CShellBrowser(); 00354 HRESULT Initialize(LPITEMIDLIST pidl, long b, long c, long d); 00355 public: 00356 HRESULT BrowseToPIDL(LPCITEMIDLIST pidl, long flags); 00357 HRESULT BrowseToPath(IShellFolder *newShellFolder, LPITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags); 00358 HRESULT GetMenuBand(REFIID riid, void **shellMenu); 00359 HRESULT GetBaseBar(bool vertical, IUnknown **theBaseBar); 00360 HRESULT ShowBand(const CLSID &classID, bool vertical); 00361 HRESULT NavigateToParent(); 00362 HRESULT DoFolderOptions(); 00363 static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 00364 void RepositionBars(); 00365 virtual WNDPROC GetWindowProc() 00366 { 00367 return WindowProc; 00368 } 00369 HRESULT FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments); 00370 HRESULT FireNavigateComplete(const wchar_t *newDirectory); 00371 HRESULT FireCommandStateChange(bool newState, int commandID); 00372 HRESULT FireCommandStateChangeAll(); 00373 HRESULT UpdateForwardBackState(); 00374 void UpdateGotoMenu(HMENU theMenu); 00375 void UpdateViewMenu(HMENU theMenu); 00376 00377 /* // *** IDockingWindowFrame methods *** 00378 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags); 00379 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags); 00380 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv); 00381 */ 00382 00383 // *** IDockingWindowSite methods *** 00384 virtual HRESULT STDMETHODCALLTYPE GetBorderDW(IUnknown* punkObj, LPRECT prcBorder); 00385 virtual HRESULT STDMETHODCALLTYPE RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); 00386 virtual HRESULT STDMETHODCALLTYPE SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); 00387 00388 // *** IOleCommandTarget methods *** 00389 virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); 00390 virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); 00391 00392 // *** IOleWindow methods *** 00393 virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); 00394 virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); 00395 00396 // *** IShellBrowser methods *** 00397 virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths); 00398 virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject); 00399 virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared); 00400 virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(LPCOLESTR pszStatusText); 00401 virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(BOOL fEnable); 00402 virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(MSG *pmsg, WORD wID); 00403 virtual HRESULT STDMETHODCALLTYPE BrowseObject(LPCITEMIDLIST pidl, UINT wFlags); 00404 virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(DWORD grfMode, IStream **ppStrm); 00405 virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND *lphwnd); 00406 virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret); 00407 virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(struct IShellView **ppshv); 00408 virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(struct IShellView *ppshv); 00409 virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags); 00410 00411 // *** IDropTarget methods *** 00412 virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); 00413 virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); 00414 virtual HRESULT STDMETHODCALLTYPE DragLeave(); 00415 virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); 00416 00417 // *** IServiceProvider methods *** 00418 virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); 00419 00420 // *** IShellBowserService methods *** 00421 virtual HRESULT STDMETHODCALLTYPE GetPropertyBag(long flags, REFIID riid, void **ppvObject); 00422 00423 // *** IDispatch methods *** 00424 virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); 00425 virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); 00426 virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); 00427 virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); 00428 00429 // *** IBrowserService methods *** 00430 virtual HRESULT STDMETHODCALLTYPE GetParentSite(IOleInPlaceSite **ppipsite); 00431 virtual HRESULT STDMETHODCALLTYPE SetTitle(IShellView *psv, LPCWSTR pszName); 00432 virtual HRESULT STDMETHODCALLTYPE GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName); 00433 virtual HRESULT STDMETHODCALLTYPE GetOleObject(IOleObject **ppobjv); 00434 virtual HRESULT STDMETHODCALLTYPE GetTravelLog(ITravelLog **pptl); 00435 virtual HRESULT STDMETHODCALLTYPE ShowControlWindow(UINT id, BOOL fShow); 00436 virtual HRESULT STDMETHODCALLTYPE IsControlWindowShown(UINT id, BOOL *pfShown); 00437 virtual HRESULT STDMETHODCALLTYPE IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags); 00438 virtual HRESULT STDMETHODCALLTYPE IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPCITEMIDLIST *ppidlOut); 00439 virtual HRESULT STDMETHODCALLTYPE DisplayParseError(HRESULT hres, LPCWSTR pwszPath); 00440 virtual HRESULT STDMETHODCALLTYPE NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF); 00441 virtual HRESULT STDMETHODCALLTYPE SetNavigateState(BNSTATE bnstate); 00442 virtual HRESULT STDMETHODCALLTYPE GetNavigateState(BNSTATE *pbnstate); 00443 virtual HRESULT STDMETHODCALLTYPE NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse); 00444 virtual HRESULT STDMETHODCALLTYPE UpdateWindowList(); 00445 virtual HRESULT STDMETHODCALLTYPE UpdateBackForwardState(); 00446 virtual HRESULT STDMETHODCALLTYPE SetFlags(DWORD dwFlags, DWORD dwFlagMask); 00447 virtual HRESULT STDMETHODCALLTYPE GetFlags(DWORD *pdwFlags); 00448 virtual HRESULT STDMETHODCALLTYPE CanNavigateNow( void); 00449 virtual HRESULT STDMETHODCALLTYPE GetPidl(LPCITEMIDLIST *ppidl); 00450 virtual HRESULT STDMETHODCALLTYPE SetReferrer(LPCITEMIDLIST pidl); 00451 virtual DWORD STDMETHODCALLTYPE GetBrowserIndex(); 00452 virtual HRESULT STDMETHODCALLTYPE GetBrowserByIndex(DWORD dwID, IUnknown **ppunk); 00453 virtual HRESULT STDMETHODCALLTYPE GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc); 00454 virtual HRESULT STDMETHODCALLTYPE SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor); 00455 virtual HRESULT STDMETHODCALLTYPE CacheOLEServer(IOleObject *pole); 00456 virtual HRESULT STDMETHODCALLTYPE GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut); 00457 virtual HRESULT STDMETHODCALLTYPE OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut); 00458 virtual HRESULT STDMETHODCALLTYPE GetPalette(HPALETTE *hpal); 00459 virtual HRESULT STDMETHODCALLTYPE RegisterWindow(BOOL fForceRegister, int swc); 00460 00461 // *** IBrowserService2 methods *** 00462 virtual LRESULT STDMETHODCALLTYPE WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 00463 virtual HRESULT STDMETHODCALLTYPE SetAsDefFolderSettings(); 00464 virtual HRESULT STDMETHODCALLTYPE GetViewRect(RECT *prc); 00465 virtual HRESULT STDMETHODCALLTYPE OnSize(WPARAM wParam); 00466 virtual HRESULT STDMETHODCALLTYPE OnCreate(struct tagCREATESTRUCTW *pcs); 00467 virtual LRESULT STDMETHODCALLTYPE OnCommand(WPARAM wParam, LPARAM lParam); 00468 virtual HRESULT STDMETHODCALLTYPE OnDestroy(); 00469 virtual LRESULT STDMETHODCALLTYPE OnNotify(struct tagNMHDR *pnm); 00470 virtual HRESULT STDMETHODCALLTYPE OnSetFocus(); 00471 virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivateBS(BOOL fActive); 00472 virtual HRESULT STDMETHODCALLTYPE ReleaseShellView(); 00473 virtual HRESULT STDMETHODCALLTYPE ActivatePendingView(); 00474 virtual HRESULT STDMETHODCALLTYPE CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd); 00475 virtual HRESULT STDMETHODCALLTYPE CreateBrowserPropSheetExt(REFIID riid, void **ppv); 00476 virtual HRESULT STDMETHODCALLTYPE GetViewWindow(HWND *phwndView); 00477 virtual HRESULT STDMETHODCALLTYPE GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd); 00478 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE PutBaseBrowserData( void); 00479 virtual HRESULT STDMETHODCALLTYPE InitializeTravelLog(ITravelLog *ptl, DWORD dw); 00480 virtual HRESULT STDMETHODCALLTYPE SetTopBrowser(); 00481 virtual HRESULT STDMETHODCALLTYPE Offline(int iCmd); 00482 virtual HRESULT STDMETHODCALLTYPE AllowViewResize(BOOL f); 00483 virtual HRESULT STDMETHODCALLTYPE SetActivateState(UINT u); 00484 virtual HRESULT STDMETHODCALLTYPE UpdateSecureLockIcon(int eSecureLock); 00485 virtual HRESULT STDMETHODCALLTYPE InitializeDownloadManager(); 00486 virtual HRESULT STDMETHODCALLTYPE InitializeTransitionSite(); 00487 virtual HRESULT STDMETHODCALLTYPE _Initialize(HWND hwnd, IUnknown *pauto); 00488 virtual HRESULT STDMETHODCALLTYPE _CancelPendingNavigationAsync( void); 00489 virtual HRESULT STDMETHODCALLTYPE _CancelPendingView(); 00490 virtual HRESULT STDMETHODCALLTYPE _MaySaveChanges(); 00491 virtual HRESULT STDMETHODCALLTYPE _PauseOrResumeView(BOOL fPaused); 00492 virtual HRESULT STDMETHODCALLTYPE _DisableModeless(); 00493 virtual HRESULT STDMETHODCALLTYPE _NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags); 00494 virtual HRESULT STDMETHODCALLTYPE _TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew); 00495 virtual HRESULT STDMETHODCALLTYPE _SwitchActivationNow(); 00496 virtual HRESULT STDMETHODCALLTYPE _ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut); 00497 virtual HRESULT STDMETHODCALLTYPE _SendChildren(HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam); 00498 virtual HRESULT STDMETHODCALLTYPE GetFolderSetData(struct tagFolderSetData *pfsd); 00499 virtual HRESULT STDMETHODCALLTYPE _OnFocusChange(UINT itb); 00500 virtual HRESULT STDMETHODCALLTYPE v_ShowHideChildWindows(BOOL fChildOnly); 00501 virtual UINT STDMETHODCALLTYPE _get_itbLastFocus(); 00502 virtual HRESULT STDMETHODCALLTYPE _put_itbLastFocus(UINT itbLastFocus); 00503 virtual HRESULT STDMETHODCALLTYPE _UIActivateView(UINT uState); 00504 virtual HRESULT STDMETHODCALLTYPE _GetViewBorderRect(RECT *prc); 00505 virtual HRESULT STDMETHODCALLTYPE _UpdateViewRectSize(); 00506 virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorder(UINT itb); 00507 virtual HRESULT STDMETHODCALLTYPE _ResizeView(); 00508 virtual HRESULT STDMETHODCALLTYPE _GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon); 00509 virtual IStream *STDMETHODCALLTYPE v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName); 00510 virtual LRESULT STDMETHODCALLTYPE ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); 00511 virtual HRESULT STDMETHODCALLTYPE SetAcceleratorMenu(HACCEL hacc); 00512 virtual int STDMETHODCALLTYPE _GetToolbarCount(); 00513 virtual LPTOOLBARITEM STDMETHODCALLTYPE _GetToolbarItem(int itb); 00514 virtual HRESULT STDMETHODCALLTYPE _SaveToolbars(IStream *pstm); 00515 virtual HRESULT STDMETHODCALLTYPE _LoadToolbars(IStream *pstm); 00516 virtual HRESULT STDMETHODCALLTYPE _CloseAndReleaseToolbars(BOOL fClose); 00517 virtual HRESULT STDMETHODCALLTYPE v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd); 00518 virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor); 00519 virtual UINT STDMETHODCALLTYPE _FindTBar(IUnknown *punkSrc); 00520 virtual HRESULT STDMETHODCALLTYPE _SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg); 00521 virtual HRESULT STDMETHODCALLTYPE v_MayTranslateAccelerator(MSG *pmsg); 00522 virtual HRESULT STDMETHODCALLTYPE _GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor); 00523 virtual HRESULT STDMETHODCALLTYPE v_CheckZoneCrossing(LPCITEMIDLIST pidl); 00524 00525 // *** IWebBrowser methods *** 00526 virtual HRESULT STDMETHODCALLTYPE GoBack(); 00527 virtual HRESULT STDMETHODCALLTYPE GoForward(); 00528 virtual HRESULT STDMETHODCALLTYPE GoHome(); 00529 virtual HRESULT STDMETHODCALLTYPE GoSearch(); 00530 virtual HRESULT STDMETHODCALLTYPE Navigate(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers); 00531 virtual HRESULT STDMETHODCALLTYPE Refresh(); 00532 virtual HRESULT STDMETHODCALLTYPE Refresh2(VARIANT *Level); 00533 virtual HRESULT STDMETHODCALLTYPE Stop(); 00534 virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppDisp); 00535 virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppDisp); 00536 virtual HRESULT STDMETHODCALLTYPE get_Container(IDispatch **ppDisp); 00537 virtual HRESULT STDMETHODCALLTYPE get_Document(IDispatch **ppDisp); 00538 virtual HRESULT STDMETHODCALLTYPE get_TopLevelContainer(VARIANT_BOOL *pBool); 00539 virtual HRESULT STDMETHODCALLTYPE get_Type(BSTR *Type); 00540 00541 // WIDL temp hack : when the interface contains 'long' WIDL writes it out as a 'LONG' 00542 // Setting the prototype to LONG in this class breaks building with MSVC so we use 00543 // the correct 'long' type here and temp hack it for WIDL generated prototypes. 00544 #ifdef __WIDL_EXDISP_H 00545 #define long LONG 00546 #endif 00547 virtual HRESULT STDMETHODCALLTYPE get_Left(long *pl); 00548 virtual HRESULT STDMETHODCALLTYPE put_Left(long Left); 00549 virtual HRESULT STDMETHODCALLTYPE get_Top(long *pl); 00550 virtual HRESULT STDMETHODCALLTYPE put_Top(long Top); 00551 virtual HRESULT STDMETHODCALLTYPE get_Width(long *pl); 00552 virtual HRESULT STDMETHODCALLTYPE put_Width(long Width); 00553 virtual HRESULT STDMETHODCALLTYPE get_Height(long *pl); 00554 virtual HRESULT STDMETHODCALLTYPE put_Height(long Height); 00555 #ifdef __WIDL_EXDISP_H 00556 #undef long 00557 #endif 00558 virtual HRESULT STDMETHODCALLTYPE get_LocationName(BSTR *LocationName); 00559 virtual HRESULT STDMETHODCALLTYPE get_LocationURL(BSTR *LocationURL); 00560 virtual HRESULT STDMETHODCALLTYPE get_Busy(VARIANT_BOOL *pBool); 00561 00562 // *** IWebBrowserApp methods *** 00563 virtual HRESULT STDMETHODCALLTYPE Quit(); 00564 virtual HRESULT STDMETHODCALLTYPE ClientToWindow(int *pcx, int *pcy); 00565 virtual HRESULT STDMETHODCALLTYPE PutProperty(BSTR Property, VARIANT vtValue); 00566 virtual HRESULT STDMETHODCALLTYPE GetProperty(BSTR Property, VARIANT *pvtValue); 00567 virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR *Name); 00568 virtual HRESULT STDMETHODCALLTYPE get_HWND(SHANDLE_PTR *pHWND); 00569 virtual HRESULT STDMETHODCALLTYPE get_FullName(BSTR *FullName); 00570 virtual HRESULT STDMETHODCALLTYPE get_Path(BSTR *Path); 00571 virtual HRESULT STDMETHODCALLTYPE get_Visible(VARIANT_BOOL *pBool); 00572 virtual HRESULT STDMETHODCALLTYPE put_Visible(VARIANT_BOOL Value); 00573 virtual HRESULT STDMETHODCALLTYPE get_StatusBar(VARIANT_BOOL *pBool); 00574 virtual HRESULT STDMETHODCALLTYPE put_StatusBar(VARIANT_BOOL Value); 00575 virtual HRESULT STDMETHODCALLTYPE get_StatusText(BSTR *StatusText); 00576 virtual HRESULT STDMETHODCALLTYPE put_StatusText(BSTR StatusText); 00577 virtual HRESULT STDMETHODCALLTYPE get_ToolBar(int *Value); 00578 virtual HRESULT STDMETHODCALLTYPE put_ToolBar(int Value); 00579 virtual HRESULT STDMETHODCALLTYPE get_MenuBar(VARIANT_BOOL *Value); 00580 virtual HRESULT STDMETHODCALLTYPE put_MenuBar(VARIANT_BOOL Value); 00581 virtual HRESULT STDMETHODCALLTYPE get_FullScreen(VARIANT_BOOL *pbFullScreen); 00582 virtual HRESULT STDMETHODCALLTYPE put_FullScreen(VARIANT_BOOL bFullScreen); 00583 00584 // *** IWebBrowser2 methods *** 00585 virtual HRESULT STDMETHODCALLTYPE Navigate2(VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers); 00586 virtual HRESULT STDMETHODCALLTYPE QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf); 00587 virtual HRESULT STDMETHODCALLTYPE ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); 00588 virtual HRESULT STDMETHODCALLTYPE ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize); 00589 virtual HRESULT STDMETHODCALLTYPE get_ReadyState(READYSTATE *plReadyState); 00590 virtual HRESULT STDMETHODCALLTYPE get_Offline(VARIANT_BOOL *pbOffline); 00591 virtual HRESULT STDMETHODCALLTYPE put_Offline(VARIANT_BOOL bOffline); 00592 virtual HRESULT STDMETHODCALLTYPE get_Silent(VARIANT_BOOL *pbSilent); 00593 virtual HRESULT STDMETHODCALLTYPE put_Silent(VARIANT_BOOL bSilent); 00594 virtual HRESULT STDMETHODCALLTYPE get_RegisterAsBrowser(VARIANT_BOOL *pbRegister); 00595 virtual HRESULT STDMETHODCALLTYPE put_RegisterAsBrowser(VARIANT_BOOL bRegister); 00596 virtual HRESULT STDMETHODCALLTYPE get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister); 00597 virtual HRESULT STDMETHODCALLTYPE put_RegisterAsDropTarget(VARIANT_BOOL bRegister); 00598 virtual HRESULT STDMETHODCALLTYPE get_TheaterMode(VARIANT_BOOL *pbRegister); 00599 virtual HRESULT STDMETHODCALLTYPE put_TheaterMode(VARIANT_BOOL bRegister); 00600 virtual HRESULT STDMETHODCALLTYPE get_AddressBar(VARIANT_BOOL *Value); 00601 virtual HRESULT STDMETHODCALLTYPE put_AddressBar(VARIANT_BOOL Value); 00602 virtual HRESULT STDMETHODCALLTYPE get_Resizable(VARIANT_BOOL *Value); 00603 virtual HRESULT STDMETHODCALLTYPE put_Resizable(VARIANT_BOOL Value); 00604 00605 // *** ITravelLogClient methods *** 00606 virtual HRESULT STDMETHODCALLTYPE FindWindowByIndex(DWORD dwID, IUnknown **ppunk); 00607 virtual HRESULT STDMETHODCALLTYPE GetWindowData(LPWINDOWDATA pWinData); 00608 virtual HRESULT STDMETHODCALLTYPE LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition); 00609 00610 // *** IPersist methods *** 00611 virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); 00612 00613 // *** IPersistHistory methods *** 00614 virtual HRESULT STDMETHODCALLTYPE LoadHistory(IStream *pStream, IBindCtx *pbc); 00615 virtual HRESULT STDMETHODCALLTYPE SaveHistory(IStream *pStream); 00616 virtual HRESULT STDMETHODCALLTYPE SetPositionCookie(DWORD dwPositioncookie); 00617 virtual HRESULT STDMETHODCALLTYPE GetPositionCookie(DWORD *pdwPositioncookie); 00618 00619 // *** IBrowserService2 methods *** 00620 00621 00622 // message handlers 00623 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 00624 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 00625 LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 00626 LRESULT RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 00627 LRESULT OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00628 LRESULT OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00629 LRESULT OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00630 LRESULT OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00631 LRESULT OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00632 LRESULT OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00633 LRESULT OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00634 LRESULT OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00635 LRESULT OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00636 LRESULT OnIsThisLegal(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00637 LRESULT OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00638 LRESULT OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00639 LRESULT OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00640 LRESULT OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00641 LRESULT OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00642 LRESULT OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00643 LRESULT OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00644 LRESULT OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); 00645 LRESULT RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); 00646 00647 static ATL::CWndClassInfo& GetWndClassInfo() 00648 { 00649 static ATL::CWndClassInfo wc = 00650 { 00651 { sizeof(WNDCLASSEX), CS_DBLCLKS, StartWindowProc, 00652 0, 0, NULL, LoadIcon(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET)), 00653 LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), NULL, szCabinetWndClass, NULL }, 00654 NULL, NULL, IDC_ARROW, TRUE, 0, _T("") 00655 }; 00656 return wc; 00657 } 00658 00659 BEGIN_MSG_MAP(CShellBrowser) 00660 MESSAGE_HANDLER(WM_DESTROY, OnDestroy) 00661 MESSAGE_HANDLER(WM_SIZE, OnSize) 00662 MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup) 00663 MESSAGE_HANDLER(WM_MEASUREITEM, RelayMsgToShellView) 00664 MESSAGE_HANDLER(WM_DRAWITEM, RelayMsgToShellView) 00665 MESSAGE_HANDLER(WM_MENUSELECT, RelayMsgToShellView) 00666 COMMAND_ID_HANDLER(IDM_FILE_CLOSE, OnClose) 00667 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS, OnFolderOptions) 00668 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE, OnMapNetworkDrive) 00669 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE, OnDisconnectNetworkDrive) 00670 COMMAND_ID_HANDLER(IDM_HELP_ABOUT, OnAboutReactOS) 00671 COMMAND_ID_HANDLER(IDM_GOTO_BACK, OnGoBack) 00672 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD, OnGoForward) 00673 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL, OnGoUpLevel) 00674 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE, OnGoHome) 00675 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL, OnIsThisLegal) 00676 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR, OnToggleStatusBarVisible) 00677 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS, OnToggleToolbarLock) 00678 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS, OnToggleToolbarBandVisible) 00679 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR, OnToggleAddressBandVisible) 00680 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR, OnToggleLinksBandVisible) 00681 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS, OnToggleTextLabels) 00682 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE, OnToolbarCustomize) 00683 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, OnGoTravel) 00684 MESSAGE_HANDLER(WM_COMMAND, RelayCommands) 00685 END_MSG_MAP() 00686 00687 BEGIN_CONNECTION_POINT_MAP(CShellBrowser) 00688 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2) 00689 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents) 00690 END_CONNECTION_POINT_MAP() 00691 00692 BEGIN_COM_MAP(CShellBrowser) 00693 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite) 00694 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) 00695 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDockingWindowSite) 00696 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser, IShellBrowser) 00697 COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget) 00698 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) 00699 COM_INTERFACE_ENTRY_IID(IID_IProfferService, IProfferService) 00700 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService, IShellBrowserService) 00701 COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) 00702 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer, IConnectionPointContainer) 00703 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser, IWebBrowser) 00704 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp, IWebBrowserApp) 00705 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2, IWebBrowser2) 00706 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient, ITravelLogClient) 00707 COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) 00708 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory, IPersistHistory) 00709 COM_INTERFACE_ENTRY_IID(IID_IBrowserService, IBrowserService) 00710 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2, IBrowserService2) 00711 END_COM_MAP() 00712 }; 00713 00714 extern HRESULT CreateProgressDialog(REFIID riid, void **ppv); 00715 00716 CShellBrowser::CShellBrowser() 00717 { 00718 int x; 00719 00720 fCurrentShellViewWindow = NULL; 00721 fCurrentDirectoryPIDL = NULL; 00722 fStatusBar = NULL; 00723 fStatusBarVisible = true; 00724 for (x = 0; x < 3; x++) 00725 fClientBars[x].hwnd = NULL; 00726 fCurrentMenuBar = NULL; 00727 fHistoryObject = NULL; 00728 fHistoryStream = NULL; 00729 fHistoryBindContext = NULL; 00730 } 00731 00732 CShellBrowser::~CShellBrowser() 00733 { 00734 } 00735 00736 HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, long b, long c, long d) 00737 { 00738 CComPtr<IDockingWindow> dockingWindow; 00739 CComPtr<IStream> settingsStream; 00740 CComPtr<IPersistStreamInit> persistStreamInit; 00741 CComPtr<IOleCommandTarget> commandTarget; 00742 CComPtr<IObjectWithSite> objectSite; 00743 RECT bounds = {0, 0, 800, 591}; 00744 HRESULT hResult; 00745 00746 _AtlInitialConstruct(); 00747 00748 fCabinetState.cLength = sizeof(fCabinetState); 00749 if (ReadCabinetState(&fCabinetState, sizeof(fCabinetState)) == FALSE) 00750 { 00751 } 00752 00753 Create(HWND_DESKTOP, bounds, NULL, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0U); 00754 if (m_hWnd == NULL) 00755 return E_FAIL; 00756 00757 #if 0 00758 hResult = CoCreateInstance(CLSID_InternetToolbar, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&fClientBars[BIInternetToolbar].clientBar); 00759 if (FAILED(hResult)) 00760 return hResult; 00761 #else 00762 hResult = CreateInternetToolbar(IID_IUnknown, (void **)&fClientBars[BIInternetToolbar].clientBar); 00763 if (FAILED(hResult)) 00764 return hResult; 00765 #endif 00766 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); 00767 if (FAILED(hResult)) 00768 return hResult; 00769 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IPersistStreamInit, (void **)&persistStreamInit); 00770 if (FAILED(hResult)) 00771 return hResult; 00772 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 00773 if (FAILED(hResult)) 00774 return hResult; 00775 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IObjectWithSite, (void **)&objectSite); 00776 if (FAILED(hResult)) 00777 return hResult; 00778 hResult = objectSite->SetSite((IShellBrowser *)this); 00779 if (FAILED(hResult)) 00780 return hResult; 00781 hResult = commandTarget->Exec(&CGID_PrivCITCommands, 1, 1 /* or 0 */, NULL, NULL); 00782 if (FAILED(hResult)) 00783 return hResult; 00784 // TODO: create settingsStream from registry entry 00785 if (settingsStream.p == NULL) 00786 { 00787 hResult = persistStreamInit->InitNew(); 00788 if (FAILED(hResult)) 00789 return hResult; 00790 } 00791 else 00792 { 00793 hResult = persistStreamInit->Load(settingsStream); 00794 if (FAILED(hResult)) 00795 return hResult; 00796 } 00797 hResult = dockingWindow->ShowDW(TRUE); 00798 if (FAILED(hResult)) 00799 return hResult; 00800 00801 fToolbarProxy.Initialize(m_hWnd, fClientBars[BIInternetToolbar].clientBar); 00802 00803 fStatusBar = CreateWindow(STATUSCLASSNAMEW, _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | 00804 SBT_NOBORDERS | SBT_TOOLTIPS, 0, 0, 500, 20, m_hWnd, (HMENU)0xa001, _AtlBaseModule.GetModuleInstance(), 0); 00805 fStatusBarVisible = true; 00806 00807 LPITEMIDLIST desktopPIDL; 00808 FOLDERSETTINGS newFolderSettings; 00809 00810 hResult = SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &desktopPIDL); 00811 if (FAILED(hResult)) 00812 return hResult; 00813 newFolderSettings.ViewMode = FVM_LIST; 00814 newFolderSettings.fFlags = 0; 00815 hResult = BrowseToPIDL(desktopPIDL, BTP_UPDATE_NEXT_HISTORY); 00816 ILFree(desktopPIDL); 00817 if (FAILED (hResult)) 00818 return hResult; 00819 00820 ShowWindow(SW_SHOWNORMAL); 00821 00822 00823 00824 00825 // test code to make brand band animate 00826 { 00827 CComPtr<IOleCommandTarget> oleCommandTarget; 00828 CComPtr<IServiceProvider> serviceProvider; 00829 CComPtr<IBandSite> bandSite; 00830 CComPtr<IDeskBand> deskBand; 00831 CComPtr<IWinEventHandler> winEventHandler; 00832 HRESULT hResult; 00833 00834 if (fClientBars[BIInternetToolbar].clientBar.p == NULL) 00835 return 0; 00836 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 00837 hResult = serviceProvider->QueryService(SID_IBandSite, IID_IBandSite, (void **)&bandSite); 00838 hResult = bandSite->QueryBand(5, &deskBand, NULL, NULL, 0); 00839 deskBand->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); 00840 winEventHandler->IsWindowOwner(NULL); 00841 deskBand->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); 00842 oleCommandTarget->QueryStatus(&CGID_BrandCmdGroup, 0, NULL, NULL); 00843 oleCommandTarget->Exec(&CGID_BrandCmdGroup, BBID_STARTANIMATION, 0, NULL, NULL); 00844 } 00845 00846 00847 00848 00849 return S_OK; 00850 } 00851 00852 HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags) 00853 { 00854 CComPtr<IShellFolder> newFolder; 00855 FOLDERSETTINGS newFolderSettings; 00856 HRESULT hResult; 00857 00858 // called by shell view to browse to new folder 00859 // also called by explorer band to navigate to new folder 00860 hResult = SHBindToFolder((LPITEMIDLIST)pidl, &newFolder); 00861 newFolderSettings.ViewMode = FVM_LIST; 00862 newFolderSettings.fFlags = 0; 00863 hResult = BrowseToPath(newFolder, (LPITEMIDLIST)pidl, &newFolderSettings, flags); 00864 if (FAILED (hResult)) 00865 return hResult; 00866 return S_OK; 00867 } 00868 00869 BOOL WINAPI _ILIsDesktop(LPCITEMIDLIST pidl) 00870 { 00871 return (pidl == NULL || pidl->mkid.cb == 0); 00872 } 00873 00874 BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl) 00875 { 00876 LPCITEMIDLIST pidlnext; 00877 WORD length; 00878 BOOL ret; 00879 00880 ret = TRUE; 00881 if (! _ILIsDesktop(pidl)) 00882 { 00883 length = pidl->mkid.cb; 00884 pidlnext = (LPCITEMIDLIST)(((LPBYTE)pidl) + length); 00885 if (pidlnext->mkid.cb != 0) 00886 ret = FALSE; 00887 } 00888 return ret; 00889 } 00890 00891 HRESULT WINAPI SHBindToFolderIDListParent(IShellFolder *unused, LPCITEMIDLIST pidl, const IID *riid, LPVOID *ppv, LPITEMIDLIST *ppidlLast) 00892 { 00893 CComPtr<IShellFolder> psf; 00894 LPITEMIDLIST pidlChild; 00895 LPITEMIDLIST pidlParent; 00896 HRESULT hResult; 00897 00898 hResult = E_FAIL; 00899 if (ppv == NULL) 00900 return E_POINTER; 00901 *ppv = NULL; 00902 if (ppidlLast != NULL) 00903 *ppidlLast = NULL; 00904 if (_ILIsPidlSimple(pidl)) 00905 { 00906 if (ppidlLast != NULL) 00907 *ppidlLast = ILClone(pidl); 00908 hResult = SHGetDesktopFolder((IShellFolder **)ppv); 00909 } 00910 else 00911 { 00912 pidlChild = ILClone(ILFindLastID(pidl)); 00913 pidlParent = ILClone(pidl); 00914 ILRemoveLastID(pidlParent); 00915 hResult = SHGetDesktopFolder(&psf); 00916 if (SUCCEEDED(hResult)) 00917 hResult = psf->BindToObject(pidlParent, NULL, *riid, ppv); 00918 if (SUCCEEDED(hResult) && ppidlLast != NULL) 00919 *ppidlLast = pidlChild; 00920 else 00921 ILFree(pidlChild); 00922 ILFree(pidlParent); 00923 } 00924 return hResult; 00925 } 00926 00927 HRESULT IEGetNameAndFlagsEx(LPITEMIDLIST pidl, SHGDNF uFlags, long param10, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut) 00928 { 00929 CComPtr<IShellFolder> parentFolder; 00930 LPITEMIDLIST childPIDL; 00931 STRRET L108; 00932 HRESULT hResult; 00933 00934 hResult = SHBindToFolderIDListParent(NULL, pidl, &IID_IShellFolder, (void **)&parentFolder, &childPIDL); 00935 hResult = parentFolder->GetDisplayNameOf(childPIDL, uFlags, &L108); 00936 StrRetToBufW(&L108, childPIDL, pszBuf, cchBuf); 00937 if (rgfInOut) 00938 hResult = parentFolder->GetAttributesOf(1, (LPCITEMIDLIST *)&childPIDL, rgfInOut); 00939 ILFree(childPIDL); 00940 return S_OK; 00941 } 00942 00943 long IEGetNameAndFlags(LPITEMIDLIST pidl, SHGDNF uFlags, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut) 00944 { 00945 return IEGetNameAndFlagsEx(pidl, uFlags, 0, pszBuf, cchBuf, rgfInOut); 00946 } 00947 00948 HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder, LPITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags) 00949 { 00950 CComPtr<IOleCommandTarget> oleCommandTarget; 00951 CComPtr<IObjectWithSite> objectWithSite; 00952 CComPtr<IShellFolder> saveCurrentShellFolder; 00953 CComPtr<IShellView> saveCurrentShellView; 00954 CComPtr<IShellView> newShellView; 00955 CComPtr<ITravelLog> travelLog; 00956 HWND newShellViewWindow; 00957 BOOL windowUpdateIsLocked; 00958 RECT shellViewWindowBounds; 00959 HWND previousView; 00960 HCURSOR saveCursor; 00961 wchar_t newTitle[MAX_PATH]; 00962 SHGDNF nameFlags; 00963 HRESULT hResult; 00964 00965 if (newShellFolder == NULL) 00966 return E_INVALIDARG; 00967 hResult = GetTravelLog(&travelLog); 00968 if (FAILED (hResult)) 00969 return hResult; 00970 if (flags & BTP_UPDATE_CUR_HISTORY) 00971 { 00972 if (travelLog->CountEntries((IDropTarget *)this) > 0) 00973 hResult = travelLog->UpdateEntry((IDropTarget *)this, FALSE); 00974 // what to do with error? Do we want to halt browse because state save failed? 00975 } 00976 hResult = newShellFolder->CreateViewObject(m_hWnd, IID_IShellView, (void **)&newShellView); 00977 if (FAILED (hResult)) 00978 return hResult; 00979 previousView = fCurrentShellViewWindow; 00980 saveCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); 00981 windowUpdateIsLocked = LockWindowUpdate(TRUE); 00982 if (fCurrentShellView != NULL) 00983 ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 0, 0); 00984 hResult = newShellView->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite); 00985 if (SUCCEEDED(hResult) && objectWithSite.p != NULL) 00986 hResult = objectWithSite->SetSite((IDropTarget *)this); 00987 saveCurrentShellFolder = fCurrentShellFolder; 00988 saveCurrentShellView = fCurrentShellView; 00989 fCurrentShellFolder = newShellFolder; 00990 fCurrentShellView = newShellView; 00991 if (previousView != NULL) 00992 ::GetWindowRect(previousView, &shellViewWindowBounds); 00993 else 00994 memset(&shellViewWindowBounds, 0, sizeof(shellViewWindowBounds)); 00995 ::MapWindowPoints(0, m_hWnd, (POINT *)&shellViewWindowBounds, 2); 00996 hResult = newShellView->CreateViewWindow(saveCurrentShellView, folderSettings, this, &shellViewWindowBounds, &newShellViewWindow); 00997 if (FAILED (hResult) || newShellViewWindow == NULL) 00998 { 00999 fCurrentShellView = saveCurrentShellView; 01000 fCurrentShellFolder = saveCurrentShellFolder; 01001 ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 1, 0); 01002 if (windowUpdateIsLocked) 01003 LockWindowUpdate(FALSE); 01004 SetCursor(saveCursor); 01005 return hResult; 01006 } 01007 if (objectWithSite.p != NULL) 01008 hResult = objectWithSite->SetSite(NULL); 01009 ILFree(fCurrentDirectoryPIDL); 01010 fCurrentDirectoryPIDL = ILClone(absolutePIDL); 01011 if (saveCurrentShellView != NULL) 01012 saveCurrentShellView->DestroyViewWindow(); 01013 fCurrentShellViewWindow = newShellViewWindow; 01014 oleCommandTarget.Release(); 01015 hResult = newShellView->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); 01016 saveCurrentShellView.Release(); 01017 saveCurrentShellFolder.Release(); 01018 hResult = newShellView->UIActivate(SVUIA_ACTIVATE_FOCUS); 01019 if (windowUpdateIsLocked) 01020 LockWindowUpdate(FALSE); 01021 SetCursor(saveCursor); 01022 if (flags & BTP_UPDATE_NEXT_HISTORY) 01023 { 01024 hResult = travelLog->AddEntry((IDropTarget *)this, FALSE); 01025 hResult = travelLog->UpdateEntry((IDropTarget *)this, FALSE); 01026 } 01027 FireNavigateComplete(L"c:\\temp"); // TODO: use real path here 01028 if (fCabinetState.fFullPathTitle) 01029 nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING; 01030 else 01031 nameFlags = SHGDN_FORADDRESSBAR; 01032 hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle, sizeof(newTitle) / sizeof(wchar_t), NULL); 01033 if (SUCCEEDED(hResult)) 01034 SetWindowText(newTitle); 01035 // TODO: Update the window icon 01036 FireCommandStateChangeAll(); 01037 hResult = UpdateForwardBackState(); 01038 return S_OK; 01039 } 01040 01041 HRESULT CShellBrowser::GetMenuBand(REFIID riid, void **shellMenu) 01042 { 01043 CComPtr<IServiceProvider> serviceProvider; 01044 CComPtr<IBandSite> bandSite; 01045 CComPtr<IDeskBand> deskBand; 01046 HRESULT hResult; 01047 01048 if (fClientBars[BIInternetToolbar].clientBar.p == NULL) 01049 return E_FAIL; 01050 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); 01051 if (FAILED(hResult)) 01052 return hResult; 01053 hResult = serviceProvider->QueryService(SID_IBandSite, IID_IBandSite, (void **)&bandSite); 01054 if (FAILED(hResult)) 01055 return hResult; 01056 hResult = bandSite->QueryBand(1, &deskBand, NULL, NULL, 0); 01057 if (FAILED(hResult)) 01058 return hResult; 01059 return deskBand->QueryInterface(riid, shellMenu); 01060 } 01061 01062 HRESULT CShellBrowser::GetBaseBar(bool vertical, IUnknown **theBaseBar) 01063 { 01064 CComPtr<IUnknown> newBaseBar; 01065 CComPtr<IDeskBar> deskBar; 01066 CComPtr<IUnknown> newBaseBarSite; 01067 CComPtr<IObjectWithSite> objectWithSite; 01068 CComPtr<IDeskBarClient> deskBarClient; 01069 IUnknown **cache; 01070 HRESULT hResult; 01071 01072 if (vertical) 01073 cache = &fClientBars[BIVerticalBaseBar].clientBar.p; 01074 else 01075 cache = &fClientBars[BIHorizontalBaseBar].clientBar.p; 01076 if (*cache == NULL) 01077 { 01078 hResult = CreateBaseBar(IID_IUnknown, (void **)&newBaseBar); 01079 if (FAILED(hResult)) 01080 return hResult; 01081 hResult = CreateBaseBarSite(IID_IUnknown, (void **)&newBaseBarSite); 01082 if (FAILED(hResult)) 01083 return hResult; 01084 01085 // tell the new base bar about the shell browser 01086 hResult = newBaseBar->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite); 01087 if (FAILED(hResult)) 01088 return hResult; 01089 hResult = objectWithSite->SetSite((IDropTarget *)this); 01090 if (FAILED(hResult)) 01091 return hResult; 01092 01093 // tell the new base bar about the new base bar site 01094 hResult = newBaseBar->QueryInterface(IID_IDeskBar, (void **)&deskBar); 01095 if (FAILED(hResult)) 01096 return hResult; 01097 hResult = deskBar->SetClient(newBaseBarSite); 01098 if (FAILED(hResult)) 01099 return hResult; 01100 01101 // tell the new base bar site about the new base bar 01102 hResult = newBaseBarSite->QueryInterface(IID_IDeskBarClient, (void **)&deskBarClient); 01103 if (FAILED(hResult)) 01104 return hResult; 01105 hResult = deskBarClient->SetDeskBarSite(newBaseBar); 01106 if (FAILED(hResult)) 01107 return hResult; 01108 01109 *cache = newBaseBar.Detach(); 01110 } 01111 return (*cache)->QueryInterface(IID_IUnknown, (void **)theBaseBar); 01112 } 01113 01114 HRESULT CShellBrowser::ShowBand(const CLSID &classID, bool vertical) 01115 { 01116 CComPtr<IDockingWindow> dockingWindow; 01117 CComPtr<IOleCommandTarget> oleCommandTarget; 01118 CComPtr<IUnknown> baseBarSite; 01119 CComPtr<IUnknown> newBand; 01120 CComPtr<IUnknown> theBaseBar; 01121 CComPtr<IDeskBar> deskBar; 01122 VARIANT vaIn; 01123 HRESULT hResult; 01124 01125 hResult = GetBaseBar(vertical, (IUnknown **)&theBaseBar); 01126 if (FAILED(hResult)) 01127 return hResult; 01128 hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&newBand); 01129 if (FAILED(hResult)) 01130 return hResult; 01131 hResult = theBaseBar->QueryInterface(IID_IDeskBar, (void **)&deskBar); 01132 if (FAILED(hResult)) 01133 return hResult; 01134 hResult = deskBar->GetClient(&baseBarSite); 01135 if (FAILED(hResult)) 01136 return hResult; 01137 hResult = theBaseBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); 01138 if (FAILED(hResult)) 01139 return hResult; 01140 hResult = baseBarSite->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); 01141 if (FAILED(hResult)) 01142 return hResult; 01143 V_VT(&vaIn) = VT_UNKNOWN; 01144 V_UNKNOWN(&vaIn) = newBand.p; 01145 hResult = oleCommandTarget->Exec(&CGID_IDeskBand, 1, 1, &vaIn, NULL); 01146 if (FAILED(hResult)) 01147 return hResult; 01148 hResult = dockingWindow->ShowDW(TRUE); 01149 if (FAILED(hResult)) 01150 return hResult; 01151 return S_OK; 01152 } 01153 01154 HRESULT CShellBrowser::NavigateToParent() 01155 { 01156 LPITEMIDLIST newDirectory; 01157 HRESULT hResult; 01158 01159 newDirectory = ILClone(fCurrentDirectoryPIDL); 01160 if (newDirectory == NULL) 01161 return E_OUTOFMEMORY; 01162 ILRemoveLastID(newDirectory); 01163 hResult = BrowseToPIDL((LPITEMIDLIST)newDirectory, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY); 01164 ILFree(newDirectory); 01165 if (FAILED (hResult)) 01166 return hResult; 01167 return S_OK; 01168 } 01169 01170 BOOL CALLBACK AddFolderOptionsPage(HPROPSHEETPAGE thePage, LPARAM lParam) 01171 { 01172 PROPSHEETHEADER *sheetInfo; 01173 01174 sheetInfo = (PROPSHEETHEADER *)lParam; 01175 if (sheetInfo->nPages >= folderOptionsPageCountMax) 01176 return FALSE; 01177 sheetInfo->phpage[sheetInfo->nPages] = thePage; 01178 sheetInfo->nPages++; 01179 return TRUE; 01180 } 01181 01182 HRESULT CShellBrowser::DoFolderOptions() 01183 { 01184 CComPtr<IShellPropSheetExt> folderOptionsSheet; 01185 CComPtr<IObjectWithSite> objectWithSite; 01186 PROPSHEETHEADER m_PropSheet; 01187 HPROPSHEETPAGE m_psp[folderOptionsPageCountMax]; 01188 // CComPtr<IGlobalFolderSettings> globalSettings; 01189 // SHELLSTATE2 shellState; 01190 HRESULT hResult; 01191 01192 memset(m_psp, 0, sizeof(m_psp)); 01193 memset(&m_PropSheet, 0, sizeof(m_PropSheet)); 01194 01195 hResult = CoCreateInstance(CLSID_ShellFldSetExt, NULL, CLSCTX_INPROC_SERVER, IID_IShellPropSheetExt, (void **)&folderOptionsSheet); 01196 if (FAILED(hResult)) 01197 return E_FAIL; 01198 // must set site in order for Apply to all Folders on Advanced page to be enabled 01199 hResult = folderOptionsSheet->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite); 01200 if (SUCCEEDED(hResult) && objectWithSite.p != NULL) 01201 hResult = objectWithSite->SetSite((IDispatch *)this); 01202 m_PropSheet.phpage = m_psp; 01203 #if 0 01204 hResult = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER, IID_IGlobalFolderSettings, (void **)&globalSettings); 01205 if (FAILED(hResult)) 01206 return E_FAIL; 01207 hResult = globalSettings->Get(&shellState, sizeof(shellState)); 01208 if (FAILED(hResult)) 01209 return E_FAIL; 01210 #endif 01211 hResult = folderOptionsSheet->AddPages(AddFolderOptionsPage, (LPARAM)&m_PropSheet); 01212 if (FAILED(hResult)) 01213 return E_FAIL; 01214 if (fCurrentShellView != NULL) 01215 { 01216 hResult = fCurrentShellView->AddPropertySheetPages( 0, AddFolderOptionsPage, (LPARAM)&m_PropSheet); 01217 if (FAILED(hResult)) 01218 return E_FAIL; 01219 } 01220 01221 m_PropSheet.dwSize = sizeof(PROPSHEETHEADER); 01222 m_PropSheet.dwFlags = 0; 01223 m_PropSheet.hwndParent = m_hWnd; 01224 m_PropSheet.hInstance = _AtlBaseModule.GetResourceInstance(); 01225 m_PropSheet.pszCaption = _T("Folder Options"); 01226 m_PropSheet.nStartPage = 0; 01227 01228 PropertySheet(&m_PropSheet); 01229 return S_OK; 01230 } 01231 01232 LRESULT CALLBACK CShellBrowser::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 01233 { 01234 CShellBrowser *pThis = reinterpret_cast<CShellBrowser *>(hWnd); 01235 _ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam); 01236 LRESULT lResult; 01237 CComPtr<IMenuBand> menuBand; 01238 const _ATL_MSG *previousMessage; 01239 BOOL handled; 01240 WNDPROC saveWindowProc; 01241 HRESULT hResult; 01242 01243 hWnd = pThis->m_hWnd; 01244 previousMessage = pThis->m_pCurrentMsg; 01245 pThis->m_pCurrentMsg = &msg; 01246 01247 hResult = pThis->GetMenuBand(IID_IMenuBand, (void **)&menuBand); 01248 if (SUCCEEDED(hResult) && menuBand.p != NULL) 01249 { 01250 hResult = menuBand->TranslateMenuMessage(&msg, &lResult); 01251 if (hResult == S_OK) 01252 return lResult; 01253 uMsg = msg.message; 01254 wParam = msg.wParam; 01255 lParam = msg.lParam; 01256 } 01257 01258 handled = pThis->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0); 01259 ATLASSERT(pThis->m_pCurrentMsg == &msg); 01260 if (handled == FALSE) 01261 { 01262 if (uMsg == WM_NCDESTROY) 01263 { 01264 saveWindowProc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC); 01265 lResult = pThis->DefWindowProc(uMsg, wParam, lParam); 01266 if (saveWindowProc == (WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC)) 01267 SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc); 01268 pThis->m_dwState |= WINSTATE_DESTROYED; 01269 } 01270 else 01271 lResult = pThis->DefWindowProc(uMsg, wParam, lParam); 01272 } 01273 pThis->m_pCurrentMsg = previousMessage; 01274 if (previousMessage == NULL && (pThis->m_dwState & WINSTATE_DESTROYED) != 0) 01275 { 01276 pThis->m_dwState &= ~WINSTATE_DESTROYED; 01277 pThis->m_hWnd = NULL; 01278 pThis->OnFinalMessage(hWnd); 01279 } 01280 return lResult; 01281 } 01282 01283 void CShellBrowser::RepositionBars() 01284 { 01285 RECT clientRect; 01286 RECT statusRect; 01287 RECT toolbarRect; 01288 int x; 01289 HRESULT hResult; 01290 01291 GetClientRect(&clientRect); 01292 01293 if (fStatusBarVisible) 01294 { 01295 ::GetWindowRect(fStatusBar, &statusRect); 01296 ::SetWindowPos(fStatusBar, NULL, clientRect.left, clientRect.bottom - (statusRect.bottom - statusRect.top), 01297 clientRect.right - clientRect.left, 01298 statusRect.bottom - statusRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER); 01299 clientRect.bottom -= statusRect.bottom - statusRect.top; 01300 } 01301 01302 for (x = 0; x < 3; x++) 01303 { 01304 CComPtr<IOleWindow> oleWindow; 01305 01306 if (fClientBars[x].hwnd == NULL && fClientBars[x].clientBar != NULL) 01307 { 01308 hResult = fClientBars[x].clientBar->QueryInterface(IID_IOleWindow, (void **)&oleWindow); 01309 if (SUCCEEDED(hResult)) 01310 hResult = oleWindow->GetWindow(&fClientBars[x].hwnd); 01311 } 01312 if (fClientBars[x].hwnd != NULL) 01313 { 01314 toolbarRect = clientRect; 01315 if (fClientBars[x].borderSpace.top != 0) 01316 toolbarRect.bottom = toolbarRect.top + fClientBars[x].borderSpace.top; 01317 else if (fClientBars[x].borderSpace.bottom != 0) 01318 toolbarRect.top = toolbarRect.bottom - fClientBars[x].borderSpace.bottom; 01319 if (fClientBars[x].borderSpace.left != 0) 01320 toolbarRect.right = toolbarRect.left + fClientBars[x].borderSpace.left; 01321 else if (fClientBars[x].borderSpace.right != 0) 01322 toolbarRect.left = toolbarRect.right - fClientBars[x].borderSpace.right; 01323 ::SetWindowPos(fClientBars[x].hwnd, NULL, toolbarRect.left, toolbarRect.top, 01324 toolbarRect.right - toolbarRect.left, 01325 toolbarRect.bottom - toolbarRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER); 01326 clientRect.top += fClientBars[x].borderSpace.top; 01327 clientRect.left += fClientBars[x].borderSpace.left; 01328 clientRect.bottom += fClientBars[x].borderSpace.bottom; 01329 clientRect.right += fClientBars[x].borderSpace.right; 01330 } 01331 } 01332 ::SetWindowPos(fCurrentShellViewWindow, NULL, clientRect.left, clientRect.top, 01333 clientRect.right - clientRect.left, 01334 clientRect.bottom - clientRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER); 01335 } 01336 01337 HRESULT CShellBrowser::FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments) 01338 { 01339 DISPPARAMS params; 01340 CComDynamicUnkArray &vec = IConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents2>::m_vec; 01341 CComDynamicUnkArray &vec2 = IConnectionPointImpl<CShellBrowser, &DIID_DWebBrowserEvents>::m_vec; 01342 HRESULT hResult; 01343 01344 params.rgvarg = arguments; 01345 params.rgdispidNamedArgs = NULL; 01346 params.cArgs = argCount; 01347 params.cNamedArgs = 0; 01348 IUnknown** pp = vec.begin(); 01349 while (pp < vec.end()) 01350 { 01351 if (*pp != NULL) 01352 { 01353 CComPtr<IDispatch> theDispatch; 01354 01355 hResult = (*pp)->QueryInterface(IID_IDispatch, (void **)&theDispatch); 01356 hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL); 01357 } 01358 pp++; 01359 } 01360 pp = vec2.begin(); 01361 while (pp < vec2.end()) 01362 { 01363 if (*pp != NULL) 01364 { 01365 CComPtr<IDispatch> theDispatch; 01366 01367 hResult = (*pp)->QueryInterface(IID_IDispatch, (void **)&theDispatch); 01368 hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL); 01369 } 01370 pp++; 01371 } 01372 return S_OK; 01373 } 01374 01375 HRESULT CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory) 01376 { 01377 // these two variants intentionally to do use CComVariant because it would double free/release 01378 // or does not need to dispose at all 01379 VARIANT varArg[2]; 01380 VARIANT varArgs; 01381 CComBSTR tempString(newDirectory); 01382 01383 V_VT(&varArgs) = VT_BSTR; 01384 V_BSTR(&varArgs) = tempString.m_str; 01385 01386 V_VT(&varArg[0]) = VT_VARIANT | VT_BYREF; 01387 V_VARIANTREF(&varArg[0]) = &varArgs; 01388 V_VT(&varArg[1]) = VT_DISPATCH; 01389 V_DISPATCH(&varArg[1]) = (IDispatch *)this; 01390 01391 return FireEvent(DISPID_NAVIGATECOMPLETE2, 2, varArg); 01392 } 01393 01394 HRESULT CShellBrowser::FireCommandStateChange(bool newState, int commandID) 01395 { 01396 VARIANT varArg[2]; 01397 01398 V_VT(&varArg[0]) = VT_BOOL; 01399 V_BOOL(&varArg[0]) = newState ? VARIANT_TRUE : VARIANT_FALSE; 01400 V_VT(&varArg[1]) = VT_I4; 01401 V_I4(&varArg[1]) = commandID; 01402 01403 return FireEvent(DISPID_COMMANDSTATECHANGE, 2, varArg); 01404 } 01405 01406 HRESULT CShellBrowser::FireCommandStateChangeAll() 01407 { 01408 return FireCommandStateChange(false, -1); 01409 } 01410 01411 HRESULT CShellBrowser::UpdateForwardBackState() 01412 { 01413 CComPtr<ITravelLog> travelLog; 01414 CComPtr<ITravelEntry> unusedEntry; 01415 bool canGoBack; 01416 bool canGoForward; 01417 HRESULT hResult; 01418 01419 canGoBack = false; 01420 canGoForward = false; 01421 hResult = GetTravelLog(&travelLog); 01422 if (FAILED (hResult)) 01423 return hResult; 01424 hResult = travelLog->GetTravelEntry((IDropTarget *)this, TLOG_BACK, &unusedEntry); 01425 if (SUCCEEDED(hResult)) 01426 { 01427 canGoBack = true; 01428 unusedEntry.Release(); 01429 } 01430 hResult = travelLog->GetTravelEntry((IDropTarget *)this, TLOG_FORE, &unusedEntry); 01431 if (SUCCEEDED(hResult)) 01432 { 01433 canGoForward = true; 01434 unusedEntry.Release(); 01435 } 01436 hResult = FireCommandStateChange(canGoBack, 2); 01437 hResult = FireCommandStateChange(canGoForward, 1); 01438 return S_OK; 01439 } 01440 01441 void CShellBrowser::UpdateGotoMenu(HMENU theMenu) 01442 { 01443 CComPtr<ITravelLog> travelLog; 01444 int position; 01445 MENUITEMINFO menuItemInfo; 01446 HRESULT hResult; 01447 01448 DeleteMenuItems(theMenu, IDM_GOTO_TRAVEL_FIRST, IDM_GOTO_TRAVEL_LAST); 01449 01450 position = GetMenuItemCount(theMenu); 01451 hResult = GetTravelLog(&travelLog); 01452 if (FAILED (hResult)) 01453 return; 01454 hResult = travelLog->InsertMenuEntries((IDropTarget *)this, theMenu, position, IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, TLMENUF_BACKANDFORTH | TLMENUF_CHECKCURRENT); 01455 if (SUCCEEDED(hResult)) 01456 { 01457 menuItemInfo.cbSize = sizeof(menuItemInfo); 01458 menuItemInfo.fMask = MIIM_TYPE | MIIM_ID; 01459 menuItemInfo.fType = MF_SEPARATOR; 01460 menuItemInfo.wID = IDM_GOTO_TRAVEL_SEP; 01461 InsertMenuItem(theMenu, position, TRUE, &menuItemInfo); 01462 } 01463 } 01464 01465 void CShellBrowser::UpdateViewMenu(HMENU theMenu) 01466 { 01467 CComPtr<IOleCommandTarget> oleCommandTarget; 01468 CComPtr<ITravelLog> travelLog; 01469 HMENU gotoMenu; 01470 OLECMD commandList[5]; 01471 HMENU toolbarMenuBar; 01472 HMENU toolbarMenu; 01473 MENUITEMINFO menuItemInfo; 01474 HRESULT hResult; 01475 01476 gotoMenu = SHGetMenuFromID(theMenu, FCIDM_MENU_EXPLORE); 01477 if (gotoMenu != NULL) 01478 UpdateGotoMenu(gotoMenu); 01479 01480 commandList[0].cmdID = ITID_TOOLBARBANDSHOWN; 01481 commandList[1].cmdID = ITID_ADDRESSBANDSHOWN; 01482 commandList[2].cmdID = ITID_LINKSBANDSHOWN; 01483 commandList[3].cmdID = ITID_TOOLBARLOCKED; 01484 commandList[4].cmdID = ITID_CUSTOMIZEENABLED; 01485 01486 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); 01487 if (SUCCEEDED(hResult)) 01488 hResult = oleCommandTarget->QueryStatus(&CGID_PrivCITCommands, 5, commandList, NULL); 01489 if (FAILED(hResult)) 01490 DeleteMenu(theMenu, IDM_VIEW_TOOLBARS, MF_BYCOMMAND); 01491 else 01492 { 01493 toolbarMenuBar = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU)); 01494 toolbarMenu = GetSubMenu(toolbarMenuBar, 0); 01495 01496 SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf); 01497 SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_ENABLED); 01498 SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_ENABLED); 01499 SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LOCKTOOLBARS, commandList[3].cmdf & OLECMDF_ENABLED); 01500 if ((commandList[4].cmdf & OLECMDF_ENABLED) == 0) 01501 DeleteMenu(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND); 01502 DeleteMenu(toolbarMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); 01503 DeleteMenu(toolbarMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND); 01504 01505 menuItemInfo.cbSize = sizeof(menuItemInfo); 01506 menuItemInfo.fMask = MIIM_SUBMENU; 01507 menuItemInfo.hSubMenu = toolbarMenu; 01508 SetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo); 01509 } 01510 SHCheckMenuItem(theMenu, IDM_VIEW_STATUSBAR, fStatusBarVisible ? TRUE : FALSE); 01511 } 01512 01513 bool IUnknownIsEqual(IUnknown *int1, IUnknown *int2) 01514 { 01515 CComPtr<IUnknown> int1Retry; 01516 CComPtr<IUnknown> int2Retry; 01517 HRESULT hResult; 01518 01519 if (int1 == int2) 01520 return true; 01521 if (int1 == NULL || int2 == NULL) 01522 return false; 01523 hResult = int1->QueryInterface(IID_IUnknown, (void **)&int1Retry); 01524 if (FAILED(hResult)) 01525 return false; 01526 hResult = int2->QueryInterface(IID_IUnknown, (void **)&int2Retry); 01527 if (FAILED(hResult)) 01528 return false; 01529 if (int1Retry == int2Retry) 01530 return true; 01531 return false; 01532 } 01533 01534 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBorderDW(IUnknown *punkObj, LPRECT prcBorder) 01535 { 01536 RECT availableBounds; 01537 static const INT excludeItems[] = {1, 1, 1, 0xa001, 0, 0}; 01538 int x; 01539 01540 GetEffectiveClientRect(m_hWnd, &availableBounds, (INT *)&excludeItems); 01541 for (x = 0; x < 3; x++) 01542 { 01543 if (fClientBars[x].clientBar.p != NULL && !IUnknownIsEqual(fClientBars[x].clientBar, punkObj)) 01544 { 01545 availableBounds.top += fClientBars[x].borderSpace.top; 01546 availableBounds.left += fClientBars[x].borderSpace.left; 01547 availableBounds.bottom -= fClientBars[x].borderSpace.bottom; 01548 availableBounds.right -= fClientBars[x].borderSpace.right; 01549 } 01550 } 01551 *prcBorder = availableBounds; 01552 return S_OK; 01553 } 01554 01555 HRESULT STDMETHODCALLTYPE CShellBrowser::RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) 01556 { 01557 return S_OK; 01558 } 01559 01560 HRESULT STDMETHODCALLTYPE CShellBrowser::SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) 01561 { 01562 int x; 01563 01564 for (x = 0; x < 3; x++) 01565 { 01566 if (IUnknownIsEqual(fClientBars[x].clientBar, punkObj)) 01567 { 01568 fClientBars[x].borderSpace = *pbw; 01569 // if this bar changed size, it cascades and forces all subsequent bars to resize 01570 RepositionBars(); 01571 return S_OK; 01572 } 01573 } 01574 return E_INVALIDARG; 01575 } 01576 01577 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) 01578 { 01579 CComPtr<IOleCommandTarget> commandTarget; 01580 HRESULT hResult; 01581 01582 if (prgCmds == NULL) 01583 return E_INVALIDARG; 01584 if (pguidCmdGroup == NULL) 01585 { 01586 if (fCurrentShellView.p != NULL) 01587 { 01588 hResult = fCurrentShellView->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 01589 if (SUCCEEDED(hResult) && commandTarget.p != NULL) 01590 return commandTarget->QueryStatus(NULL, 1, prgCmds, pCmdText); 01591 } 01592 while (cCmds != 0) 01593 { 01594 prgCmds->cmdf = 0; 01595 prgCmds++; 01596 cCmds--; 01597 } 01598 } 01599 else if (IsEqualIID(*pguidCmdGroup, CGID_Explorer)) 01600 { 01601 while (cCmds != 0) 01602 { 01603 switch (prgCmds->cmdID) 01604 { 01605 case 0x1c: // search 01606 prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; 01607 break; 01608 case 0x1d: // history 01609 prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; 01610 break; 01611 case 0x1e: // favorites 01612 prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; 01613 break; 01614 case 0x23: // folders 01615 prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED | OLECMDF_LATCHED; 01616 break; 01617 default: 01618 prgCmds->cmdf = 0; 01619 break; 01620 } 01621 prgCmds++; 01622 cCmds--; 01623 } 01624 } 01625 else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser)) 01626 { 01627 while (cCmds != 0) 01628 { 01629 switch (prgCmds->cmdID) 01630 { 01631 case 0xa022: // up level 01632 prgCmds->cmdf = OLECMDF_SUPPORTED; 01633 if (fCurrentDirectoryPIDL->mkid.cb != 0) 01634 prgCmds->cmdf |= OLECMDF_ENABLED; 01635 break; 01636 } 01637 prgCmds++; 01638 cCmds--; 01639 } 01640 } 01641 return S_OK; 01642 } 01643 01644 HRESULT STDMETHODCALLTYPE CShellBrowser::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) 01645 { 01646 HRESULT hResult; 01647 01648 if (IsEqualIID(*pguidCmdGroup, CGID_Explorer)) 01649 { 01650 switch (nCmdID) 01651 { 01652 case 0x23: 01653 hResult = ShowBand(CLSID_ExplorerBand, true); 01654 return S_OK; 01655 case 0x27: 01656 if (nCmdexecopt == 1) 01657 { 01658 // pvaIn is a VT_UNKNOWN with a band that is being hidden 01659 } 01660 else 01661 { 01662 // update zones part of the status bar 01663 } 01664 return S_OK; 01665 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band 01666 V_VT(pvaOut) = VT_INT_PTR; 01667 V_INTREF(pvaOut) = (INT *)LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU)); 01668 return S_OK; 01669 case 0x38: 01670 // indicate if this cabinet was opened as a browser 01671 return S_FALSE; 01672 default: 01673 return E_NOTIMPL; 01674 } 01675 } 01676 else if (IsEqualIID(*pguidCmdGroup, CGID_InternetButtons)) 01677 { 01678 switch (nCmdID) 01679 { 01680 case 0x23: 01681 // placeholder 01682 return S_OK; 01683 } 01684 } 01685 else if (IsEqualIID(*pguidCmdGroup, CGID_Theater)) 01686 { 01687 switch (nCmdID) 01688 { 01689 case 6: 01690 // what is theater mode and why do we receive this? 01691 return E_NOTIMPL; 01692 } 01693 } 01694 else if (IsEqualIID(*pguidCmdGroup, CGID_MenuBand)) 01695 { 01696 switch (nCmdID) 01697 { 01698 case 14: 01699 // initialize favorites menu 01700 return S_OK; 01701 } 01702 } 01703 else if (IsEqualIID(*pguidCmdGroup, CGID_ShellDocView)) 01704 { 01705 switch (nCmdID) 01706 { 01707 case 0x12: 01708 // refresh on toolbar clicked 01709 return S_OK; 01710 case 0x4d: 01711 // tell the view if it should hide the task pane or not 01712 return (fClientBars[BIVerticalBaseBar].clientBar.p == NULL) ? S_FALSE : S_OK; 01713 } 01714 } 01715 else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser)) 01716 { 01717 switch (nCmdID) 01718 { 01719 case 40994: 01720 return NavigateToParent(); 01721 } 01722 } 01723 else if (IsEqualIID(*pguidCmdGroup, CGID_IExplorerToolbar)) 01724 { 01725 switch (nCmdID) 01726 { 01727 case 0x7063: 01728 return DoFolderOptions(); 01729 } 01730 } 01731 else if (IsEqualIID(*pguidCmdGroup, CGID_DefView)) 01732 { 01733 switch (nCmdID) 01734 { 01735 case 1: 01736 // Reset All Folders option in Folder Options 01737 break; 01738 } 01739 } 01740 else 01741 { 01742 return E_NOTIMPL; 01743 } 01744 return E_NOTIMPL; 01745 } 01746 01747 HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindow(HWND *lphwnd) 01748 { 01749 if (lphwnd == NULL) 01750 return E_POINTER; 01751 *lphwnd = m_hWnd; 01752 return S_OK; 01753 } 01754 01755 HRESULT STDMETHODCALLTYPE CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode) 01756 { 01757 return E_NOTIMPL; 01758 } 01759 01760 HRESULT STDMETHODCALLTYPE CShellBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) 01761 { 01762 HMENU mainMenu = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU)); 01763 Shell_MergeMenus(hmenuShared, mainMenu, 0, 0, FCIDM_BROWSERLAST, MM_SUBMENUSHAVEIDS); 01764 01765 int GCCU(itemCount3) = GetMenuItemCount(hmenuShared); 01766 Unused(itemCount3); 01767 01768 lpMenuWidths->width[0] = 2; 01769 lpMenuWidths->width[2] = 3; 01770 lpMenuWidths->width[4] = 1; 01771 return S_OK; 01772 } 01773 01774 HRESULT STDMETHODCALLTYPE CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject) 01775 { 01776 CComPtr<IShellMenu> shellMenu; 01777 HRESULT hResult; 01778 01779 if (IsMenu(hmenuShared) == FALSE) 01780 return E_FAIL; 01781 hResult = GetMenuBand(IID_IShellMenu, (void **)&shellMenu); 01782 if (FAILED(hResult)) 01783 return hResult; 01784 hResult = shellMenu->SetMenu(hmenuShared, NULL, SMSET_DONTOWN); 01785 if (FAILED(hResult)) 01786 return hResult; 01787 fCurrentMenuBar = hmenuShared; 01788 return S_OK; 01789 } 01790 01791 HRESULT STDMETHODCALLTYPE CShellBrowser::RemoveMenusSB(HMENU hmenuShared) 01792 { 01793 if (hmenuShared == fCurrentMenuBar) 01794 fCurrentMenuBar = NULL; 01795 return S_OK; 01796 } 01797 01798 HRESULT STDMETHODCALLTYPE CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText) 01799 { 01800 return E_NOTIMPL; 01801 } 01802 01803 HRESULT STDMETHODCALLTYPE CShellBrowser::EnableModelessSB(BOOL fEnable) 01804 { 01805 return E_NOTIMPL; 01806 } 01807 01808 HRESULT STDMETHODCALLTYPE CShellBrowser::TranslateAcceleratorSB(MSG *pmsg, WORD wID) 01809 { 01810 return E_NOTIMPL; 01811 } 01812 01813 HRESULT STDMETHODCALLTYPE CShellBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) 01814 { 01815 return BrowseToPIDL((LPITEMIDLIST)pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY); 01816 } 01817 01818 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm) 01819 { 01820 return E_NOTIMPL; 01821 } 01822 01823 HRESULT STDMETHODCALLTYPE CShellBrowser::GetControlWindow(UINT id, HWND *lphwnd) 01824 { 01825 if (lphwnd == NULL) 01826 return E_POINTER; 01827 *lphwnd = NULL; 01828 switch(id) 01829 { 01830 case FCW_TOOLBAR: 01831 *lphwnd = fToolbarProxy.m_hWnd; 01832 return S_OK; 01833 case FCW_STATUS: 01834 *lphwnd = fStatusBar; 01835 return S_OK; 01836 case FCW_TREE: 01837 // find the directory browser and return it 01838 // this should be used only to determine if a tree is present 01839 return S_OK; 01840 case FCW_PROGRESS: 01841 // is this a progress dialog? 01842 return S_OK; 01843 } 01844 return S_OK; 01845 } 01846 01847 HRESULT STDMETHODCALLTYPE CShellBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret) 01848 { 01849 LPARAM result; 01850 01851 if (pret != NULL) 01852 *pret = 0; 01853 switch(id) 01854 { 01855 case FCW_TOOLBAR: 01856 result = fToolbarProxy.SendMessage(uMsg, wParam, lParam); 01857 if (pret != NULL) 01858 *pret = result; 01859 break; 01860 case FCW_STATUS: 01861 result = SendMessage(fStatusBar, uMsg, wParam, lParam); 01862 if (pret != NULL) 01863 *pret = result; 01864 break; 01865 } 01866 return S_OK; 01867 } 01868 01869 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryActiveShellView(struct IShellView **ppshv) 01870 { 01871 if (ppshv == NULL) 01872 return E_POINTER; 01873 *ppshv = fCurrentShellView; 01874 if (fCurrentShellView.p != NULL) 01875 fCurrentShellView.p->AddRef(); 01876 return S_OK; 01877 } 01878 01879 HRESULT STDMETHODCALLTYPE CShellBrowser::OnViewWindowActive(struct IShellView *ppshv) 01880 { 01881 return E_NOTIMPL; 01882 } 01883 01884 HRESULT STDMETHODCALLTYPE CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags) 01885 { 01886 return E_NOTIMPL; 01887 } 01888 01889 HRESULT STDMETHODCALLTYPE CShellBrowser::DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) 01890 { 01891 return E_NOTIMPL; 01892 } 01893 01894 HRESULT STDMETHODCALLTYPE CShellBrowser::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) 01895 { 01896 return E_NOTIMPL; 01897 } 01898 01899 HRESULT STDMETHODCALLTYPE CShellBrowser::DragLeave() 01900 { 01901 return E_NOTIMPL; 01902 } 01903 01904 HRESULT STDMETHODCALLTYPE CShellBrowser::Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) 01905 { 01906 return E_NOTIMPL; 01907 } 01908 01909 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) 01910 { 01911 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService 01912 // the returned interface has a method GetPropertyBag on it 01913 if (IsEqualIID(guidService, SID_STopLevelBrowser)) 01914 return this->QueryInterface(riid, ppvObject); 01915 if (IsEqualIID(guidService, SID_SShellBrowser)) 01916 return this->QueryInterface(riid, ppvObject); 01917 if (IsEqualIID(guidService, SID_ITargetFrame2)) 01918 return this->QueryInterface(riid, ppvObject); 01919 if (IsEqualIID(guidService, SID_IWebBrowserApp)) // without this, the internet toolbar won't reflect notifications 01920 return this->QueryInterface(riid, ppvObject); 01921 if (IsEqualIID(guidService, SID_SProxyBrowser)) 01922 return this->QueryInterface(riid, ppvObject); 01923 if (IsEqualIID(guidService, SID_IExplorerToolbar)) 01924 return fClientBars[BIInternetToolbar].clientBar->QueryInterface(riid, ppvObject); 01925 return E_NOINTERFACE; 01926 } 01927 01928 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPropertyBag(long flags, REFIID riid, void **ppvObject) 01929 { 01930 if (ppvObject == NULL) 01931 return E_POINTER; 01932 *ppvObject = NULL; 01933 return E_NOTIMPL; 01934 } 01935 01936 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfoCount(UINT *pctinfo) 01937 { 01938 return E_NOTIMPL; 01939 } 01940 01941 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) 01942 { 01943 return E_NOTIMPL; 01944 } 01945 01946 HRESULT STDMETHODCALLTYPE CShellBrowser::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) 01947 { 01948 return E_NOTIMPL; 01949 } 01950 01951 HRESULT STDMETHODCALLTYPE CShellBrowser::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) 01952 { 01953 return E_NOTIMPL; 01954 } 01955 01956 HRESULT STDMETHODCALLTYPE CShellBrowser::GetParentSite(IOleInPlaceSite **ppipsite) 01957 { 01958 return E_NOTIMPL; 01959 } 01960 01961 HRESULT STDMETHODCALLTYPE CShellBrowser::SetTitle(IShellView *psv, LPCWSTR pszName) 01962 { 01963 return E_NOTIMPL; 01964 } 01965 01966 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName) 01967 { 01968 return E_NOTIMPL; 01969 } 01970 01971 HRESULT STDMETHODCALLTYPE CShellBrowser::GetOleObject(IOleObject **ppobjv) 01972 { 01973 return E_NOTIMPL; 01974 } 01975 01976 HRESULT STDMETHODCALLTYPE CShellBrowser::GetTravelLog(ITravelLog **pptl) 01977 { 01978 HRESULT hResult; 01979 01980 // called by toolbar when displaying tooltips 01981 if (pptl != NULL) 01982 *pptl = NULL; 01983 if (fTravelLog.p == NULL) 01984 { 01985 hResult = CreateTravelLog(IID_ITravelLog, (void **)&fTravelLog); 01986 if (FAILED(hResult)) 01987 return hResult; 01988 } 01989 *pptl = fTravelLog.p; 01990 fTravelLog.p->AddRef(); 01991 return S_OK; 01992 } 01993 01994 HRESULT STDMETHODCALLTYPE CShellBrowser::ShowControlWindow(UINT id, BOOL fShow) 01995 { 01996 return E_NOTIMPL; 01997 } 01998 01999 HRESULT STDMETHODCALLTYPE CShellBrowser::IsControlWindowShown(UINT id, BOOL *pfShown) 02000 { 02001 return E_NOTIMPL; 02002 } 02003 02004 HRESULT STDMETHODCALLTYPE CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags) 02005 { 02006 return E_NOTIMPL; 02007 } 02008 02009 HRESULT STDMETHODCALLTYPE CShellBrowser::IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPCITEMIDLIST *ppidlOut) 02010 { 02011 return E_NOTIMPL; 02012 } 02013 02014 HRESULT STDMETHODCALLTYPE CShellBrowser::DisplayParseError(HRESULT hres, LPCWSTR pwszPath) 02015 { 02016 return E_NOTIMPL; 02017 } 02018 02019 HRESULT STDMETHODCALLTYPE CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF) 02020 { 02021 return E_NOTIMPL; 02022 } 02023 02024 HRESULT STDMETHODCALLTYPE CShellBrowser::SetNavigateState(BNSTATE bnstate) 02025 { 02026 return E_NOTIMPL; 02027 } 02028 02029 HRESULT STDMETHODCALLTYPE CShellBrowser::GetNavigateState(BNSTATE *pbnstate) 02030 { 02031 return E_NOTIMPL; 02032 } 02033 02034 HRESULT STDMETHODCALLTYPE CShellBrowser::NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse) 02035 { 02036 return E_NOTIMPL; 02037 } 02038 02039 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateWindowList() 02040 { 02041 return E_NOTIMPL; 02042 } 02043 02044 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateBackForwardState() 02045 { 02046 return E_NOTIMPL; 02047 } 02048 02049 HRESULT STDMETHODCALLTYPE CShellBrowser::SetFlags(DWORD dwFlags, DWORD dwFlagMask) 02050 { 02051 return E_NOTIMPL; 02052 } 02053 02054 HRESULT STDMETHODCALLTYPE CShellBrowser::GetFlags(DWORD *pdwFlags) 02055 { 02056 return E_NOTIMPL; 02057 } 02058 02059 HRESULT STDMETHODCALLTYPE CShellBrowser::CanNavigateNow() 02060 { 02061 return E_NOTIMPL; 02062 } 02063 02064 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPidl(LPCITEMIDLIST *ppidl) 02065 { 02066 // called by explorer bar to get current pidl 02067 if (ppidl == NULL) 02068 return E_POINTER; 02069 *ppidl = ILClone(fCurrentDirectoryPIDL); 02070 return S_OK; 02071 } 02072 02073 HRESULT STDMETHODCALLTYPE CShellBrowser::SetReferrer(LPCITEMIDLIST pidl) 02074 { 02075 return E_NOTIMPL; 02076 } 02077 02078 DWORD STDMETHODCALLTYPE CShellBrowser::GetBrowserIndex() 02079 { 02080 return -1; 02081 } 02082 02083 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBrowserByIndex(DWORD dwID, IUnknown **ppunk) 02084 { 02085 return E_NOTIMPL; 02086 } 02087 02088 HRESULT STDMETHODCALLTYPE CShellBrowser::GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc) 02089 { 02090 if (ppole == NULL || pstm == NULL || ppbc == NULL) 02091 return E_INVALIDARG; 02092 *ppole = fHistoryObject; 02093 if (fHistoryObject != NULL) 02094 fHistoryObject->AddRef(); 02095 *pstm = fHistoryStream; 02096 if (fHistoryStream != NULL) 02097 fHistoryStream->AddRef(); 02098 *ppbc = fHistoryBindContext; 02099 if (fHistoryBindContext != NULL) 02100 fHistoryBindContext->AddRef(); 02101 fHistoryObject = NULL; 02102 fHistoryStream = NULL; 02103 fHistoryBindContext = NULL; 02104 if (*ppole == NULL) 02105 return E_FAIL; 02106 return S_OK; 02107 } 02108 02109 HRESULT STDMETHODCALLTYPE CShellBrowser::SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor) 02110 { 02111 return E_NOTIMPL; 02112 } 02113 02114 HRESULT STDMETHODCALLTYPE CShellBrowser::CacheOLEServer(IOleObject *pole) 02115 { 02116 return E_NOTIMPL; 02117 } 02118 02119 HRESULT STDMETHODCALLTYPE CShellBrowser::GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut) 02120 { 02121 return E_NOTIMPL; 02122 } 02123 02124 HRESULT STDMETHODCALLTYPE CShellBrowser::OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut) 02125 { 02126 return E_NOTIMPL; 02127 } 02128 02129 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPalette(HPALETTE *hpal) 02130 { 02131 return E_NOTIMPL; 02132 } 02133 02134 HRESULT STDMETHODCALLTYPE CShellBrowser::RegisterWindow(BOOL fForceRegister, int swc) 02135 { 02136 return E_NOTIMPL; 02137 } 02138 02139 LRESULT STDMETHODCALLTYPE CShellBrowser::WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 02140 { 02141 return E_NOTIMPL; 02142 } 02143 02144 HRESULT STDMETHODCALLTYPE CShellBrowser::SetAsDefFolderSettings() 02145 { 02146 return E_NOTIMPL; 02147 } 02148 02149 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewRect(RECT *prc) 02150 { 02151 return E_NOTIMPL; 02152 } 02153 02154 HRESULT STDMETHODCALLTYPE CShellBrowser::OnSize(WPARAM wParam) 02155 { 02156 return E_NOTIMPL; 02157 } 02158 02159 HRESULT STDMETHODCALLTYPE CShellBrowser::OnCreate(struct tagCREATESTRUCTW *pcs) 02160 { 02161 return E_NOTIMPL; 02162 } 02163 02164 LRESULT STDMETHODCALLTYPE CShellBrowser::OnCommand(WPARAM wParam, LPARAM lParam) 02165 { 02166 return 0; 02167 } 02168 02169 HRESULT STDMETHODCALLTYPE CShellBrowser::OnDestroy() 02170 { 02171 return E_NOTIMPL; 02172 } 02173 02174 LRESULT STDMETHODCALLTYPE CShellBrowser::OnNotify(struct tagNMHDR *pnm) 02175 { 02176 return 0; 02177 } 02178 02179 HRESULT STDMETHODCALLTYPE CShellBrowser::OnSetFocus() 02180 { 02181 return E_NOTIMPL; 02182 } 02183 02184 HRESULT STDMETHODCALLTYPE CShellBrowser::OnFrameWindowActivateBS(BOOL fActive) 02185 { 02186 return E_NOTIMPL; 02187 } 02188 02189 HRESULT STDMETHODCALLTYPE CShellBrowser::ReleaseShellView() 02190 { 02191 return E_NOTIMPL; 02192 } 02193 02194 HRESULT STDMETHODCALLTYPE CShellBrowser::ActivatePendingView() 02195 { 02196 return E_NOTIMPL; 02197 } 02198 02199 HRESULT STDMETHODCALLTYPE CShellBrowser::CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd) 02200 { 02201 return E_NOTIMPL; 02202 } 02203 02204 HRESULT STDMETHODCALLTYPE CShellBrowser::CreateBrowserPropSheetExt(REFIID riid, void **ppv) 02205 { 02206 return E_NOTIMPL; 02207 } 02208 02209 HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewWindow(HWND *phwndView) 02210 { 02211 return E_NOTIMPL; 02212 } 02213 02214 HRESULT STDMETHODCALLTYPE CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd) 02215 { 02216 return E_NOTIMPL; 02217 } 02218 02219 LPBASEBROWSERDATA STDMETHODCALLTYPE CShellBrowser::PutBaseBrowserData() 02220 { 02221 return NULL; 02222 } 02223 02224 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTravelLog(ITravelLog *ptl, DWORD dw) 02225 { 02226 return E_NOTIMPL; 02227 } 02228 02229 HRESULT STDMETHODCALLTYPE CShellBrowser::SetTopBrowser() 02230 { 02231 return E_NOTIMPL; 02232 } 02233 02234 HRESULT STDMETHODCALLTYPE CShellBrowser::Offline(int iCmd) 02235 { 02236 return E_NOTIMPL; 02237 } 02238 02239 HRESULT STDMETHODCALLTYPE CShellBrowser::AllowViewResize(BOOL f) 02240 { 02241 return E_NOTIMPL; 02242 } 02243 02244 HRESULT STDMETHODCALLTYPE CShellBrowser::SetActivateState(UINT u) 02245 { 02246 return E_NOTIMPL; 02247 } 02248 02249 HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateSecureLockIcon(int eSecureLock) 02250 { 02251 return E_NOTIMPL; 02252 } 02253 02254 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeDownloadManager() 02255 { 02256 return E_NOTIMPL; 02257 } 02258 02259 HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTransitionSite() 02260 { 02261 return E_NOTIMPL; 02262 } 02263 02264 HRESULT STDMETHODCALLTYPE CShellBrowser::_Initialize(HWND hwnd, IUnknown *pauto) 02265 { 02266 return E_NOTIMPL; 02267 } 02268 02269 HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingNavigationAsync() 02270 { 02271 return E_NOTIMPL; 02272 } 02273 02274 HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingView() 02275 { 02276 return E_NOTIMPL; 02277 } 02278 02279 HRESULT STDMETHODCALLTYPE CShellBrowser::_MaySaveChanges() 02280 { 02281 return E_NOTIMPL; 02282 } 02283 02284 HRESULT STDMETHODCALLTYPE CShellBrowser::_PauseOrResumeView(BOOL fPaused) 02285 { 02286 return E_NOTIMPL; 02287 } 02288 02289 HRESULT STDMETHODCALLTYPE CShellBrowser::_DisableModeless() 02290 { 02291 return E_NOTIMPL; 02292 } 02293 02294 HRESULT STDMETHODCALLTYPE CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags) 02295 { 02296 return E_NOTIMPL; 02297 } 02298 02299 HRESULT STDMETHODCALLTYPE CShellBrowser::_TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew) 02300 { 02301 return E_NOTIMPL; 02302 } 02303 02304 HRESULT STDMETHODCALLTYPE CShellBrowser::_SwitchActivationNow() 02305 { 02306 return E_NOTIMPL; 02307 } 02308 02309 HRESULT STDMETHODCALLTYPE CShellBrowser::_ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut) 02310 { 02311 return E_NOTIMPL; 02312 } 02313 02314 HRESULT STDMETHODCALLTYPE CShellBrowser::_SendChildren(HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam) 02315 { 02316 return E_NOTIMPL; 02317 } 02318 02319 HRESULT STDMETHODCALLTYPE CShellBrowser::GetFolderSetData(struct tagFolderSetData *pfsd) 02320 { 02321 return E_NOTIMPL; 02322 } 02323 02324 HRESULT STDMETHODCALLTYPE CShellBrowser::_OnFocusChange(UINT itb) 02325 { 02326 return E_NOTIMPL; 02327 } 02328 02329 HRESULT STDMETHODCALLTYPE CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly) 02330 { 02331 return E_NOTIMPL; 02332 } 02333 02334 UINT STDMETHODCALLTYPE CShellBrowser::_get_itbLastFocus() 02335 { 02336 return 0; 02337 } 02338 02339 HRESULT STDMETHODCALLTYPE CShellBrowser::_put_itbLastFocus(UINT itbLastFocus) 02340 { 02341 return E_NOTIMPL; 02342 } 02343 02344 HRESULT STDMETHODCALLTYPE CShellBrowser::_UIActivateView(UINT uState) 02345 { 02346 return E_NOTIMPL; 02347 } 02348 02349 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetViewBorderRect(RECT *prc) 02350 { 02351 return E_NOTIMPL; 02352 } 02353 02354 HRESULT STDMETHODCALLTYPE CShellBrowser::_UpdateViewRectSize() 02355 { 02356 return E_NOTIMPL; 02357 } 02358 02359 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorder(UINT itb) 02360 { 02361 return E_NOTIMPL; 02362 } 02363 02364 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeView() 02365 { 02366 return E_NOTIMPL; 02367 } 02368 02369 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon) 02370 { 02371 return E_NOTIMPL; 02372 } 02373 02374 IStream *STDMETHODCALLTYPE CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName) 02375 { 02376 return NULL; 02377 } 02378 02379 LRESULT STDMETHODCALLTYPE CShellBrowser::ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) 02380 { 02381 return 0; 02382 } 02383 02384 HRESULT STDMETHODCALLTYPE CShellBrowser::SetAcceleratorMenu(HACCEL hacc) 02385 { 02386 return E_NOTIMPL; 02387 } 02388 02389 int STDMETHODCALLTYPE CShellBrowser::_GetToolbarCount() 02390 { 02391 return 0; 02392 } 02393 02394 LPTOOLBARITEM STDMETHODCALLTYPE CShellBrowser::_GetToolbarItem(int itb) 02395 { 02396 return NULL; 02397 } 02398 02399 HRESULT STDMETHODCALLTYPE CShellBrowser::_SaveToolbars(IStream *pstm) 02400 { 02401 return E_NOTIMPL; 02402 } 02403 02404 HRESULT STDMETHODCALLTYPE CShellBrowser::_LoadToolbars(IStream *pstm) 02405 { 02406 return E_NOTIMPL; 02407 } 02408 02409 HRESULT STDMETHODCALLTYPE CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose) 02410 { 02411 return E_NOTIMPL; 02412 } 02413 02414 HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd) 02415 { 02416 return E_NOTIMPL; 02417 } 02418 02419 HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor) 02420 { 02421 return E_NOTIMPL; 02422 } 02423 02424 UINT STDMETHODCALLTYPE CShellBrowser::_FindTBar(IUnknown *punkSrc) 02425 { 02426 return 0; 02427 } 02428 02429 HRESULT STDMETHODCALLTYPE CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg) 02430 { 02431 return E_NOTIMPL; 02432 } 02433 02434 HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayTranslateAccelerator(MSG *pmsg) 02435 { 02436 return E_NOTIMPL; 02437 } 02438 02439 HRESULT STDMETHODCALLTYPE CShellBrowser::_GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor) 02440 { 02441 return E_NOTIMPL; 02442 } 02443 02444 HRESULT STDMETHODCALLTYPE CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl) 02445 { 02446 return E_NOTIMPL; 02447 } 02448 02449 HRESULT STDMETHODCALLTYPE CShellBrowser::GoBack() 02450 { 02451 CComPtr<ITravelLog> travelLog; 02452 HRESULT hResult; 02453 02454 hResult = GetTravelLog(&travelLog); 02455 if (FAILED (hResult)) 02456 return hResult; 02457 return travelLog->Travel((IDropTarget *)this, TLOG_BACK); 02458 } 02459 02460 HRESULT STDMETHODCALLTYPE CShellBrowser::GoForward() 02461 { 02462 CComPtr<ITravelLog> travelLog; 02463 HRESULT hResult; 02464 02465 hResult = GetTravelLog(&travelLog); 02466 if (FAILED (hResult)) 02467 return hResult; 02468 return travelLog->Travel((IDropTarget *)this, TLOG_FORE); 02469 } 02470 02471 HRESULT STDMETHODCALLTYPE CShellBrowser::GoHome() 02472 { 02473 return E_NOTIMPL; 02474 } 02475 02476 HRESULT STDMETHODCALLTYPE CShellBrowser::GoSearch() 02477 { 02478 return E_NOTIMPL; 02479 } 02480 02481 HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) 02482 { 02483 return E_NOTIMPL; 02484 } 02485 02486 HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh() 02487 { 02488 VARIANT level; 02489 02490 V_VT(&level) = VT_I4; 02491 V_I4(&level) = 4; 02492 return Refresh2(&level); 02493 } 02494 02495 HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh2(VARIANT *Level) 02496 { 02497 CComPtr<IOleCommandTarget> oleCommandTarget; 02498 HRESULT hResult; 02499 02500 hResult = fCurrentShellView->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); 02501 if (FAILED (hResult)) 02502 return hResult; 02503 return oleCommandTarget->Exec(NULL, 22, 1, Level, NULL); 02504 } 02505 02506 HRESULT STDMETHODCALLTYPE CShellBrowser::Stop() 02507 { 02508 return E_NOTIMPL; 02509 } 02510 02511 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Application(IDispatch **ppDisp) 02512 { 02513 return E_NOTIMPL; 02514 } 02515 02516 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Parent(IDispatch **ppDisp) 02517 { 02518 return E_NOTIMPL; 02519 } 02520 02521 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Container(IDispatch **ppDisp) 02522 { 02523 return E_NOTIMPL; 02524 } 02525 02526 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Document(IDispatch **ppDisp) 02527 { 02528 return E_NOTIMPL; 02529 } 02530 02531 HRESULT STDMETHODCALLTYPE CShellBrowser::get_TopLevelContainer(VARIANT_BOOL *pBool) 02532 { 02533 return E_NOTIMPL; 02534 } 02535 02536 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Type(BSTR *Type) 02537 { 02538 return E_NOTIMPL; 02539 } 02540 #ifdef __WIDL_EXDISP_H 02541 #define long LONG 02542 #endif 02543 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Left(long *pl) 02544 { 02545 return E_NOTIMPL; 02546 } 02547 02548 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Left(long Left) 02549 { 02550 return E_NOTIMPL; 02551 } 02552 02553 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Top(long *pl) 02554 { 02555 return E_NOTIMPL; 02556 } 02557 02558 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Top(long Top) 02559 { 02560 return E_NOTIMPL; 02561 } 02562 02563 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Width(long *pl) 02564 { 02565 return E_NOTIMPL; 02566 } 02567 02568 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Width(long Width) 02569 { 02570 return E_NOTIMPL; 02571 } 02572 02573 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Height(long *pl) 02574 { 02575 return E_NOTIMPL; 02576 } 02577 02578 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Height(long Height) 02579 { 02580 return E_NOTIMPL; 02581 } 02582 #ifdef __WIDL_EXDISP_H 02583 #undef long 02584 #endif 02585 HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationName(BSTR *LocationName) 02586 { 02587 return E_NOTIMPL; 02588 } 02589 02590 HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationURL(BSTR *LocationURL) 02591 { 02592 return E_NOTIMPL; 02593 } 02594 02595 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Busy(VARIANT_BOOL *pBool) 02596 { 02597 return E_NOTIMPL; 02598 } 02599 02600 HRESULT STDMETHODCALLTYPE CShellBrowser::Quit() 02601 { 02602 return E_NOTIMPL; 02603 } 02604 02605 HRESULT STDMETHODCALLTYPE CShellBrowser::ClientToWindow(int *pcx, int *pcy) 02606 { 02607 return E_NOTIMPL; 02608 } 02609 02610 HRESULT STDMETHODCALLTYPE CShellBrowser::PutProperty(BSTR Property, VARIANT vtValue) 02611 { 02612 return E_NOTIMPL; 02613 } 02614 02615 HRESULT STDMETHODCALLTYPE CShellBrowser::GetProperty(BSTR Property, VARIANT *pvtValue) 02616 { 02617 return E_NOTIMPL; 02618 } 02619 02620 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Name(BSTR *Name) 02621 { 02622 return E_NOTIMPL; 02623 } 02624 02625 HRESULT STDMETHODCALLTYPE CShellBrowser::get_HWND(SHANDLE_PTR *pHWND) 02626 { 02627 return E_NOTIMPL; 02628 } 02629 02630 HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullName(BSTR *FullName) 02631 { 02632 return E_NOTIMPL; 02633 } 02634 02635 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Path(BSTR *Path) 02636 { 02637 return E_NOTIMPL; 02638 } 02639 02640 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Visible(VARIANT_BOOL *pBool) 02641 { 02642 return E_NOTIMPL; 02643 } 02644 02645 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Visible(VARIANT_BOOL Value) 02646 { 02647 return E_NOTIMPL; 02648 } 02649 02650 HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusBar(VARIANT_BOOL *pBool) 02651 { 02652 return E_NOTIMPL; 02653 } 02654 02655 HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusBar(VARIANT_BOOL Value) 02656 { 02657 return E_NOTIMPL; 02658 } 02659 02660 HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusText(BSTR *StatusText) 02661 { 02662 return E_NOTIMPL; 02663 } 02664 02665 HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusText(BSTR StatusText) 02666 { 02667 return E_NOTIMPL; 02668 } 02669 02670 HRESULT STDMETHODCALLTYPE CShellBrowser::get_ToolBar(int *Value) 02671 { 02672 return E_NOTIMPL; 02673 } 02674 02675 HRESULT STDMETHODCALLTYPE CShellBrowser::put_ToolBar(int Value) 02676 { 02677 return E_NOTIMPL; 02678 } 02679 02680 HRESULT STDMETHODCALLTYPE CShellBrowser::get_MenuBar(VARIANT_BOOL *Value) 02681 { 02682 return E_NOTIMPL; 02683 } 02684 02685 HRESULT STDMETHODCALLTYPE CShellBrowser::put_MenuBar(VARIANT_BOOL Value) 02686 { 02687 return E_NOTIMPL; 02688 } 02689 02690 HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullScreen(VARIANT_BOOL *pbFullScreen) 02691 { 02692 return E_NOTIMPL; 02693 } 02694 02695 HRESULT STDMETHODCALLTYPE CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen) 02696 { 02697 return E_NOTIMPL; 02698 } 02699 02700 HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate2(VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) 02701 { 02702 LPITEMIDLIST pidl; 02703 HRESULT hResult; 02704 02705 // called from drive combo box to navigate to a directory 02706 if (V_VT(URL) != (VT_ARRAY | VT_UI1)) 02707 return E_INVALIDARG; 02708 if (V_ARRAY(URL)->cDims != 1 || V_ARRAY(URL)->cbElements != 1) 02709 return E_INVALIDARG; 02710 pidl = (LPITEMIDLIST)V_ARRAY(URL)->pvData; 02711 hResult = BrowseToPIDL((LPITEMIDLIST)pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY); 02712 if (FAILED (hResult)) 02713 return hResult; 02714 return S_OK; 02715 } 02716 02717 HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf) 02718 { 02719 return E_NOTIMPL; 02720 } 02721 02722 HRESULT STDMETHODCALLTYPE CShellBrowser::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) 02723 { 02724 return E_NOTIMPL; 02725 } 02726 02727 HRESULT STDMETHODCALLTYPE CShellBrowser::ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize) 02728 { 02729 CLSID classID; 02730 bool vertical; 02731 02732 // called to show search bar 02733 if (V_VT(pvaClsid) != VT_BSTR) 02734 return E_INVALIDARG; 02735 CLSIDFromString(V_BSTR(pvaClsid), &classID); 02736 // TODO: properly compute the value of vertical 02737 vertical = true; 02738 return ShowBand(classID, vertical); 02739 } 02740 02741 HRESULT STDMETHODCALLTYPE CShellBrowser::get_ReadyState(READYSTATE *plReadyState) 02742 { 02743 return E_NOTIMPL; 02744 } 02745 02746 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Offline(VARIANT_BOOL *pbOffline) 02747 { 02748 return E_NOTIMPL; 02749 } 02750 02751 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Offline(VARIANT_BOOL bOffline) 02752 { 02753 return E_NOTIMPL; 02754 } 02755 02756 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Silent(VARIANT_BOOL *pbSilent) 02757 { 02758 return E_NOTIMPL; 02759 } 02760 02761 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Silent(VARIANT_BOOL bSilent) 02762 { 02763 return E_NOTIMPL; 02764 } 02765 02766 HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL *pbRegister) 02767 { 02768 return E_NOTIMPL; 02769 } 02770 02771 HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister) 02772 { 02773 return E_NOTIMPL; 02774 } 02775 02776 HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister) 02777 { 02778 return E_NOTIMPL; 02779 } 02780 02781 HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister) 02782 { 02783 return E_NOTIMPL; 02784 } 02785 02786 HRESULT STDMETHODCALLTYPE CShellBrowser::get_TheaterMode(VARIANT_BOOL *pbRegister) 02787 { 02788 return E_NOTIMPL; 02789 } 02790 02791 HRESULT STDMETHODCALLTYPE CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister) 02792 { 02793 return E_NOTIMPL; 02794 } 02795 02796 HRESULT STDMETHODCALLTYPE CShellBrowser::get_AddressBar(VARIANT_BOOL *Value) 02797 { 02798 return E_NOTIMPL; 02799 } 02800 02801 HRESULT STDMETHODCALLTYPE CShellBrowser::put_AddressBar(VARIANT_BOOL Value) 02802 { 02803 return E_NOTIMPL; 02804 } 02805 02806 HRESULT STDMETHODCALLTYPE CShellBrowser::get_Resizable(VARIANT_BOOL *Value) 02807 { 02808 return E_NOTIMPL; 02809 } 02810 02811 HRESULT STDMETHODCALLTYPE CShellBrowser::put_Resizable(VARIANT_BOOL Value) 02812 { 02813 return E_NOTIMPL; 02814 } 02815 02816 HRESULT STDMETHODCALLTYPE CShellBrowser::FindWindowByIndex(DWORD dwID, IUnknown **ppunk) 02817 { 02818 return E_NOTIMPL; 02819 } 02820 02821 HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindowData(LPWINDOWDATA pWinData) 02822 { 02823 if (pWinData == NULL) 02824 return E_POINTER; 02825 02826 pWinData->dwWindowID = -1; 02827 pWinData->uiCP = 0; 02828 pWinData->pidl = ILClone(fCurrentDirectoryPIDL); 02829 pWinData->lpszUrl = NULL; 02830 pWinData->lpszUrlLocation = NULL; 02831 pWinData->lpszTitle = NULL; 02832 return S_OK; 02833 } 02834 02835 HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition) 02836 { 02837 return E_NOTIMPL; 02838 } 02839 02840 HRESULT STDMETHODCALLTYPE CShellBrowser::GetClassID(CLSID *pClassID) 02841 { 02842 return E_NOTIMPL; 02843 } 02844 02845 HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistory(IStream *pStream, IBindCtx *pbc) 02846 { 02847 CComPtr<IPersistHistory> viewPersistHistory; 02848 CComPtr<IOleObject> viewHistoryObject; 02849 persistState oldState; 02850 ULONG numRead; 02851 LPITEMIDLIST pidl; 02852 HRESULT hResult; 02853 02854 hResult = pStream->Read(&oldState, sizeof(oldState), &numRead); 02855 if (FAILED(hResult)) 02856 return hResult; 02857 if (numRead != sizeof(oldState) || oldState.dwSize != sizeof(oldState)) 02858 return E_FAIL; 02859 if (oldState.browseType != 2) 02860 return E_FAIL; 02861 pidl = (LPITEMIDLIST)SHAlloc(oldState.pidlSize); 02862 if (pidl == NULL) 02863 return E_OUTOFMEMORY; 02864 hResult = pStream->Read(pidl, oldState.pidlSize, &numRead); 02865 if (FAILED(hResult)) 02866 { 02867 ILFree(pidl); 02868 return hResult; 02869 } 02870 if (numRead != oldState.pidlSize) 02871 { 02872 ILFree(pidl); 02873 return E_FAIL; 02874 } 02875 hResult = CoCreateInstance(oldState.persistClass, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_SERVER, IID_IOleObject, (void **)&viewHistoryObject); 02876 fHistoryObject = viewHistoryObject; 02877 fHistoryStream = pStream; 02878 fHistoryBindContext = pbc; 02879 hResult = BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY); 02880 fHistoryObject = NULL; 02881 fHistoryStream = NULL; 02882 fHistoryBindContext = NULL; 02883 ILFree(pidl); 02884 if (FAILED(hResult)) 02885 return hResult; 02886 return S_OK; 02887 } 02888 02889 HRESULT STDMETHODCALLTYPE CShellBrowser::SaveHistory(IStream *pStream) 02890 { 02891 CComPtr<IPersistHistory> viewPersistHistory; 02892 persistState newState; 02893 HRESULT hResult; 02894 02895 hResult = fCurrentShellView->GetItemObject(SVGIO_BACKGROUND, IID_IPersistHistory, (void **)&viewPersistHistory); 02896 memset(&newState, 0, sizeof(newState)); 02897 newState.dwSize = sizeof(newState); 02898 newState.browseType = 2; 02899 newState.browserIndex = GetBrowserIndex(); 02900 if (viewPersistHistory.p != NULL) 02901 { 02902 hResult = viewPersistHistory->GetClassID(&newState.persistClass); 02903 if (FAILED(hResult)) 02904 return hResult; 02905 } 02906 newState.pidlSize = ILGetSize(fCurrentDirectoryPIDL); 02907 hResult = pStream->Write(&newState, sizeof(newState), NULL); 02908 if (FAILED(hResult)) 02909 return hResult; 02910 hResult = pStream->Write(fCurrentDirectoryPIDL, newState.pidlSize, NULL); 02911 if (FAILED(hResult)) 02912 return hResult; 02913 if (viewPersistHistory.p != NULL) 02914 { 02915 hResult = viewPersistHistory->SaveHistory(pStream); 02916 if (FAILED(hResult)) 02917 return hResult; 02918 } 02919 return S_OK; 02920 } 02921 02922 HRESULT STDMETHODCALLTYPE CShellBrowser::SetPositionCookie(DWORD dwPositioncookie) 02923 { 02924 return E_NOTIMPL; 02925 } 02926 02927 HRESULT STDMETHODCALLTYPE CShellBrowser::GetPositionCookie(DWORD *pdwPositioncookie) 02928 { 02929 return E_NOTIMPL; 02930 } 02931 02932 LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 02933 { 02934 // TODO: rip down everything 02935 PostQuitMessage(0); 02936 return 0; 02937 } 02938 02939 LRESULT CShellBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 02940 { 02941 CComPtr<IDockingWindow> dockingWindow; 02942 RECT availableBounds; 02943 static const INT excludeItems[] = {1, 1, 1, 0xa001, 0, 0}; 02944 int x; 02945 HRESULT hResult; 02946 02947 if (wParam != SIZE_MINIMIZED) 02948 { 02949 GetEffectiveClientRect(m_hWnd, &availableBounds, (INT *)&excludeItems); 02950 for (x = 0; x < 3; x++) 02951 { 02952 if (fClientBars[x].clientBar != NULL) 02953 { 02954 hResult = fClientBars[x].clientBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); 02955 if (SUCCEEDED(hResult) && dockingWindow != NULL) 02956 { 02957 hResult = dockingWindow->ResizeBorderDW(&availableBounds, (IDropTarget *)this, TRUE); 02958 break; 02959 } 02960 } 02961 } 02962 RepositionBars(); 02963 } 02964 return 1; 02965 } 02966 02967 LRESULT CShellBrowser::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 02968 { 02969 HMENU theMenu; 02970 02971 theMenu = (HMENU)wParam; 02972 if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_VIEW)) 02973 UpdateViewMenu(theMenu); 02974 return RelayMsgToShellView(uMsg, wParam, lParam, bHandled); 02975 } 02976 02977 LRESULT CShellBrowser::RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 02978 { 02979 if (fCurrentShellViewWindow != NULL) 02980 return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam); 02981 return 0; 02982 } 02983 02984 LRESULT CShellBrowser::OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 02985 { 02986 return 0; 02987 } 02988 02989 LRESULT CShellBrowser::OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 02990 { 02991 HRESULT hResult; 02992 02993 hResult = DoFolderOptions(); 02994 return 0; 02995 } 02996 02997 LRESULT CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 02998 { 02999 #ifndef ROS_Headers 03000 WNetConnectionDialog(m_hWnd, RESOURCETYPE_DISK); 03001 #endif 03002 return 0; 03003 } 03004 03005 LRESULT CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03006 { 03007 #ifndef ROS_Headers 03008 WNetDisconnectDialog(m_hWnd, RESOURCETYPE_DISK); 03009 #endif 03010 return 0; 03011 } 03012 03013 LRESULT CShellBrowser::OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03014 { 03015 ShellAbout(m_hWnd, _T("ReactOS"), _T(""), NULL); 03016 return 0; 03017 } 03018 03019 LRESULT CShellBrowser::OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03020 { 03021 HRESULT hResult; 03022 03023 hResult = GoBack(); 03024 return 0; 03025 } 03026 03027 LRESULT CShellBrowser::OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03028 { 03029 HRESULT hResult; 03030 03031 hResult = GoForward(); 03032 return 0; 03033 } 03034 03035 LRESULT CShellBrowser::OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03036 { 03037 HRESULT hResult; 03038 03039 hResult = NavigateToParent(); 03040 return 0; 03041 } 03042 03043 LRESULT CShellBrowser::OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03044 { 03045 HRESULT hResult; 03046 03047 hResult = GoHome(); 03048 return 0; 03049 } 03050 03051 LRESULT CShellBrowser::OnIsThisLegal(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03052 { 03053 HRESULT hResult; 03054 03055 typedef HRESULT (WINAPI *PSHOpenNewFrame)(LPITEMIDLIST pidl, IUnknown *b, long c, long d); 03056 PSHOpenNewFrame Func; 03057 HMODULE hShlwapi; 03058 03059 hShlwapi = LoadLibrary(TEXT("browseui.dll")); 03060 if (hShlwapi != NULL) 03061 Func = (PSHOpenNewFrame)GetProcAddress(hShlwapi, (LPCSTR)103); 03062 else 03063 Func = NULL; 03064 if (Func != NULL) 03065 { 03066 LPITEMIDLIST desktopPIDL; 03067 03068 hResult = SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &desktopPIDL); 03069 if (SUCCEEDED(hResult)) 03070 { 03071 hResult = Func(desktopPIDL, NULL, -1, 1); 03072 } 03073 } 03074 return 0; 03075 } 03076 03077 LRESULT CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03078 { 03079 fStatusBarVisible = !fStatusBarVisible; 03080 // TODO: trigger a relayout of contained items 03081 return 0; 03082 } 03083 03084 LRESULT CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03085 { 03086 CComPtr<IOleCommandTarget> commandTarget; 03087 HRESULT hResult; 03088 03089 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 03090 if (FAILED(hResult)) 03091 return 0; 03092 hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TOOLBARLOCKED, 0, NULL, NULL); 03093 return 0; 03094 } 03095 03096 LRESULT CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03097 { 03098 CComPtr<IOleCommandTarget> commandTarget; 03099 HRESULT hResult; 03100 03101 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 03102 if (FAILED(hResult)) 03103 return 0; 03104 hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TOOLBARBANDSHOWN, 0, NULL, NULL); 03105 return 0; 03106 } 03107 03108 LRESULT CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03109 { 03110 CComPtr<IOleCommandTarget> commandTarget; 03111 HRESULT hResult; 03112 03113 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 03114 if (FAILED(hResult)) 03115 return 0; 03116 hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_ADDRESSBANDSHOWN, 0, NULL, NULL); 03117 return 0; 03118 } 03119 03120 LRESULT CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03121 { 03122 CComPtr<IOleCommandTarget> commandTarget; 03123 HRESULT hResult; 03124 03125 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 03126 if (FAILED(hResult)) 03127 return 0; 03128 hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_LINKSBANDSHOWN, 0, NULL, NULL); 03129 return 0; 03130 } 03131 03132 LRESULT CShellBrowser::OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03133 { 03134 CComPtr<IOleCommandTarget> commandTarget; 03135 HRESULT hResult; 03136 03137 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 03138 if (FAILED(hResult)) 03139 return 0; 03140 hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TEXTLABELS, 0, NULL, NULL); 03141 return 0; 03142 } 03143 03144 LRESULT CShellBrowser::OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03145 { 03146 CComPtr<IOleCommandTarget> commandTarget; 03147 HRESULT hResult; 03148 03149 hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); 03150 if (FAILED(hResult)) 03151 return 0; 03152 hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_CUSTOMIZEENABLED, 0, NULL, NULL); 03153 return 0; 03154 } 03155 03156 LRESULT CShellBrowser::OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) 03157 { 03158 return 0; 03159 } 03160 03161 LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 03162 { 03163 if (HIWORD(wParam) == 0 && LOWORD(wParam) < FCIDM_SHVIEWLAST && fCurrentShellViewWindow != NULL) 03164 return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam); 03165 return 0; 03166 } 03167 03168 //static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 03169 //{ 03170 // return DefWindowProc(hwnd, uMsg, wParam, lParam); 03171 //} 03172 03173 static void ExplorerMessageLoop() 03174 { 03175 MSG Msg; 03176 BOOL Ret; 03177 03178 while (1) 03179 { 03180 Ret = (GetMessage(&Msg, NULL, 0, 0) != 0); 03181 03182 if (Ret != -1) 03183 { 03184 if (!Ret) 03185 break; 03186 03187 TranslateMessage(&Msg); 03188 DispatchMessage(&Msg); 03189 } 03190 } 03191 } 03192 03193 DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter) 03194 { 03195 CComPtr<IShellBrowser> shellBrowser; 03196 CComObject<CShellBrowser> *theCabinet; 03197 IEThreadParamBlock *parameters; 03198 HRESULT hResult; 03199 03200 parameters = (IEThreadParamBlock *)lpThreadParameter; 03201 OleInitialize(NULL); 03202 ATLTRY (theCabinet = new CComObject<CShellBrowser>); 03203 if (theCabinet == NULL) 03204 return E_OUTOFMEMORY; 03205 hResult = theCabinet->QueryInterface(IID_IShellBrowser, (void **)&shellBrowser); 03206 if (FAILED (hResult)) 03207 { 03208 delete theCabinet; 03209 return hResult; 03210 } 03211 hResult = theCabinet->Initialize(parameters->directoryPIDL, 0, 0, 0); 03212 if (FAILED (hResult)) 03213 return hResult; 03214 ExplorerMessageLoop(); 03215 OleUninitialize(); 03216 return 0; 03217 } Generated on Sun May 27 2012 04:18:35 for ReactOS by
1.7.6.1
|